{
  "rules": [
    {
      "path": "**/*.py",
      "rule": "代码评审 10 维度（项目 AGENTS.md + ponytail 规则）：1) 正确性 — 边界条件、异常路径、空值处理；2) 安全性 — API Key 比较必须 hmac.compare_digest（恒定时间），JWT HS256 access 15min/refresh 7d，RBAC 三级权限位，专家名必须 _EXPERT_NAME_RE=re.compile(r\"^[a-zA-Z0-9_-]{1,64}$\") 校验，bcrypt rounds=12，禁止 SQL 注入/路径穿越；3) 类型安全 — 禁止 any，必须类型注解，所有数据模型用 pydantic>=2.0 且 model_config=ConfigDict(...) 而非 class Config；4) 并发异步 — HandoffTransport 队列有界 maxsize=1024，关闭用 sentinel 模式，async def 含 yield 禁止在首个 yield 前用 return（必须 return; yield 模式或重构），禁止阻塞调用在 async 函数中；5) 性能 — N+1 查询、未加索引、未用缓存、内存泄漏、未关闭资源；6) 可维护性 — 命名、重复代码、圈复杂度、函数过长；7) 错误处理 — 信任边界必须校验输入，防止数据丢失，禁止裸 except；8) 依赖配置 — 不得擅自改 pyproject.toml 版本，配置优先级 CLI>yaml>env>.env>默认；9) 测试 — 非平凡逻辑必须留下一个可运行检查（assert demo 或小测试文件，无框架无 fixtures）；10) Ponytail 原则 — 无未请求的抽象、无未请求的新依赖、删除优先于新增、复杂处用 ponytail: 注释标记已知上限与升级路径。"
    },
    {
      "path": "**/*.ts",
      "rule": "前端 TS 评审维度（AGENTS.md 前端规范）：1) 类型安全 — 禁止 any，必须显式类型注解，interface/type 优先；2) Vue3 Composition API — 禁止 Options API，必须 <script setup lang=\"ts\">；3) Pinia store — 每个领域一个 store，state/getters/actions 规范，禁止全局可变状态；4) 禁止 require() 调用，必须 ES import；5) Ant Design Vue 4 组件规范 — 按需引入，a-* 组件名；6) 异步处理 — async/await，禁止 .then 链过深，错误边界处理；7) 响应式 — ref/reactive 正确使用，禁止解构 reactive 丢失响应性，computed 优先于 methods；8) 安全 — XSS 防护（v-html 慎用），用户输入转义，JWT 存储位置安全；9) 性能 — 懒加载路由（defineAsyncComponent），避免大列表未虚拟化，watch 深度慎用；10) 可维护性 — 命名规范（camelCase 变量、PascalCase 组件），文件组织按领域，无重复代码。"
    },
    {
      "path": "**/*.vue",
      "rule": "Vue3 SFC 评审维度：1) <script setup lang=\"ts\"> 必须使用，禁止 Options API；2) 模板 — 单根节点（Vue3 允许多根但建议单根），v-for 必须 :key 唯一且非 index，v-if 与 v-for 不同级；3) Props — defineProps 必带类型与 required 标注，defineEmits 必带类型；4) 响应式 — ref/reactive/computed 正确区分，watch 与 watchEffect 按需使用，避免深监听大对象；5) 生命周期 — onMounted 异步需 try/catch，onUnmounted 必须清理（定时器、事件监听、WebSocket）；6) Ant Design Vue — 组件按需引入，message/notification/modal API 调用规范；7) 样式 — scoped 必加，避免全局污染，CSS 变量优先于硬编码颜色；8) 安全 — v-html 必须确认来源可信，用户输入绝不直接 v-html；9) 可访问性 — 表单 label/for，按钮 aria-label，键盘导航；10) 性能 — 大列表虚拟滚动，图片懒加载，组件懒加载（defineAsyncComponent）。"
    },
    {
      "path": "**/stores/*.ts",
      "rule": "Pinia store 专项评审：1) defineStore id 唯一且语义化；2) state 必须是函数返回对象（setup store）或对象（option store），不可混用；3) getters 必须有返回类型注解；4) actions 异步必须 try/catch 并更新错误状态；5) 禁止在 store 中直接操作 DOM；6) 跨 store 调用必须通过 useXxxStore()，禁止循环依赖；7) 持久化需明确策略（localStorage/sessionStorage/无）；8) WebSocket 连接必须在 store 中管理生命周期（onUnmounted 时关闭）。"
    },
    {
      "path": "**/auth/**/*.py",
      "rule": "认证安全专项（最高优先级）：1) API Key 比较必须 hmac.compare_digest，禁止 == 比较密钥/token；2) JWT — HS256，access 15min/refresh 7d，过期校验，刷新令牌轮换；3) 密码 — bcrypt rounds=12，禁止明文存储；4) RBAC — 三级（member/operator/admin）+ 权限位，越权检查；5) 终端安全 — 6 层白名单（blocklist→shell-ops→builtin→global→user→session→danger），危险命令需管理员审批；6) 会话 — 登出必须失效 token，并发会话控制；7) CSRF — 状态变更接口必须校验；8) 速率限制 — 登录/敏感接口必须限流。"
    },
    {
      "path": "**/routes/*.py",
      "rule": "FastAPI 路由专项：1) 路径必须 /api/v1 前缀；2) 依赖注入 — 认证/权限用 Depends()，禁止在函数体内校验；3) Pydantic 模型校验请求体/查询参数，禁止裸 dict；4) 响应模型 response_model 显式声明；5) 异步 — async def 优先，IO 密集用 await，CPU 密集用 run_in_threadpool；6) 错误处理 — HTTPException 明确 status_code 与 detail，禁止裸 raise Exception；7) WebSocket — 连接管理（心跳/超时/断线重连），广播需并发控制；8) 输入校验 — 路径参数/查询参数边界值，防止注入。"
    },
    {
      "path": "**/calendar/**/*.py",
      "rule": "日历服务专项：1) 时区处理必须显式（Asia/Shanghai 或 UTC），禁止 naive datetime；2) 重复事件 RRULE 解析正确性；3) 跨时区会议时间一致性；4) 飞书/Outlook 同步 — 冲突检测、增量同步、失败重试；5) 数据持久化 — 事务边界，回滚策略；6) 并发 — 同一日历并发写入需锁；7) 错误恢复 — 同步中断可续传。"
    },
    {
      "path": "**/sqlite_conversation_store.py",
      "rule": "SQLite 会话存储专项：1) SQL 参数化查询（禁止 f-string/format 拼接 SQL）；2) 事务管理 — 显式 begin/commit/rollback，async with；3) 连接池 — Singleton 或 per-request，禁止每次新建；4) 并发写入 — WAL 模式或串行化；5) 数据完整性 — 外键约束、NOT NULL、唯一索引；6) 迁移 — schema 版本管理，向后兼容；7) 性能 — 索引覆盖查询，分页 LIMIT/OFFSET 或 cursor；8) 错误处理 — IntegrityError 捕获并返回明确错误。"
    },
    {
      "path": "**/middleware.py",
      "rule": "中间件专项：1) 执行顺序 — 认证→授权→限流→日志→业务；2) 异步 — async def，禁止阻塞；3) 上下文传递 — request.state.user 等规范字段；4) 错误 — 中间件异常必须转为 HTTP 响应，禁止吞异常；5) 性能 — 中间件链不宜过长，热路径避免重计算；6) CORS — 白名单显式，禁止 *；7) 日志 — 敏感信息脱敏（token/密码）。"
    }
  ]
}
