py程式設計(三)課程網站
整學期共用 · 第 1 週完成設定

Git × GitHub × Vercel:從自己的電腦到公開網址

三個工具串起來之後,你只要在 Antigravity 裡說「存檔」「推上 GitHub」,一分鐘後網站就自動更新。這一頁是整學期的部署手冊,也收錄了可以直接使用的提示詞與 Antigravity 課程套件。

你的電腦Antigravity+Git寫程式、測試、建立存檔點
git push→
GitHub雲端儲存庫備份程式碼、記錄每一個存檔點
自動觸發→
Vercel網站主機每次推送都自動部署成公開網址
工具一句話出錯時救你的方式
Git在自己電腦上建立存檔點回到任何一個存檔點
GitHub把存檔點備份到雲端,Vercel 從這裡取得程式碼電腦壞了,程式碼還在
Vercel把 GitHub 上的程式碼變成網站一鍵退回上一個正常的版本

一次性設定(約 20 分鐘)

完成環境安裝的 Antigravity、Python、Git 之後,再做下面三件事:

1. 安裝 GitHub CLI 並登入

  1. 到 cli.github.com 下載安裝(Windows 選 .msi,Mac 選 .pkg)。安裝後重新開啟 Antigravity。
  2. 在 Antigravity 的終端機自己輸入下列指令,依序選擇 GitHub.com → HTTPS → Login with a web browser,再到瀏覽器輸入畫面上的代碼完成登入:
gh auth login

確認:

gh auth status
應該看到Logged in to github.com account 你的帳號

為什麼用 gh:登入資訊由系統安全保存,之後 AI 執行 git push 或建立儲存庫時都不需要你提供密碼或 token。Windows 與 Mac 的步驟完全一樣。

2. 註冊 Vercel

  1. 到 vercel.com/signup,選 Hobby(免費)方案,按 Continue with GitHub。
  2. 第一次匯入專案時,Vercel 會請你安裝它的 GitHub App。可以選「只允許特定儲存庫」,之後每個專案再加入。

3. 安裝課程的 Antigravity 套件

把下方「Antigravity 課程套件」的 AGENTS.md 與 .agents 資料夾複製到每個專案的根目錄。

gh auth login 一定要學生自己在終端機操作。若讓 AI 執行,它會卡在互動式選單。教室網路若擋 github.com 的裝置驗證頁,請先用手機熱點完成登入。

每天的工作循環

  1. 修改:請 AI 做一條功能(先讀 PROJECT.md)。
  2. 測試:在自己電腦上對答案、執行 pytest。
  3. 存檔:「存檔」→ git-save skill 建立存檔點。
  4. 推送:「推上 GitHub」→ github-publish skill 執行 git push。
  5. 自動部署:Vercel 偵測到推送,大約 1 分鐘完成。
  6. 線上確認:打開公開網址,用手機也看一次。

口訣:本機對過答案才存檔,存檔了才推送。推送到 main 分支的每一個版本都會直接上線,所以壞掉的程式不要推。

實作:第一次上線【第 1 週】

先用一個只有 HTML 的自我介紹網頁,把整條流程走一次。網頁越簡單越好,重點是看到「推送後網站自動更新」。

步驟 1:建立網頁

在 程式設計三 底下建立 my-first-site 資料夾,用 Antigravity 開啟,並放入課程套件。

提示詞 1 Antigravity
請在目前資料夾建立一個自我介紹網頁 index.html:
1. 只用 HTML 與 CSS,寫在同一個檔案裡,不使用任何框架
2. 內容:我的暱稱(先填「我的名字」)、三個興趣、一句這學期的目標
3. 手機與電腦都要好讀
4. 執行 git init,建立 .gitignore,然後用 git-save 存檔,訊息「建立自我介紹網頁」
完成後告訴我怎麼在瀏覽器打開它。

步驟 2:推上 GitHub

提示詞 2 Antigravity
推上 GitHub。儲存庫名稱 my-first-site,選 Public。
應該看到AI 回報一個 https://github.com/你的帳號/my-first-site 網址,打開後看得到 index.html。

