# Nexus 6.0 — Cursor Rules

## 项目概述
Nexus 是一个 2000+ 服务器运维管理平台。技术栈：FastAPI + Async SQLAlchemy + Redis + WebSocket + Telegram (后端)，Vue 3 + Vuetify 4 + TypeScript SPA (前端，14页面)。项目 ~99% 完成。

## 基本信息
- 仓库: http://66.154.115.8:3000/admin/Nexus.git
- 本地路径: C:\Users\uzuma\Desktop\svn\Nexus
- 生产域名: https://api.synaglobal.vip
- 生产 IP: 47.254.123.106，后端端口 8600
- 部署路径: /www/wwwroot/api.synaglobal.vip/
- 管理员: admin / Nexus@2026
- 数据库: MySQL nexus/Nexus@2026!@127.0.0.1:3306/nexus
- SSH 别名: ssh nexus (key: id_rsa_nexus)

## 目录结构
```
Nexus/
├── server/            ← FastAPI 后端 (Clean Architecture 4层)
│   ├── api/           ← API 路由
│   ├── domain/        ← SQLAlchemy 模型 (14+张表)
│   ├── infrastructure/← SSH 连接池 + Redis + Telegram
│   ├── background/    ← 后台任务
│   └── config.py      ← Pydantic Settings + MySQL 覆盖
├── frontend/          ← Vue 3 + Vuetify 4 + TypeScript SPA
│   └── src/pages/     ← 14 个页面组件
├── web/app/           ← Vite 构建输出 (后端 StaticFiles 挂载点)
├── deploy/            ← Supervisor + Nginx + 健康检查脚本
├── docs/              ← 设计文档/审计/changelog
└── .env               ← NOT IN GIT (安装向导生成)
```

## 实现原则（强制）

**所有设计和实现都必须是完美实现。**

- ❌ 不允许为了实现而实现 — 每一行代码必须有明确的目的和质量标准
- ❌ 不允许降级实现 — 不得以「先用着」为由降低安全、架构或代码质量标准
- ❌ 不允许妥协实现 — 不得在发现问题后选择绕过而非根治
- ❌ 不允许留技术债 — 发现问题必须当场修复，不得标注 TODO/FIXME 延后
- ✅ 无法完美实现时必须停下来与用户交流后再换方案，不得擅自从权

## 安全铁律（强制）

- ❌ 禁止明文密码出现在前端 JS 变量、localStorage、URL 参数中
- ❌ 禁止静默吞错 — except 块不得空 pass 或 return None 掩盖异常
- ❌ 禁止硬编码密钥/密码/Token — 必须走配置或环境变量
- ❌ 禁止 f-string 拼 SQL — 必须参数化查询
- ❌ 禁止未验证的用户输入拼入 shell 命令 — 必须用 shlex.quote() 或 subprocess 参数化
- ✅ 敏感操作必须二次验证身份（re-auth pattern）
- ✅ API 响应不得返回密码/密钥明文 — 用 password_set 布尔标记
- ✅ 所有 CUD 操作必须记录审计日志

## 文档纪律（强制）

- 新功能/架构变更：先写 docs/design/specs/YYYY-MM-DD-*-design.md，再写代码
- 开发前：写 docs/design/plans/ 或 docs/reports/ 技术文档
- 项目缺文档的模块：改动时一并补全
- 每次修改：在 docs/changelog/YYYY-MM-DD-*.md 留 changelog（行数≥10，不能空壳）

## 强制文件修改流程（不可跳步）

```
实现 → WSL本地验证 → ★审计8步★ → 部署 → 健康检查 → 浏览器验证 → changelog
```

进度条（每次改代码必须输出）：
```
□实现 □WSL验证 □审计8步 □部署 □健康检查 □浏览器验证 □changelog
```

审计8步：登记→全文Read→规则扫描H→Closure表→入口表→输入→Sink→归类→DoD

## 部署流程

### 后端部署
```bash
git push origin main
ssh nexus "cd /www/wwwroot/api.synaglobal.vip && git fetch --all && git reset --hard origin/main && supervisorctl restart nexus"
ssh nexus "sleep 3 && curl -s http://127.0.0.1:8600/health"  # 预期: ok
```

### 前端部署
```bash
cd frontend && npx vite build && cd ..
tar czf /tmp/nexus-frontend.tar.gz -C web/app index.html assets/
scp /tmp/nexus-frontend.tar.gz nexus:/tmp/nexus-frontend.tar.gz
ssh nexus "cd /www/wwwroot/api.synaglobal.vip/web/app && tar xzf /tmp/nexus-frontend.tar.gz && rm /tmp/nexus-frontend.tar.gz"
```

### 本地开发
```bash
cd frontend && npm run dev   # http://localhost:3000/app/
```

## 7道门控 (deploy/pre_deploy_check.sh)

1. Changelog门 — 文件存在且行数≥10
2. Audit门 — 文件存在且含 Step3+Closure+DoD
3. Test门 — test_api.py 必须存在且通过
4. Lint门 — ruff check server/ 零错误
5. Import门 — import server.main 成功
6. Security门 — bandit 无 HIGH/MEDIUM
7. Review门 — 审计文件包含实际改动文件清单

## 已确认的关键决策

| 不可改项 | 原因 |
|---------|------|
| API_KEY | 加密一致性 + 子服务器认证 |
| SECRET_KEY | 加密回退密钥 |
| DATABASE_URL | 启动必需 |
| ENCRYPTION_KEY | 凭据加密 |

| 可改项 | 说明 |
|--------|------|
| system_name/title | 前端显示 |
| pool_size/overflow | 安装向导自动推荐 |
| redis_url | Redis 连接 |
| 告警阈值 | 默认 80% |
| Telegram 配置 | 告警推送 |

## 关键文件速查

| 用途 | 文件路径 |
|------|----------|
| 后端入口 | server/main.py |
| 数据模型 | server/domain/models/__init__.py |
| JWT 认证 | server/api/auth_jwt.py |
| 登录 API | server/api/auth.py |
| WebSSH | server/api/webssh.py |
| WebSocket | server/api/websocket.py |
| 设置 CRUD | server/api/settings.py |
| 服务器 CRUD | server/api/servers.py |
| 快捷命令 | server/api/terminal.py |
| Agent 心跳 | server/api/agent.py |
| 同步引擎 | server/application/services/sync_engine_v2.py |
| 前端入口 | frontend/src/main.ts |
| 路由 | frontend/src/router/index.ts |
| API 客户端 | frontend/src/api/index.ts |
| Auth Store | frontend/src/stores/auth.ts |
| 登录页 | frontend/src/pages/LoginPage.vue |
| 终端页 | frontend/src/pages/TerminalPage.vue |
| Vite 配置 | frontend/vite.config.mts |

## 已知待续事项

| 优先级 | 问题 | 文件 |
|--------|------|------|
| P1 | 批量操作按钮无反应 | ServersPage.vue |
| P1 | agent script-callback 无 API Key 认证 | server/api/agent.py |
| P1 | 访问令牌 30 天有效期过长 | server/config.py |
| P2 | 47.121.118.30 持续发 422 | server/api/agent.py |
| P2 | 422 调试日志是临时的 | server/main.py |
| P2 | Admin 废弃列未清理 | server/domain/models/__init__.py |
| P3 | agent.py on_event 弃用 | server/api/agent.py |
| UX | 命令输入栏高亮对齐偏差 | TerminalPage.vue |

## 用中文回复
