# global-rules # ========================= # 1. 架构与代码规范(强约束) # ========================= - 严格分层,不允许跨层调用: 后端:Controller → Service → Mapper → Entity 前端:pages → components → api → utils → store - 命名统一: DB:snake_case Java:camelCase + PascalCase类 Vue组件:PascalCase 权限:module:feature:action(必须与sys_menu一致) - 代码必须具备可维护性: - 不允许过度抽象 - 不允许无需求扩展 - 禁止 magic number(必须常量化) - 注释规则: 关键类/接口必须说明用途 + 入参出参 + 权限 复杂逻辑必须说明业务规则 # ========================= # 2. 数据与接口契约(强一致) # ========================= - 所有数据结构必须来源PRD,不得擅自修改字段/类型 - 接口必须先定义契约(request/response/error code)再实现 - 所有接口必须使用统一Response结构 - 所有异常必须标准化处理,不允许裸奔返回 # ========================= # 3. 安全与系统红线(禁止违规) # ========================= - 禁止修改核心模块(权限/菜单/流程/字典/表单)除非明确PRD授权 - 禁止自动修改数据库结构(必须先输出SQL + 人工确认) - 所有权限必须RBAC校验,不得存在无权限接口 - 多租户数据必须严格隔离,禁止越权查询 - 高危操作必须包含: 二次确认 + 操作日志 + 事务控制 + 逻辑删除(禁止物理删除) - 禁止自动执行终端命令(rm/drop/git push -f等必须人工确认) - 禁止随意升级依赖或新增未确认依赖 # ========================= # 4. 交付闭环(必须执行) # ========================= 每个任务必须完整闭环: 1. 分析问题 / 明确需求 2. 输出修改方案 3. 代码实现(单文件优先) 4. 给出验证方式(test / API / UI) 5. 提交git(Conventional Commits) - 必须生成测试用例(接口 / UI / 边界) - 必须更新相关文档(API / PRD / README) - 超过100行修改必须分段review # ========================= # 5. Git与协作规范 # ========================= - 禁止在main分支开发 - 必须feature分支开发 - 必须pull最新代码后再修改 - 冲突必须人工确认解决方案,不得自动合并 - commit必须符合: feat|fix|docs|refactor(module): description + PRD引用 # ========================= # 6. 禁止占位与假功能 # ========================= - 禁止任何“占位UI / 敬请期待 / 未实现入口” - 未实现功能 = 不渲染入口(菜单/按钮必须真实可执行) - 所有交互必须可追溯到真实 API / Controller / IPC # ========================= # 7. 配置与运行时单一真相(SSOT) # ========================= - 禁止前后端/运行时双轨配置(UI/DB/Runtime必须同源) - 所有可配置项必须具备三件套: 1) 启动参数 2) 注入策略 3) 页面回读验证 - 同一功能面只能有一种实现路径(禁止 JS + Native 双实现并存) # ========================= # 8. 禁止静默失败(P0) # ========================= - 所有 async 必须: - log error - 用户可见错误提示 - 可观测指标记录 - 禁止空 catch / 吞异常 - 桌面端与打包态必须分别验证(dev ≠ production) # ========================= # 9. 接口与数据库契约优先(P0) # ========================= - 必须先定义接口契约(request/response/error code)再编码 - 数据结构必须来自PRD,不得随意新增字段 - JSON字段类型必须统一(禁止同字段多类型) - DB变更必须通过 migration,不允许代码先行 - 查询必须分页,禁止 findAll 默认全表 # ========================= # 10. 前端交互稳定性规则(P1) # ========================= - 弹窗/下拉必须显式控制生命周期(禁止纯CSS状态) - 所有操作必须具备: loading状态 + 防重复提交 + 成功/失败反馈 - 列表操作禁止全量刷新(必须局部更新) - 编辑/授权类操作必须回显数据 # ========================= # 11. 禁止重复实现与碎片化开发(P1) # ========================= - 新功能必须先检查是否已有类似Service/Util - 相似能力必须合并实现,不允许重复造轮子 - 禁止一个功能拆成多个无意义Step往返开发 # ========================= # 12. 运行时与系统稳定性(P1) # ========================= - 所有系统必须具备明确状态机(store/lifecycle) - 启动/退出必须避免异步竞态(必须可追踪) - 探针/重试必须有限制(禁止无限重试/全量扫描) # ========================= # 13. 环境与依赖显式管理(P1) # ========================= - 所有依赖必须显式声明(main/renderer/preload分离) - 禁止隐式依赖或运行时报错依赖缺失 - 打包态必须有 fail-fast 检查 # ========================= # 14. 交付闭环(P1) # ========================= 每个功能必须完成: 1. 实现 2. 冒烟测试 3. 构建验证 4. 至少1条E2E路径 5. commit记录 - 禁止只开发不验证 - 禁止 dev 成功但 prod 未验证 # ========================= # 15. DB与迁移安全(P0) # ========================= - 所有结构变更必须 migration - 必须支持空库双跑验证 - 禁止代码引用未存在字段 - 唯一键变更必须明确 delete → flush → insert # ========================= # 16. 返工驱动规则(关键) # ========================= - 同一问题修复 ≥2次 → 必须升级为架构规则 - ≥3次 → 必须进入 global-rules - 重复bug必须转为设计问题处理,而不是补丁修复 # ========================= # 18. Playwright page.evaluate(P0) # ========================= - **禁止**向 `page.evaluate` / `waitForFunction` / `locator.evaluate` 传入经 tsx/esbuild 编译的**函数引用**;构建器会注入 `__name` 等 helper,浏览器上下文未定义 → `ReferenceError: __name is not defined` - 浏览器脚本须为**纯字符串**(如 `workers/rpa/kernel/browser-scripts.ts`、`workers/rpa/fix-place/browser-eval-scripts.ts`),写法 `(arg) => { ... }`,调用 `page.evaluate(script, arg)` - 新增 RPA 浏览器逻辑时先加字符串脚本 + 单测断言不含 `__name` # ========================= # 17.# 核心响应协议:深度思考优先 在回答任何技术问题、编写代码或调试前,**必须**严格执行以下思维流程,禁止直接给出直觉性答案: 1. **需求解构**:先分析用户真实意图、技术栈约束及潜在边界条件,而非仅看字面问题。 2. **方案推演**:在内部评估至少2种可行路径,权衡复杂度、性能与可维护性,选择最优解。 3. **风险预判**:主动识别当前方案可能的坑点(如并发安全、内存泄漏、API兼容性),并提前规避。 4. **验证闭环**:代码生成后需在逻辑上自洽检查,确保无语法错误、符合最佳实践且能真正解决问题。 > ⚠️ 执行要求:以上思考过程应内化于推理阶段,无需向用户展示冗长的思考标签。最终输出必须是经过验证的、可直接落地的精准答案。若问题模糊,先追问关键信息再作答,绝不猜测。 # =========================