步驟 3:在 Vercel 匯入

  1. Vercel 首頁 →「Add New…」→「Project」。
  2. 在「Import Git Repository」找到 my-first-site,按「Import」(第一次會請你安裝 Vercel 的 GitHub App)。
  3. Framework Preset 保持 Other,其他不用改,按「Deploy」。
  4. 完成後點畫面上的網址,例如 my-first-site-xxxx.vercel.app。

步驟 4:感受自動部署

提示詞 3 Antigravity
把網頁上的「我的名字」改成(你的暱稱),再加一個「我最想做的網站」段落。改完先讓我在本機確認,確認後存檔並推上 GitHub。

推送後馬上到 Vercel 專案的「Deployments」頁面,看著新的部署從 Building 變成 Ready,再重新整理你的公開網址。

完成:你剛剛把一段修改,從自己的電腦送到全世界都看得到的網址,中間沒有手動上傳任何檔案。整學期的每一個專案都會這樣上線。

分支與預覽部署:上線前先試看看

推到 main 分支的版本會直接上線。想先試一個比較大的改動時,開一個分支:Vercel 會替每個分支產生一個預覽網址,正式網址完全不受影響。

提示詞 Antigravity
我想試著把網頁改成深色主題,但先不要影響正式網站。
請建立一個新分支 dark-theme,在這個分支上修改並存檔,然後推上 GitHub。
完成後告訴我:要怎麼在 Vercel 找到這個分支的預覽網址?確認沒問題後,要怎麼把它合併回 main?
推送到Vercel 的反應網址
mainProduction 部署正式網址(同學看到的)
其他分支Preview 部署每個分支各自的預覽網址

環境變數與金鑰

資料庫連線字串、AI 的 API 金鑰,永遠不放進程式碼,也不推上 GitHub。

位置放什麼會不會上傳
專案裡的 .env自己電腦開發用的設定不會(列在 .gitignore)
Vercel → Settings → Environment Variables線上網站用的設定只存在 Vercel
Vercel Marketplace 加入 Neon 時自動產生 DATABASE_URL只存在 Vercel

如果不小心把金鑰推上 GitHub:刪掉檔案再推送是不夠的,歷史紀錄裡還查得到。第一件事是到該服務的網站把金鑰作廢、重新產生一組,再告訴老師。

出錯時怎麼辦

狀況做法
線上網站壞了,要馬上恢復Vercel 專案 → Deployments → 找到上一個正常的部署 → 「⋯」→ Instant Rollback。幾秒內恢復,之後再慢慢修。
某個存檔點的修改是錯的請 AI:「用 git revert 撤銷『功能3:新增評論』這個存檔點,不要用 reset」。revert 會新增一個存檔點,紀錄完整保留。
Vercel 部署失敗(紅色 Error)點該次部署 → Logs,把錯誤訊息貼給 AI,並使用 vercel-deploy-check skill。
推送被拒絕(rejected)通常是 GitHub 上有你電腦沒有的修改。請 AI 用 git pull 合併後再推送,不要使用 --force。

提示詞模板

有安裝課程套件時,簡短的一句話就會觸發對應的 skill;沒有安裝時,請使用完整版。

