원클릭으로
course-page-generator
將講稿或非結構化筆記轉換為約定的 Markdown 格式,再透過 build script 產生單一 HTML 課程頁面與 OG 縮圖。Skill 的主要任務是 Markdown 格式轉換,build 與 OG 圖片生成是最後的必要步驟。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
將講稿或非結構化筆記轉換為約定的 Markdown 格式,再透過 build script 產生單一 HTML 課程頁面與 OG 縮圖。Skill 的主要任務是 Markdown 格式轉換,build 與 OG 圖片生成是最後的必要步驟。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | course-page-generator |
| description | 將講稿或非結構化筆記轉換為約定的 Markdown 格式,再透過 build script 產生單一 HTML 課程頁面與 OG 縮圖。Skill 的主要任務是 Markdown 格式轉換,build 與 OG 圖片生成是最後的必要步驟。 |
原始講稿 → 結構化 Markdown → node .agents/skills/course-page-generator/scripts/build.mjs <dir> → index.html → node .agents/skills/course-page-generator/scripts/generate-og.mjs <dir> → assets/og-*.jpg
.agents/skills/course-page-generator/
├── scripts/
│ ├── build.mjs # 課程頁 build script
│ └── generate-og.mjs # 針對課程頁產出 1200x630 OG 縮圖(依賴 Puppeteer)
└── reference/ # 格式範例與 HTML 模板(含支援 ?og=1 的 base.html)
<root>/ # 任意根目錄(例如 course/、lectures/、docs/)
├── config/
│ ├── global.yaml # 全域設定(講者、社群、頁尾)
│ └── assets/ # 共用圖片(avatar 等)
├── <course-dir>/
│ ├── config.yaml # 課程專屬設定(覆蓋 global)
│ ├── content.md # 結構化 Markdown 講稿
│ ├── index.html # 課程頁(build 生成)
│ └── assets/
│ └── og-*.jpg # OG 縮圖(generate-og.mjs 產出)
在進入轉換流程之前,先判斷使用者提供的是哪種輸入:
| 情境 | 判斷依據 | 行動 |
|---|---|---|
| 只有主題 | 只給了一句話主題/標題,無對應資料夾或 Markdown | → 執行「主題生成流程」(見下方) |
| 有講稿內容 | 提供了講稿文字、大綱、或已有 content.md | → 直接進入 Step 1 |
| 有現有目錄 | 指定了已存在的課程資料夾 | → 讀取後進入 Step 1 |
當使用者只提供主題(例如「Python 非同步程式設計」):
決定課程資料夾位置:將主題轉為 kebab-case 英文(例如 python-async)作為資料夾名稱。
lectures/python-async),直接使用。course/、lectures/ 等慣例目錄),沿用同層。<course-dir>/),不假設子目錄。建立資料夾結構:
<root>/<course-dir>/
├── config.yaml # 從主題推導課程設定
├── content.md # 根據主題生成骨架
└── assets/ # 空資料夾(保留圖片用)
生成 config.yaml:根據主題填入基本欄位(page.title、page.hero_title、seo.title、seo.description、quotes.opening、quotes.closing);seo.image 與 seo.url 依照 Step 2-0 偵測到的 GitHub Pages 前綴填入;若偵測失敗則留空。
生成 content.md 骨架:
#),每章節下 1–2 個子章節(##)與 2–3 張卡片(### Emoji Title)[summary] 區塊,列出各章節預期的學習成果<!-- TODO: ... --> 或簡短提示標記,讓使用者知道哪裡需要補充確認 global config:檢查是否已有 config/global.yaml,若無,在回覆中提示使用者參考 Step 2 建立。
告知使用者:列出已建立的檔案清單,並說明下一步(補充內容或直接 build)。
完成後繼續 Step 2 以下流程(確認 config → build → OG 縮圖)。Build 成功後必須立即執行 generate-og.mjs。
這是 Skill 的核心任務。使用者提供的可能是:
AI 需要根據以下語法規則,將內容轉換為 content.md。
| 語法 | 用途 | 範例 |
|---|---|---|
# LABEL:TITLE | 主章節 | # 新專案:用 SDD 讓 AI 根據規格建立專案 |
> lead text | 章節引言(緊接 # 後) | > 規格驅動開發(Spec-Driven Development) |
## Title | 子章節 | ## OpenSpec 初始化 |
### Emoji Title | 卡片標題 | ### 🔧 為什麼需要 OpenSpec? |
```prompt [label="..."] | 終端機/Prompt 區塊 | 見下方 |
> **Bold Title** | 洞察框(Insight) | > **AI 正在改變企業決策** |
[flow]...[/flow] | 流程步驟 | 見下方 |
[tags]...[/tags] | 標籤(必須用此區塊包裹) | - [green] 正面 |
[summary]...[/summary] | 總結卡片 | - 🏗️ **標題** | 描述 |
- [x] item | 勾選清單(僅用於已驗證/已完成的事項) | - [x] 已完成項目 |
 | 獨立圖片 |  |
[image-text]...[/image-text] | 圖文並排 | 見下方 |
[youtube id="..." title="..."] | YouTube 影片嵌入 | 見下方 |
--- | 章節分隔線 | 放在 # 章節之間 |
Prompt Block:
```prompt [label="安裝指令"]
npm install -g @fission-ai/openspec@latest
```
npm, git, docker 等)→ header 顯示 "Terminal"Flow Steps:
[flow]
1. proposal.md — 確認目標與範圍
2. design.md — 技術選型與風險評估
[/flow]
Tags:
[tags]
- [green] 正面標籤
- [orange] 警告標籤
- [purple] 中性標籤
- [blue] 資訊標籤
[/tags]
⚠️ - [color] text 必須放在 [tags]...[/tags] 內,獨立使用不會套用顏色。
Summary Grid:
[summary]
- 🏗️ **標題** | 描述文字
- ⚙️ **標題** | 描述文字
[/summary]
Insight Box:
> **洞察標題**
> 第一段落內容。
>
> 第二段落內容(空行分隔)。
獨立圖片:

圖文並排(Image-Text):
[image-text position="left" width="50"]

這是產品的主要介面,提供了 **直覺式操作** 體驗。
- 支援拖放操作
- 即時預覽結果
[/image-text]
position="left"(預設):圖片在左、文字在右position="right":圖片在右、文字在左width="N" 設定圖片佔比百分比(預設 40),例如 width="30" 或 width="60"YouTube 影片嵌入:
單行:
[youtube id="dQw4w9WgXcQ" title="Demo 影片"]
區塊(含說明文字):
[youtube id="dQw4w9WgXcQ"]
這是一段示範影片的說明
[/youtube]
id 為 YouTube 影片 ID(網址中 v= 後面的值)title 為選填標題,顯示在影片下方完整元件對照請參考:components.md Markdown 範例請參考:content-example.md
在撰寫任何 config 之前,先執行以下指令取得 GitHub Pages base URL:
git remote get-url origin
解析規則:
git@github.com:user/repo.git → https://user.github.io/repohttps://github.com/user/repo.git → https://user.github.io/repo取得 GH_BASE 後,seo.image 和 seo.url 的值即為:
seo.url:{GH_BASE}/{course-dir}/seo.image:{GH_BASE}/{course-dir}/assets/og-image.jpg(固定檔名,由 generate-og.mjs 輸出)若指令失敗(非 git repo、無 remote、非 GitHub),直接在 config 中留空這兩個欄位,並告知使用者需手動填入。
Config 分為兩層:
| 檔案 | 用途 | 必要性 |
|---|---|---|
config/global.yaml | 全域設定(講者資訊、社群連結、頁尾) | 首次使用時建立一次 |
<course-dir>/config.yaml | 課程專屬設定(覆蓋 global) | 每個課程各一份 |
config/global.yaml不需要放在固定位置,build 會從課程目錄往上搜尋最多 4 層父目錄。只需確保它存在於課程目錄的某個祖層即可。
如果還沒有 config/global.yaml,需要先建立全域設定。可參考 config-example.yaml 作為模板:
config/global.yaml,填入講者資訊、社群連結、頁尾預設值config/assets/ 資料夾,放入講師頭像(檔名為 author,副檔名可省略,build 會自動偵測 jpg/jpeg/png/webp/gif/svg)全域設定的關鍵欄位:
instructor:
name: "講者姓名"
tagline: "一句話簡介"
bio: "講者介紹(支援 <br> 換行)"
avatar: "config/assets/author" # 可省略副檔名
stats: # text 支援 **粗體** 等 inline markdown
- text: "📚 出版 **7** 本專業書籍"
url: "https://..."
socials: # 支援 Medium/Facebook/Threads/YouTube/GitHub/LinkedIn/Email
- platform: "YouTube"
url: "https://..."
footer:
cta: "行動呼籲文字"
copyright: "© 你的名字"
show_socials: true
seo:
site_name: "網站名稱"
每個課程目錄的 config.yaml 只需寫要覆蓋全域設定的欄位:
page:
title: "課程標題"
badge: "BADGE 文字"
hero_title: "Hero 大標題<br>支援換行"
subtitle: "副標題"
seo:
title: "SEO 標題"
description: "頁面描述"
image: "https://username.github.io/repo/<course-dir>/assets/og-image.jpg" # 由 Step 2-0 偵測填入
url: "https://username.github.io/repo/<course-dir>/" # 由 Step 2-0 偵測填入
quotes:
opening:
text: "開場引言"
closing:
text: >
結尾引言
⚠️ seo.image 必須使用絕對 URL(https://...),社群平台無法解析相對路徑,會導致 OG 預覽圖片無法顯示。這兩個欄位的值應在 Step 2-0 執行 git remote get-url origin 後填入。
nav(Hero 導覽按鈕)預設從 content.md 的 # 章節自動產生,不需手動維護。
若需自訂按鈕文字,可在 config.yaml 中覆蓋:
nav:
- text: "自訂文字"
href: "#section-id"
YAML 完整範例:config-example.yaml
⚠️ Step 3 與 Step 4 是綁定的:只要執行了 build,就必須接著產生 OG 縮圖。不可只做 build 而跳過 OG。
所有指令都從 repo 根目錄 執行:
# Step 3: Build 課程頁
node .agents/skills/course-page-generator/scripts/build.mjs <course-dir>
# Step 4: 產生 OG 縮圖(build 成功後立即執行)
node .agents/skills/course-page-generator/scripts/generate-og.mjs <course-dir>
範例:
node .agents/skills/course-page-generator/scripts/build.mjs course/cake
node .agents/skills/course-page-generator/scripts/generate-og.mjs course/cake
Step 3 — Build 自動流程:
config/global.yaml(base config)<course-dir>/config.yaml(deep merge 覆蓋)<course-dir>/content.md<course-dir>/index.htmlStep 4 — OG 縮圖(build 完成後自動接續):
⚠️ 此步驟為必要步驟,每次 build 完成後都必須執行,不可省略。需要 Puppeteer(
npm install --save-dev puppeteer)。
generate-og.mjs 的行為概要:
file://<course-dir>/index.html?og=1
?og=1 會觸發 base.html 中的 og-mode:
deviceScaleFactor,輸出 1200×630 截圖<course-dir>/assets/og-*.jpg,課程 config 的 seo.image 應指向該檔案nav 或 socials 在課程 config 有定義時,完整取代全域的⚠️ 核心原則:講義是傳遞資訊的載體,請「萃取重點」而非「逐字轉錄」。 請忽略口語化的過場詞(如:大家好、接下來我們看、老實說)、贅字與講者自我呢喃,直接將講稿「提煉」成結構化的條列重點、圖表或卡片。
當使用者提供原始講稿時,AI 應該:
# 主章節與 ## 子章節。### Emoji Title 卡片與條列式列表,不要把講稿的段落直接複製貼上。
loose-text)。一開始我把課程大綱交給 AI,第一版完成度很高。
但 AI 會自己增減文字,想修改時得回去改 HTML。
### 💡 第一版很快,但改不動
- 把課程大綱直接交給 AI,第一版完成度很高
- 但 AI 會自行增減文字、改變強調方式
- 想修改時,得回去改 HTML 原始碼
> **不能只停留在 AI 幫我生成第一版**
> 講義要維護的是內容,不是 HTML。
```prompt 包裹。[flow]...[/flow]。> **Title** Insight Box 點出。[summary]...[/summary] 歸納本次課程精華。config.yaml(或 global.yaml)是否已設定 quotes.opening 和 quotes.closing。若尚未設定,根據講稿的核心精神各撰寫一段引言,寫入 config.yaml。開場引言出現在講師介紹之後、第一個章節之前;結尾引言出現在所有章節之後、頁尾之前,用於收束整場課程的訊息。<course-dir>/assets/ 資料夾中的圖片檔(*.png, *.jpg, *.jpeg, *.gif, *.svg, *.webp)。
 或 [image-text] 區塊。<!-- TODO: 建議在此加入圖片:{圖片描述},請將圖片放到 assets/ 資料夾 -->,同時在回覆中彙整所有缺圖位置,提醒使用者補充。<course-dir>/assets/ 並放入相關圖片。