删掉多余的
This commit is contained in:
1 parent
887c1f449e
commit
a22ee82b07
9 files changed
+1054
-207
No files matched your search
@@ -35,54 +35,6 @@ pnpm test:watch # 监听模式
|
||||
pnpm test:coverage # 运行测试并生成覆盖率报告
|
||||
```
|
||||
|
||||
## 目录结构
|
||||
|
||||
```text
|
||||
frontend/
|
||||
├── src/
|
||||
│ ├── app/ # Next.js App Router
|
||||
│ │ ├── admin/ # 司命台管理控制台(增强 UI,开关驱动)
|
||||
│ │ ├── archive/ # 归档(记忆时间河)
|
||||
│ │ ├── characters/ # 人物
|
||||
│ │ ├── chat/ # 对话
|
||||
│ │ ├── memory/ # 记忆管理
|
||||
│ │ ├── personality/ # 人格
|
||||
│ │ ├── runs/[runId]/ # 运行轨迹
|
||||
│ │ ├── tools/ # 工具调用
|
||||
│ │ ├── error.tsx # 全局错误边界(Client,reset)
|
||||
│ │ ├── global-error.tsx # 根级错误兜底(自带 html/body)
|
||||
│ │ ├── layout.tsx # 根布局
|
||||
│ │ ├── loading.tsx # 路由加载态
|
||||
│ │ ├── not-found.tsx # 404
|
||||
│ │ ├── page.tsx # 首页(重定向 /chat)
|
||||
│ │ └── template.tsx # 页面过渡动画
|
||||
│ ├── components/ # React 组件(按功能域组织)
|
||||
│ │ ├── admin/ # 司命台签名组件(StarMap/VermilionAction…)
|
||||
│ │ ├── archive/ characters/ chat/ memory/ personality/ runs/ tools/
|
||||
│ │ ├── layout/ # 应用壳层 / 侧栏 / 主题初始化
|
||||
│ │ ├── shared/ # 共享状态视图(Empty/Error/Loading)
|
||||
│ │ └── ui/ # 通用 UI(Button/Card/BronzeMirror/Badge…)
|
||||
│ ├── lib/
|
||||
│ │ ├── api/ # API 客户端(client.ts 统一出口 + 按域分模块)
|
||||
│ │ ├── constants/ # 枚举标签常量
|
||||
│ │ ├── hooks/ # 自定义 Hooks
|
||||
│ │ ├── mock/ # Mock 数据层(无后端时驱动全页面)
|
||||
│ │ ├── stores/ # Zustand/Jotai stores
|
||||
│ │ └── utils/ # 工具函数(cn/format/error)
|
||||
│ ├── test/ # Vitest 全局 setup
|
||||
│ ├── types/ # TypeScript 类型定义
|
||||
│ └── styles/ # 全局样式(琉璃镜 token)
|
||||
├── .husky/ # Git hooks(pre-commit)
|
||||
├── public/ # 静态资源
|
||||
├── .env.local # 环境变量 (本地)
|
||||
├── .lintstagedrc.json # lint-staged 配置
|
||||
├── eslint.config.mjs # ESLint flat config
|
||||
├── vitest.config.ts # Vitest 配置
|
||||
└── next.config.ts # Next.js 配置(rewrites 代理 /api/v1 → 后端)
|
||||
```
|
||||
|
||||
> 组织约定:采用 `src/` 根 + `components` 按功能域分子目录 + `stores` 置于 `lib` 下的方式,不设独立 `features/` 顶层目录。浏览器请求经 `next.config.ts` 的 rewrites 同源代理到后端(规避跨域,含 SSE);认证与鉴权统一走 BFF:token 仅存于 httpOnly cookie,由 App Router 内的 `/api/auth/*`(认证)、`/api/proxy/*`(业务 REST 代理)、`/api/sse/*`(SSE 流式代理)在服务端读取并注入 Authorization,客户端 JS 不接触 token。
|
||||
|
||||
## 代码规范
|
||||
|
||||
### 页面设计
|
||||
@@ -113,93 +65,6 @@ Tailwind 任意值 [var(--)] → 仅当变量不在 @theme 映射表中时使
|
||||
内联 style → 仅限复合值 / 动态运行时值
|
||||
```
|
||||
|
||||
#### 具体对照
|
||||
|
||||
`globals.css` 的 `@theme inline {}` 块已映射的部分,直接用 Tailwind 类:
|
||||
|
||||
```tsx
|
||||
// ✅ 正确:变量在 @theme inline {} 中有 --color-X 映射 → 用 Tailwind 类
|
||||
<div className="bg-patina text-fg-dim border-rule" />
|
||||
<span className="text-cinnabar" />
|
||||
<div className="bg-night-bronze text-fg" />
|
||||
<div className="bg-surface" />
|
||||
<button className="border-gilt text-gilt" />
|
||||
<div className="bg-btn-primary-bg" /> {/* Layer 2 组件 token 同理 */}
|
||||
|
||||
// ✅ 正确:变量未映射到 @theme inline {} → 用 Tailwind 任意值
|
||||
<div className="bg-[var(--patina-wash)]" />
|
||||
<span className="text-[var(--fg-faint)]" />
|
||||
<div className="border-[var(--gilt-dim)]" />
|
||||
<div className="bg-[var(--cinnabar-wash)]" />
|
||||
```
|
||||
|
||||
> `bg-[var(--x)]` 是 Tailwind v4 的合法任意值语法(非 hack),属于 Tailwind 体系内,**不是** style 违规。`--patina-wash`、`--patina-dim`、`--gilt-faint`、`--gilt-dim`、`--cinnabar-wash`、`--cinnabar-dim` 当前均未直接映射,使用任意值是正确做法。
|
||||
|
||||
```tsx
|
||||
// ❌ 禁止:变量已在 @theme inline {} 中有映射,却用任意值
|
||||
// 不要用 bg-[var(--patina)] —— 应写 bg-patina(已映射)
|
||||
// 不要用 text-[var(--cinnabar)] —— 应写 text-cinnabar(已映射)
|
||||
// 不要用 border-[var(--rule)] —— 应写 border-rule(已映射)
|
||||
// 不要用 text-[var(--fg-dim)] —— 应写 text-fg-dim(已映射)
|
||||
|
||||
// ❌ 禁止:用内联 style 表达单值 CSS 变量
|
||||
// 不要写 style={{ color: "var(--patina)" }}
|
||||
// 不要写 style={{ background: "var(--surface)" }}
|
||||
|
||||
// ✅ 正确:渐变色/复合 CSS 用内联 style(Tailwind 无法表达)
|
||||
<div style={{
|
||||
background: "linear-gradient(180deg, var(--patina-wash), var(--surface))",
|
||||
boxShadow: "inset 0 1px 0 var(--face-in-top), var(--shadow)",
|
||||
}} />
|
||||
|
||||
// ✅ 正确:动态运行时值用内联 style
|
||||
<div style={{ color: health === "ok" ? "var(--patina)" : "var(--cinnabar)" }} />
|
||||
|
||||
// ✅ 正确:SVG 属性用内联 style 或 className
|
||||
<circle style={{ fill: "var(--patina)", stroke: "var(--gilt)" }} />
|
||||
```
|
||||
|
||||
#### 映射速查
|
||||
|
||||
当前 `@theme inline {}` 中已映射的 铜镜鉴心 变量(查阅 `globals.css` 确认完整列表):
|
||||
|
||||
| CSS 变量 | Tailwind 类前缀 | 示例 |
|
||||
| ---------- | ---------------- | ------ |
|
||||
| `--patina` | `patina` | `bg-patina` `text-patina` `border-patina` |
|
||||
| `--patina-bright` | `patina-bright` | `bg-patina-bright` |
|
||||
| `--gilt` | `gilt` | `bg-gilt` `text-gilt` |
|
||||
| `--cinnabar` | `cinnabar` | `bg-cinnabar` `text-cinnabar` |
|
||||
| `--ink` | `ink` | `bg-ink` |
|
||||
| `--night-bronze` | `night-bronze` | `bg-night-bronze` |
|
||||
| `--fg` | `fg` | `text-fg` |
|
||||
| `--fg-dim` | `fg-dim` | `text-fg-dim` |
|
||||
| `--fg-faint` | `fg-faint` | `text-fg-faint` |
|
||||
| `--rule` | `rule` | `border-rule` `bg-rule` |
|
||||
| `--surface` | `surface` | `bg-surface` |
|
||||
| `--surface-hi` | `surface-hi` | `bg-surface-hi` |
|
||||
| `--patina-wash` | `patina-wash` | `bg-patina-wash` |
|
||||
| `--patina-dim` | `patina-dim` | `border-patina-dim` `bg-patina-dim` |
|
||||
| `--gilt-dim` | `gilt-dim` | `border-gilt-dim` `text-gilt-dim` `bg-gilt-dim` |
|
||||
| `--gilt-faint` | `gilt-faint` | `bg-gilt-faint` |
|
||||
| `--cinnabar-wash` | `cinnabar-wash` | `bg-cinnabar-wash` |
|
||||
| `--cinnabar-dim` | `cinnabar-dim` | `border-cinnabar-dim` |
|
||||
| `--glass` | `glass` | `bg-glass` |
|
||||
| `--glass-border` | `glass-border` | `border-glass-border` |
|
||||
| `--overlay-hover` | `overlay-hover` | `bg-overlay-hover` |
|
||||
|
||||
**未映射**(用 `bg-[var(--x)]`):`--face-sheen` `--sweep-gradient` `--face-in-top` `--face-in-bot` `--shadow` `--aurora-*` `--code-*` 以及 SVG 特有的 `--raw-*`
|
||||
|
||||
#### 例外清单
|
||||
|
||||
以下变量是复合 CSS 值或动画属性,**必须**用内联 style,不能抽象为 Tailwind 类:
|
||||
|
||||
- 渐变/光照效果:`--face-sheen` `--sweep-gradient` `--face-in-top` `--face-in-bot`
|
||||
- 阴影:`--shadow`
|
||||
- 背景光晕:`--aurora-*`
|
||||
- 动态 `color-mix()` 表达式
|
||||
|
||||
> 规则生效日:此约定写入后,新代码必须遵守。存量代码暂不回溯,待 P0/P1 功能补齐后再做 codemod 迁移。
|
||||
|
||||
- 统一通过 `lib/api`(`client.ts` 出口)调用后端,禁止在组件内散落 fetch
|
||||
- SSE 连接封装在 `lib/sse-client.ts`,不在组件内直接实例化 EventSource
|
||||
- 所有 API 调用必须有 TypeScript 类型定义和错误处理(`ApiError` 统一承载 code/trace_id)
|
||||
@@ -220,7 +85,6 @@ pnpm test # Vitest 测试
|
||||
|
||||
- 必须同时通过 lint、type-check 与格式检查才能提交
|
||||
- Husky + lint-staged 已配置 `pre-commit` 钩子:对暂存文件自动跑 ESLint --fix + Prettier,再整体 type-check;不通过则阻止提交(临时跳过用 `git commit --no-verify`)
|
||||
- 注:本仓库 git 根在父目录(monorepo),`prepare` 脚本以 `cd .. && husky frontend/.husky` 安装钩子,`core.hooksPath` 指向 `frontend/.husky/_`
|
||||
|
||||
## 绝对禁止事项
|
||||
|
||||
|
||||
Reference in new issue
Block a user