要做的事有套件時說使用的 skill
建立存檔點存檔git-save
推上 GitHub推上 GitHubgithub-publish
上線前檢查準備上線到 Vercel,請做上線前檢查vercel-deploy-check
完整版:存檔 Antigravity
請建立 Git 存檔點:先執行 git status 告訴我有哪些改動,確認沒有 .env、.venv、instance/、資料庫檔要被存檔;有 tests/ 就先跑 python -m pytest -q,失敗就停下來告訴我原因。全部沒問題後,用「功能N:功能名稱」的格式存檔,並執行 git log --oneline -5。
完整版:推上 GitHub Antigravity
請把專案推上 GitHub。先執行 gh auth status 確認我已登入(沒登入就告訴我自己執行 gh auth login,不要向我要密碼或 token)。確認 .gitignore 正確、所有修改都已存檔。還沒有遠端時,用 gh repo create(名稱:___,Public)建立並推送;已有遠端就 git push。最後告訴我儲存庫網址。不要使用 --force。
完整版:Flask 網站上線前檢查 Antigravity
我要把這個 Flask 網站部署到 Vercel。請先不要修改任何檔案,逐項檢查並用表格回報:
1. 根目錄的 app.py 有名為 app 的 Flask 物件;requirements.txt 完整
2. Vercel 上 SQLite 的寫入會消失:程式是否在 DATABASE_URL 存在時改用 Postgres(Neon),並列出需要調整的 SQL 語法
3. .env、.venv、instance/、*.db 都在 .gitignore,且 git ls-files 中沒有它們
4. 程式碼中沒有寫死任何密碼或連線字串
5. python -m pytest -q 是否全部通過
最後列出部署後我要在瀏覽器手動確認的項目。
完整版:部署失敗時 Antigravity
Vercel 部署失敗了,以下是 Deployments → Logs 的錯誤訊息:
(貼上錯誤訊息)
請說明失敗的原因、要修改哪個檔案的哪裡,先不要修改,等我確認。

Antigravity 課程套件

套件放在課程資料夾 practice/antigravity-kit/。把 AGENTS.md 與整個 .agents 資料夾複製到每個專案的根目錄即可。這兩樣都會跟著 Git 存檔,同組同學共用同一套規則。

foodie/
├─ AGENTS.md                         課程規則:每次對話都會遵守
├─ .agents/
│  └─ skills/
│     ├─ git-save/SKILL.md            「存檔」
│     ├─ github-publish/SKILL.md      「推上 GitHub」
│     └─ vercel-deploy-check/SKILL.md 「上線前檢查」
├─ PROJECT.md
└─ app.py …

Rules 與 Skills 的差別:AGENTS.md 是規則,每一次對話都會套用,所以只放「永遠要遵守」的事,例如不可以要求密碼。Skill 是做事的步驟,AI 讀了每個 skill 的 description,判斷你的需求符合時才會使用。你也可以直接在提示詞裡寫出 skill 名稱,確保它被使用。

安裝後,到 Antigravity 對話框右上角「⋯」→ Customizations,可以看到目前生效的 Rules 與 Skills。

AGENTS.md(課程規則)
AGENTS.md 放在專案根目錄
# 課程規則(程式設計三)

這份檔案放在專案根目錄,Antigravity 每次對話都會遵守。

## 工作方式
- 每次開始工作前,先讀 PROJECT.md,依照裡面的頁面、資料表與驗收標準實作。
- 一次只做一條功能。完成後停下來,告訴我怎麼手動測試,等我確認再做下一條。
- 只修改和這次任務相關的檔案,不要重寫整個專案,也不要順手改其他功能。
- 用繁體中文說明你做了什麼、改了哪些檔案,以及每個檔案改動的原因。

## 程式品質
- SQL 一律使用參數(SQLite 用 ?,Postgres 用 %s),不可以用字串拼接或 f-string 組 SQL。
- 使用者輸入一定要在伺服器端檢查,不能只靠網頁表單。
- 測試失敗時,先說明原因;不要為了讓測試通過而修改測試的預期結果。

## 安全
- 不要要求我把密碼、token、API 金鑰貼到對話框。需要登入時,告訴我要在瀏覽器或終端機做什麼,由我自己完成。
- 金鑰與資料庫連線字串只放在 .env 或 Vercel 的環境變數,.env 必須列在 .gitignore。
- 不要執行 git push --force、git reset --hard,也不要刪除 GitHub 儲存庫或 Vercel 專案。
- 專案資料夾只放虛構或範例資料。
git-save/SKILL.md
.agents/skills/git-save/SKILL.md
---
name: git-save
description: 建立 Git 存檔點(commit)。當使用者說「存檔」「commit」「建立存檔點」,或一條功能已經對過答案、要保存目前進度時使用。
---

# 建立存檔點

依照下列順序執行,每一步都用繁體中文回報結果。

