system-map
島島 daodao 六個 repo 的系統全景圖——服務職責、呼叫關係、types 同步鏈、跨 repo 變更 SOP。任何變更可能影響其他 repo 時必讀
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
島島 daodao 六個 repo 的系統全景圖——服務職責、呼叫關係、types 同步鏈、跨 repo 變更 SOP。任何變更可能影響其他 repo 時必讀
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Push 後收集 PR 上的所有 review feedback(CI、AI Code Review、Gemini Code Assist、人類 reviewer),分析並詢問使用者要修正哪些
在 iOS 模擬器上跑 apps/mobile(Expo)。涵蓋 prebuild 過期、code signing、模擬器選錯、Metro 舊 bundle、i18n key 對不到等已知陷阱與除錯法
daodao-f2e codebase 地圖——monorepo 結構、依賴方向、常見任務觸點、隱藏的 build 依賴。開工前先讀,省去盲目探索
daodao-f2e 專案開發規範,涵蓋 package 使用、API 錯誤處理、命名慣例、程式碼風格
Push 前 review 整個 branch 的變更,檢查邏輯錯誤、安全問題、效能問題、架構一致性
commit 前執行 lint、typecheck 檢查,自動修復可修的錯誤
| name | system-map |
| description | 島島 daodao 六個 repo 的系統全景圖——服務職責、呼叫關係、types 同步鏈、跨 repo 變更 SOP。任何變更可能影響其他 repo 時必讀 |
本檔在六個 repo 中各有一份相同的副本。更新時必須六份一起改(見「維護」)。 最後校準:2026-07-06(由全 repo 實地盤點產出)。
| Repo | 技術 | 職責 | Prod 網域 | Dev 網域 |
|---|---|---|---|---|
| daodao-f2e | Next.js 15 monorepo(pnpm + turbo) | 前台:官網(website, :3000)、產品站(product, :3001)、mobile(Expo) | app.daodao.so / daodao.so | app-dev.daodao.so |
| daodao-server | Express + Prisma(TypeScript,src/ 全 TS) | 主後端:REST API /api/v1/*、認證(Google OAuth + JWT 簽發)、BullMQ queues | api.daodao.so | (本地 :3000,Docker dev_app) |
| daodao-worker | Cloudflare Workers(Hono + zod-openapi) | AI action-maker:/action-maker/generate、/refine | worker.daodao.so | worker-dev.daodao.so |
| daodao-ai-backend | Python 3.12 FastAPI | AI 子後端:feed、recommendation、insight、admin AI 管理 /api/v1/admin/* | ai.daodao.so | ai-dev.daodao.so(:8002→8000) |
| daodao-storage | SQL schema + migration + ansible | 資料庫的 single source of truth(PostgreSQL + Qdrant 容器) | —(Linode 主機) | — |
| daodao-admin-ui | Vite + React SPA(shadcn) | 管理後台,base path /admin/,runtime 用 vite preview :3000 | admin.daodao.so | admin-dev.daodao.so |
Docker network:dev 用 dev-daodao-network、prod 用 prod-daodao-network(external,各 compose 掛同一網路互通)。
f2e ──openapi-fetch──────────▶ server (NEXT_PUBLIC_API_URL)
f2e ──fetch──────────────────▶ ai-backend (NEXT_PUBLIC_AI_API_URL)
f2e ──fetch──────────────────▶ worker (NEXT_PUBLIC_WORKER_URL,未列於 .env.example)
worker ──X-Internal-API-Key──▶ server (POST /api/internal/ai-generations)
admin-ui ──/daodao-server/*──▶ server (SERVER_BACKEND_URL / vite proxy :4000)
admin-ui ──/api/v1/admin/*───▶ ai-backend (BACKEND_URL / vite proxy :8002)
server ──Prisma──────────────▶ PostgreSQL(storage 定義 schema)
ai-backend ──SQLAlchemy──────▶ 同一個 PostgreSQL(不做 DDL,只讀寫)
認證邊界:
JWT_SECURITY)驗證,並 fallback 讀共用 HttpOnly cookie auth_token。X-Internal-API-Key(非 JWT)。daodao_admin_token Bearer + cookie,角色白名單 admin/superadmin。registry.registerPath 自動生成 openapi.json 與 generated/openapi-types.ts(pnpm run openapi:generate + openapi:generate-types)。f2e 的 .github/workflows/sync-openapi.yml(每日 cron UTC 21:00 + repository_dispatch: sync_openapi + 手動)從 daodaoedu/daodao-server 的 dev branch 拉檔寫入 packages/api/src/types.ts 並自動 commit。https://ai-dev.daodao.so/openapi.json 生成 packages/api/src/ai-types.ts。src/api/types.ts(千行集中檔)手動維護。packages/api/src/types.ts、ai-types.ts;server 的 generated/。storage 是 schema 的 single source of truth。順序固定:
migrate/sql/ 新增 {下一序號}_{描述}.sql(不可改已存在的 migration,hook 會擋)+同步回寫 schema/ 對應檔。make migrate-sql-dev(CD 在 push main/dev 時自動跑 prod/dev)。prisma/schema.prisma(prisma db pull 或手改)→ pnpm run prisma:generate → pnpm run schema:drift 驗證(CI schema-drift.yml 也會 checkout storage 比對,漂移發 Discord 警報)。src/models/ 的 SQLAlchemy ORM(無自動檢查欄位層級,靠人工;enum/CHECK 值層級由 storage 的 schema-sync-check.yml 每日 cron 比對三 repo)。已知現況:storage 的 schema/ 落後 migrate/sql/(check_schema_sync.py 的 SKIP_TABLES 白名單就是漂移清單);migration runner 只認檔名不驗 checksum,「migration 不可變」實際靠 .claude/hooks/pre-write-guard.sh 在撰寫端阻擋。
改動前先對照此表,凡命中就要開跨 repo 的後續工作(或明確告知使用者尚未同步):
| 你改了什麼 | 需要跟進的 repo |
|---|---|
| server 的 API contract(validator/route/response) | f2e(等 sync-openapi 或手動 gen:types);admin-ui(手動改 src/api/types.ts) |
| ai-backend 的 API contract | f2e(gen:ai-types);admin-ui(手動) |
| worker 的 API contract | f2e action-maker(手動改型別) |
| DB schema | storage → server → ai-backend(上節 SOP) |
| DB 的 enum/CHECK 允許值 | server 的 TS 常量(如 src/types/email/base.types.ts)+ ai-backend 的 Py 常量(schema-sync-check.yml 會抓) |
| JWT payload / auth 流程 | server(簽發)+ ai-backend(驗證)+ f2e(refresh 邏輯)+ admin-ui(角色白名單) |
.claude/hooks/*、.claude/settings.json | 六個 repo 全部(複製式共用,md5 必須一致) |
| 本檔(system-map) | 六個 repo 全部 |
NEXT_PUBLIC_API_URL 的 fallback 網域兩處不同:packages/api/src/client.ts 用 api.daodao.so,action-maker hooks 用 server.daodao.so。package-lock.json(npm),但 CI 與規範文件用 pnpm 指令。.husky/pre-commit 硬編碼 /opt/homebrew/bin(macOS 假設),Linux 環境可能失效。