Co-Authored-By: OpenAI Codex <codex@openai.com> Co-authored-by: Cursor <cursoragent@cursor.com>
131 lines
6.1 KiB
Markdown
131 lines
6.1 KiB
Markdown
# AGENTS.md
|
||
|
||
NeoZQYY Monorepo 顶层规则。子模块详细规范见各自 `apps/*/AGENTS.md`、`docs/database/`、`apps/etl/connectors/feiqiu/AGENTS.md`。
|
||
|
||
## 语言(强制)
|
||
|
||
始终中文:对话、解释、代码注释、commit message(中文描述 + 英文 Co-Authored-By 签名)、PR、审计、文档、错误日志。
|
||
保持原文:变量/函数/类名、第三方 API 字段名、CLI 命令、技术术语。
|
||
禁止英文段落或英文标题。
|
||
|
||
## CLI / Shell 中文处理
|
||
|
||
- Python `encoding="utf-8"` / `PYTHONUTF8=1`;CSV 给 Excel 用 `utf-8-sig`;PowerShell/Node 不依赖系统 ANSI。
|
||
- 终端中文乱码时,不当作事实;先调编码重跑,或说明"终端编码异常,结果需复核"。
|
||
- Shell 路径含中文/空格/特殊字符必须加引号;复杂中文输出走脚本或结构化 API。
|
||
|
||
## 项目概览
|
||
|
||
NeoZQYY = 台球门店全栈数据平台。多门店隔离(`site_id` + RLS),中文领域语言,CNY,金额 `numeric(2)`。
|
||
|
||
| 目录 | 用途 |
|
||
|------|------|
|
||
| `apps/etl/connectors/feiqiu/` | 飞球 ETL:API → ODS → DWD → DWS |
|
||
| `apps/backend/` | FastAPI(JWT 双认证 + WebSocket + AI) |
|
||
| `apps/miniprogram/` | 微信小程序 C 端(Donut + TDesign) |
|
||
| `apps/admin-web/` | 系统管理后台(开发/运维视角,操作 ETL 库) |
|
||
| `apps/tenant-admin/` | 租户管理后台(门店管理员视角,操作业务库) |
|
||
| `apps/demo-miniprogram/` | MOCK 标杆小程序(样式校对,禁改) |
|
||
| `apps/mcp-server/` | MCP Server(PostgreSQL 只读) |
|
||
| `packages/shared/` | 跨项目共享包 |
|
||
| `db/` | DDL(`schemas/`)+ 迁移 + FDW |
|
||
| `tools/` | 通用工具 |
|
||
| `scripts/ops/` | 日常运维脚本 |
|
||
|
||
技术栈:Python 3.10+ uv workspace、React+Vite+AntD、PostgreSQL 四库(`etl_feiqiu`/`test_etl_feiqiu`/`zqyy_app`/`test_zqyy_app`,DSN `PG_DSN`/`APP_DB_DSN`)。配置分层 `.env` < `.env.local` < env < CLI。
|
||
|
||
## 数据库
|
||
|
||
- 六层 Schema:`meta` → `ods` → `dwd` → `core` → `dws` → `app`(RLS 视图)
|
||
- 跨库:`zqyy_app` 通过 FDW 只读映射 `etl_feiqiu.app`
|
||
- RLS:`site_id` + `app.current_site_id` 会话变量
|
||
- **RLS 双 Schema 踩坑**:DWS/DWD 表的 RLS 视图必须同时建在 `dws` 和 `app` schema,后端走 `app.v_*`。只建 `dws` 会让后端查询失败。回滚需逆序 DROP。
|
||
|
||
## 飞球数据规范(速查)
|
||
|
||
- `consume_money` 禁止直接计算 → 用 `items_sum` 拆分字段
|
||
- 取数优先级:DWS > DWD > 禁止 ODS
|
||
- 参考优先级:DWD-DOC > DWS 权威规范 > BD 手册 > ETL 任务文档 > DDL 注释
|
||
- `_archived/` 目录禁止读取或参考
|
||
- 完整规则见 `apps/etl/connectors/feiqiu/AGENTS.md`
|
||
|
||
## 文件归属
|
||
|
||
| 类型 | 位置 |
|
||
|------|------|
|
||
| 模块内文档/测试/脚本 | 模块内 `docs/`、`tests/`、`scripts/` |
|
||
| 跨模块文档 | 根 `docs/` |
|
||
| Monorepo 守护测试 | 根 `tests/` |
|
||
| 日常运维脚本 | `scripts/ops/` |
|
||
| 通用工具 | `tools/`(按类型分子目录) |
|
||
| 审计记录 | 根 `docs/audit/changes/<YYYY-MM-DD>__<slug>.md`(禁止写子模块) |
|
||
| 数据库文档 | 根 `docs/database/` |
|
||
| 归档/待删 | `_DEL/`(保持原路径,定期清理) |
|
||
|
||
`docs/audit/audit_dashboard.md` 由 `scripts/audit/gen_audit_dashboard.py` 生成,勿手动编辑。
|
||
|
||
## 编码前需求审问(强制)
|
||
|
||
新建功能/接口、重构、多模块联动、需求模糊时:
|
||
1. 不立即动手,先提问循环(每轮 3-5 个问题)
|
||
2. 必问:用户角色、核心操作、数据写入/展示/来源、错误/成功反馈、认证权限、存储(哪库/新表)、终端适配、边界(并发/幂等/超时)
|
||
3. 输出「需求确认摘要」,用户确认后实施
|
||
|
||
例外:用户说"直接改/跳过审问"、Bug 有明确复现步骤、纯格式调整、已有 spec
|
||
|
||
## 逻辑改动前置调研(强制)
|
||
|
||
任何逻辑改动(ETL/业务规则/API/数据模型/前端交互):
|
||
1. 委托 Explore 子代理调研:目标模块、`docs/audit/changes/` 历史、调用方/被调用方、数据流向、影响范围
|
||
2. 输出「改动前上下文摘要」,用户确认后实施
|
||
|
||
流程:需求审问 → 确认 → 前置调研 → 确认 → 编码
|
||
|
||
例外:纯格式/注释/文档修改、用户说"直接改/跳过调研"、新建独立文件
|
||
|
||
## 改动后验证(强制)
|
||
|
||
1. 运行相关测试(单元/集成/lint),不能运行需说明原因
|
||
2. 输出 diff 摘要(文件清单 + 每个改动要点)
|
||
3. 列出未覆盖风险点(未测路径、副作用、需人工验证场景)
|
||
|
||
例外:纯格式/文档/注释、用户说"跳过验证"
|
||
|
||
## 数据库 Schema 变更
|
||
|
||
修改 PostgreSQL schema(迁移/DDL/表定义/ORM)时,必须同步 `docs/database/`:变更说明、兼容性影响、回滚策略、≥3 条校验 SQL。
|
||
|
||
## 测试环境
|
||
|
||
1. `load_dotenv` 加根 `.env`;必需变量缺失立即报错,禁止静默回退空串
|
||
2. cwd 与正式一致:ETL → `apps/etl/connectors/feiqiu/`、后端 → `apps/backend/`
|
||
3. 配置走 `AppConfig.load()`,不得为测试构造简化配置
|
||
4. 用测试库(`TEST_DB_DSN`),禁止连正式库
|
||
5. 属性测试分组执行(`-k` 筛选),禁止一次性全跑;hypothesis 默认 `max_examples=100`
|
||
|
||
例外:用户指定简化环境、纯单元测试用 FakeDB/FakeAPI、`--dry-run` CLI 验证
|
||
|
||
## 脚本规范
|
||
|
||
- 复杂操作写 Python 脚本,避免复杂 shell
|
||
- 一次性运维 → `scripts/ops/`;模块专属 → 模块内 `scripts/`
|
||
- `scripts/ops/` 不在 uv workspace 内,导入 ETL 纯函数用 `importlib.util` + stub(参考 `scripts/ops/backfill_finance_area_daily.py`)
|
||
|
||
## 子代理
|
||
|
||
- 委托:批量读 ≥3 文件、大范围搜索、不熟悉模块探索、多步 shell
|
||
- 主流程直接处理:单文件、单命令、小范围精确搜索
|
||
|
||
## 审计
|
||
|
||
任何逻辑改动必须可追溯、可验证、可回滚。
|
||
|
||
完成一轮后用 `/audit`:
|
||
1. `python scripts/audit/prescan.py` 预扫描(自动识别+分类+合规,零 token)
|
||
2. 补充语义上下文(从对话提取每变更原因)
|
||
3. 委托子代理写 `docs/audit/changes/`
|
||
4. 补齐文档同步
|
||
5. `python scripts/audit/gen_audit_dashboard.py` 刷新一览表
|
||
|
||
`prescan.py --files` 参数:git status 含大量历史未提交时,只传本次会话文件列表。
|