1. 執行 `git status`,列出這次有哪些檔案被新增、修改或刪除。
2. 檢查是否有不該存檔的檔案:`.env`、`.venv/`、`instance/`、`__pycache__/`、資料庫檔(`*.db`)。如果出現在待存檔清單中,先停下來告訴我,並建議加入 `.gitignore`,不要存檔。
3. 如果專案有 `tests/` 資料夾,執行 `python -m pytest -q`。有測試失敗就停下來說明原因,不要存檔。
4. 用一兩句話摘要這次的改動,請我確認存檔訊息。訊息格式:`功能N:功能名稱` 或 `修正:問題描述`。
5. 執行 `git add -A` 與 `git commit -m "<訊息>"`。
6. 如果 PROJECT.md 有「功能進度」,把完成的項目打勾,並一起存檔。
7. 最後執行 `git log --oneline -5` 給我看。

不要執行 `git push`;要推上 GitHub 請使用 github-publish skill。
github-publish/SKILL.md
.agents/skills/github-publish/SKILL.md
---
name: github-publish
description: 把專案推上 GitHub。當使用者說「推上 GitHub」「push」「備份到 GitHub」「建立 GitHub 儲存庫」時使用。第一次推送會建立新的儲存庫,之後只推送新的存檔點。
---

# 推上 GitHub

使用 GitHub CLI(gh)。全程不可以要求使用者提供密碼或 token。

## 1. 檢查登入狀態
執行 `gh auth status`。
- 如果顯示未登入:停下來,請使用者自己在終端機執行 `gh auth login`(選 GitHub.com → HTTPS → Login with a web browser),完成後再繼續。不要替使用者執行登入。
- 如果找不到 gh 指令:請使用者到 https://cli.github.com 安裝,安裝後重新開啟 Antigravity。

## 2. 推送前檢查
- `git status` 必須是乾淨的(所有修改都已存檔);如果不是,先請使用者用 git-save 存檔。
- 確認 `.gitignore` 排除 `.env`、`.venv/`、`instance/`、`__pycache__/`、`*.db`。
- 用 `git ls-files` 確認沒有任何 .env 或金鑰檔已經被追蹤。若有,停下來說明怎麼移除,不要推送。

## 3. 推送
- 執行 `git remote -v`。
- **還沒有遠端(第一次)**:詢問使用者儲存庫名稱與 Public/Private,然後執行
  `gh repo create <名稱> --<public 或 private> --source=. --remote=origin --push`
- **已經有遠端**:執行 `git push`。

## 4. 回報
- 執行 `gh repo view --json url -q .url` 取得儲存庫網址,告訴使用者。
- 如果這個儲存庫已連結 Vercel,提醒使用者:推送後 Vercel 會自動開始部署,大約 1 分鐘後到 Vercel 的 Deployments 頁面確認狀態。

禁止:`git push --force`、刪除或改名遠端儲存庫、修改其他人的儲存庫。
vercel-deploy-check/SKILL.md
.agents/skills/vercel-deploy-check/SKILL.md
---
name: vercel-deploy-check
description: 部署到 Vercel 之前的檢查清單,以及部署後的線上驗收。當使用者說「準備上線」「部署到 Vercel」「上線前檢查」,或部署失敗需要找原因時使用。
---

# Vercel 上線前檢查

逐項檢查,用表格回報每一項的結果(通過/未通過/不適用)與修正建議。未經使用者同意,不要自行修改檔案。

## A. 靜態網站(只有 HTML/CSS/JS)
1. 根目錄有 `index.html`。
2. 網頁中的連結與圖片都使用相對路徑,而且檔名大小寫和實際檔案一致(Vercel 主機會區分大小寫)。

## B. Flask 網站
1. 入口檔是根目錄的 `app.py`(或 index.py、main.py),裡面有名為 `app` 的 Flask 物件。
2. `requirements.txt` 列出所有用到的套件(至少 flask;使用 Postgres 時要有 psycopg)。
3. 圖片、CSS 等靜態檔案放在 `public/` 資料夾。
4. **資料庫**:Vercel 主機上的檔案是暫時的,SQLite 寫入的資料會消失。
   - 程式要能在環境變數 `DATABASE_URL` 存在時連線到 Postgres(Neon),不存在時使用本機 SQLite。
   - 列出 SQLite 與 Postgres 語法不同的地方:參數符號 ? 與 %s、自動編號欄位、日期函式、ROUND(AVG(...)) 需要轉成 numeric。
