diff --git a/CLAUDE.md b/CLAUDE.md index 59b42ba8..5050fcbc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,22 +2,11 @@ > Claude Code 自動載入,定義核心原則 -## 🔴🔴🔴 絕對禁止 (Hard Rules) +## 🔴 絕對禁止 (Hard Rules) -以下是**絕對不能違反**的鐵律,直接寫死在這: +**做任何修改前,先讀對應的鐵律文件:** -| 禁止項目 | 正確做法 | Memory 來源 | -|---------|---------|-------------| -| `runs-on: ubuntu-latest` | `runs-on: self-hosted` | feedback_github_billing.md | -| Telegram `logOut()` | 先停舊 Bot 再換 Token | feedback_telegram_token_disaster.md | -| 前端硬編碼文字 | 100% 使用 next-intl | feedback_i18n_zero_hardcode.md | -| SQLite | PostgreSQL only | AWOOOI 憲法 | -| CORS `*` | 嚴格白名單 | AWOOOI 憲法 | -| 假數據 Demo | 真實 API 數據 | feedback_no_fake_data.md | -| 刪除 OpenClaw | OpenClaw 是核心 | feedback_architecture_openclaw_core.md | -| `git push --force` | 正常 push | 防禦性工程 | - -**違反以上任何一條 = 重大事故** +→ [HARD_RULES.md](docs/HARD_RULES.md) --- @@ -44,18 +33,14 @@ - `apps/web/` - Next.js 前端 - `k8s/` - Kubernetes 配置 -## 🛑 修改前檢查清單 +## 🛑 修改前 -**修改 `.github/workflows/` 前:** -- [ ] 確認 `runs-on: self-hosted`,禁止 `ubuntu-latest` +修改以下檔案前,**必須先讀** [HARD_RULES.md](docs/HARD_RULES.md): -**修改 Telegram 相關前:** -- [ ] 讀 `feedback_telegram_token_disaster.md` -- [ ] 禁止呼叫 `logOut()` - -**修改 Incident/Approval 流程前:** -- [ ] 確認 Telegram 通知鏈路完整 -- [ ] 確認 DB 寫入正常 +- `.github/workflows/*` → GitHub Billing 章節 +- `*telegram*` → Telegram Token 章節 +- `apps/web/**` → i18n 章節 +- Incident/Approval 流程 → 確認 Telegram + DB 鏈路 --- diff --git a/docs/HARD_RULES.md b/docs/HARD_RULES.md new file mode 100644 index 00000000..2b529489 --- /dev/null +++ b/docs/HARD_RULES.md @@ -0,0 +1,154 @@ +# AWOOOI 絕對禁止規則 (Hard Rules) + +> 違反任何一條 = 重大事故 + +## 快速索引 + +| 主題 | 禁止 | 正確做法 | 詳細規則 | +|------|------|---------|---------| +| CI/CD | `ubuntu-latest` | `self-hosted` | [→ GitHub Billing](#github-billing) | +| Telegram | `logOut()` | 先停後換 | [→ Telegram Token](#telegram-token) | +| 前端 | 硬編碼文字 | `next-intl` | [→ i18n](#i18n) | +| 資料庫 | SQLite | PostgreSQL | [→ DB](#database) | +| CORS | `*` | 白名單 | [→ CORS](#cors) | +| 數據 | 假數據 Demo | 真實 API | [→ No Fake Data](#no-fake-data) | +| 架構 | 刪除 OpenClaw | OpenClaw 是核心 | [→ OpenClaw](#openclaw) | +| Git | `--force` | 正常 push | [→ Git Safety](#git-safety) | + +--- + +## GitHub Billing + +**Memory:** `~/.claude/projects/-Users-ogt-awoooi/memory/feedback_github_billing.md` + +```yaml +# ❌ 禁止 +runs-on: ubuntu-latest + +# ✅ 正確 +runs-on: self-hosted +``` + +**原因:** GitHub Actions 帳戶額度限制,必須用 192.168.0.110 的 self-hosted runner。 + +--- + +## Telegram Token + +**Memory:** `~/.claude/projects/-Users-ogt-awoooi/memory/feedback_telegram_token_disaster.md` + +```python +# ❌ 禁止 - 會導致 Token 永久失效 +await bot.log_out() + +# ✅ 正確流程 +1. 先停止舊 Bot 的 Long Polling +2. 再切換新 Token +``` + +**原因:** 2026-03-23 災難事件,logOut 導致 Token 永久失效。 + +--- + +## i18n + +**Memory:** `~/.claude/projects/-Users-ogt-awoooi/memory/feedback_i18n_zero_hardcode.md` + +```tsx +// ❌ 禁止 + + +// ✅ 正確 + +``` + +**原因:** 100% 雙語支援 (zh-TW + en)。 + +--- + +## Database + +**Memory:** AWOOOI 憲法 + +```python +# ❌ 禁止 +DATABASE_URL = "sqlite:///..." + +# ✅ 正確 +DATABASE_URL = "postgresql+asyncpg://..." +``` + +**原因:** SQLite 無法支援生產環境並發。 + +--- + +## CORS + +**Memory:** AWOOOI 憲法 + +```python +# ❌ 禁止 +CORS_ORIGINS = ["*"] + +# ✅ 正確 +CORS_ORIGINS = ["https://awoooi.wooo.work", "http://localhost:3000"] +``` + +**原因:** 安全性要求。 + +--- + +## No Fake Data + +**Memory:** `~/.claude/projects/-Users-ogt-awoooi/memory/feedback_no_fake_data.md` + +```tsx +// ❌ 禁止 +const data = DEMO_DATA + +// ✅ 正確 +const { data } = useRealAPI() +``` + +**原因:** 假數據導致用戶無法看到真實系統狀態。 + +--- + +## OpenClaw + +**Memory:** `~/.claude/projects/-Users-ogt-awoooi/memory/feedback_architecture_openclaw_core.md` + +``` +❌ 禁止: 淘汰、取代、或刪除 OpenClaw +✅ 正確: OpenClaw 是 AWOOOI 產品核心,只能增強不能移除 +``` + +**原因:** OpenClaw AI 是產品核心價值。 + +--- + +## Git Safety + +**Memory:** 防禦性工程 + +```bash +# ❌ 禁止 +git push --force +git reset --hard +git checkout -- . + +# ✅ 正確 +git push +git revert +``` + +**原因:** 防止資料遺失。 + +--- + +## 如何新增規則 + +1. 在此文件新增章節 +2. 更新快速索引表 +3. 在 Memory 新增對應 `feedback_*.md` +4. 更新 `MEMORY.md` 索引