# 编码规则(Coding Rules) > 每次改代码前完整读取。本文件是实现硬约束;产品范围以 [`02-requirements.md`](02-requirements.md) 为准,模块事实以 [`04-architecture.md`](04-architecture.md) 和 [`api.md`](api.md) 为准。 ## 0. 黄金法则 1. **不臆造**:字段、平台规则、路径、依赖和接口必须查仓库事实。 2. **一次一事**:只实现当前 `DOING` 任务,不夹带 Backlog 和无关重构。 3. **依赖向内**:UI 和基础设施依赖 application/domain,domain 不依赖框架。 4. **先验证风险**:Gio 组件、Chrome profile 和图片合成闸门未通过前,不大规模铺业务页面。 5. **副作用可控**:进程、文件、数据库、剪贴板和恢复操作必须可观察、可失败、可追踪。 6. **完成有证据**:没有测试、构建和任务要求的 smoke,不得标记 `DONE`。 ## 1. 动手前 - 按 `vision -> requirements -> tech-stack -> architecture -> api/routes -> tasks -> current-state` 建立上下文。 - 找到任务对应的需求 ID、服务合约和页面。 - 检查是否已有可复用 package、component、repository 和测试夹具。 - 运行标准基线并记录当前失败;基线坏时先处理基线。 - 查看工作区已有改动,保留不属于本任务的用户修改。 - 若任务会改变第三方平台数据、删除用户文件、保存秘密或扩大自动化范围,先停止并要求产品决策。 ## 2. Go 规则 - package 名短小、全小写、单数优先,不使用 `utils`、`common`、`helpers` 作为无边界杂物包。 - 公开标识符只在跨包合约需要时导出;先使用小接口,接口由消费者定义。 - 所有 I/O 方法接收 `context.Context`,不把 context 存在 struct 中。 - 错误必须包装上下文并保留 `errors.Is/As` 可判定性,不比较底层错误字符串。 - 不使用 `panic` 处理可预期业务错误;启动期不可恢复错误可以返回到 `main` 后记录并退出。 - 不忽略返回值,不用空 `recover`,不在 library code 中 `os.Exit`。 - 时间通过注入的 Clock 获取,测试不依赖真实等待。 - 金额不用 `float64` 持久化;用最小货币单位整数,比例/汇率用可精确解析表示。 - 路径用 `filepath`,URL 用 `net/url`,CSV/XLSX 用结构化解析器,不手工拆字符串。 - 代码必须通过 `gofmt`;注释解释边界和原因,不复述代码。 ## 3. 分层规则 - `internal/domain`:纯规则、实体和值对象,不导入 Gio、driver、Windows API。 - `internal/application`:用例编排和稳定错误码,不写 SQL、不布局 UI。 - `internal/infrastructure/sqlite`:repository 和 migration,不出现 UI 文案。 - `internal/platform`:进程、路径、剪贴板和文件副作用,不决定业务优先级。 - `internal/ui`:页面状态和展示,不直接打开数据库或启动进程。 - 不通过全局变量跨层共享数据库、页面状态或 process registry。 - 新增跨层调用前先更新 `api.md`;不得为绕过接口而从 UI 直接引用 concrete repository。 ## 4. Gio 规则 - widget、clickable、editor、list、drag 和页面状态必须跨 frame 持久存在。 - layout 函数不得执行 SQL、文件读写、大图解码、网络请求、`Process.Wait` 或阻塞 channel receive。 - 用户动作只提交 intent;异步结果通过 event channel 返回并调用 window invalidate。 - 每个异步操作有 busy、success、error 和必要的 cancel 状态。 - 同一按钮请求进行中防重复提交。 - 页面切换保留列表筛选和滚动状态;销毁页面时取消所属 context。 - 固定画布、表格、工具栏和图标按钮设置稳定约束,动态文字不得挤压相邻控件。 - 关键状态不能只用颜色;图标按钮必须有 tooltip/可访问名称。 - 项目内组件只在存在真实复用时抽取,不创建通用 UI DSL。 - UI 自动测试不稳定时可以保留手工 smoke,但 domain/application 行为必须有自动测试。 ## 5. SQLite 规则 - schema 只通过按序 migration 变化,已经提交或发布的 migration 不修改。 - 每个连接启用外键和 busy timeout。 - 多表写入、导入提交和计数更新使用事务。 - repository 查询显式列名,不使用 `SELECT *`。 - nullable 数据使用明确类型,不用魔法空字符串混淆“未填写”和有效值,除非 schema 已定义为空字符串语义。 - 列表查询有稳定排序、分页边界和必要索引。 - 唯一约束、外键约束和 busy 错误映射到稳定应用错误码。 - 测试使用临时目录的真实 SQLite,不共享开发数据库。 - 不把密码、Cookie、token、代理秘密或图片二进制写进数据库。 - 备份恢复前后执行完整性检查;失败必须保留可回滚旧库。 ## 6. Chrome 与进程规则 - 只能用 `exec.CommandContext` 或经审查的等价 API 和独立参数启动,不使用 `cmd /c`、PowerShell 字符串或 shell 拼接。 - Chrome executable、profile 目录和目标 URL 分别校验。 - profile 必须是绝对规范路径;managed path 必须位于配置根目录内。 - 不使用默认用户 Chrome profile 作为 ShopHelm managed profile。 - 同一 profile 占用时返回 `profile_in_use`,不尝试强制解锁或删除 lock 文件。 - 不在命令行传密码、Cookie 或代理认证信息。 - 不默认加 `--remote-debugging-port`、规避检测或安全降级参数。 - 进程退出必须释放 registry;应用重启后不得相信陈旧 PID。 - 应用退出默认不杀用户打开的 Chrome;需要关闭能力时必须单独立项和确认。 - 测试参数生成时用 fake runner,真实 Chrome smoke 只能使用测试 profile 和非生产账号。 ## 7. 文件、导入和图片规则 - 任何用户路径先做存在性、文件类型、权限和规范化检查。 - 读取外部文件不修改源文件。 - 写入先落同目录临时文件,成功 close/sync 后原子改名。 - 默认 `overwrite=false`;即使允许覆盖,也绝不能覆盖底图或叠加图。 - 图片解码设置尺寸和内存上限,防止异常大文件耗尽内存。 - 预览和导出共用 `CompositionPlanner`,不得复制位置/缩放公式。 - Gio framebuffer 截图不能作为正式图片输出。 - PNG alpha 和 JPG 背景有固定测试。 - CSV/XLSX 先 preview 后 commit;文件 fingerprint 改变时拒绝提交。 - 导入错误包含行号、字段和原因;不静默修复未知值。 - 删除数据库素材关联默认不删除物理文件。 ## 8. 安全、隐私与合规 - 真实账号、密码、token、Cookie、买家隐私、私有 URL 不进入代码、文档、日志、截图或测试数据。 - 账号标识只用于人类识别;日志中仍应最小化或脱敏。 - 不实现绕验证码、绕风控、反指纹、刷单、刷评、批量抓取和未经确认的批量消息。 - 不把 `user-data-dir` 描述成防关联功能。 - 平台规则变化必须以官方来源为准,记录链接、访问日期和影响。 - 未来自动化默认具备 dry-run、明确预览、人工确认、速率边界、审计和取消。 - 操作日志记录 action、entity、result、error code,不记录完整话术、买家详情或命令秘密。 ## 9. 依赖规则 - 新依赖前检查标准库和已引入依赖能否满足。 - 在 `03-tech-stack.md` 记录用途、版本策略和引入任务。 - 运行 `go mod tidy` 后审查直接和间接依赖变化。 - 不引入 ORM、Web 框架、嵌入浏览器、依赖注入框架或第二套图片库,除非新任务明确批准。 - `gioui.org/x/component` 只有 T-101 通过后才允许保留。 - 依赖升级单独提交,不与业务功能混在同一任务。 ## 10. 测试规则 最低自动验证: ```powershell go test ./... go vet ./... go build -o build/shophelm.exe ./cmd/shophelm ``` 按改动增加: - 并发和共享状态:`go test -race ./...`,若目标工具链不支持则记录真实原因。 - migration/repository:临时数据库从空库迁移,运行 CRUD、约束和重开测试。 - Chrome:参数单测、fake process 生命周期、Windows 真实 Chrome smoke。 - 图片:固定夹具 pixel/golden 测试、原图校验和、格式和失败清理。 - 导入:CSV/XLSX round-trip、错误行、fingerprint 和事务测试。 - 备份:完整性、恢复成功、损坏备份、替换失败回滚测试。 - Gio:对应页面手工 smoke,记录窗口尺寸、动作和观察结果。 测试禁止: - 为绿灯删除断言、降低验收或跳过失败用例。 - 使用真实用户数据库、真实 Chrome profile 或真实店铺凭证。 - 依赖测试执行顺序或固定本机绝对路径。 ## 11. 文档与提交 - 需求变化先改 `02-requirements.md`,再改代码。 - schema 或 service 合约变化同步 `04-architecture.md` 和 `api.md`。 - 页面变化同步 `routes.md`。 - 版本、依赖和命令变化同步 `03-tech-stack.md`、`00-ai-start-here.md`、`current-state.md` 和 `init.*`。 - 每轮实际命令和结果只追加到 `progress.md`。 - 提交只包含当前任务相关文件;不重写或撤销用户无关改动。 - 提交信息建议:`T-XXX: imperative summary`。 ## 12. 完成定义 任务标记 `DONE` 前逐项确认: - [ ] 需求 ID 和任务验收全部满足。 - [ ] 代码遵守模块和副作用边界。 - [ ] 自动测试、vet、build 通过。 - [ ] 任务要求的手工 smoke 已执行并记录环境。 - [ ] 没有真实秘密、隐私或生产路径进入变更。 - [ ] 没有无关重构或 Backlog 功能。 - [ ] 相关文档、任务状态和 current state 已同步。 - [ ] `progress.md` 有真实验证证据。 - [ ] `clean-state-checklist.md` 已通过。 ## 13. 绝不 - 绝不明文保存密码。 - 绝不删除或强制解锁 Chrome profile。 - 绝不覆盖原始图片作为默认行为。 - 绝不在 Gio frame 中等待 I/O。 - 绝不把数据库 `running` 字段当真实进程状态。 - 绝不静默吞掉导入、恢复或导出中的部分失败。 - 绝不因为任务困难就跳过高风险闸门。