5. 本機執行 `python -m pytest -q` 全部通過。

## C. 安全
1. `.env`、`.venv/`、`instance/`、`*.db` 都在 `.gitignore` 中,而且 `git ls-files` 中看不到它們。
2. 程式碼中沒有寫死任何密碼、token、連線字串;一律從環境變數讀取。
3. 說明哪些環境變數要到 Vercel 專案的 Settings → Environment Variables 設定(Neon 由 Marketplace 加入時會自動設定 DATABASE_URL)。

## D. 部署後驗收
部署完成後,請使用者提供網址,然後列出要在瀏覽器手動確認的項目:
- 首頁能打開,資料有顯示(代表資料庫連線成功)。
- 新增一筆資料後重新整理,資料仍在(代表寫入的是雲端資料庫,不是暫時檔案)。
- 用手機打開一次。
- 失敗時,請使用者到 Vercel 專案的 Deployments → 點該次部署 → Logs,把錯誤訊息貼給你分析。

套件中的 skill 是「範例答案」。建議第 1 週先讓學生用完整版提示詞操作一次,體會每一步在做什麼;第 4 週開始做吃貨站時再安裝套件,讓學生感受到「把重複的流程寫成 skill」帶來的差別。

自己建立 Skill

當你發現自己第三次貼上同一段提示詞時,就是把它變成 skill 的時候。

Skill 的結構

  1. 在專案的 .agents/skills/ 底下建立一個資料夾,名稱用小寫英文與連字號,例如 weekly-log。
  2. 在資料夾裡建立 SKILL.md:開頭的 description 是最重要的一行,要寫出「做什麼」與「什麼時候用」;下面寫步驟、何時要停下來問你、禁止事項。
  3. 需要的話,可以在同一個資料夾放 resources/(範本、資料)或 scripts/(AI 可以執行的程式)。
Skill 範本(practice/antigravity-kit/skill-template/)
.agents/skills/my-skill/SKILL.md
---
name: my-skill
description: (一句話說明這個 skill 做什麼,以及「什麼時候」要使用它。AI 只看這一句決定要不要用,所以要寫出使用者可能會說的話,例如:當使用者說「整理週誌」時使用。)
---

# (skill 的名稱)

## 目的
(這個 skill 要解決什麼重複發生的問題?)

## 步驟
1. (第一步要做什麼、執行什麼指令、讀哪個檔案)
2. (第二步)
3. (怎麼回報結果:表格、清單,或一句話)

## 什麼時候要停下來問我
- (例如:要刪除檔案之前、測試失敗時)

## 禁止
- (例如:不可以修改 tests/ 裡的檔案)

請 AI 幫你寫 Skill

提示詞 Antigravity
我每週上課最後都要寫「每週進度紀錄」:讀 PROJECT.md 和 git log,整理本週完成的功能、對應的存檔點、還沒完成的項目,「AI 犯的錯」與「我怎麼發現的」兩格留白讓我自己寫。
請幫我把這件事做成一個 Antigravity skill:
1. 建立 .agents/skills/weekly-log/SKILL.md
2. description 要寫出我可能會說的話,例如「整理週誌」「寫進度紀錄」
3. 步驟要具體到執行哪個指令、讀哪個檔案、用什麼格式回報
4. 寫明什麼情況要停下來問我
完成後說明這個 skill 什麼時候會被觸發,並建議我用哪一句話測試它。

練習:做一個屬於你的 Skill

點子description 可以這樣寫
每週進度紀錄整理本週進度紀錄。當使用者說「整理週誌」「寫進度紀錄」時使用。
新增一條功能的固定流程依 PROJECT.md 實作一條新功能。當使用者說「做下一條功能」時使用。
Demo 前檢查Demo 發表前檢查公開網址與示範資料。當使用者說「準備 Demo」時使用。

