跳轉到

架構說明

目錄結構

ekkorn-doc/
├── workspace/                # 全域 AI 規範 Source of Truth
│   ├── CLAUDE.md             → 部署至 $EKKORN_WORK_DIR/CLAUDE.md
│   ├── GEMINI.md             → 部署至 ~/.gemini/GEMINI.md
│   ├── docs/                 → 部署至 $EKKORN_WORK_DIR/docs/
│   │   ├── repo_overview.md
│   │   ├── workspace-sync.md (內部流程,不同步至靜態網站)
│   │   └── rules/safety.md
│   └── .claude/commands/     → 部署至 $EKKORN_WORK_DIR/.claude/commands/
│       ├── plan.md, execute.md, review.md, commit.md, pr.md, ticket.md, doc.md
├── scripts/
│   ├── repos.yml             # 所有 repo 清單(single source of truth)
│   ├── sync-docs.sh          # CI 用:從各 repo sparse checkout docs/
│   ├── deploy-config.sh      # 本地用:部署 workspace/ 到工作目錄
│   └── git-fetch-all.sh      # 批次 fetch 所有本地 repo
├── site/                     # MkDocs 站點
│   ├── mkdocs.yml            # MkDocs Material 設定
│   └── docs/                 # 聚合後的文件(CI 自動填充,.gitignore 排除)
│       └── index.md          # 首頁(手動維護)
├── .github/workflows/
│   └── sync-and-build.yml    # CI:同步 + 建置
├── docs/                     # ekkorn-doc 專案自身的文件
├── Dockerfile                # MkDocs 本地預覽用
└── docker-compose.yml

技術選型

技術 用途 選型理由
MkDocs Material 靜態網站生成 Markdown 原生、搜尋/暗色模式/Mermaid 內建、Python 生態簡單
yq YAML 解析 在 Bash 腳本中解析 repos.yml,無需引入程式語言 runtime
Git sparse checkout 文件拉取 只下載 docs/ 目錄,節省 CI 頻寬與時間
Docker 本地預覽 一鍵啟動,不需本地安裝 Python/MkDocs
Cloudflare Pages 靜態網站托管(Stage 2) 免費、CDN、自動 HTTPS
GitHub Actions CI/CD 與 GitHub 原生整合,支援排程觸發

CI/CD Pipeline

觸發條件:
  - 每天 UTC 19:00(台灣凌晨 3 點)
  - push 到 main(workspace/、site/mkdocs.yml、scripts/repos.yml、workflow 自身)
  - 手動觸發(workflow_dispatch)

流程:
  1. Checkout ekkorn-doc
  2. 安裝 mkdocs-material + yq
  3. sync-docs.sh:遍歷 repos.yml,sparse checkout 各 repo 的 docs/ → site/docs/<name>/
  4. mkdocs build:編譯 site/docs/ → public/
  5. (Stage 2)部署 public/ 至 Cloudflare Pages

本地開發

# 首次同步(需要 yq:brew install yq)
bash scripts/sync-docs.sh

# 啟動本地預覽(http://localhost:8000,支援 hot reload)
docker compose up docs

# 部署 workspace 設定到本地工作目錄
bash scripts/deploy-config.sh

命名規範

  • scripts/ 下的腳本一律使用 kebab-case(如 sync-docs.sh
  • workspace/.claude/commands/ 下的 Skills 一律使用 kebab-case(如 commit.md
  • repos.yml 中的 name 欄位必須與本地工作目錄中的資料夾名稱一致