baseline: Clover 独立仓库首次基线提交
将 Clover 从上层产品包旧仓库中独立出来,建立专属版本控制。 当前状态=纵切片端到端已打通(登录→选品→出文出图→审核→下载包), M1文案质量去套路化已验收。此提交作为后续按核销清单逐条修复的基线。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
42
.claude/rules/api.md
Normal file
42
.claude/rules/api.md
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
paths:
|
||||
- "src/api/**"
|
||||
- "src/routers/**"
|
||||
- "src/services/**"
|
||||
---
|
||||
|
||||
# API 层开发规则(Clover 后端)
|
||||
|
||||
> 承接架构方案v0.3 基石 + API契约.md,冲突以架构方案为准。
|
||||
|
||||
## 路由规范
|
||||
- RESTful 命名:资源用名词复数(/tasks, /products, /api-keys)
|
||||
- 版本前缀:/api/v1/
|
||||
- 控制器只做:参数校验 → 调 service → 格式化响应,**不含业务逻辑**
|
||||
|
||||
## 响应格式(统一包络)
|
||||
- 成功:`{ "code": 0, "data": {...} }`
|
||||
- 失败:`{ "code": <错误码>, "message": "用户可读信息" }`
|
||||
- HTTP 状态码与业务 code 分离(见契约§0七类错误码)
|
||||
|
||||
## 安全(基石B/C)
|
||||
- 所有用户输入必须校验(类型、长度、范围)
|
||||
- SQL 查询使用参数化,禁止字符串拼接
|
||||
- **API Key 绝不进 Celery 参数**,只传 task_id;worker 内查库→Fernet解密→局部变量
|
||||
- FERNET_KEY 走环境变量,绝不进代码库;解密不落盘、不打日志
|
||||
- 敏感操作记审计日志(ai_call_logs)
|
||||
|
||||
## 多租户隔离(红线)
|
||||
- 所有查询强制带 workspace_id 条件
|
||||
- 写操作 + 切 workspace 必须查 workspace_members 校验权限
|
||||
- workspace_id / product_id 从 JWT + 上下文自动带,前端不传(防越权)
|
||||
- 所有 workspace 相关 Repo 继承 base_workspace_repo
|
||||
|
||||
## 错误处理(官网V1坑3)
|
||||
- service 错误不许静默吞,至少打 error log
|
||||
- AI/token站调用失败归因到个人 key(错误码50002)
|
||||
- DB 枚举约束要有对应代码侧常量文件
|
||||
|
||||
## 业务参数不写死(基石A)
|
||||
- 禁止出现品类/数量/角度任何枚举常量
|
||||
- "看起来像枚举"的业务概念 → 做成数据不做成代码
|
||||
49
.claude/rules/db.md
Normal file
49
.claude/rules/db.md
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
paths:
|
||||
- "src/models/**"
|
||||
- "alembic/**"
|
||||
- "migrations/**"
|
||||
---
|
||||
|
||||
# 数据库规则(Clover · MySQL + Alembic)
|
||||
|
||||
> 承接架构方案v0.3 第三章(16表)。一期建14张,matrix_accounts/preference_profile 二期预留。
|
||||
|
||||
## 迁移
|
||||
- 每次 schema 变更创建迁移文件,不手动改数据库
|
||||
- 迁移文件不可修改已提交的,只能新增
|
||||
- 迁移必须包含 up 和 down
|
||||
- 按序:001(banana搬3张) → 002(多租户基础) → 003(业务7张) → 004(飞轮)
|
||||
|
||||
## 查询
|
||||
- 禁止 SELECT *,明确列出字段
|
||||
- 大表查询必须有索引支撑,新增查询模式时同步加索引
|
||||
- N+1 问题:关联查询用 JOIN 或批量加载
|
||||
- 飞轮聚合走 MySQL JOIN(MongoDB 只存 AI debug trace,业务不依赖)
|
||||
|
||||
## 命名
|
||||
- 表名:snake_case 复数(users, generation_tasks, preference_events)
|
||||
- 字段名:snake_case(created_at, workspace_id)
|
||||
- 索引名:idx_表名_字段名
|
||||
|
||||
## 关键约束(架构方案)
|
||||
- 任务主键:自增 BIGINT + mongo_trace_id VARCHAR(24)
|
||||
- user_api_keys:UNIQUE(user_id, workspace_id, provider)
|
||||
- 所有业务表必须有 workspace_id(多租户逻辑隔离)
|
||||
- preference_events 必须有 workspace_id + product_id(跨公司隔离+按产品分开学)
|
||||
|
||||
## 状态机(generation_tasks.status)
|
||||
pending → generating → pending_selection → pending_review → approved/rejected → archived
|
||||
- 打回后回到 pending_selection
|
||||
- 非法流转返错误码 40901
|
||||
|
||||
## 字段红线
|
||||
- API Key 字段:encrypted_key(Fernet),**不存 url 字段**(token站固定自家站)
|
||||
- users 表:删除 banana 的 credits 字段
|
||||
- eval_score:留 NULL(不接 banana 假评分)
|
||||
- data_ownership:client_data / platform_asset(洞7分层归属)
|
||||
- banned_words.level:auto_fix / soft_warn / hard_block(三级)
|
||||
|
||||
## 枚举约束
|
||||
- DB 枚举约束要有对应代码侧常量文件(消除三套命名打架)
|
||||
- 品类(products.category)是纯数据字段,禁止任何品类枚举常量
|
||||
46
.claude/rules/frontend.md
Normal file
46
.claude/rules/frontend.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
paths:
|
||||
- "src/components/**"
|
||||
- "src/app/**"
|
||||
- "src/pages/**"
|
||||
- "src/stores/**"
|
||||
---
|
||||
|
||||
# 前端开发规则(Clover · Next.js)
|
||||
|
||||
> 承接 前端交互设计.md(5屏金标准)+ API契约.md §3 DTO。
|
||||
|
||||
## 组件规范
|
||||
- 单一职责:一个组件只做一件事
|
||||
- Props 必须定义类型(TypeScript interface)
|
||||
- 避免 prop drilling 超 3 层,用 Context 或状态管理
|
||||
|
||||
## DTO 对接(堵官网V1坑4)
|
||||
- 所有 DTO 字段严格按 API契约§3,**不许自己假设嵌套结构**
|
||||
- 后端响应与契约不符立即报 Lead,不私下适配
|
||||
- workspace_id / product_id 不在前端传
|
||||
|
||||
## SSE(异步生图电影)
|
||||
- 按 event_seq 去重,断线重连补发历史事件
|
||||
- 11类事件按契约§2渲染:0/N进度 + 谁好谁先冒 + 单批失败重试 + 能离开
|
||||
- flywheel_injected 事件 → 显"本次已注入:最近偏好/打回原因"
|
||||
|
||||
## 样式
|
||||
- 用 CSS Modules 或 Tailwind,不用全局样式
|
||||
- 响应断点统一:sm(640) md(768) lg(1024) xl(1280)
|
||||
- 颜色/间距用 design token,不硬编码
|
||||
|
||||
## 可访问性
|
||||
- 交互元素必须有 aria-label
|
||||
- 图片必须有 alt 文本
|
||||
- 键盘导航可用
|
||||
|
||||
## 红线(CLAUDE.md)
|
||||
- ❌ 不展示 Token 余额、不做积分页(key 去中转站后台看)
|
||||
- ❌ 飞轮隐形:无"训练AI"按钮,只在生成时显注入提示
|
||||
- ❌ 不做"自动发布到小红书"——只到确认预览
|
||||
- ❌ 不做移动端(一期)
|
||||
|
||||
## 状态管理
|
||||
- 4 个 Store:任务 / 候选 / 审核 / 全局
|
||||
- 异步态用骨架屏,错误态对接契约§0错误码
|
||||
Reference in New Issue
Block a user