AGENT.MD
本文件是本仓库内 AI 协作规则的唯一真源。
.codex/、.claude/、.cursor/、.trae/ 下的规则文件仅作为兼容适配层,不能再次演变成各自独立维护的 project rule 副本。
按下面顺序加载项目上下文:
AGENT.MDaiDoc/README.mdaiDoc/relations/aiDoc/modules/aiDoc/frontend-backend/aiDoc/examples/aiDoc/memory/若内容冲突,以 AGENT.MD 为准。
server/: Go + Gin 后端web/: Vue 3 + Vite 前端deploy/: 部署资产docs/: 项目文档与设计记录aiDoc/: AI 协作文档层Router -> API -> Service -> Modelenter.go 继续作为分组注册与组合入口gin.Context@Success 响应要落到具体类型,让 swag 能生成真实返回结构:列表用 response.PageResult{list=[]Model}、详情用具体 model,不要停留在空的 response.PageResult 或 data=object(仅动态/示例数据才用 object);细则见 aiDoc/modules/backend-layer-rules.mdrequest.PageInfo:Service 层取 limit/offset 一律用 info.LimitOffset()(内置 MaxPageSize=100 截断),不要手写 PageSize*(Page-1) 换算CreatedBy/UpdatedBy/DeletedBy/DeptId 公共操作字段(dept_id 为数据权限的归属部门列)仅在业务表需要数据权限时才创建(对应代码生成器的 AutoCreateResource),手写时不要自造 CreatorID 之类同义字段;细则见 aiDoc/modules/backend-layer-rules.mdc.Request.Context() 一路透传(WithContext(ctx)),不手写 dept_id/created_by 范围条件;细则见 aiDoc/examples/backend/service-example.md{ code, data, msg }{ page, pageSize, total, list }web/src/utils/ 里的工具函数aiDoc/frontend-backend/web/uno.config.js,presetWind3)。写样式优先用 UnoCSS 原子类:布局、间距、排版、尺寸、颜色等能用原子类表达的,一律用原子类,不再新增自定义 class<style scoped>:需要 :deep() 覆盖 Element Plus 内部样式、伪类/伪元素、复杂选择器,或原子类确实难以表达的样式style;动态样式用绑定的原子 class 或 CSS 变量,主题相关能力优先走 CSS 变量aiDoc/frontend-backend/frontend-rules.mdserver/source/system/menu.go 的 Icon 字段)优先用空心(线框)风格,避免填充式/实心款(如 Element Plus 的 *-filled,及 avatar/platform/management/lock 等视觉实心款);找不到合适的空心图标时,去 Iconify(优先 lucide)挑一个合适的空心 svg、规整后存为本地 web/src/assets/icons/<name>-gva.svg(不要手画自己发挥,也不要将就用实心款);由 web/src/core/global.js 自动注册、菜单按名引用,新增后需重启/重新构建前端以重生成 sprite(线宽统一由 svgIcon.vue 提供,根 svg 勿写 stroke-width——构建插件会破坏它)aiDoc/frontend-backend/frontend-rules.md 的「图标规范」aiDoc/frontend-backend/page-click-testing.md 执行:优先静默读取 .local/gva-test-token(已 gitignore);没有或失效时按该文档的标准话术向用户索取 token,注入 localStorage 后点触global.GVA_DB/GVA_LOG/GVA_CACHE/GVA_REDIS/GVA_CONFIG)时,统一复用 server/internal/testutil,不要在各 _test.go 里重复手写 sqlite :memory:、AutoMigrate、nop logger、存旧值/赋值/t.Cleanup 还原这套样板testutil.NewMemoryDB(t, models...)(内存库 + AutoMigrate + 赋值 GVA_DB + cleanup 还原,可选 WithDataScopeCallbacks()/WithoutAutoMigrate())、InitMemoryCache(t, 0)、InitNopLogger()、NewRedisOrSkip(t)(无 Redis 自动 skip)、LoadConfig(t, path) / LoadDefaultTestConfig(t);每个 helper 的语义与选项以包内 godoc 为准t.Cleanup 还原(个别如 Redis 需显式开启);t.Parallel() 并行测试改用 *WithoutGlobal 变体或直接持有局部实例,避免全局单例数据竞争testutil 仅供测试使用,置于 server/internal/ 下,只有 server 模块内可 import;新增测试优先向 testutil 补 helper,不要另起一套内联样板server/service/system/sys_timed_task_runner_test.goserver/plugin/<name>/web/src/plugin/<name>/aiDoc/modules/aiDoc/examples/ 是讲解型示例层aiDoc/memory/long-term/ 用于记录长期稳定的用户偏好、协作方式和跨任务约束aiDoc/memory/business/ 用于记录每次用户提出的业务需求business 记忆文件,并在 demand-index.md 中登记cli-xxx.md),并在文件之间用反向链接关联上下文long-termREADME.md、project-memory.md、demand-index.md 这类文件只承担说明或索引职责,不承载多条记忆正文AGENT.MD 只保留高层、稳定、跨任务的规则aiDoc/aiDoc/relations/aiDoc/examples/aiDoc/memory/AGENT.MD,再按需更新适配层aiDoc/relations/branding.mdnode_modules/ 中的代码node_modules/ 逐文件读取实现aiDoc/README.mdaiDoc/relations/repo-profile.mdaiDoc/relations/development-workflow.mdaiDoc/relations/system-map.mdaiDoc/relations/branding.mdaiDoc/modules/module-index.mdaiDoc/modules/backend-layer-rules.mdaiDoc/modules/plugin-development.mdaiDoc/frontend-backend/boundary.mdaiDoc/frontend-backend/frontend-rules.mdaiDoc/frontend-backend/page-click-testing.mdaiDoc/frontend-backend/frontend-utils.mdaiDoc/frontend-backend/component-library.mdaiDoc/examples/README.mdaiDoc/examples/backend/aiDoc/examples/frontend/aiDoc/examples/plugin/aiDoc/memory/README.mdaiDoc/memory/project-memory.mdaiDoc/memory/long-term/aiDoc/memory/business/