9.9 KiB
9.9 KiB
编码规则(Coding Rules)
每次改代码前完整读取。本文件是实现硬约束;产品范围以
02-requirements.md为准,模块事实以04-architecture.md和api.md为准。
0. 黄金法则
- 不臆造:字段、平台规则、路径、依赖和接口必须查仓库事实。
- 一次一事:只实现当前
DOING任务,不夹带 Backlog 和无关重构。 - 依赖向内:UI 和基础设施依赖 application/domain,domain 不依赖框架。
- 先验证风险:Gio 组件、Chrome profile 和图片合成闸门未通过前,不大规模铺业务页面。
- 副作用可控:进程、文件、数据库、剪贴板和恢复操作必须可观察、可失败、可追踪。
- 完成有证据:没有测试、构建和任务要求的 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. 测试规则
最低自动验证:
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字段当真实进程状态。 - 绝不静默吞掉导入、恢复或导出中的部分失败。
- 绝不因为任务困难就跳过高风险闸门。