新增(Codex 起草,本次纳入并校对): - AGENTS.md:仓库级 AI 强约束入口 - docs/00-ai-start-here.md:AI 开发入口与导航 - docs/api.md:账号/生词本/进度 API 合约草案 - docs/routes.md:go-app 页面路由与组件归属 - docs/current-state.md:当前实现状态 补充与对齐: - 验证命令补 bash(WSL/Linux 为主,PowerShell 为备):00-ai-start-here、AGENTS - 04-architecture:新增第六节"项目结构(包布局)"+ 3.2 建表 SQL 草案 - docs/README 导航补 06-tasks;CLAUDE 目录树补 AGENTS/scripts/design_mockups - 00-ai-start-here 去除已过时的"需要补齐"段 - 06-tasks:Phase 2/3/4/5 交叉引用 api.md / routes.md / 包布局 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
100 lines
6.4 KiB
Markdown
100 lines
6.4 KiB
Markdown
# 编码规则(Coding Rules)
|
||
|
||
> **每次写代码前先读完本文件。** 这是让 AI 不跑偏、代码质量稳定的"宪法"。
|
||
> 与技术细节冲突时,以 [技术栈](03-tech-stack.md) / [架构设计](04-architecture.md) 和 `CLAUDE.md` 的事实为准;与"该不该做"冲突时,以 [需求](02-requirements.md) 为准。
|
||
|
||
## 0. 黄金法则(记住这 5 条就够稳)
|
||
|
||
1. **不臆造**:数据字段、文件、接口、依赖,不确定就去查 / 去问,绝不凭印象编。
|
||
2. **守范围**:只做被要求的事,MVP 只做 ep1–17 的 P0,不顺手加 V2/V3。
|
||
3. **照架构**:用既定技术栈(go-app / net/http / SQLite),不擅自引入新框架或依赖。
|
||
4. **小步改**:一次只解决一个问题,不夹带无关重构、不整文件重排版。
|
||
5. **可验证**:改完必须能构建、过校验、对得上验收标准,再说"完成"。
|
||
|
||
## 1. 动手前
|
||
|
||
- 按链路确认:`vision`(方向)→ `requirements`(要什么 + 验收标准)→ `tech-stack` + `architecture` + `CLAUDE.md`(怎么做)。
|
||
- 找到对应的**验收标准**(02-requirements 第五节),写之前就知道"怎么算做对"。
|
||
- 需求含糊、或一个改动会偏离原则 / 架构时——**先问,不要猜着做**。
|
||
- 动手前先找现有的函数 / 组件 / 工具能不能复用,**别重复造轮子**。
|
||
|
||
## 2. 事实来源纪律(最容易踩的坑)
|
||
|
||
- **内容数据只信 `family-album-usa/episodes.json` 的真实结构**:
|
||
- `line` 只有 `{ t, en }`——**没有 `zh`**,不要读、不要假设有行级中文。
|
||
- 三级是 `episode → act → line`,不是 `course/lesson`。
|
||
- `audio` 字段是**服务路径** `/family-album/audio/u{集}{幕}.mp3`,磁盘在 `family-album-usa/audio/`,**必须做映射**,不能当文件路径直接用。
|
||
- **不要为 ep18–26 补造音频或假数据**——这 9 集真的没音频,MVP 不依赖它们。
|
||
- **改了 `episodes.json` 或它的结构,必须**:① 跑 `python3 scripts/validate_episodes.py` 过校验;② 同步更新 [架构设计](04-architecture.md) 第三节 + `CLAUDE.md` 的 schema 段(防文档漂移)。
|
||
- `notion_docs/` 和 `*.bak` 是只读存档,**不读作事实、不修改、不删除**。
|
||
|
||
## 3. 范围纪律(防镀金 / 防跑题)
|
||
|
||
- MVP 范围 = **ep1–17 + 6 个 P0 功能**(课程列表 / 播放 / 逐句同步 / 生词本 / 账号同步 / 离线)。其余一律不做。
|
||
- 看到"顺便也能做 X"的冲动先停下:X 在 requirements 里是 P0 吗?不是就**不做**,最多记成 TODO。
|
||
- 不做需求里明确的非目标:视频、行级中英对照、社交、AI 口语评分。
|
||
- 不为"将来可能用到"提前抽象(多教材结构架构已预留,按现状写即可,别过度设计)。
|
||
|
||
## 4. 架构纪律
|
||
|
||
- **技术栈固定**:以 [技术栈](03-tech-stack.md) 为准(前端 go-app、后端 `net/http`、数据库 SQLite)。要加任何第三方依赖,**先说明理由并征求同意**。
|
||
- **技术栈以 [技术栈](03-tech-stack.md) 为准**。若未来新增标"待定"的栈项,不要在代码里擅自选定;先在文档中决策,再实现。
|
||
- **内容数据 vs 用户数据分清**:教材内容(episodes.json)前端直接读、**不入库**;SQLite **只存**用户态(users / progress / vocab)。别把课程内容写进数据库。
|
||
- 把浏览器互操作(`syscall/js`、Audio API)**封装成可复用组件**,不要散落在各处业务代码里。
|
||
- 进度 / 生词本的字段以 [架构设计](04-architecture.md) 第 3.2 节为准(按 `episode_id + act` 定位,不是抽象 lesson_id)。
|
||
|
||
## 5. Go / go-app 代码规范
|
||
|
||
- 提交前过 `gofmt` 和 `go vet`;构建用 `GOOS=js GOARCH=wasm go build`(前端)/ 普通 `go build`(后端)。
|
||
- **错误必须处理**:不忽略 `err`、不用 `_` 吞错;正常流程里不 `panic`(初始化致命错误除外)。
|
||
- 包 / 文件按职责划分,对照 [架构设计](04-architecture.md) 第二节的前后端职责组织(列表 / 播放器 / 字幕同步 / 生词本 / API 封装)。
|
||
- 控制 wasm 体积:不引重型库;公共逻辑抽函数,避免复制粘贴。
|
||
- 不留 `TODO` 就当没事——要么实现,要么在 PR / 回复里**明确标注未完成项**。
|
||
|
||
## 6. 字幕同步专项(核心功能,最易出 bug)
|
||
|
||
- 定位当前句:用音频 `currentTime` 在该 act 的 `lines[].t` 上**二分查找**,不要线性扫每帧。
|
||
- **时间戳可能非严格递增**(已知 ep18/ep25 有倒退):定位逻辑要对乱序 / 相等 `t` 容错,不能假设严格单调。
|
||
- 点句跳转:seek 到该句 `t`;高亮的句子必须和正在播放的一致(验收标准里有这条)。
|
||
- `hasAudio=false` 的 act:没有音频可同步,UI 要**优雅降级**(只显示文本 / 标注无音频),不要崩。
|
||
|
||
## 7. 命名与风格
|
||
|
||
- 代码标识符用**英文**;UI 文案、注释、文档用**中文**(与项目现状一致)。
|
||
- 写新代码前先看邻近代码的命名、缩进、注释密度,**与之保持一致**,不要自带一套风格。
|
||
- 注释解释"为什么",不复述"做了什么"。
|
||
|
||
## 8. 改完之前("完成"的定义)
|
||
|
||
逐项过,全绿才算完成:
|
||
|
||
- [ ] 能构建通过(前端 wasm / 后端 二进制)
|
||
- [ ] 碰过内容数据就跑了 `validate_episodes.py`,0 ERROR
|
||
- [ ] 对得上相关功能的**验收标准**
|
||
- [ ] 没有夹带无关改动、没有整文件重排版
|
||
- [ ] 涉及数据结构变化的,文档(tech-stack / architecture / CLAUDE.md)已同步
|
||
- [ ] 如实汇报:跑了什么、结果如何;测试失败就说失败,别粉饰
|
||
|
||
Windows PowerShell 常用验证命令:
|
||
|
||
```powershell
|
||
$env:GOOS='js'; $env:GOARCH='wasm'; go build -o app.wasm
|
||
go build
|
||
go vet ./...
|
||
python scripts/validate_episodes.py
|
||
```
|
||
|
||
`validate_episodes.py` 仅在改动内容数据或 schema 时必跑。
|
||
|
||
## 9. 绝不
|
||
|
||
- 绝不把密钥 / token 写进代码或提交(用环境变量 / 配置)。
|
||
- 绝不删除或覆盖 `notion_docs/`、`*.bak`、`episodes.json`(改它先靠 `fix_episodes.py` 备份)。
|
||
- 绝不为了让测试 / 校验通过而改判据、删用例、注释掉检查。
|
||
- 绝不引入版权存疑的素材或内容。
|
||
- 绝不在没说明的情况下"顺手"重构、改公共接口、升级依赖。
|
||
|
||
## 10. 拿不准就问
|
||
|
||
宁可停下来问一句,也不要猜着写半天最后方向错了。问题要具体,给出你倾向的选项和理由。
|