app-template/AGENTS.md

104 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)