104 lines
5.4 KiB
Markdown
104 lines
5.4 KiB
Markdown
# AGENTS.md — 帆幕(Fanmu)总览
|
||
|
||
面向 AI 编码代理的仓库导览。修改任何代码前,先读本文件与目标子包的 `AGENTS.md`。
|
||
|
||
## 项目是什么
|
||
|
||
**帆幕(Fanmu)**:私有影音库 · 弹幕观影 · 网盘挂载。本仓库为**产品仓**,业务代码进入既有分层。视觉基线见 `DESIGN.md`。
|
||
|
||
技术栈:Astro 7(SSR)+ React 19 islands · tRPC v11 · Drizzle ORM + Turso/libSQL · Tailwind CSS 4 · TypeScript 7 · Biome · Yarn 4 workspaces + Turbo。
|
||
|
||
## 模块地图
|
||
|
||
| 包 | 职责 | 依赖 |
|
||
|----|------|------|
|
||
| `@app/types` | Zod 入参 schema + 共享输出类型 | zod |
|
||
| `@app/models` | Drizzle 表定义(唯一 schema 源) | drizzle-orm |
|
||
| `@app/db` | libSQL/Turso 客户端单例 + drizzle-kit | models |
|
||
| `@app/dao` | 数据访问层(`userDao` / `mountDao` / `mediaItemDao` 等) | db, models |
|
||
| `@app/trpc` | tRPC 路由 + service 业务逻辑(调用 DAO) | types, dao |
|
||
| `@app/web` | Astro 前端 + React islands + 本地 tRPC HTTP 适配 | trpc, types, design-tokens, seo-geo, i18n, ui |
|
||
| `@app/ui` | shadcn 风格基础 UI 组件(源码直出 + Storybook) | design-tokens, react (peer) |
|
||
| `@app/design-tokens` | 共享 CSS 设计令牌(`tokens.css`) | — |
|
||
| `@app/seo-geo` | SEO/GEO 纯函数(meta、sitemap、JSON-D、llms.txt) | zod, schema-dts, escape-html, fast-xml-builder, serialize-javascript, mdast-util-to-markdown |
|
||
| `@app/i18n` | 文案与 locale 纯函数(zh-CN / en、t()、Accept-Language) | — |
|
||
| `@app/adsense` | AdSense 脚本加载 + `AdSlot` React 组件 | react (peer) |
|
||
| `@app/docs` | 产品文档站(VitePress,中文根路径 + 英文 `/en`) | —(仅 vitepress) |
|
||
|
||
依赖方向(只允许向下):
|
||
|
||
```
|
||
web ──► trpc ──► dao ──► db ──► models
|
||
│ │ │
|
||
│ └─────────────────┴──► types
|
||
├──► design-tokens
|
||
├──► seo-geo
|
||
├──► i18n
|
||
├──► adsense
|
||
└──► ui
|
||
|
||
docs(独立,不依赖上述业务包)
|
||
```
|
||
|
||
禁止循环依赖。跨包只通过 `package.json` 的 `exports` 入口引用,不要 deep import。
|
||
|
||
## 目录约定
|
||
|
||
- 源码在各包 `src/`;构建产物在 `dist/`(git 忽略,勿手改)。
|
||
- 环境变量模板见 `.env.example`:`TURSO_DATABASE_URL`、`TURSO_AUTH_TOKEN`、`PUBLIC_SITE_URL`。
|
||
- 根 `.env` 由 `packages/db/drizzle.config.ts` 与 `packages/db/scripts/seed.ts` 手动加载(monorepo 下工具不会自动读根 env)。
|
||
- **分层不跳层**:业务实体按 types → models → dao → trpc → web 落地;领域逻辑进 service,SQL 进 dao。
|
||
- `e2e/`:Playwright 端到端测试(配置在根 `playwright.config.ts`),不是 workspace 包。
|
||
- `app/docs/`:VitePress 文档站源码(`.vitepress/` 配置 + `guide/` 中文 + `en/guide/` 英文)。
|
||
|
||
## 常用命令
|
||
|
||
```bash
|
||
yarn install
|
||
yarn typecheck # 全仓 typecheck
|
||
yarn lint # Biome
|
||
yarn build # 全仓 build(依赖拓扑)
|
||
yarn build:web # 仅 @app/web + 上游依赖闭包(日常/CI 更快)
|
||
yarn dev:web # Astro :4321
|
||
yarn dev:api # 独立 tRPC :4000(web 内嵌 /api/trpc 时通常不需要)
|
||
yarn docs:dev # VitePress 文档站
|
||
yarn docs:build
|
||
yarn test:e2e # Playwright(自动起 webServer)
|
||
yarn db:generate # Drizzle 迁移生成
|
||
yarn db:push # 推 schema
|
||
yarn db:seed # 初始化默认管理员(幂等)
|
||
yarn db:studio
|
||
yarn storybook # @app/ui Storybook :6006
|
||
```
|
||
|
||
改某个包时可先 `yarn workspace @app/<name> typecheck`。
|
||
|
||
## 全局约定(必须遵守)
|
||
|
||
1. **TypeScript 很严**:`strict` + `noUncheckedIndexedAccess` + `exactOptionalPropertyTypes` + `noPropertyAccessFromIndexSignature`。可选属性传 `undefined` 时类型要写 `?: T | undefined`。
|
||
2. **ESM only**(`"type": "module"`)。源码内相对 import 带 `.js` 后缀(TS bundler 解析)。
|
||
3. **格式化/静态检查**:Biome(2 空格、行宽 100)。不要引入 ESLint/Prettier。
|
||
4. **校验**:对外输入用 Zod 4,定义放在 `@app/types`,router/service 共用。
|
||
5. **数据库模型**只放 `@app/models`;**查询/SQL** 只放 `@app/dao`;`@app/db` 只建连接单例,不建表、不含业务规则。
|
||
6. **UI**:设计令牌从 `@app/design-tokens` 引入;组件优先用 `@app/ui`(shadcn 风格,源码在 `packages/ui`)+ `cn()`。视觉遵循 `DESIGN.md`。
|
||
7. **构建顺序**:改 `types`/`models` 后需先 build 上游,再让下游 typecheck(Turbo `dependsOn: ["^build"]` 已配置)。
|
||
8. **注释**:只写非显而易见的 WHY;默认不写注释。
|
||
9. **新增业务实体**:按 types → models → dao → trpc → web 分层落地,不要跳层。
|
||
|
||
## 各包入口
|
||
|
||
细节见各包 `AGENTS.md`:
|
||
|
||
- [packages/types/AGENTS.md](packages/types/AGENTS.md)
|
||
- [packages/models/AGENTS.md](packages/models/AGENTS.md)
|
||
- [packages/db/AGENTS.md](packages/db/AGENTS.md)
|
||
- [packages/dao/AGENTS.md](packages/dao/AGENTS.md)
|
||
- [packages/trpc/AGENTS.md](packages/trpc/AGENTS.md)
|
||
- [app/web/AGENTS.md](app/web/AGENTS.md)
|
||
- [packages/design-tokens/AGENTS.md](packages/design-tokens/AGENTS.md)
|
||
- [packages/seo-geo/AGENTS.md](packages/seo-geo/AGENTS.md)
|
||
- [packages/i18n/AGENTS.md](packages/i18n/AGENTS.md)
|
||
- [packages/adsense/AGENTS.md](packages/adsense/AGENTS.md)
|
||
- [packages/ui/AGENTS.md](packages/ui/AGENTS.md)
|
||
- [app/docs/AGENTS.md](app/docs/AGENTS.md)
|