測試方法:開一個新的對話,只說 description 裡寫的那句話,看 AI 有沒有照你的步驟做。沒有被觸發時,通常是 description 寫得太籠統。

其他 AI 工具的 Skill:Claude Code 與 Codex

Skill 不是 Antigravity 獨有的功能。Anthropic 在 2025 年把 SKILL.md 的格式公開成 Agent Skills 開放標準,Claude Code、OpenAI Codex、Antigravity 都採用同一種寫法:一個資料夾、一個 SKILL.md、開頭寫 name 與 description。你寫的 skill,換工具也帶得走。

Antigravity(本課程)OpenAI CodexClaude Code
專案的 skill 放在.agents/skills/.agents/skills/.claude/skills/
個人(所有專案)~/.gemini/config/skills/~/.agents/skills/~/.claude/skills/
每次都遵守的規則AGENTS.mdAGENTS.mdCLAUDE.md
自動使用依 description 判斷依 description 判斷依 description 判斷
手動指定在提示詞寫出 skill 名稱輸入 $skill名稱,或 /skills 選單輸入 /skill名稱
內建、可直接用的 skill—$skill-creator(幫你寫 skill)、$skill-installer(安裝精選 skill)/code-review、/debug、/verify、/run 等;skill-creator 以外掛安裝
分享給別人放進 Git 儲存庫打包成外掛(plugin)打包成外掛,從 marketplace 安裝

課程套件可以直接沿用:Codex 讀的位置和 Antigravity 完全相同,複製過去就能用。Claude Code 只要換個資料夾:把 .agents/skills/ 底下的三個資料夾複製到 .claude/skills/,再建立一個 CLAUDE.md,內容只寫一行 @AGENTS.md(Claude Code 會把它引入的檔案一起當成規則)。

推薦的 Skill

Skill工具什麼時候用推薦度
本課程套件:git-save、github-publish、vercel-deploy-check三者皆可每天的存檔、推送、上線必裝
skill-creatorCodex 內建;Claude Code 以外掛安裝把重複的提示詞變成 skill。它會先問你要什麼,再寫出結構完整的 SKILL.md非常推薦,學寫 skill 最快的方法
/code-review、/debugClaude Code 內建存檔前請 AI 找出改動中的錯誤;程式出錯時有系統地找原因推薦,對應課程的「審查 AI 程式」
文件類 skill:docx、pptx、xlsx、pdfAnthropic 官方範例(anthropics/skills)期末專題要交 Word 報告或 PowerPoint 簡報時期末報告時好用
$skill-installerCodex 內建安裝 OpenAI 整理的精選 skill進階,安裝前先讀內容

安裝別人的 skill 前,一定要先讀過 SKILL.md。skill 可以附帶腳本,AI 會照著執行。只安裝來源可信的 skill:你自己寫的、課程提供的,或工具官方發布的。

網路上的「精選 skill 清單」更新很快,也常有沒人維護的。看到推薦時,先確認它的來源和最後更新時間。

課堂統一使用 Antigravity,但有些學生自己在用 Claude Code 或 Codex。告訴他們:課程套件、提示詞模板、PROJECT.md 都是通用的,換工具不影響作業。評量看的是 PROJECT.md、測試與 AI 協作紀錄,不看用哪個工具。

常見狀況

gh auth login 之後,git push 還是要求輸入帳號密碼

在終端機執行一次 gh auth setup-git,讓 Git 改用 gh 的登入資訊。

Vercel 的 Import 清單裡找不到我的儲存庫

Vercel 的 GitHub App 只被允許存取部分儲存庫。在匯入畫面點選調整 GitHub App 權限的連結(會跳到 GitHub 的設定頁),把該儲存庫加進「Repository access」後存檔。

網站部署成功,但打開是 404

靜態網站:確認根目錄有 index.html,而且檔名是小寫。Flask 網站:確認入口檔是根目錄的 app.py,裡面的 Flask 物件叫做 app。

線上新增的資料,過一陣子就不見了

網站還在使用 SQLite。Vercel 主機上的檔案是暫時的,必須改用 Neon 雲端資料庫,見第 8 週。