# AGENTS.md

本文件用于约束在 `Loan/client` 仓库内工作的 AI agent / 协作者，目标是让改动更稳、更贴近当前项目结构，并减少无关返工。仓库信息变化后，请同步更新此文件。

## 项目概览

- 项目名称：`Loan Assistant` / `借贷助手` 客户端
- 技术栈：`Expo 55`、`React Native 0.83`、`React 19`、`TypeScript`、`expo-router`、`NativeWind 4`、`@ant-design/react-native 5`
- 目标平台：`iOS`、`Android`、`Web`
- 包管理器：仓库包含 `pnpm-lock.yaml`，默认优先使用 `pnpm`
- 当前 UI 基调：浅色主题，根布局与全局 Provider 在 `src/app/_layout.tsx`

## 常用命令

- 安装依赖：`pnpm install`
- 启动开发环境：`pnpm start`
- 启动 Android：`pnpm android`
- 启动 iOS：`pnpm ios`
- 启动 Web：`pnpm web`
- 代码检查：`pnpm lint`

如果必须使用 `npm`，请确保不要混乱提交锁文件；默认仍以 `pnpm-lock.yaml` 为准。

## 目录约定

- `src/app`：`expo-router` 路由入口、`layout`、页面级 screen 文件
- `src/app/(tabs)`：底部标签页相关路由
- `src/components`：跨页面复用组件
- `src/components/ui`：更基础的 UI 组件与页面积木
- `src/hooks`：自定义 hooks
- `src/utils`：基础能力与业务支撑工具，例如 `api`、`auth`、`storage`
- `src/constants`：主题和常量
- `src/global.css`：`NativeWind` 全局样式入口
- `assets`：运行时资源
- `design`：设计参考稿或静态参考资料，默认不作为运行时代码来源
- `docs/antd`：本地 Ant Design RN 参考文档，新增或调整组件时优先查阅
- `android`、`ios`：原生工程，除非是原生能力、权限、构建配置相关改动，否则不要随意修改
- `dist`：构建产物目录，不要手工编辑

## 代码组织规则

- 路由文件尽量保持轻量，复杂 UI 和业务逻辑优先下沉到 `src/components`、`src/hooks`、`src/utils`
- 本项目已配置路径别名：
  - `@/*` -> `src/*`
  - `@/assets/*` -> `assets/*`
- 新页面优先放在 `src/app` 下对应路由位置，不要回退到旧式集中路由表
- 涉及标签页结构时，同时检查 `src/app/(tabs)/_layout.tsx`
- 平台差异优先通过 `*.web.tsx` 等平台文件处理，避免在单文件里堆过多平台分支
- 尽量复用已有基础组件，不要在页面里重复造按钮、输入框、弹窗、状态标签

## UI 与样式约定

- 样式方案以 `NativeWind + global.css + tailwind.config.js` 为主
- 组件型交互优先复用 `@ant-design/react-native`
- 根节点已经包裹 `@ant-design/react-native` 的 `Provider`，全局 Provider 变更集中放在 `src/app/_layout.tsx`
- 项目已有一套 Tailwind 扩展颜色和圆角 token，新增样式优先复用，不要到处散落魔法值
- 如果引入新的 Ant Design RN 组件，先查 `docs/antd/llms-semantic.md` 或 `docs/antd/llms-full.txt`
- Web 与 Native 表现如果需要分流，优先延续现有 `component.tsx` / `component.web.tsx` 结构

## 数据、认证与存储

- 网络请求优先复用 `src/utils/api.ts` 中的统一请求封装，不要重复创建新的 axios client
- 接口地址与版本信息优先从现有配置读取，不要在页面或组件中硬编码 base URL
- 鉴权上下文在 `src/utils/auth.tsx`，修改登录态逻辑时同步检查 Provider、hook、请求头注入
- 本地持久化与缓存使用 `src/utils/storage.ts` 中的 `MMKV` 封装，避免绕过统一入口

## 工程约定

- TypeScript 处于 `strict` 模式，新增代码不要用 `any` 糊过去，必要时补充明确类型
- `expo-router` 已启用 `typedRoutes`，新增路由时保持类型友好
- 项目开启了 `reactCompiler`，默认不要为了“优化”到处添加 `useMemo` / `useCallback`
- JS 层改动默认不要动 `android/`、`ios/`
- 配置类文件如 `app.json`、`babel.config.js`、`metro.config.js`、`tailwind.config.js` 修改前先确认影响范围
- 不要引入重量级新依赖，除非现有方案明显无法满足需求

## Agent 工作方式

- 开始前先看 `git status --short`，确认工作区是否已有用户未提交改动
- 不要回滚与当前任务无关的变更
- 先阅读相关文件，再改代码；避免“按印象重写”
- 优先做最小必要改动，保持与现有风格一致
- 修改公共能力时，检查调用方是否需要同步更新
- 如果改动影响路由、鉴权、全局 Provider、主题或构建配置，在说明中明确指出

## 验证要求

- 最低要求：执行 `pnpm lint`
- 如果改动影响页面交互、路由、平台差异或构建配置，尽量补充对应平台验证
- 如果因为环境限制无法完成验证，需要在最终说明中明确写出“未验证项”

## 提交说明建议

最终汇报建议至少包含以下信息：

- 改了什么
- 为什么这么改
- 怎么验证
- 还有哪些风险或待补充项

## 待项目负责人补充

