feat: 首次推送到Gitea - 完整项目代码 + 安全加固 + 知识库

This commit is contained in:
ZhuiGuangAI Dev
2026-10-02 18:52:49 +08:00
parent b44601bb66
commit 8205ae709c
1185 changed files with 49841 additions and 12802 deletions
+433
View File
@@ -1,5 +1,438 @@
# 追光AI 变更日志
## 2026-06-22/23 项目开发规则全面优化(三轮迭代)
### 目标
基于 Trae IDE 开发规则最佳实践,审查并全面优化 `.trae/rules/project_rules.md`,使之覆盖项目开发全生命周期。
---
### 第一轮:基础增强(8章 → 12章)
- **新增"零、代码质量基础"**: TypeScript类型安全(禁止any/as、泛型约束)、构建检查铁律(tsc+vitetest)、Git工作流、文件组织规范表
- **新增"九、测试规范"**: Vitest框架、80%覆盖率目标、三类测试、禁止skip
- **增强图片优化**: 新增LCP priority规则、LazyImage组件引用、sizes属性
- **增强无障碍**: 从2条→4条(语义化HTML、ARIA/键盘交互、焦点对比度)
- **增强SEO**: 新增Canonical URL/Robots策略
- **增强性能**: 从2条→5条(字体优化、Suspense、Bundle体积控制)
- **增强安全**: 从2条→6条(具体CSP值、XSS消毒方案、Zod验证、认证授权、敏感信息)
- **增强定时任务**: 新增crontab格式示例、错误处理/退出码、任务幂等性
- **新增数据获取**: 缓存失效策略(stale-while-revalidate)、并行查询(Promise.all)
- **新增导航**: 中间件路由保护、prefetch控制
- **全局改进**: 所有规则添加🔴🟡🟢严重级别、18处file://可点击链接
- **新增"十"→"十二"**: 设计系统速查、API约定速查、踩坑记录独立章节
### 第二轮:运维增强(12章 → 15章)
- **新增"十三、Shell脚本规范"**: 脚本结构模板、set -e错误处理、PASS/FAIL/WARN结构化输出、磁盘预检、禁止操作清单
- **新增"十四、Docker容器规范"**: 容器清单(app+cron)、host网络、容器管理命令、健康检查配置
- **新增"十五、部署规范"**: 部署前5项自检、构建流程、部署后六项验证清单、镜像回滚策略
- **新增8.6 Cron Entrypoint规范**: 信号处理(trap+30s优雅关闭)、启动前.env/crontab.txt校验、健康检查端点(8311)、环境变量注入
- **新增8.7 日志规范**: Node.js统一logger.mjs、Shell结构化输出、三层日志目录、禁止写入其他项目日志
- **修复8.3**: 备份.env路径修正为 `$PROJECT/env/.env.production`
### 第三轮:深度补充(15章 → 22章)
- **新增"十六、数据模型与迁移规范"**: Prisma命名约定、连接单例、Schema变更四步流程、严禁DROP/TRUNCATE、数据库隔离
- **新增"十七、API设计规范"**: 路由标准骨架、错误处理表、响应格式、状态码约定、Cache-Control策略、认证三层分层、分页上限
- **新增"十八、AI/Bot系统规范"**: Bot角色定义(112角色)、12张Bot表、活动脚本5大约定、AI API调用隔离、提示词管理
- **新增"十九、环境变量管理规范"**: 8个关键变量分级、.env.example同步规则、脚本侧加载顺序
- **新增"二十、依赖管理规范"**: 添加/移除/版本管理
- **新增"二十一、代码审查清单"**: 12项提交前自检 + Knowledge Graph同步规则
### 文档同步
- **新增模块文档**: `.trae/specs/modules/17-rules.md` — 开发规则模块完整索引
- **modules.md 更新**: 模块表新增第17项、项目结构/关键特性同步更新
- **4个关联模块追加规则引用**: 01-database.md / 02-api.md / 07-lib-and-scripts.md / 09-devops.md
- **数量同步**: crontab 调度表从13条→25条(三处更新)
### 变更统计
| 类型 | 数量 |
|------|------|
| 规则文件变更 | 3轮迭代(222行 → 609行 → ~1100行) |
| 新增章节 | 14个(覆盖22章) |
| 新增file://链接 | 24个 |
| 新增模块文档 | 1个(17-rules.md) |
| 修改已有模块 | 5个(modules.md + 4个关联模块) |
| 规则同步文档数 | 7个 |
### 关键指标
- 规则覆盖从 8 个关键领域 → 22 章全生命周期
- 🔴 必须遵守规则 ~50 条,🟡 强烈推荐 ~30 条
- 全部 file:// 链接指向真实代码文件(24/24 通过验证)
- 4个关联模块文档完整追加规则引用
---
### 性能优化
- **31 个 `<img>` 替换为 `<LazyImage>`**: 跨 24 个文件,全面使用 lazy loading + skeleton + error fallback
- **LazyImage 增强**: 新增 `referrerPolicy` 属性支持,用于跨域图片场景
- **动态导入**: layout.tsx 中 BackToTop 和 ReadingProgress 使用 `dynamic(() => import(...), { ssr: false })`
- **N+1 查询修复**: tools/[slug] 页面合并 4 个串行 await 为 `Promise.all` 批量并行查询
- **ISR 统一**: community/page.tsx revalidate 从 300 调整为 600(与其他列表页一致)
- **@next/bundle-analyzer**: 添加打包分析配置,`ANALYZE=true npm run build` 启用
### 可访问性(WCAG 2.1)
- **9 个 div onClick 元素** 添加 `role` + `aria-*` 属性 + `onKeyDown` 键盘事件
- **6 个装饰性图片** 添加 `role="presentation"` (不暴露给屏幕阅读器)
- **5 个搜索输入框** 添加 `aria-label` 属性
### 代码质量
- **API 响应统一**: 所有列表接口 `totalCount` 统一为 `total`(notifications/forum/topics/comments 及其前端消费端)
- **重复代码提取**:
- `src/lib/source-type.ts` — sourceTypeLabel + sourceTypeColor(从多个文件提取)
- `src/lib/utils.ts` — formatRelativeTime(从工具/技能详情页提取)
- `src/lib/constants.ts` — tagColors(从多个组件提取)
- **router.push → Link**: 10 处面包屑和导航链接替换
- **any → 严格类型**:
- `src/lib/cache.ts` — `cachedResponse<T>` 泛型
- `src/lib/achievements.ts` — 精确类型约束
- `src/lib/auth.ts` — 回调函数明确类型
- `src/app/api/recommendations/route.ts` — 内联 interface 替代匿名类型
- **admin-auth 重构**: NextAuth string id 转换为 Prisma number 类型
### 测试
- **测试基础设施**: `vitest.config.ts` + `vitest.setup.ts`
- **tsconfig 更新**: 添加 `"types": ["vitest/globals"]`
- **5 个测试套件 / 132 个测试**:
| 套件 | 测试数 | 覆盖 |
|------|--------|------|
| level-config.test.ts | 28 | 等级配置 |
| elo.test.ts | 24 | ELO 评分 |
| forum-hot.test.ts | 30 | 论坛热度 |
| achievements.test.ts | 26 | 成就系统 |
| points-reward.test.ts | 24 | 积分奖励 |
### 新增功能(先前轮次汇总)
- **Smart Notification Digest**: NotifType 新增 DIGEST,notification-digest.mjs cron,通知偏好 API,通知中心页面
- **Dark Mode**: ThemeProvider,globals.css 暗色变量,Header 切换,14 个组件文件适配
- **Content Recommendation Engine**: /api/recommendations,PersonalizedRecommend 组件,话题详情相关推荐
- **New User Onboarding**: 5-task 引导向导,进度 API,NewcomerOnboard 重写,Confetti 动画
- **Search Enhancement**: /api/search/autocomplete,SearchBox 重写(键盘导航),搜索历史 localStorage,HighlightText 组件
- **Tool Comparison**: CompareProvider Context,CompareBar 浮动栏,CompareButton,/tools/compare 页面,10 维度对比表格
- **Tool Verification Badge**: 管理 API,蓝V勾号,已认证工具 API
- **Streak Freeze Protection**: streak-freeze.ts,Freeze API,CheckInCard 增强,季度日历,grant-freeze-cards.mjs
- **Points Shop**: shop-items.ts,商店页面,购买 API,已购物品 API,个人中心装饰效果
### 新增文件统计
| 类型 | 数量 |
|------|------|
| 新增 lib 文件 | 4 个(source-type.ts / constants.ts / streak-freeze.ts / shop-items.ts) |
| 新增组件 | 8 个(LazyImage / ThemeProvider / CompareProvider / CompareBar / CompareButton / PersonalizedRecommend / HighlightText / NotificationCenter) |
| 新增 API 路由 | 8 个(notifications prefs / shop / check-in / streak-freeze / search autocomplete / tools verify / tools verified / recommendations) |
| 新增页面 | 4 个(/tools/compare / /user/notifications / /user/shop / /user/onboarding) |
| 测试文件 | 7 个(vitest.config.ts + vitest.setup.ts + 5 test suites) |
| 修改文件 | 60+ 个 |
### 关键指标
- 全局零 `<img>` 标签,全部使用 `<LazyImage>`
- TypeScript 零 `any` 类型残留
- 132 个测试全部通过,80%+ 覆盖率目标
- API 响应格式统一(total,非 totalCount)
- 导航全部 Link 化(零 router.push 静态跳转)
---
## 2026-06-14 全面SEO/UX/性能/无障碍优化(9轮迭代)
### 🎯 目标
对项目进行全面深度优化,覆盖SEO基础设施、用户体验、页面性能、链接语义、无障碍访问、定时任务和Bot系统健康度,提升自然流量获取能力和用户留存率。
---
### 第一轮:SEO基础设施
#### 结构化数据
- **SoftwareApplicationJsonLd**: tools/[slug] 工具详情页添加 Google 富文本搜索结果支持
- **BreadcrumbJsonLd**: tools/[slug] + skills/[slug] + categories/[slug] 面包屑结构化数据
#### Sitemap优化
- **sitemap.ts**: 从 ~16 条扩展到 1000+ 条,覆盖全量工具/技能/分类详情页 URL
#### RSS Feed
- **src/app/api/rss/route.ts**: RSS 2.0 聚合推送,含最近50个工具/技能
- **layout.tsx**: 添加 `<link rel="alternate" type="application/rss+xml">` 浏览器自动发现
#### SSG预渲染
- **tools/[slug]**: `generateStaticParams` 预渲染前100个热门工具
- **skills/[slug]**: `generateStaticParams` 预渲染前100个热门技能
- **categories/[slug]**: `generateStaticParams` 预渲染所有分类
#### Social元数据
- tools/[slug] + skills/[slug] + categories/[slug]: 完整 `openGraph` + `twitter` card 元数据
#### 搜索框语义化
- ToolsContent + SkillsPageClient: `<div>` → `<form role="search">` + `<label>` + `type="search"` + `name="search"`
---
### 第二轮:UX质量提升
#### Footer全量Link化
- **Footer.tsx**: 13个 `<a>` 链接全部改为 `<Link>`,消除页脚点击时的整页白屏重载
- 删除3个 `href="#"` 死链接,修复3个重复 `/tools` 链接
- 新增日报/评测/社区/Bot排行榜/签到等关键入口
#### Favorites/Collections Link化
- favorites + collections 页面:所有卡片 `div+onClick+router.push` → `<Link>` 包裹,支持右键新标签/鼠标预取/爬虫抓取
#### 404增强
- **not-found.tsx**: 新增"浏览工具"+"社区求助"两个按钮,降低跳出率
#### globals.css清理
- 移除无效 `"Noto Sans SC Variable"` 字体声明
---
### 第三轮:卡片全量Link化 + 交互组件
#### 首页卡片
- **HomePageClient.tsx**: 工具卡片 `onClick+router.push` → `<Link>`,支持预取/右键/SEO
#### 技能库卡片
- **SkillsPageClient.tsx**: 技能卡片 `onClick+router.push` → `<Link>`,"查看全部"按钮 → `<Link>`
#### 工具列表卡片
- **ToolsContent.tsx**: 搜索/筛选结果页卡片全部 `onClick+router.push` → `<Link>`
#### 分类页面包屑
- **categories/[slug]**: 面包屑 `<a>` → `<Link>`,新增 `BreadcrumbJsonLd` + `openGraph` + `generateStaticParams`
#### 新增交互组件
- **BackToTop**: 滚动超过400px出现右下角浮动"回到顶部"按钮,平滑滚动
- **ReadingProgress**: 页面顶部渐变彩色进度条(蓝→紫→金),实时显示阅读进度
- 两个组件集成到 layout.tsx 全局生效
---
### 第四轮:ISR 性能缓存
#### 页面ISR(12个页面从 force-dynamic → revalidate)
| 页面 | 旧配置 | 新配置 |
|------|--------|--------|
| daily/page | force-dynamic | revalidate=3600 |
| skills/page | force-dynamic | revalidate=3600 |
| community/page | force-dynamic+revalidate=0 | revalidate=300 |
| community/[category] | force-dynamic | revalidate=300 |
| community/tag/[slug] | force-dynamic | revalidate=600 |
| community/tags | force-dynamic+revalidate=0 | revalidate=3600 |
| community/bots | force-dynamic | revalidate=3600 |
| tools/[slug] | SSG永不过期 | revalidate=3600 |
| skills/[slug] | SSG永不过期 | revalidate=3600 |
| categories/[slug] | SSG永不过期 | revalidate=3600 |
#### Daily SSR
- daily/page.tsx 从 `force-dynamic` 客户端加载 → `DailyContent.tsx` 服务端预取数据
#### 搜索框语义化
- ToolsContent + SkillsPageClient: 搜索表单添加 `<form role="search">` + `<label>` + `name="search"`
---
### 定时任务修复 + Bot系统健康度
#### Crontab修复(14 → 17个任务)
- **反馈闭环恢复**: `bot-feedback-loop` 从"每周日22:00"恢复为"每3小时"(56次/周 vs 1次/周)
- **补回 cleanup-task-logs**: 每日06:30清理30天前的DB task_log记录
- **补回 reconcile-like-counts**: 每6h15min带 `--fix` 自动修正点赞计数偏差
- **新增 health-check**: 每日08:30审计所有任务最近成功率
#### Bot系统修复
- **Bot互回防护**: 目标话题作者为Bot时90%跳过,260条/天互回降为26条
- **低质量拦截**: 评分<40的内容抛异常被try/catch丢弃(<100字+多重AI句式检测)
---
### 第五轮:详情页ISR + 分页/侧边栏Link化
#### 详情页ISR
- tools/[slug]: `revalidate=3600`
- skills/[slug]: `revalidate=3600`
- categories/[slug]: `revalidate=3600`
#### 分页Link化
- **ToolsContent**: "上一页"Button→Link + 5个页码button→Link + "下一页"Button→Link
- 新增 `buildPageUrl` / `buildFilterUrl` 工具函数
#### 侧边栏过滤Link化
- **ToolsContent**: 全部分类+N个分类+全部定价+N个定价 = 15个button→Link
---
### 第六轮:用户中心Link化 + 图片优化
#### 用户中心Link化(6处)
- 面包屑"首页": `<button onClick router.push>` → `<Link>`
- 最近浏览×N卡片: `<div onClick router.push>` → `<Link>`
- 我的话题/回复/收藏: `<div onClick router.push>` → `<Link>`
#### 图片优化
- user/page.tsx: `<img>` → `<Image width={32} height={32}>` 消除CLS
- tools/[slug]: 主logo + 推荐logo = 4个 `<img>` → `<Image>`
- skills/[slug]: 主logo = 1个 `<img>` → `<Image>`
---
### 第七轮:无障碍 + N+1优化 + 新鲜度
#### 无障碍
- **layout.tsx**: 新增 skip-link(`<a href="#main-content">`)+ `<main id="main-content" tabIndex={-1}>`
#### N+1查询
- tools/[slug]: `favorite.count()` 独立查询 → 主query `_count.favorites`(消除1次DB查询)
#### 内容新鲜度
- tools/[slug] + skills/[slug]: 新增 `formatRelativeTime` + "更新于今天/昨天/N天前" 时钟图标
#### 面包屑Link化
- tools/[slug]: 面包屑("首页"/"全部工具") + 分类标签 = 3处 `<a>` → `<Link>`
- skills/[slug]: 面包屑("首页"/"技能库") + 分类标签 = 3处 `<a>` → `<Link>`
---
### 第八轮:API缓存审计 + N+1审查
#### API缓存补齐
- **api/daily-reports**: 无缓存 → `cachedResponse(cacheKey, 300)` 5分钟CDN缓存
- 缓存审计: 19/74个GET端点有缓存,公开高频路由缓存覆盖率100%
#### 审查确认
- 社区话题详情页: 无 `<a>`/`<img>`/`router.push` 问题,force-dynamic合理
- 分类页查询: `Promise.all` 并行 findMany+count 已优化
---
### 第九轮:首页"近期热门" + Prisma索引审计
#### 新功能:首页近期热门板块
- **page.tsx**: 新增 `trendingTools` 查询(30天内创建+浏览量排序Top8+category关联)
- **HomePageClient.tsx**: 新增 `TrendingTool` 接口 + "近期热门"板块(琥珀色渐变卡片/4列网格/Link跳转)
- 视觉位置: HeroBanner → 近期热门(⚡琥珀色)→ 分类板块
#### Prisma索引审计
- 20+模型完整审计: Tool/Skill/Favorite/ForumTopic/ForumPost/BrowsingHistory/PointsHistory/ForumTopicSubscription 全部有完善多列复合索引
#### Bot列表Link修复
- community/bots/BotsListClient: "清除筛选" `button+onClick+router.push` → `<Link href="/community/bots">`
---
### 📁 变更统计(九轮累计)
| 类型 | 数量 |
|------|------|
| 新增文件 | 15个(loading×4 / error×5 / DailyContent / RSS API / BackToTop / ReadingProgress / skills error / tools error) |
| 修改文件 | 37个 |
| ISR页面 | 12个(force-dynamic→revalidate) |
| Link化元素 | 150+处(Footer 13 / 卡片100+ / 分页/侧边栏 15+ / 面包屑 6+ / 用户页 6+) |
| img→Image | 10+处(tools/skills/user详情页全部logo) |
| 定时任务 | 14→17(补回2个+新增1个health-check) |
| TypeScript检查 | 九轮全部零错误通过 |
### ✅ 关键指标
- `generateStaticParams` 覆盖 tools + skills + categories 热门页面
- sitemap 从 ~16 条扩展到 1000+ 条
- RSS Feed 就绪 (`/api/rss`)
- 全局零 `<a>` 内部跳转残留,全部 `<Link>` 化
- 全局零 `<img>` 遗漏,全部 `<Image>` 优化
- `force-dynamic` 页面降至最低
- Footer 整页刷新消除
- Skip-link 无障碍支持
- API 公开路由缓存覆盖率 100%
- 定时任务 17 个全部健康运行
- Bot 互回率降低 90%,低质量内容拦截
---
## 2026-06-14 会员头像库系统上线 + 论坛Bot自回复修复
### 🎯 目标
建立统一的会员头像库(500个高质量SVG头像),支持用户从预置库选择或自定义上传,同时让Bot从同一个多样化头像库中随机匹配,彻底解决头像风格单一问题。同步修复论坛Bot自己回复自己的逻辑错误。
### 🟢 会员头像库系统
#### 头像库生成
- **scripts/generate-avatar-library.mjs** — 头像库批量生成CLI
- 支持 `--all`(生成全部500个)/ `--gender=男/女/中性` / `--theme=business/cute/tech/creative/nature/sport/dark/retro/abstract/minimal/geometric/space` / `--count`
- 8种配色体系(商务蓝/创意粉/自然绿/科技紫/温暖橙/可爱粉/暗黑系/复古棕)
- 4种背景形状(圆形/圆角方形/全幅方形/六边形)
- 7类图标(抽象面部/商务符号/科技电路/自然景观/艺术图形/运动器材/几何图案)
- 6种装饰风格(圆点/十字星/波浪/条纹/边框/无装饰)
- **500个SVG头像**落盘到 `public/avatars/` + `manifest.json`
- 男性170个(商务/科技/运动/创意/休闲/暗黑6大主题)
- 女性170个(创意/商务/可爱/科技/自然/运动6大主题)
- 中性160个(抽象/自然/极简/可爱/复古/几何/太空7大主题)
#### 后端API
- **GET /api/user/avatars** — 头像库列表API(需用户认证)
- 支持 `gender`(男/女/中性)、`theme` 筛选、`page`/`pageSize` 分页
- 返回完整的 avatarId / url / gender / theme / colors 元数据
- **POST /api/user/avatar/upload** — 自定义头像上传API(需用户认证)
- 支持 PNG/JPEG/WebP/SVG 格式,5MB限制
- 上传到 `public/uploads/avatars/` 目录
- 文件名使用 `{userId}_{timestamp}.{ext}` 防止冲突
- **PUT /api/user/profile** — 扩展支持 `avatarUrl` 字段
- 用户可在个人中心选择头像后保存到User表
#### 前端组件
- **AvatarPicker** (`src/components/forum/AvatarPicker.tsx`)
- 弹窗式头像选择器(固定宽度640px,3列网格)
- 支持按性别(男/女/中性)和主题筛选
- 当前头像高亮选中 + hover缩放预览效果
- 自定义上传功能(拖拽/点击上传PNG/JPG/WebP)
- 选择后自动调用 `PUT /api/user/profile` 保存
- **user/page.tsx** — 集成AvatarPicker
- 原静态首字母头像替换为可点击的 UserAvatar 组件
- 鼠标悬停显示相机图标,提示"点击更换头像"
- 头像更新后实时刷新页面
#### 工具库
- **src/lib/avatar-library.ts** — 头像库数据文件(500个avatar ID列表)
- **src/lib/bot-utils.ts** — 更新 `getBotAvatarUrl()` 逻辑
- 从新的500个头像库中通过key哈希匹配(替代旧的112个Bot专属SVG)
- 同一key始终映射到同一头像(确定性哈希,向后兼容)
- Bot不再使用单调的SVG几何头像,而是获得视觉丰富的头像
### 🟡 论坛Bot自回复修复
#### 问题诊断
Bot在 `bot-feedback-loop.mjs` 中会对**所有新回复**进行二次回复,包括其他Bot的回复,导致多个Bot在同一帖子中互相"自嗨"对话。
#### 修复
- **scripts/bot-feedback-loop.mjs** — 在二次回复触发条件中添加 `humanCount > 0` 检查
- 确保Bot只在有**真人用户**回复时才进行二次回复
- 删除54条Bot互相回复的错误帖子记录
#### 路人角色扩容
- 路人角色从66个增加到132个(2倍),覆盖8种不同类型
### 🚀 部署
- 500个SVG头像通过SCP上传到服务器 `public/avatars/`
- Docker卷路径复制:`/var/lib/docker/volumes/zhuiguang_ai_bot_public/_data/avatars/`
- `docker-compose build --no-cache zhuiguang-ai-app` 重新构建
- 容器重启后验证:头像文件 HTTP 200 正常访问
### ✅ 验证
| 验证项 | 结果 |
|--------|------|
| 头像SVG文件 HTTP访问 | ✅ 200(采样6个全部通过) |
| manifest.json HTTP访问 | ✅ 200(外部域名 zhuig.com) |
| 头像库API | ✅ 正常(需用户认证,307重定向到登录) |
| 个人中心头像选择器 | ✅ 功能完成(tsc 零错误) |
| Bot头像随机匹配 | ✅ 500个库中哈希匹配 |
| Bot自回复修复 | ✅ 删除35+条错误记录,逻辑修复 |
| 路人角色 | ✅ 132个(原66个 x2) |
| 代码编译 | ✅ tsc --noEmit 零错误 |
### 📁 变更统计
| 类型 | 数量 |
|------|------|
| 新增文件 | 5个(generate-avatar-library.mjs / avatar-library.ts / AvatarPicker.tsx / 头像库API / 头像上传API)+ 501个产物(500 SVG + 1 manifest) |
| 修改文件 | 3个(bot-utils.ts / user-page.tsx / profile-route.ts / bot-feedback-loop.mjs) |
| 删除错误记录 | 35+条Bot自回复帖子 |
---
## 2026-06-11 容器化生产切换 + 旧部署清理
### 🎯 目标
+446
View File
@@ -0,0 +1,446 @@
{
"schema_version": "1.0",
"type": "ai_coding_knowledge_graph",
"name": "AI 辅助编程效率知识库",
"description": "整合当前最有效的 AI 辅助编程方法、工具、工作流与反模式。机器可解析:AI 代理在每次任务开始前加载本文件(优先按 entity.type / applies_to / id 过滤),作为协作方法论;本文件不描述业务,业务知识见 .trae/knowledge_graph.jsonl。",
"version": "1.0.0",
"updated_at": "2026-10-01T16:58:00",
"project": "追光AI",
"machine_contract": {
"entity_required_fields": ["id", "type", "name", "summary"],
"entity_id_format": "{type}:{kebab-case-slug}",
"entity_types": ["tool", "method", "workflow", "principle", "anti_pattern"],
"relation_fields": ["from", "to", "type"],
"load_priority": ["principle", "method", "workflow", "anti_pattern", "tool"],
"note": "所有字段值为稳定英文 key 或中文短句;AI 可仅依赖 id/type/category/relations 做推理,summary 用于人类复核。"
},
"bound_to_project": {
"toolchain": ["Trae IDE", "Next.js 14 App Router", "TypeScript", "Prisma 7.8", "Vitest", "Docker"],
"deterministic_gates": ["npx tsc --noEmit", "npx vitest run"],
"persistent_context": [".trae/rules/*.md", ".trae/ai_coding_knowledge.json", ".trae/knowledge_graph.jsonl"],
"auto_record_entry": "node scripts/update-knowledge.mjs",
"note": "以上为本项目把通用方法落地的具体载体,替换其他项目时只需替换本块。"
},
"sources": [
"AGENTS.md 开放标准(Agentic AI Foundation / Linux Foundation)",
"OpenAI Codex 工程团队指南(2026)",
"Anthropic Claude Code 最佳实践(2026)",
"Cursor Rules / .mdc 规范(2026)",
"Trae IDE 官方规则与 MCP 文档(2026)"
],
"entities": [
{
"id": "principle:stateless-agent",
"type": "principle",
"name": "Agent 无状态",
"summary": "AI 代理每次会话从零开始,不记得上次讨论。规则文件与知识库的唯一作用是注入跨会话持久上下文。",
"applies_to": ["理解为什么必须维护 rules + 知识库"],
"consequence": "上下文不落盘 = 每次都重新犯错;落盘 = 迭代效率复利"
},
{
"id": "principle:enforcement-pyramid",
"type": "principle",
"name": "执行金字塔(Advisory → Gate → Hook)",
"summary": "规则文件只是建议层。关键标准必须逐级下沉:rules(建议)→ CI/测试门禁(强制)→ hooks(确定性)。",
"applies_to": ["关键规范落地", "防止规则被忽略"],
"levels": ["advisory: .trae/rules/*.md", "gate: npm test / tsc --noEmit / code review", "hook: git pre-commit / post-commit / CI"]
},
{
"id": "principle:context-budget",
"type": "principle",
"name": "上下文是预算",
"summary": "只注入与本任务相关的文件与最近变更;大仓库用分层索引,避免一次性灌入冗余历史。",
"applies_to": ["大代码库协作", "降低 token 成本与跑偏率"],
"levels": ["L0 索引: rules/README.md + 本文件 id 列表", "L1 规范: ai_collaboration.md / ai_agent_rules.md", "L2 项目知识: knowledge_graph.jsonl", "L3 细节: 具体源码文件"]
},
{
"id": "principle:single-source-of-truth",
"type": "principle",
"name": "单一事实源",
"summary": "同一份知识只允许一个权威载体,其他位置派生或引用;否则必然漂移。",
"applies_to": ["规则与知识库治理"],
"antipattern_ref": "antipattern:divergent-copies"
},
{
"id": "principle:observability-first",
"type": "principle",
"name": "可观测优先",
"summary": "AI 生成的代码默认只优化「能跑」而非「可排查」。必须显式要求日志/指标/错误上下文,否则凌晨排障无窗口。",
"applies_to": ["服务端代码", "定时任务脚本"],
"project_binding": "scripts/lib/logger.mjs + TaskLog 表"
},
{
"id": "method:task-decomposition",
"type": "method",
"name": "任务拆解",
"summary": "把大任务拆成 Epic→Story→Task→Step,每步有明确输入/输出契约,避免黑盒式长推理。",
"how": [
"窄范围 > 大而模糊:『修 /api/tools 分页 total 字段』优于『改进工具模块』",
"每步定义输入(依赖文件/数据)与输出(验收标准)",
"状态机驱动:Pending → Running → Blocked → Done / Failed"
],
"evidence": "Agent 在大而模糊的任务上跑偏率显著更高;窄范围单目标任务成功率最高",
"project_binding": "TodoWrite 工具 + 本文件 workflow:plan-first"
},
{
"id": "method:context-engineering",
"type": "method",
"name": "上下文工程",
"summary": "为 AI 提供强结构化的项目上下文(架构/规范/示例/反例),防止它用通用默认猜测。",
"how": [
"持久上下文写入 rules 文件,而非每次对话重复交代",
"文档化架构决策、命名约定、错误处理规则、禁止事项",
"措辞精确可验证,给出正例与反例",
"项目专属事实写进知识图谱,方法层写进本文件"
],
"evidence": "缺乏上下文时 AI 易混用 API、忽略错误处理、用过时库",
"project_binding": [
".trae/rules/project_rules.md(工程标准)",
".trae/rules/ai_collaboration.md(协作流程)",
".trae/ai_coding_knowledge.json(本文件,方法层)",
".trae/knowledge_graph.jsonl(事实层)"
]
},
{
"id": "method:acceptance-criteria",
"type": "method",
"name": "验收标准",
"summary": "每个任务开始前必须定义可验证的验收标准,否则 AI 无法可靠收敛。",
"how": [
"例:『npx tsc --noEmit 零错误 + npx vitest run 全绿 + 无 N+1』",
"verification 与 implementation 一样是交付物的一部分"
],
"applies_to": ["所有 AI 代理任务"],
"antipattern_ref": "antipattern:no-acceptance"
},
{
"id": "method:plan-first",
"type": "method",
"name": "Plan-first 工作流",
"summary": "先规划后执行:Explore → Plan → Implement → Verify 四阶段,提升一致性与可预测性。",
"how": [
"Explore:先读代码/规格/知识图谱,理解现状",
"Plan:输出结构化计划(步骤 + 依赖 + 验收标准),复杂任务先给计划再动手",
"Implement:按计划分步实现,一步一验证",
"Verify:跑门禁;失败回到 Implement"
],
"applies_to": ["复杂功能开发", "重构", "跨模块改动"],
"workflow_ref": "workflow:plan-first-loop"
},
{
"id": "method:review-diff",
"type": "method",
"name": "看 diff 不看对话",
"summary": "审查 AI 产出必须看实际 git diff,而不是它自己的解释。",
"how": ["用 git diff / IDE diff 视图逐行审查", "AI 的自我描述可信度低于实际改动", "对照验收标准核验,而非对照 AI 的说法"],
"evidence": "AI 可能误报自己做了什么;diff 才是真相",
"antipattern_ref": "antipattern:skip-review"
},
{
"id": "method:model-tiering",
"type": "method",
"name": "模型成本分级",
"summary": "高难步骤用强模型,常规步骤用轻量模型,控制时延与成本。",
"how": [
"补全/格式/单文件改动 → 轻量模型",
"架构决策/疑难根因/跨模块重构 → 强模型",
"任务开始先用轻量,按需升级"
],
"evidence": "分级可省 40-70% 成本而不明显降低质量"
},
{
"id": "method:logging-standard",
"type": "method",
"name": "日志标准(最高 ROI 规则)",
"summary": "强制 AI 产出可观测日志,因为 LLM 天然少打日志。",
"how": ["规则层强制日志格式,禁止 print('done') 式输出", "记录关键状态、失败原因、输入输出摘要", "脚本统一走 scripts/lib/logger.mjs,结果写 TaskLog"],
"applies_to": ["服务端代码", "定时任务脚本"],
"project_binding": "workspace 规则 §8.7 日志规范"
},
{
"id": "method:failure-classification",
"type": "method",
"name": "失败分型",
"summary": "把 AI 失败分为规划失败/执行失败/质量失败,分型后再优化,避免盲目调 prompt。",
"how": [
"规划失败 → 重新拆解任务",
"执行失败 → 修工具/环境/依赖",
"质量失败 → 收紧验收标准或门禁"
],
"applies_to": ["AI 任务复盘"],
"evidence": "分型后针对优化,比反复调 prompt 有效得多"
},
{
"id": "method:spec-driven",
"type": "method",
"name": "规格驱动开发",
"summary": "先写规格(输入/输出/边界/验收),再让 AI 实现;规格是 AI 与人的共同契约。",
"how": ["复杂需求先落到 .trae/specs/ 或设计文档", "规格含验收标准与不变量", "实现阶段只对照规格,不临场改需求"],
"applies_to": ["新模块", "接口变更", "结构重构"]
},
{
"id": "method:test-first-gate",
"type": "method",
"name": "测试先行 + 门禁",
"summary": "先写失败测试再实现,让 AI 有确定的收敛目标;门禁命令必须可一键复现。",
"how": ["先补一条会失败的用例", "实现到用例转绿", "提交前跑 tsc + vitest 双门禁"],
"project_binding": "Vitest;门禁:npx tsc --noEmit && npx vitest run"
},
{
"id": "method:incremental-refactor",
"type": "method",
"name": "小步重构",
"summary": "行为不变前提下小步改动,每步可回滚,禁止一次性大重构。",
"how": ["一次只改一个关注点", "每步跑门禁保持全绿", "大重构拆成可独立验证的若干步"]
},
{
"id": "workflow:plan-first-loop",
"type": "workflow",
"name": "Plan-first 主循环",
"summary": "本项目标准工作流:加载上下文 → 探索 → 规划 → 分步实现 → 验证 → 自动记录。",
"stages": ["load_context", "explore", "plan", "implement", "verify", "auto_record"],
"how": [
"load_context:读 rules/README.md → 本文件 → knowledge_graph.jsonl(按需)",
"verify:npx tsc --noEmit + npx vitest run,失败回 implement",
"auto_record:node scripts/update-knowledge.mjs(见 workflow:auto-record)"
],
"evidence": "可复用的 plan-first 流程让产出可预测、可验证"
},
{
"id": "workflow:edit-test-loop",
"type": "workflow",
"name": "Edit-Test Loop(编辑-测试循环)",
"summary": "让 AI 自主形成『写→测→读报错→修→重跑』闭环,是最核心的提效模式。",
"stages": ["写代码", "跑测试", "读报错", "修复", "重跑直到通过"],
"how": [
"给一条完整指令:实现 + 补测试 + 测试通过再报告",
"允许 AI 自动运行安全测试命令",
"通常 2-5 轮收敛到全绿"
],
"evidence": "让 AI 自闭环比人工逐步确认 diff 效率高数倍",
"tool_fit": ["tool:trae", "tool:claude-code"]
},
{
"id": "workflow:subagent-fanout",
"type": "workflow",
"name": "子代理并行扇出",
"summary": "把互相独立的任务拆成多个子代理并行执行,主代理只做编排与合并,保护主上下文。",
"stages": ["识别独立任务", "并行派发子代理", "汇总结果", "主代理复核与合并"],
"how": [
"仅对无共享状态的独立任务并行(如同时核查 3 个仓库/3 个目录)",
"探索型任务交给搜索代理,避免污染主上下文",
"子代理返回结论而非原始日志"
],
"evidence": "并行 + 上下文隔离,是大仓库提效的关键手段"
},
{
"id": "workflow:auto-record",
"type": "workflow",
"name": "开发完成自动记录",
"summary": "每次开发完成后自动捕获三类信息并沉淀,形成持续更新的知识库。",
"stages": ["scan_capabilities", "collect_dev_process", "capture_artifacts", "upsert_knowledge_graph"],
"how": [
"命令:node scripts/update-knowledge.mjs(可加 --dry-run 预览)",
"能力特征 → .trae/knowledge/capabilities.json(API/页面/组件/模型/脚本/任务/技术栈快照)",
"开发过程 → .trae/knowledge/dev_process.jsonl(按 commit 追加)",
"模型成果 → .trae/knowledge/artifacts.jsonl(迁移/脚本/提交统计等交付物)",
"写回 .trae/knowledge_graph.json(权威)+ .trae/knowledge_graph.jsonl(MCP 读取)"
],
"trigger": ["git post-commit hook(本机自动)", "AI 任务收尾手动执行", "npm run knowledge:update"],
"evidence": "不落盘的迭代 = 每次重新开始;落盘后 AI 可直接检索历史决策与踩坑",
"project_binding": "scripts/update-knowledge.mjs"
},
{
"id": "workflow:persistent-context-load",
"type": "workflow",
"name": "持久上下文加载顺序",
"summary": "AI 每次任务开始按固定顺序加载上下文,避免重复交代与遗漏。",
"stages": ["rules/README.md(索引)", "ai_agent_rules.md(启动规则)", "ai_coding_knowledge.json(方法层)", "knowledge_graph.jsonl(事实层,按需)", "具体源码"],
"how": ["先索引后详情,按 context-budget 原则只加载相关部分"],
"evidence": "固定加载顺序让 AI 行为可预测,减少『忘记项目约定』类返工"
},
{
"id": "tool:trae",
"type": "tool",
"category": "ai_ide",
"name": "Trae",
"summary": "本项目实际使用的 AI IDE,规则体系(.trae/rules)+ MCP + 技能 + 子代理。",
"observations": [
".trae/rules/*.md 规则体系(工作区级 + 项目级)",
".trae/mcp.json 注册 MCP 服务(含 Knowledge Graph Memory)",
"内置子代理(搜索/前端/后端/测试等)与 TodoWrite 任务管理",
"支持的 Skills 可封装可复用流程"
],
"use_cases": ["本项目日常开发", "规则驱动的 AI 协作", "知识库维护"],
"strengths": ["规则+知识图谱+子代理一体", "中文语境好"],
"weaknesses": ["生态较新", "部分能力依赖版本"]
},
{
"id": "tool:claude-code",
"type": "tool",
"category": "terminal_agent",
"name": "Claude Code",
"summary": "终端 Agent-first 工具,大上下文,可读代码库、改文件、跑命令、自修复,端到端完成任务。",
"observations": ["MCP 原生支持", ".claude/skills 跨会话复用约定", "hooks 做确定性约束", "自动读报错→定位→修复→重跑测试闭环"],
"use_cases": ["大型重构", "跨文件修改", "疑难 Bug 根因定位", "代码审查"],
"strengths": ["自主性最高", "终端串联顺手", "MCP 生态完整"],
"weaknesses": ["无 IDE 补全体验", "长任务易跑偏需纠偏"]
},
{
"id": "tool:cursor",
"type": "tool",
"category": "ai_ide",
"name": "Cursor",
"summary": "AI 原生 IDE,Tab 补全 + 内联编辑 + 多文件 Agent,零学习曲线。",
"observations": ["Tab 补全业界领先", ".cursor/rules/*.mdc 按 glob 自动激活规则", "多模型自由切换", "2025 年底起原生读 AGENTS.md"],
"use_cases": ["日常编码", "小粒度修改", "保持心流"],
"strengths": ["补全最顺滑", "可视化 Diff", "有免费层"],
"weaknesses": ["超大重构易跑偏", "CI/脚本集成弱"]
},
{
"id": "tool:codex",
"type": "tool",
"category": "cloud_agent",
"name": "OpenAI Codex",
"summary": "云端异步编码 Agent,沙箱执行,超大上下文,适合批量异步任务。",
"observations": ["异步任务模式:提交后云端执行,完成后通知", "AGENTS.md 标准发起者", "可并行批量处理", "支持只读/全自动权限分级"],
"use_cases": ["批量修改", "自动提 PR", "异步后台任务", "CI/CD 集成"],
"strengths": ["异步并行", "沙箱安全", "上下文最大"],
"weaknesses": ["非实时", "沙箱无本地文件直访"]
},
{
"id": "tool:copilot",
"type": "tool",
"category": "ide_extension",
"name": "GitHub Copilot",
"summary": "IDE 插件,补全 + agent 模式,通过 copilot-instructions.md 注入项目上下文。",
"observations": ["补全速度快", "GitHub 深度集成", "agent 模式支持多文件编辑与建 PR"],
"use_cases": ["日常补全", "快速原型", "GitHub 工作流"],
"strengths": ["补全快", "集成深"],
"weaknesses": ["自主性弱于终端 Agent"]
},
{
"id": "tool:mcp",
"type": "tool",
"category": "protocol",
"name": "MCP(Model Context Protocol)",
"summary": "AI 与外部工具/数据源的标准接口层,让代理具备确定性能力(读库、查图、调 API)。",
"observations": [
"本项目 .trae/mcp.json 注册服务",
"Knowledge Graph Memory:结构化长期记忆(读写 .trae/knowledge_graph.jsonl)",
"可接数据库/仓库/浏览器等外部能力",
"工具描述文件需先读 schema 再调用"
],
"use_cases": ["长期记忆", "确定性数据访问", "跨会话知识复用"],
"strengths": ["标准化", "可组合", "确定性优于纯 prompt"],
"weaknesses": ["需按 schema 调用", "服务未挂载则退化为文件维护"]
},
{
"id": "tool:agents-md",
"type": "tool",
"category": "standard",
"name": "AGENTS.md 开放标准",
"summary": "跨工具的项目上下文单一事实源,symlink 到各工具专属文件,解决配置碎片化。",
"observations": ["ln -s AGENTS.md CLAUDE.md / .cursorrules", "已被数万开源项目采用", "Cursor/Codex 原生支持"],
"use_cases": ["多工具并存的项目", "上下文统一治理"],
"strengths": ["一次编写多工具复用"],
"weaknesses": ["各工具支持度仍有差异"]
},
{
"id": "anti_pattern:one-shot-big",
"type": "anti_pattern",
"name": "一次性生成大量代码",
"why_bad": "Agent 在大任务里易跑偏,产出难审查、难验证",
"fix": "任务拆解,一次只给一个窄范围目标,分步实现 + 验证",
"detect": "单个任务改动文件数 > 15 或 diff > 800 行时需重新拆解"
},
{
"id": "anti_pattern:no-acceptance",
"type": "anti_pattern",
"name": "没有验收标准",
"why_bad": "AI 无法判断任务是否完成,会无限发散或过早收工",
"fix": "每个任务先定义可验证标准(tsc 零错误 / vitest 全绿 / 性能不回归)",
"detect": "任务开始前说不出『怎么算完成』即触发"
},
{
"id": "anti_pattern:skip-review",
"type": "anti_pattern",
"name": "不审查 AI 生成代码",
"why_bad": "可能含 bug、安全风险、过时实践、臆造 API",
"fix": "看 diff 逐行审查 + 类型检查 + 测试三重门禁",
"detect": "直接 git commit 且未跑门禁即触发"
},
{
"id": "anti_pattern:vague-task",
"type": "anti_pattern",
"name": "模糊的大任务",
"why_bad": "『优化一下社区模块』这类任务 Agent 必然迷失",
"fix": "改成窄范围明确目标,并给出验收标准",
"detect": "任务描述无具体文件/接口/行为即触发"
},
{
"id": "anti_pattern:context-overload",
"type": "anti_pattern",
"name": "一次性灌入冗余历史",
"why_bad": "上下文超载导致抓不住重点、成本飙升、准确率下降",
"fix": "只注入必要文件与最近变更,分层索引按需加载",
"detect": "单次注入 > 10 个无关文件即触发"
},
{
"id": "anti_pattern:model-is-everything",
"type": "anti_pattern",
"name": "把模型更强当系统更稳",
"why_bad": "没有编排、门禁与观测,强模型也会产生不可控波动",
"fix": "模型层 + 编排层 + 门禁/观测层三层闭环,而非只换更强模型",
"detect": "复盘只归因于『换个模型就好』且无门禁改进即触发"
},
{
"id": "anti_pattern:divergent-copies",
"type": "anti_pattern",
"name": "同一知识多份副本各自漂移",
"why_bad": "规则/图谱/文档多份并存且内容冲突,AI 加载到哪份全靠运气",
"fix": "确立单一事实源(其余派生)+ 增量化同步脚本 + 定期一致性巡检",
"detect": "同一事实在两处以上出现且可被独立编辑即触发",
"project_evidence": "2026-10-01 巡检发现:两份 project_rules.md 并存、根 modules.md 与实际规格文件不一致"
},
{
"id": "anti_pattern:memory-rot",
"type": "anti_pattern",
"name": "知识库只写不更新",
"why_bad": "知识图谱/规则过期后,AI 会依据错误事实决策,比没有知识更危险",
"fix": "开发完成强制运行 auto_record;关键节点做『图谱 vs 代码』一致性巡检",
"detect": "knowledge_graph.updated_at 落后于最近 commit 超过 7 天即触发",
"project_binding": "workflow:auto-record + node scripts/update-knowledge.mjs"
}
],
"relations": [
{"from": "method:context-engineering", "to": "principle:stateless-agent", "type": "SOLVES"},
{"from": "method:context-engineering", "to": "anti_pattern:context-overload", "type": "AVOIDS"},
{"from": "method:task-decomposition", "to": "anti_pattern:one-shot-big", "type": "AVOIDS"},
{"from": "method:task-decomposition", "to": "anti_pattern:vague-task", "type": "AVOIDS"},
{"from": "method:acceptance-criteria", "to": "anti_pattern:no-acceptance", "type": "AVOIDS"},
{"from": "method:review-diff", "to": "anti_pattern:skip-review", "type": "AVOIDS"},
{"from": "method:failure-classification", "to": "anti_pattern:model-is-everything", "type": "AVOIDS"},
{"from": "principle:single-source-of-truth", "to": "anti_pattern:divergent-copies", "type": "AVOIDS"},
{"from": "workflow:auto-record", "to": "anti_pattern:memory-rot", "type": "AVOIDS"},
{"from": "workflow:auto-record", "to": "workflow:persistent-context-load", "type": "FEEDS"},
{"from": "workflow:plan-first-loop", "to": "method:task-decomposition", "type": "USES"},
{"from": "workflow:plan-first-loop", "to": "method:plan-first", "type": "IMPLEMENTS"},
{"from": "workflow:plan-first-loop", "to": "workflow:edit-test-loop", "type": "CONTAINS"},
{"from": "workflow:plan-first-loop", "to": "workflow:auto-record", "type": "ENDS_WITH"},
{"from": "workflow:edit-test-loop", "to": "method:test-first-gate", "type": "USES"},
{"from": "method:test-first-gate", "to": "principle:enforcement-pyramid", "type": "IMPLEMENTS"},
{"from": "method:logging-standard", "to": "principle:observability-first", "type": "IMPLEMENTS"},
{"from": "method:spec-driven", "to": "method:acceptance-criteria", "type": "REQUIRES"},
{"from": "method:plan-first", "to": "method:spec-driven", "type": "RELATES_TO"},
{"from": "method:incremental-refactor", "to": "anti_pattern:one-shot-big", "type": "AVOIDS"},
{"from": "workflow:subagent-fanout", "to": "principle:context-budget", "type": "IMPLEMENTS"},
{"from": "tool:trae", "to": "workflow:plan-first-loop", "type": "BEST_AT"},
{"from": "tool:claude-code", "to": "workflow:edit-test-loop", "type": "BEST_AT"},
{"from": "tool:cursor", "to": "method:task-decomposition", "type": "NEEDS"},
{"from": "tool:codex", "to": "tool:agents-md", "type": "ORIGINATES"},
{"from": "tool:trae", "to": "tool:mcp", "type": "SUPPORTS"},
{"from": "tool:trae", "to": "workflow:auto-record", "type": "HOSTS"},
{"from": "tool:mcp", "to": "workflow:auto-record", "type": "STORES"}
]
}
+457
View File
@@ -0,0 +1,457 @@
{
"project": "追光AI",
"version": "V2.1.2",
"updated_at": "2026-10-01T09:04:53",
"entities": [
{
"type": "entity",
"entityType": "Project",
"name": "追光AI",
"observations": [
"项目名称:追光AI (zhuiguang-ai),AI 工具与技能发现/评测/社区平台",
"技术栈:Next.js 14 App Router + TypeScript(strict) + Tailwind CSS + shadcn/ui + Prisma 7.8(MariaDB adapter) + MySQL(阿里云RDS) + NextAuth v4 + Redis(ioredis)",
"版本:V2.1.2(package.json;Docker 镜像 tag zhuiguang-ai:2.1.3)",
"生产域名:https://www.zhuig.com(备用 ai.zhuig.com)",
"端口锁定:8301-8310,默认 8301",
"代码规模:154 个 API 路由(route.ts)、61 个页面(page.tsx)、90 个组件(tsx)、69 个脚本(mjs)、56 个 Prisma 模型、22 个迁移",
"本地工作副本:E:\\KF_7\\ZhuiGuangAI\\zhuiguang-ai(master)",
"2026-10-01 巡检:本地源码与服务器 /home/ubuntu/zhuiguang-ai 源码逐文件一致(493 个文件 MD5 相同)"
]
},
{
"type": "entity",
"entityType": "Infrastructure",
"name": "追光AI:服务器与基础设施",
"observations": [
"服务器:119.45.242.239(登录用户 ubuntu)",
"SSH 私钥:E:\\0.Center-S2\\S890-V3\\pem\\zg.pem(规则旧路径 C:\\SGP_KF\\ZhuiGuangAI\\zhuiguang-ai\\Pem\\zg.pem 已失效)",
"部署目录:/home/ubuntu/zhuiguang-ai",
"数据库:阿里云 RDS MySQL rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai",
"共享服务(禁动):redis-cache:6379、nacos:8848、minio:9000、系统 nginx:80/443",
"nginx 站点配置:/etc/nginx/sites-enabled/zhuiguang-ai → 127.0.0.1:8301",
"SSL 证书:/etc/letsencrypt/live/www.zhuig.com(自动续期)",
"邻居项目(只读):zhuiguang-quant、zhenfang、snowy-fgt、agent-system、nacos、gpsj2-webhook"
]
},
{
"type": "entity",
"entityType": "Deployment",
"name": "追光AI:容器化部署",
"observations": [
"镜像:zhuiguang-ai:2.1.3(多阶段构建 Dockerfile)",
"容器1:zhuiguang-ai-app(Next.js,端口 8301,healthcheck /api/health)",
"容器2:zhuiguang-ai-cron(supercronic 调度,healthcheck pgrep supercronic)",
"网络:network_mode: host(直接访问宿主机 Redis/Nacos/MinIO)",
"命名卷:zhuiguang-ai_bot-data / zhuiguang-ai_bot-public / zhuiguang-ai_bot-logs / zhuiguang-ai_bot-prisma",
"生产环境变量:/home/ubuntu/zhuiguang-ai/env/.env.production(chmod 600)",
"部署脚本:scripts/deploy-build.sh(docker build --build-arg DATABASE_URL)+ scripts/deploy-run.sh(docker stop/rm + docker run)",
"部署方式:非 git 拉取式,服务器仓库无 git remote",
"2026-10-01 状态:两容器均 Up 21h (healthy),/api/health 返回 database ok"
]
},
{
"type": "entity",
"entityType": "ScheduledTask",
"name": "追光AI:定时任务体系",
"observations": [
"调度器:zhuiguang-ai-cron 容器内 supercronic,配置文件 crontab.txt(容器内按 UTC 执行 = 北京时间 -8h)",
"启用任务数:19 个",
"启用清单:task1-discover-tools、task3-check-tools、task4-discover-skills(daily-discover)、task5-update-stars、task6-review-hot、daily-news、task7-news-to-community、cleanup-logs、cleanup-task-logs、reconcile-like-counts、health-check、weekly-recommend-email、grant-freeze-cards、notification-digest、newsletter-generate、competitor-monitor、trend-alert、enrich-tool-data、industry-thinktank(collect)",
"已停用:bot-activity、bot-skill-crystallize、bot-affinity-update、bot-weekly-review、bot-feedback-loop、bot-adversarial-learning-run、bot-persona-experiment-run、bot-roundtable、industry-thinktank(weekly/respond)、industry-daily(daily/respond)",
"停用原因:2026-09-05 旧『模拟真人互刷』Bot 体系退役;2026-09-26 按要求关闭全部 AI 生成功能(行业情报改为需登录访问)",
"四方同步要求:新增任务须同步 crontab.txt + seed-task-configs.mjs + health-check.mjs",
"已知漂移(2026-10-01):seed-task-configs.mjs 仍 enabled:true、health-check.mjs 仍列为期望键,会产生误告警"
]
},
{
"type": "entity",
"entityType": "Subsystem",
"name": "追光AI:数字人Bot系统",
"observations": [
"角色定义:data/bot-characters.json,当前仅 6 个『行业情报官』角色(cb_intel、fi_ins_intel、fi_stock_intel、brand_intel、ai_intel、ct_intel)",
"历史:曾为 112 个角色体系,2026-09-05 退役,改由行业情报官引擎承担",
"头像资源:public/bot-avatars 178 个 SVG;会员头像库 public/avatars 530 个 SVG",
"Bot 用户标记:User.isBot = true",
"Bot 专用表 12 张:BotConfig/BotMemory/BotDailyStat/BotSkill/BotWeeklyReview/BotPersona/BotPersonaVariant/BotPersonaExperiment/BotPersonaAssignment/BotPersonaMetric/BotAdversarialLearning/BotCrossForumAffinity"
]
},
{
"type": "entity",
"entityType": "DataModel",
"name": "追光AI:数据模型",
"observations": [
"ORM:Prisma 7.8 + PrismaMariaDb adapter(禁止直接 new PrismaClient()),datasource.url 位于 prisma.config.ts",
"模型总数:56 个(prisma/schema.prisma)",
"迁移:prisma/migrations 共 22 个",
"命名约定:模型 PascalCase + @@map(snake_case);字段 camelCase + @map(snake_case)",
"库:阿里云 RDS MySQL zhuiguang_ai(严禁 DROP/TRUNCATE/删迁移,走 migrate deploy 前向变更)"
]
},
{
"type": "entity",
"entityType": "Repository",
"name": "追光AI:代码仓库与备份",
"observations": [
"当前工作副本:E:\\KF_7\\ZhuiGuangAI\\zhuiguang-ai(master,18 个提交,~500 项未提交改动)",
"本地裸仓镜像:K:\\git-repos\\zhuiguang-ai.git(2026-10-01 新建,bare,HEAD=master)",
"裸仓校验:HEAD b44601b 与源一致、18 提交、1504 对象、git fsck 无错",
"远程现状:E:\\KF_7 的 remote『local』仍指向已不存在的 c:\\gitbf\\zhuiguang-ai.git",
"副本 E:\\ZG_Dev\\ZhuiGuangAI\\zhuiguang-ai:停在 6c78c32(2026-05-23),无 remote,历史已被 E:\\KF_7 完整包含",
"旧副本 K:\\git-repos\\zhuiguang-ai(非裸仓):停在 2026-05-23,origin 指向 E:\\ZG_Dev",
"云端 Gitea(119.45.242.239:3000,v1.27.1):本项目无仓库,无法推送"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(01-数据库)",
"observations": [
"规格文档:.trae/specs/modules/01-database.md",
"覆盖 Prisma Schema、56 个数据模型、MariaDB/RDS"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(02-API)",
"observations": [
"规格文档:.trae/specs/modules/02-api.md",
"覆盖 REST API 路由(154 个 route.ts)、认证、缓存、v1 公开 API",
"响应约定:列表 {data,total,page,pageSize};错误 {success:false,error}"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(03-页面)",
"observations": [
"规格文档:.trae/specs/modules/03-pages.md",
"Next.js 14 App Router 页面体系(61 个 page.tsx)"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(04-组件与样式)",
"observations": [
"规格文档:.trae/specs/modules/04-components-and-styles.md",
"UI 组件库(90 个 tsx)、Tailwind CSS、shadcn/ui"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(05-AI发现)",
"observations": [
"规格文档:.trae/specs/modules/05-ai-discovery.md",
"提示词+JSON 粘贴导入模式,不调用外部 AI API"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(06-认证)",
"observations": [
"规格文档:.trae/specs/modules/06-auth.md",
"NextAuth v4 Credentials、RBAC、API Key 认证、middleware 保护 /admin 与 /api/admin"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(07-库与脚本)",
"observations": [
"规格文档:.trae/specs/modules/07-lib-and-scripts.md",
"src/lib 纯函数库 + scripts/ 定时任务与运维脚本(69 个 mjs)"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(08-社区)",
"observations": [
"规格文档:.trae/specs/modules/08-community.md",
"论坛、帖子、评论、签到、排行榜、举报、通知"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(09-运维与部署)",
"observations": [
"规格文档:.trae/specs/modules/09-devops.md",
"容器化部署、crontab、备份、监控;注意该文档仍写『本地Git同步目录 C:\\gitbf』,与工作区规则 K:\\git-repos 不一致"
]
},
{
"type": "entity",
"entityType": "Module",
"name": "追光AI:模块(10-Bot系统)",
"observations": [
"规格文档:.trae/specs/modules/10-bot-system.md",
"数字人 Bot 引擎;旧体系已于 2026-09-05 退役,现为行业情报官引擎"
]
},
{
"type": "entity",
"entityType": "Convention",
"name": "追光AI:开发约定(导航与图片)",
"observations": [
"页面内导航必须用 next/link <Link>,禁止 button+router.push;仅外链用 <a target=_blank rel=noopener noreferrer>",
"图片强制使用 src/components/ui/LazyImage.tsx,禁止原生 <img>",
"首屏 LCP 图片加 priority,每页最多 1-2 张",
"长列表(>50) 用 VirtualList 虚拟滚动"
]
},
{
"type": "entity",
"entityType": "Convention",
"name": "追光AI:开发约定(数据获取与性能)",
"observations": [
"含 generateStaticParams 的页面必须声明 export const revalidate 与 dynamicParams",
"高频读接口使用 cachedResponse 缓存,写入后 invalidateCache 失效",
"详情页用 include/_count 一次取关联计数,禁止 N+1",
"互不依赖的 Prisma 查询必须 Promise.all 并行",
"非首屏组件用 next/dynamic 懒加载"
]
},
{
"type": "entity",
"entityType": "Convention",
"name": "追光AI:开发约定(安全与校验)",
"observations": [
"API 路由必须用 Zod 校验请求体;批量上限:工具/技能导入 100、新闻 50、发布 500",
"后台写操作 API 必须调用 requireAdmin()",
"禁止硬编码密钥,全部走环境变量且 .env.example 同步",
"CSP script-src 必须含 'unsafe-inline'(Next.js App Router 水合依赖),禁止 'unsafe-eval'",
"外键回退值禁止硬编码魔法数字,须查库取有效 ID"
]
},
{
"type": "entity",
"entityType": "Issue",
"name": "追光AI:巡检问题与处理(2026-10-01)",
"observations": [
"规则文件 SSH 密钥路径失效:写 C:\\SGP_KF\\...\\Pem\\zg.pem,实际 E:\\0.Center-S2\\S890-V3\\pem\\zg.pem",
"双份 project_rules.md 并存且冲突:工作区根 908 行 / 项目内 357 行",
"规格文档不自洽:根 modules.md 索引 10 个模块但实际仅 5 个文件,且与项目内 17 个文件命名体系不同",
"定时任务四方同步漂移:crontab 已停用 vs seed-task-configs 仍 enabled:true vs health-check 仍期望",
"版本号不一致:package.json V2.1.2 vs 镜像 tag zhuiguang-ai:2.1.3",
"规则中『112 个 Bot 角色』已过期,实际 6 个行业情报官",
"本地约 500 项未提交改动未进入任何备份",
"Gitea 无本项目仓库,且本地 remote 指向不存在的 c:\\gitbf",
"✅ 2026-10-01 已处理(规则侧):SSH 密钥路径、工作区/裸仓镜像/远端现状、Bot 角色数(112→6)、头像数、seed 任务数(6→29)、定时任务表(改为 UTC 并标注停用)、KG 同步方式,均已同步进两份 project_rules.md",
"✅ 2026-10-01 已处理(备份侧):新建裸仓 K:\\git-repos\\zhuiguang-ai.git 并推入 master(18 提交/1504 对象/fsck 无错)",
"✅ 2026-10-01 已处理(图谱侧):建立 .trae/knowledge_graph.jsonl(21 实体/23 关系) 与渲染版 .trae/knowledge_graph.json",
"⏳ 待处理:.trae/mcp.json 为受保护文件,需人工写入 Knowledge Graph Memory 配置",
"⏳ 待处理:本地 remote『local』仍指向不存在的 c:\\gitbf;约 500 项未提交改动未进备份",
"⏳ 待处理:规格文档不自洽(根 modules.md 索引 10 个模块但仅存 5 个文件;根/项目两套命名体系不同,05 一边 auth 一边 ai-discovery)",
"⏳ 待处理:定时任务三方漂移(crontab 停用 vs seed-task-configs enabled:true vs health-check 期望键)",
"⏳ 待处理:版本号不一致(package.json V2.1.2 vs 镜像 tag zhuiguang-ai:2.1.3)",
"⏳ 待处理:双份 project_rules.md 仍并存未合并(工作区根 908 行 / 项目内约 380 行)"
]
},
{
"type": "entity",
"entityType": "Convention",
"name": "追光AI:AI协作知识体系",
"observations": [
"四层结构:L0 方法层 .trae/ai_coding_knowledge.json(AI 编程方法/工具/工作流/原则/反模式,机器可解析)|L1 协作层 .trae/rules/README.md + ai_agent_rules.md + ai_collaboration.md|L2 工程层 .trae/rules/project_rules.md|L3 事实层 .trae/knowledge_graph.jsonl/.json + .trae/knowledge/*",
"自动化记录:node scripts/update-knowledge.mjs(npm run knowledge:update)— 捕获能力特征→.trae/knowledge/capabilities.json、开发过程→dev_process.jsonl、模型成果→artifacts.jsonl,并增量 upsert 知识图谱 json+jsonl",
"触发方式:git post-commit 钩子(后台静默,不阻断提交)+ 任务收尾手动执行;换机需按 ai_collaboration.md §6 重装钩子",
"幂等保证:能力快照按实体名整条替换;开发过程按提交 hash 去重;模型成果按(日期+head提交)去重;旧实体永不删除",
"单一事实源:同一事实只存一处,其余位置只写引用(禁止复制,见反模式 divergent-copies)",
"入口文档:.trae/rules/README.md(§4 自动化闭环 / §5 维护规则)"
]
},
{
"type": "entity",
"entityType": "Capability",
"name": "追光AI:能力快照",
"observations": [
"版本: V2.1.2",
"代码规模: API 路由 154 / 页面 61 / 组件 90 / hooks 1 / lib 38",
"数据层: Prisma 模型 56 个、迁移 22 个(最新 20260605010000_forum_phase5、20260607000000_bot_persona_ab_test、20260607010000_bot_adversarial_learning、20260824170000_add_public_share_and_screenshots、20260905180000_add_thinktank)",
"脚本: 79 个(含定时任务与运维脚本)",
"定时任务: 启用 19 个 —— task1-discover-tools、task3-check-tools、daily-discover、task5-update-stars、task6-review-hot、daily-news、task7-news-to-community、cleanup-logs、cleanup-task-logs、reconcile-like-counts、health-check、weekly-recommend-email、grant-freeze-cards、notification-digest、newsletter-generate、competitor-monitor、trend-alert、enrich-tool-data、industry-thinktank",
"数字人角色: 6 个(cb_intel、fi_ins_intel、fi_stock_intel、brand_intel、ai_intel、ct_intel)",
"依赖: dependencies 26 / devDependencies 15(next 14.2.35、prisma ^7.8.0、react ^18)",
"快照时间: 2026-10-01T09:04:53(由 scripts/update-knowledge.mjs 自动生成,勿手工编辑)"
]
},
{
"type": "entity",
"entityType": "fact",
"name": "开发记录:2026-10-01",
"observations": [
"记录时间: 2026-10-01T09:04:53",
"本次交付: b44601bb feat: 全面优化系统 - 修复task1语法错误 + Bot超时保护 + 熔断重试 + Redis缓存 + SEO + 日志清理 + 内容质量评估(改动文件 12 个、12 files changed, 399 insertions(+), 12 deletions(-))",
"能力基线: API 154 / 页面 61 / 组件 90 / 模型 56 / 迁移 22 / 脚本 79 / 定时任务 19",
"b44601bb 2026-06-13 feat: 全面优化系统 - 修复task1语法错误 + Bot超时保护 + 熔断重试 + Redis缓存 + SEO + 日志清理 + 内容质量评估",
"a0a60ee9 2026-06-12 fix: 修复6个use client页面metadata冲突,创建layout.tsx承载metadata",
"4c325c86 2026-06-12 全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除",
"464924ae 2026-06-01 fix: 修复bot-activity两个致命BUG + 添加3个passerby bot补充板块覆盖 + 减少GoogleNews超时",
"a9145c4d 2026-06-01 修复自动化任务:bot-activity上线 + task7板块slug修复 + cron强化",
"维护: 运行 npm run knowledge:update 刷新本记录"
]
}
],
"relations": [
{
"type": "relation",
"relationType": "HAS_INFRASTRUCTURE",
"from": "追光AI",
"to": "追光AI:服务器与基础设施"
},
{
"type": "relation",
"relationType": "HAS_DEPLOYMENT",
"from": "追光AI",
"to": "追光AI:容器化部署"
},
{
"type": "relation",
"relationType": "HAS_SCHEDULED_TASKS",
"from": "追光AI",
"to": "追光AI:定时任务体系"
},
{
"type": "relation",
"relationType": "HAS_SUBSYSTEM",
"from": "追光AI",
"to": "追光AI:数字人Bot系统"
},
{
"type": "relation",
"relationType": "HAS_DATAMODEL",
"from": "追光AI",
"to": "追光AI:数据模型"
},
{
"type": "relation",
"relationType": "HAS_REPOSITORY",
"from": "追光AI",
"to": "追光AI:代码仓库与备份"
},
{
"type": "relation",
"relationType": "HAS_ISSUE",
"from": "追光AI",
"to": "追光AI:巡检问题与处理(2026-10-01)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(01-数据库)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(02-API)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(03-页面)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(04-组件与样式)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(05-AI发现)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(06-认证)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(07-库与脚本)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(08-社区)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(09-运维与部署)"
},
{
"type": "relation",
"relationType": "HAS_MODULE",
"from": "追光AI",
"to": "追光AI:模块(10-Bot系统)"
},
{
"type": "relation",
"relationType": "HAS_CONVENTION",
"from": "追光AI",
"to": "追光AI:开发约定(导航与图片)"
},
{
"type": "relation",
"relationType": "HAS_CONVENTION",
"from": "追光AI",
"to": "追光AI:开发约定(数据获取与性能)"
},
{
"type": "relation",
"relationType": "HAS_CONVENTION",
"from": "追光AI",
"to": "追光AI:开发约定(安全与校验)"
},
{
"type": "relation",
"relationType": "DEPLOYED_ON",
"from": "追光AI:容器化部署",
"to": "追光AI:服务器与基础设施"
},
{
"type": "relation",
"relationType": "BACKED_UP_TO",
"from": "追光AI:代码仓库与备份",
"to": "K:\\git-repos\\zhuiguang-ai.git"
},
{
"type": "relation",
"relationType": "RUNS_ON",
"from": "追光AI:定时任务体系",
"to": "追光AI:容器化部署"
},
{
"type": "relation",
"relationType": "HAS_CAPABILITY",
"from": "追光AI",
"to": "追光AI:能力快照"
},
{
"type": "relation",
"relationType": "HAS_DEV_RECORD",
"from": "追光AI",
"to": "开发记录:2026-10-01"
},
{
"type": "relation",
"relationType": "HAS_CONVENTION",
"from": "追光AI",
"to": "追光AI:AI协作知识体系"
}
]
}
+50
View File
@@ -0,0 +1,50 @@
{"type":"entity","entityType":"Project","name":"追光AI","observations":["项目名称:追光AI (zhuiguang-ai),AI 工具与技能发现/评测/社区平台","技术栈:Next.js 14 App Router + TypeScript(strict) + Tailwind CSS + shadcn/ui + Prisma 7.8(MariaDB adapter) + MySQL(阿里云RDS) + NextAuth v4 + Redis(ioredis)","版本:V2.1.2(package.json;Docker 镜像 tag zhuiguang-ai:2.1.3)","生产域名:https://www.zhuig.com(备用 ai.zhuig.com)","端口锁定:8301-8310,默认 8301","代码规模:154 个 API 路由(route.ts)、61 个页面(page.tsx)、90 个组件(tsx)、69 个脚本(mjs)、56 个 Prisma 模型、22 个迁移","本地工作副本:E:\\KF_7\\ZhuiGuangAI\\zhuiguang-ai(master)","2026-10-01 巡检:本地源码与服务器 /home/ubuntu/zhuiguang-ai 源码逐文件一致(493 个文件 MD5 相同)"]}
{"type":"entity","entityType":"Infrastructure","name":"追光AI:服务器与基础设施","observations":["服务器:119.45.242.239(登录用户 ubuntu)","SSH 私钥:E:\\0.Center-S2\\S890-V3\\pem\\zg.pem(规则旧路径 C:\\SGP_KF\\ZhuiGuangAI\\zhuiguang-ai\\Pem\\zg.pem 已失效)","部署目录:/home/ubuntu/zhuiguang-ai","数据库:阿里云 RDS MySQL rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai","共享服务(禁动):redis-cache:6379、nacos:8848、minio:9000、系统 nginx:80/443","nginx 站点配置:/etc/nginx/sites-enabled/zhuiguang-ai → 127.0.0.1:8301","SSL 证书:/etc/letsencrypt/live/www.zhuig.com(自动续期)","邻居项目(只读):zhuiguang-quant、zhenfang、snowy-fgt、agent-system、nacos、gpsj2-webhook"]}
{"type":"entity","entityType":"Deployment","name":"追光AI:容器化部署","observations":["镜像:zhuiguang-ai:2.1.3(多阶段构建 Dockerfile)","容器1:zhuiguang-ai-app(Next.js,端口 8301,healthcheck /api/health)","容器2:zhuiguang-ai-cron(supercronic 调度,healthcheck pgrep supercronic)","网络:network_mode: host(直接访问宿主机 Redis/Nacos/MinIO)","命名卷:zhuiguang-ai_bot-data / zhuiguang-ai_bot-public / zhuiguang-ai_bot-logs / zhuiguang-ai_bot-prisma","生产环境变量:/home/ubuntu/zhuiguang-ai/env/.env.production(chmod 600)","部署脚本:scripts/deploy-build.sh(docker build --build-arg DATABASE_URL)+ scripts/deploy-run.sh(docker stop/rm + docker run)","部署方式:非 git 拉取式,服务器仓库无 git remote","2026-10-01 状态:两容器均 Up 21h (healthy),/api/health 返回 database ok"]}
{"type":"entity","entityType":"ScheduledTask","name":"追光AI:定时任务体系","observations":["调度器:zhuiguang-ai-cron 容器内 supercronic,配置文件 crontab.txt(容器内按 UTC 执行 = 北京时间 -8h)","启用任务数:19 个","启用清单:task1-discover-tools、task3-check-tools、task4-discover-skills(daily-discover)、task5-update-stars、task6-review-hot、daily-news、task7-news-to-community、cleanup-logs、cleanup-task-logs、reconcile-like-counts、health-check、weekly-recommend-email、grant-freeze-cards、notification-digest、newsletter-generate、competitor-monitor、trend-alert、enrich-tool-data、industry-thinktank(collect)","已停用:bot-activity、bot-skill-crystallize、bot-affinity-update、bot-weekly-review、bot-feedback-loop、bot-adversarial-learning-run、bot-persona-experiment-run、bot-roundtable、industry-thinktank(weekly/respond)、industry-daily(daily/respond)","停用原因:2026-09-05 旧『模拟真人互刷』Bot 体系退役;2026-09-26 按要求关闭全部 AI 生成功能(行业情报改为需登录访问)","四方同步要求:新增任务须同步 crontab.txt + seed-task-configs.mjs + health-check.mjs","已知漂移(2026-10-01):seed-task-configs.mjs 仍 enabled:true、health-check.mjs 仍列为期望键,会产生误告警"]}
{"type":"entity","entityType":"Subsystem","name":"追光AI:数字人Bot系统","observations":["角色定义:data/bot-characters.json,当前仅 6 个『行业情报官』角色(cb_intel、fi_ins_intel、fi_stock_intel、brand_intel、ai_intel、ct_intel)","历史:曾为 112 个角色体系,2026-09-05 退役,改由行业情报官引擎承担","头像资源:public/bot-avatars 178 个 SVG;会员头像库 public/avatars 530 个 SVG","Bot 用户标记:User.isBot = true","Bot 专用表 12 张:BotConfig/BotMemory/BotDailyStat/BotSkill/BotWeeklyReview/BotPersona/BotPersonaVariant/BotPersonaExperiment/BotPersonaAssignment/BotPersonaMetric/BotAdversarialLearning/BotCrossForumAffinity"]}
{"type":"entity","entityType":"DataModel","name":"追光AI:数据模型","observations":["ORM:Prisma 7.8 + PrismaMariaDb adapter(禁止直接 new PrismaClient()),datasource.url 位于 prisma.config.ts","模型总数:56 个(prisma/schema.prisma)","迁移:prisma/migrations 共 22 个","命名约定:模型 PascalCase + @@map(snake_case);字段 camelCase + @map(snake_case)","库:阿里云 RDS MySQL zhuiguang_ai(严禁 DROP/TRUNCATE/删迁移,走 migrate deploy 前向变更)"]}
{"type":"entity","entityType":"Repository","name":"追光AI:代码仓库与备份","observations":["当前工作副本:E:\\KF_7\\ZhuiGuangAI\\zhuiguang-ai(master,18 个提交,~500 项未提交改动)","本地裸仓镜像:K:\\git-repos\\zhuiguang-ai.git(2026-10-01 新建,bare,HEAD=master)","裸仓校验:HEAD b44601b 与源一致、18 提交、1504 对象、git fsck 无错","远程现状:E:\\KF_7 的 remote『local』仍指向已不存在的 c:\\gitbf\\zhuiguang-ai.git","副本 E:\\ZG_Dev\\ZhuiGuangAI\\zhuiguang-ai:停在 6c78c32(2026-05-23),无 remote,历史已被 E:\\KF_7 完整包含","旧副本 K:\\git-repos\\zhuiguang-ai(非裸仓):停在 2026-05-23,origin 指向 E:\\ZG_Dev","云端 Gitea(119.45.242.239:3000,v1.27.1):本项目无仓库,无法推送"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(01-数据库)","observations":["规格文档:.trae/specs/modules/01-database.md","覆盖 Prisma Schema、56 个数据模型、MariaDB/RDS"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(02-API)","observations":["规格文档:.trae/specs/modules/02-api.md","覆盖 REST API 路由(154 个 route.ts)、认证、缓存、v1 公开 API","响应约定:列表 {data,total,page,pageSize};错误 {success:false,error}"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(03-页面)","observations":["规格文档:.trae/specs/modules/03-pages.md","Next.js 14 App Router 页面体系(61 个 page.tsx)"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(04-组件与样式)","observations":["规格文档:.trae/specs/modules/04-components-and-styles.md","UI 组件库(90 个 tsx)、Tailwind CSS、shadcn/ui"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(05-AI发现)","observations":["规格文档:.trae/specs/modules/05-ai-discovery.md","提示词+JSON 粘贴导入模式,不调用外部 AI API"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(06-认证)","observations":["规格文档:.trae/specs/modules/06-auth.md","NextAuth v4 Credentials、RBAC、API Key 认证、middleware 保护 /admin 与 /api/admin"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(07-库与脚本)","observations":["规格文档:.trae/specs/modules/07-lib-and-scripts.md","src/lib 纯函数库 + scripts/ 定时任务与运维脚本(69 个 mjs)"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(08-社区)","observations":["规格文档:.trae/specs/modules/08-community.md","论坛、帖子、评论、签到、排行榜、举报、通知"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(09-运维与部署)","observations":["规格文档:.trae/specs/modules/09-devops.md","容器化部署、crontab、备份、监控;注意该文档仍写『本地Git同步目录 C:\\gitbf』,与工作区规则 K:\\git-repos 不一致"]}
{"type":"entity","entityType":"Module","name":"追光AI:模块(10-Bot系统)","observations":["规格文档:.trae/specs/modules/10-bot-system.md","数字人 Bot 引擎;旧体系已于 2026-09-05 退役,现为行业情报官引擎"]}
{"type":"entity","entityType":"Convention","name":"追光AI:开发约定(导航与图片)","observations":["页面内导航必须用 next/link <Link>,禁止 button+router.push;仅外链用 <a target=_blank rel=noopener noreferrer>","图片强制使用 src/components/ui/LazyImage.tsx,禁止原生 <img>","首屏 LCP 图片加 priority,每页最多 1-2 张","长列表(>50) 用 VirtualList 虚拟滚动"]}
{"type":"entity","entityType":"Convention","name":"追光AI:开发约定(数据获取与性能)","observations":["含 generateStaticParams 的页面必须声明 export const revalidate 与 dynamicParams","高频读接口使用 cachedResponse 缓存,写入后 invalidateCache 失效","详情页用 include/_count 一次取关联计数,禁止 N+1","互不依赖的 Prisma 查询必须 Promise.all 并行","非首屏组件用 next/dynamic 懒加载"]}
{"type":"entity","entityType":"Convention","name":"追光AI:开发约定(安全与校验)","observations":["API 路由必须用 Zod 校验请求体;批量上限:工具/技能导入 100、新闻 50、发布 500","后台写操作 API 必须调用 requireAdmin()","禁止硬编码密钥,全部走环境变量且 .env.example 同步","CSP script-src 必须含 'unsafe-inline'(Next.js App Router 水合依赖),禁止 'unsafe-eval'","外键回退值禁止硬编码魔法数字,须查库取有效 ID"]}
{"type":"entity","entityType":"Issue","name":"追光AI:巡检问题与处理(2026-10-01)","observations":["规则文件 SSH 密钥路径失效:写 C:\\SGP_KF\\...\\Pem\\zg.pem,实际 E:\\0.Center-S2\\S890-V3\\pem\\zg.pem","双份 project_rules.md 并存且冲突:工作区根 908 行 / 项目内 357 行","规格文档不自洽:根 modules.md 索引 10 个模块但实际仅 5 个文件,且与项目内 17 个文件命名体系不同","定时任务四方同步漂移:crontab 已停用 vs seed-task-configs 仍 enabled:true vs health-check 仍期望","版本号不一致:package.json V2.1.2 vs 镜像 tag zhuiguang-ai:2.1.3","规则中『112 个 Bot 角色』已过期,实际 6 个行业情报官","本地约 500 项未提交改动未进入任何备份","Gitea 无本项目仓库,且本地 remote 指向不存在的 c:\\gitbf","✅ 2026-10-01 已处理(规则侧):SSH 密钥路径、工作区/裸仓镜像/远端现状、Bot 角色数(112→6)、头像数、seed 任务数(6→29)、定时任务表(改为 UTC 并标注停用)、KG 同步方式,均已同步进两份 project_rules.md","✅ 2026-10-01 已处理(备份侧):新建裸仓 K:\\git-repos\\zhuiguang-ai.git 并推入 master(18 提交/1504 对象/fsck 无错)","✅ 2026-10-01 已处理(图谱侧):建立 .trae/knowledge_graph.jsonl(21 实体/23 关系) 与渲染版 .trae/knowledge_graph.json","⏳ 待处理:.trae/mcp.json 为受保护文件,需人工写入 Knowledge Graph Memory 配置","⏳ 待处理:本地 remote『local』仍指向不存在的 c:\\gitbf;约 500 项未提交改动未进备份","⏳ 待处理:规格文档不自洽(根 modules.md 索引 10 个模块但仅存 5 个文件;根/项目两套命名体系不同,05 一边 auth 一边 ai-discovery)","⏳ 待处理:定时任务三方漂移(crontab 停用 vs seed-task-configs enabled:true vs health-check 期望键)","⏳ 待处理:版本号不一致(package.json V2.1.2 vs 镜像 tag zhuiguang-ai:2.1.3)","⏳ 待处理:双份 project_rules.md 仍并存未合并(工作区根 908 行 / 项目内约 380 行)","✅ 2026-10-01 已处理(知识库侧):建立 AI 编程效率知识库 .trae/ai_coding_knowledge.json、规则体系四层索引 .trae/rules/README.md + ai_agent_rules.md + ai_collaboration.md、自动化记录 scripts/update-knowledge.mjs(能力特征/开发过程/模型成果)+ npm run knowledge:update + git post-commit 钩子"]}
{"type":"entity","entityType":"Convention","name":"追光AI:AI协作知识体系","observations":["四层结构:L0 方法层 .trae/ai_coding_knowledge.json(AI 编程方法/工具/工作流/原则/反模式,机器可解析)|L1 协作层 .trae/rules/README.md + ai_agent_rules.md + ai_collaboration.md|L2 工程层 .trae/rules/project_rules.md|L3 事实层 .trae/knowledge_graph.jsonl/.json + .trae/knowledge/*","自动化记录:node scripts/update-knowledge.mjs(npm run knowledge:update)— 捕获能力特征→.trae/knowledge/capabilities.json、开发过程→dev_process.jsonl、模型成果→artifacts.jsonl,并增量 upsert 知识图谱 json+jsonl","触发方式:git post-commit 钩子(后台静默,不阻断提交)+ 任务收尾手动执行;换机需按 ai_collaboration.md §6 重装钩子","幂等保证:能力快照按实体名整条替换;开发过程按提交 hash 去重;模型成果按(日期+head提交)去重;旧实体永不删除","单一事实源:同一事实只存一处,其余位置只写引用(禁止复制,见反模式 divergent-copies)","入口文档:.trae/rules/README.md(§4 自动化闭环 / §5 维护规则)"]}
{"type":"entity","entityType":"Capability","name":"追光AI:能力快照","observations":["版本: V2.1.2","代码规模: API 路由 154 / 页面 61 / 组件 90 / hooks 1 / lib 38","数据层: Prisma 模型 56 个、迁移 22 个(最新 20260605010000_forum_phase5、20260607000000_bot_persona_ab_test、20260607010000_bot_adversarial_learning、20260824170000_add_public_share_and_screenshots、20260905180000_add_thinktank)","脚本: 79 个(含定时任务与运维脚本)","定时任务: 启用 19 个 —— task1-discover-tools、task3-check-tools、daily-discover、task5-update-stars、task6-review-hot、daily-news、task7-news-to-community、cleanup-logs、cleanup-task-logs、reconcile-like-counts、health-check、weekly-recommend-email、grant-freeze-cards、notification-digest、newsletter-generate、competitor-monitor、trend-alert、enrich-tool-data、industry-thinktank","数字人角色: 6 个(cb_intel、fi_ins_intel、fi_stock_intel、brand_intel、ai_intel、ct_intel)","依赖: dependencies 26 / devDependencies 15(next 14.2.35、prisma ^7.8.0、react ^18)","快照时间: 2026-10-01T09:04:53(由 scripts/update-knowledge.mjs 自动生成,勿手工编辑)"]}
{"type":"entity","entityType":"fact","name":"开发记录:2026-10-01","observations":["记录时间: 2026-10-01T09:04:53","本次交付: b44601bb feat: 全面优化系统 - 修复task1语法错误 + Bot超时保护 + 熔断重试 + Redis缓存 + SEO + 日志清理 + 内容质量评估(改动文件 12 个、12 files changed, 399 insertions(+), 12 deletions(-))","能力基线: API 154 / 页面 61 / 组件 90 / 模型 56 / 迁移 22 / 脚本 79 / 定时任务 19","b44601bb 2026-06-13 feat: 全面优化系统 - 修复task1语法错误 + Bot超时保护 + 熔断重试 + Redis缓存 + SEO + 日志清理 + 内容质量评估","a0a60ee9 2026-06-12 fix: 修复6个use client页面metadata冲突,创建layout.tsx承载metadata","4c325c86 2026-06-12 全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除","464924ae 2026-06-01 fix: 修复bot-activity两个致命BUG + 添加3个passerby bot补充板块覆盖 + 减少GoogleNews超时","a9145c4d 2026-06-01 修复自动化任务:bot-activity上线 + task7板块slug修复 + cron强化","维护: 运行 npm run knowledge:update 刷新本记录"]}
{"type":"relation","relationType":"HAS_INFRASTRUCTURE","from":"追光AI","to":"追光AI:服务器与基础设施"}
{"type":"relation","relationType":"HAS_DEPLOYMENT","from":"追光AI","to":"追光AI:容器化部署"}
{"type":"relation","relationType":"HAS_SCHEDULED_TASKS","from":"追光AI","to":"追光AI:定时任务体系"}
{"type":"relation","relationType":"HAS_SUBSYSTEM","from":"追光AI","to":"追光AI:数字人Bot系统"}
{"type":"relation","relationType":"HAS_DATAMODEL","from":"追光AI","to":"追光AI:数据模型"}
{"type":"relation","relationType":"HAS_REPOSITORY","from":"追光AI","to":"追光AI:代码仓库与备份"}
{"type":"relation","relationType":"HAS_ISSUE","from":"追光AI","to":"追光AI:巡检问题与处理(2026-10-01)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(01-数据库)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(02-API)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(03-页面)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(04-组件与样式)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(05-AI发现)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(06-认证)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(07-库与脚本)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(08-社区)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(09-运维与部署)"}
{"type":"relation","relationType":"HAS_MODULE","from":"追光AI","to":"追光AI:模块(10-Bot系统)"}
{"type":"relation","relationType":"HAS_CONVENTION","from":"追光AI","to":"追光AI:开发约定(导航与图片)"}
{"type":"relation","relationType":"HAS_CONVENTION","from":"追光AI","to":"追光AI:开发约定(数据获取与性能)"}
{"type":"relation","relationType":"HAS_CONVENTION","from":"追光AI","to":"追光AI:开发约定(安全与校验)"}
{"type":"relation","relationType":"DEPLOYED_ON","from":"追光AI:容器化部署","to":"追光AI:服务器与基础设施"}
{"type":"relation","relationType":"BACKED_UP_TO","from":"追光AI:代码仓库与备份","to":"K:\\git-repos\\zhuiguang-ai.git"}
{"type":"relation","relationType":"RUNS_ON","from":"追光AI:定时任务体系","to":"追光AI:容器化部署"}
{"type":"relation","relationType":"HAS_CAPABILITY","from":"追光AI","to":"追光AI:能力快照"}
{"type":"relation","relationType":"HAS_DEV_RECORD","from":"追光AI","to":"开发记录:2026-10-01"}
{"type":"relation","relationType":"HAS_CONVENTION","from":"追光AI","to":"追光AI:AI协作知识体系"}
+61
View File
@@ -0,0 +1,61 @@
# 追光AI — 规则体系索引
> 版本: v1.0 | 更新: 2026-10-01 | 所有 `.trae` 内容均在代码仓库 `zhuiguang-ai/.trae/` 内,跟着 git 走
## 一、这套规则解决什么问题
AI 代理**每次会话都是无状态的**(不记得上次讨论)。规则与知识库的唯一作用,就是把跨会话的持久上下文注入进来。
没有它们,AI 每次都会重新问、重新猜、重复踩坑 —— 迭代效率无法复利。
## 二、四层结构(单一事实源,互不复制)
| 层 | 载体 | 内容 | 何时加载 |
|----|------|------|---------|
| **L0 方法论** | `.trae/ai_coding_knowledge.json` | AI 编程效率的方法/工具/工作流/原则/反模式(**机器可解析**,不写业务) | 每次任务开始前 |
| **L1 协作规则** | `.trae/rules/ai_agent_rules.md`<br>`.trae/rules/ai_collaboration.md` | 启动加载顺序、小任务豁免、Plan-first 流程、验收标准、完成自动记录 | 每次任务开始前 / 收尾时 |
| **L2 工程标准** | `.trae/rules/project_rules.md` | 技术栈、数据获取、导航图片、无障碍、安全、定时任务、部署等硬规范 | 写代码时按需 |
| **L3 项目事实** | `.trae/knowledge_graph.jsonl`(MCP 源)<br>`.trae/knowledge_graph.json`(渲染版)<br>`.trae/knowledge/*`(能力/过程/成果自动记录) | 模块、部署、定时任务、仓库、约定、巡检问题等**事实** | 需要项目具体知识时 |
> ⚠️ **禁止跨层复制**:同一事实只允许有一个权威载体,其余位置只写引用。复制必然漂移(见反模式 `divergent-copies`)。
## 三、快速导航
| 我要… | 读哪个 |
|-------|--------|
| 开始一个开发任务 | [ai_agent_rules.md](ai_agent_rules.md) §0 |
| 知道怎么和 AI 协作、怎么算做完 | [ai_collaboration.md](ai_collaboration.md) |
| 查 AI 编程方法论 / 选工具 | `.trae/ai_coding_knowledge.json` |
| 查项目某个模块/部署/定时任务的事实 | `.trae/knowledge_graph.jsonl` |
| 查编码硬规范(安全/API/图片/无障碍) | [project_rules.md](project_rules.md) |
| 部署、运维、容器 | [project_rules.md](project_rules.md) §14–15(工程侧见 [specs/modules/09-devops.md](../specs/modules/09-devops.md)) |
## 四、自动化闭环
```
开发完成
│
├─ npm run knowledge:update ← 手动/收尾执行
└─ git post-commit hook ← 本机自动触发
│
▼
scripts/update-knowledge.mjs
│
├─ .trae/knowledge/capabilities.json 能力特征(API/页面/组件/模型/脚本/任务/依赖)
├─ .trae/knowledge/dev_process.jsonl 开发过程(按提交追加)
├─ .trae/knowledge/artifacts.jsonl 模型成果(迁移/脚本/提交统计)
└─ .trae/knowledge_graph.json / .jsonl 事实层增量 upsert
```
## 五、维护规则
1. **方法/工具层变化** → 改 `.trae/ai_coding_knowledge.json`,同步 [ai_collaboration.md](ai_collaboration.md)
2. **协作流程变化** → 改 [ai_collaboration.md](ai_collaboration.md),同步更新 `ai_coding_knowledge.json` 中对应 `workflow:*`
3. **项目事实变化** → 跑 `npm run knowledge:update`,或直接维护 `.trae/knowledge_graph.jsonl`
4. **工程标准变化** → 改 [project_rules.md](project_rules.md)
5. **废弃而非删除**:用 `> **已废弃 (date)**` 标注并写明替代方案,保留至少一个大版本周期
## 六、版本历史
| 日期 | 版本 | 变更 |
|------|------|------|
| 2026-10-01 | v1.0 | 初始版本:建立四层结构;新增 AI 编程知识库、AI 代理规则、AI 协作流程、自动记录脚本 |
+88
View File
@@ -0,0 +1,88 @@
# AI Agent 规则(启动与查询)
> 版本: v1.0 | 更新: 2026-10-01
> 相关: [README.md](README.md) · [ai_collaboration.md](ai_collaboration.md) · `../ai_coding_knowledge.json`
目的:让 AI 在本项目中**每次任务开始前按固定顺序加载上下文**,开工前就知道方法、规范与既有事实,避免重复交代与重复踩坑。
---
## §0 启动加载顺序(最高优先级)
```
1. .trae/rules/README.md ← 索引:先看有哪些层
2. .trae/ai_coding_knowledge.json ← 方法层:按 entity.type 过滤(principle/method/workflow/anti_pattern/tool)
3. .trae/rules/ai_collaboration.md ← 流程层:Plan-first / 验收标准 / 完成自动记录
4. .trae/knowledge_graph.jsonl ← 事实层:按 name / observations 关键词检索相关实体(按需,不要全量读)
5. .trae/rules/project_rules.md ← 工程标准:与本次改动相关的章节
6. 具体源码(只读相关文件)
```
**原则**:上下文是预算(见 `principle:context-budget`)。第 4、5 步**按需**加载,不要一次性灌入全部历史。
## §1 小任务豁免清单
以下任务**无需**走完整启动流程,可直接执行:
| 豁免类型 | 示例 |
|---------|------|
| 拼写修正 | 修改变量名拼写 |
| 注释/文案 | 增删注释、改中文提示文案 |
| 格式调整 | 缩进、空行、引号风格 |
| 单值配置 | 改端口号、超时时间等单个常量 |
| 纯查询 | 「XX 在哪」「XX 是什么意思」(不改代码) |
| 已给完整方案 | 用户已提供明确的文件+改法 |
## §2 非小任务:强制先查知识库
不属于 §1 的任务,开工前**必须**先检索事实层:
```
步骤1 读 .trae/rules/README.md 确定应查哪一层
步骤2 在 .trae/knowledge_graph.jsonl 中按关键词检索(name / observations)
优先匹配:实体名 > observations 关键词 > entityType 批量
步骤3 命中则读取该实体 observations,确认规范/部署/踩坑/约束
步骤4 再开始 Explore → Plan → Implement → Verify(见 ai_collaboration.md)
```
### 检索优先级
| 优先级 | 方式 | 场景 |
|--------|------|------|
| 1 | 实体名精确匹配(如 `追光AI:容器化部署`) | 已知目标实体 |
| 2 | observations 关键词(如 `cron`、`8301`、`Prisma`) | 知道主题 |
| 3 | entityType 批量(如全部 `Issue`、全部 `ScheduledTask`) | 需要某类全貌 |
### 若 Knowledge Graph Memory MCP 不可用
直接读/写 `.trae/knowledge_graph.jsonl`(JSONL,一行一实体或关系)。改动后用 `npm run knowledge:update` 同步渲染版 `.json`。
## §3 查询后输出格式
命中实体时,在回复中简述(便于复核):
```
[KG] 命中 N 条:
- Module: 追光AI:模块(09-运维与部署)
- Issue : 追光AI:巡检问题与处理(2026-10-01)
```
## §4 行为约束
### 必须
1. 非豁免任务**必须先检索知识库**再动手
2. 发现代码与已记录规范/事实冲突时**必须指出**,不得静默按代码走
3. 遇到新踩坑/新约束,**必须**在收尾时写入知识库(见 ai_collaboration.md §4)
4. 改动涉及部署/定时任务/数据模型时,**必须**同步更新对应实体
### 禁止
1. 禁止跳过检索直接改业务代码(豁免项除外)
2. 禁止把同一事实**复制**到多个文件(只写一处 + 其余引用)
3. 禁止忽略知识库中已记录的 `Issue` 实体而重复踩同一坑
4. 禁止在未跑门禁(`npx tsc --noEmit` + `npx vitest run`)的情况下声称完成
## §5 版本历史
| 日期 | 版本 | 变更 |
|------|------|------|
| 2026-10-01 | v1.0 | 初始版本:§0 启动加载顺序 + §1 豁免 + §2 强制检索 + §4 行为约束 |
+110
View File
@@ -0,0 +1,110 @@
# AI 协作流程规范
> 版本: v1.0 | 更新: 2026-10-01
> 相关: [README.md](README.md) · [ai_agent_rules.md](ai_agent_rules.md) · `../ai_coding_knowledge.json`
定义 AI 在本项目中的**协作流程**:怎么规划、怎么验证、怎么收尾、怎么沉淀。目标 —— 产出可验证、经验可复利。
---
## §0 三条不可协商的原则
1. **不一次性生成大量代码** —— 任务必须可拆解(`anti_pattern:one-shot-big`)
2. **没有验收标准不开工** —— 否则无法判断何时完成(`method:acceptance-criteria`)
3. **不审查 diff 不算完成** —— AI 的自我描述可信度低于实际改动(`method:review-diff`)
## §1 主工作流:Explore → Plan → Implement → Verify
| 阶段 | 做什么 | 产出 |
|------|--------|------|
| **Explore** | 读相关源码 / 规格 / 知识图谱实体,确认现状与约束 | 现状结论 + 涉及文件清单 |
| **Plan** | 输出结构化步骤(步骤 + 依赖 + 验收标准);复杂任务**先给计划再动手** | 计划(TodoWrite 跟踪) |
| **Implement** | 按计划分步实现,**一步一验证**,不攒到最后一起验 | 可增量验证的改动 |
| **Verify** | 跑门禁;失败回到 Implement | 门禁通过证据 |
> 复杂任务(跨 3 个以上模块 / 涉及数据模型 / 涉及部署)**必须先出计划并等确认**。
## §2 任务拆解铁律
- **窄范围 > 大而模糊**:`修 /api/tools 分页 total 字段` 优于 `改进工具模块`
- 每步定义**输入**(依赖文件/数据)与**输出**(验收标准)
- 状态机驱动:`Pending → Running → Blocked → Done / Failed`
- 单任务改动建议 ≤15 个文件;超出则重新拆解
## §3 验收标准(每个任务开工前必须明确)
| 任务类型 | 验收标准 |
|---------|---------|
| 功能开发 | `npx tsc --noEmit` 零错误 + `npx vitest run` 全绿 + 新功能可用 + 无回归 |
| Bug 修复 | 复现路径通过 + 相关测试通过 |
| 重构 | 行为不变 + 测试全绿 + 无性能回归 |
| 数据/脚本 | 输出格式正确 + 样例验证通过 + 幂等可重跑 |
| 部署/运维 | 部署后自检清单全通过(见 project_rules.md §15.3) |
本项目**双门禁**:`npx tsc --noEmit` + `npx vitest run`(缺一不可)。
## §4 代码审查:看 diff 不看对话
- 用 `git diff` 逐行审查**实际改动**
- 对照 `§3 验收标准` 核验,而不是对照 AI 的说法
- 重点排查:臆造的 API/字段、被静默删除的逻辑、异常处理缺失、硬编码密钥
## §5 失败分型(先分型,再优化)
| 失败类型 | 表现 | 优化方向 |
|---------|------|---------|
| 规划失败 | 任务拆解不合理、范围失控 | 重新拆解任务 |
| 执行失败 | 命令/环境/依赖报错 | 修工具、环境、依赖 |
| 质量失败 | 结果不满足验收标准 | 收紧验收标准或加门禁 |
> 禁止把所有失败都归因为「模型不够强」(`anti_pattern:model-is-everything`)。
## §6 完成流程:自动记录(关键,不可跳过)
开发完成并通过门禁后,**必须**运行:
```bash
npm run knowledge:update
# 等价于:node scripts/update-knowledge.mjs(可加 --dry-run 预览,不写文件)
```
脚本自动捕获三类信息并沉淀:
| 捕获内容 | 来源 | 落盘位置 |
|---------|------|---------|
| **能力特征** | 扫描 `src/app/api/**/route.ts`、`src/app/**/page.tsx`、`src/components/**`、`prisma/schema.prisma`、`scripts/**`、`crontab.txt`、`package.json`、`data/bot-characters.json` | `.trae/knowledge/capabilities.json` |
| **开发过程** | `git log`(最近提交:hash/时间/主题/改动文件数) | `.trae/knowledge/dev_process.jsonl`(按提交追加) |
| **模型成果** | 本次交付物:新增迁移、新增/变更脚本、提交统计 | `.trae/knowledge/artifacts.jsonl`(追加) |
并**增量 upsert**(按实体名,同名替换 observations,未出现的旧实体原样保留,永不删除):
- `.trae/knowledge_graph.json`(渲染版,人类可读 + 权威)
- `.trae/knowledge_graph.jsonl`(MCP Knowledge Graph Memory 读取的源文件)
**自动化触发**:本机已装 `git post-commit` 钩子(`.git/hooks/post-commit`),每次提交后自动执行同一脚本(静默 + 后台,不阻断、不拖慢提交),无需手动记得。
> **换机 / 新克隆后重装钩子**(`.git/hooks/` 不随 git 传递)——在仓库根执行:
> ```bash
> printf '#!/bin/sh\nROOT=$(git rev-parse --show-toplevel) || exit 0\n[ -f "$ROOT/scripts/update-knowledge.mjs" ] || exit 0\ncommand -v node >/dev/null 2>&1 || exit 0\n( cd "$ROOT" && node scripts/update-knowledge.mjs --quiet >/dev/null 2>&1 & )\nexit 0\n' > .git/hooks/post-commit
> ```
> 卸载:删除 `.git/hooks/post-commit` 即可(脚本本身仍可手动运行)。
> 未运行记录脚本就结束任务,视为**流程未完成**。
## §7 反模式(禁止)
| 反模式 | 替代做法 |
|--------|---------|
| 一次性生成大量代码 | 任务拆解(§2) |
| 无验收标准 | 先定义验收标准(§3) |
| 不审查 AI 代码 | 看 diff + 双门禁(§4) |
| 一次性灌入冗余上下文 | 上下文预算,按需加载 |
| 把「模型更强」当「系统更稳」 | 模型 + 编排 + 门禁三层闭环 |
| 同一知识多份副本 | 单一事实源 + 引用 |
| 知识库只写不更新 | §6 自动记录 + 定期一致性巡检 |
## §8 版本历史
| 日期 | 版本 | 变更 |
|------|------|------|
| 2026-10-01 | v1.0 | 初始版本:Plan-first 四阶段 + 验收标准 + 完成自动记录(§6) |
+134 -26
View File
@@ -1,5 +1,10 @@
# 追光AI 项目开发规则
> **本文件是 L2 工程标准层**(四层结构索引见 [README.md](README.md))。其他层:
> - L0 方法论:[../ai_coding_knowledge.json](../ai_coding_knowledge.json)(AI 编程效率方法库,机器可解析)
> - L1 协作规则:[ai_agent_rules.md](ai_agent_rules.md)(启动加载)· [ai_collaboration.md](ai_collaboration.md)(Plan-first + 自动记录)
> - L3 项目事实:[../knowledge_graph.jsonl](../knowledge_graph.jsonl)(知识图谱)· [../knowledge/](../knowledge/)(能力/过程/成果自动记录)
## 端口规范
- 应用端口范围: **8301-8310**(预留扩展)
- 默认端口: **8301**
@@ -9,9 +14,9 @@
## 服务器连接信息(重要!总是需要)
- **IP地址**: 119.45.242.239
- **登录用户**: ubuntu
- **SSH密钥**: `C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem`
- **SSH命令**: `ssh -i "C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem" ubuntu@119.45.242.239`
- **SCP示例**: `scp -i "C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem" localfile ubuntu@119.45.242.239:/home/ubuntu/zhuiguang-ai/`
- **SSH密钥**: `C:\SSH\zhuiguang-ai\zg.pem`(2026-10-02 校正;旧值 `E:\0.Center-S2\S890-V3\pem\zg.pem` 已迁移)
- **SSH命令**: `ssh -i "C:\SSH\zhuiguang-ai\zg.pem" ubuntu@119.45.242.239`
- **SCP示例**: `scp -i "C:\SSH\zhuiguang-ai\zg.pem" localfile ubuntu@119.45.242.239:/home/ubuntu/zhuiguang-ai/`
## 服务器与基础设施
- **域名**: www.zhuig.com (HTTPS,SSL证书自动续期)
@@ -19,8 +24,10 @@
- **访问地址**: https://www.zhuig.com (HTTP自动跳转HTTPS)
- **数据库**: 阿里云RDS MySQL — rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306
- **Redis**: 云服务器上已有(Docker容器redis-cache:6379),与其他项目共用,有密码认证
- **本地Git同步目录**: K:\git-repos
- **开发机**: E:\ZG_Dev\ZhuiGuangAI\zhuiguang-ai
- **工作区/开发目录**: `E:\KF_7\ZhuiGuangAI\zhuiguang-ai`(master,当前唯一活跃工作副本)
- **本地裸仓镜像(备份入口)**: `K:\git-repos\zhuiguang-ai.git`(bare,2026-10-01 新建。源仓库 remote 需指向它才能持续备份)
- **已停用副本**: `E:\ZG_Dev\ZhuiGuangAI\zhuiguang-ai`(停在 2026-05-23,无 remote)与 `K:\git-repos\zhuiguang-ai`(非裸仓旧工作副本,同样停在 2026-05-23)
- **远端现状**: 源仓库 remote `local` 仍指向已不存在的 `c:\gitbf\zhuiguang-ai.git`;云端 Gitea(119.45.242.239:3000)无本项目仓库
- **Docker管理**: `docker ps` / `docker logs zhuiguang-ai-app` / `docker restart zhuiguang-ai-app`
### ⚠️ 多项目共存服务器(更新/部署铁律)
@@ -142,9 +149,87 @@ docker logs --tail 50 zhuiguang-ai-cron # Cron 容器日志
## 构建与检查
- 修改代码后必须运行 `npx tsc --noEmit` 确认零错误
- 修改代码后必须运行 `npx vitest run` 确认所有测试通过
- 本地开发服务器: `npm run dev` (端口8301)
- 生产构建: `docker build -t zhuiguang-ai:latest .`
- 部署: `docker stop/rm` 旧容器 → `docker run` 新容器
- **打包分析**: `ANALYZE=true npm run build` 启用 `@next/bundle-analyzer` 分析包体积
## 测试规范
- 测试框架: Vitest
- 配置文件: `vitest.config.ts` + `vitest.setup.ts`
- 测试目录: `src/__tests__/`,文件名匹配 `*.test.ts`
- 覆盖率目标: **80%+**(行/分支/函数/语句)
- tsconfig 需包含 `"types": ["vitest/globals"]` 以启用全局 test/expect/describe
- 测试类别:
- 工具函数单元测试(lib 目录下的纯函数)
- API 路由集成测试
- 组件渲染测试(配合 @testing-library/react)
- 禁止跳过测试(`.skip`)除非有明确的 TODO 注释说明原因
## 图片优化规范
- **强制使用 LazyImage 组件** (`src/components/ui/LazyImage.tsx`),禁止使用原生 `<img>` 标签
- LazyImage 特性:
- 基于 next/image 的懒加载包装器
- 内置骨架屏加载状态(Skeleton loading state)
- 错误回退占位图(Error fallback)
- 支持 `referrerPolicy` 属性(用于跨域图片场景)
- 支持 `width`/`height` 或 `fill` 模式
- 用法示例:
```tsx
import LazyImage from "@/components/ui/LazyImage";
// 固定尺寸
<LazyImage src={url} alt="描述" width={32} height={32} />
// 响应式
<LazyImage src={url} alt="描述" fill className="object-cover" />
// 跨域图片
<LazyImage src={url} alt="描述" width={48} height={48} referrerPolicy="no-referrer" />
```
- 必须提供有意义的 `alt` 文本
- 装饰性图片使用 `alt=""` 配合 `role="presentation"`
## 导航规范(Link vs router.push)
- 所有静态页面内导航必须使用 Next.js `<Link>` 组件
- 禁止使用 `<button onClick={() => router.push(...)}>` 进行页面跳转
- 适用场景:
- 分页按钮 → `<Link>`
- 侧边栏筛选 → `<Link>`(含查询参数)
- 面包屑 → `<Link>`
- 卡片/列表项 → `<Link>`
- "清除筛选"按钮 → `<Link href="/base-path">`
- 仅外部链接使用 `<a>`(需加 `target="_blank" rel="noopener noreferrer"`)
## API 响应格式规范
- 列表接口统一使用 `total`(不是 `totalCount`)表示总数
- 返回格式: `{ data, total, page, pageSize }` 或 `{ success, error }`
- 前端消费端也同步使用 `total` 字段
- 已统一接口: `/api/notifications`, `/api/forum/topics`, `/api/comments`, `/api/user/points`
## 并行查询规范
- 多个独立的 Prisma 查询必须使用 `Promise.all` 并行执行
- 严禁串行 await 多个无依赖的数据库查询
```typescript
// ✅ 正确:并行查询
const [tool, relatedTools, reviewCount] = await Promise.all([
prisma.tool.findUnique({ where: { slug } }),
prisma.tool.findMany({ where: { categoryId }, take: 6 }),
prisma.review.count({ where: { toolId } }),
]);
```
## 无障碍规范(WCAG 2.1)
- 所有交互元素(div onClick)必须添加 `role` + `aria-*` 属性 + 键盘事件(`onKeyDown`)
- 搜索输入框必须添加 `aria-label` 属性
- 装饰性图片添加 `role="presentation"`(不暴露给屏幕阅读器)
- 根布局必须提供跳过导航链接(Skip-link)
- 主内容区域使用 `<main id="main-content" tabIndex={-1}>`
## TypeScript 类型规范
- 禁止使用 `any` 类型
- 泛型函数使用 `<T>` 约束(参考 `src/lib/cache.ts` 的 `cachedResponse<T>`)
- API 回调函数使用明确的参数类型
- 内联对象类型使用 interface 而非匿名类型字面量
- `src/lib/admin-auth.ts`: 使用 Prisma 严格类型,id 字段统一为 `number`
## 数据库
- 云数据库: 阿里云RDS MySQL
@@ -236,16 +321,19 @@ docker logs --tail 50 zhuiguang-ai-cron # Cron 容器日志
- OPENAI_API_KEY: OpenAI API Key(Bot活动引擎使用,生成论坛内容)
## 数字人Bot系统
- **角色定义文件**: `data/bot-characters.json` — 112个Bot角色定义,所有Bot脚本和前端工具依赖此文件
- **Bot头像目录**: `public/bot-avatars/` — 程序化SVG头像(112个,~2.5KB/个)
- **角色定义文件**: `data/bot-characters.json` — 当前 **6 个**「行业情报官」角色(cb_intel / fi_ins_intel / fi_stock_intel / brand_intel / ai_intel / ct_intel);旧 112 角色「模拟真人互刷」体系已于 2026-09-05 退役
- **Bot头像目录**: `public/bot-avatars/` — SVG 头像 178 个(含历史角色头像)
- **会员头像库**: `public/avatars/` — SVG 头像 530 个,会员可在个人中心选择或自定义上传
- **头像生成脚本**: `scripts/generate-avatar-library.mjs` — 批量生成头像库,支持按性别/主题/数量筛选
- **头像上传目录**: `public/uploads/avatars/` — 用户自定义上传头像存储
- **Bot用户标记**: User表中 `isBot: true` 标识Bot用户,与真人的互动数据分别统计
- **Bot活动时段**: 9:00-23:00每小时运行,15轮/天,论坛内容不干扰深夜用户体验
- **Bot活动时段**: 旧「模拟真人互刷」体系已停用(`bot-activity` 等任务在 `crontab.txt` 中已注释,2026-09-05 退役);现由行业情报官引擎承担
- **Bot数据库**: 12张Bot专用表(BotConfig/BotMemory/BotDailyStat/BotSkill/BotWeeklyReview/BotPersona/BotPersonaVariant/BotPersonaExperiment/BotPersonaAssignment/BotPersonaMetric/BotAdversarialLearning/BotCrossForumAffinity)
## 定时任务调度系统
- **后台管理**: `/admin/tasks`(任务中心)、`/admin/tasks/logs`(执行日志)、`/admin/tasks/[taskKey]`(单任务详情+统计)
- **数据模型**: TaskConfig(任务配置,含enabled/cronExpr/config)、TaskLog(执行历史,含status/duration/result/error)
- **种子数据**: `scripts/seed-task-configs.mjs` 初始化6个任务配置
- **种子数据**: `scripts/seed-task-configs.mjs` 初始化 29 个任务配置(含已停用任务,与 `crontab.txt` 存在漂移,见下)
- **手动触发**: `/admin/tasks` 页支持每个任务运行,也可通过 POST `/api/admin/tasks/run` 触发
- **API**:
- `GET/PUT /api/admin/tasks/configs` — 任务配置查询/更新
@@ -253,25 +341,42 @@ docker logs --tail 50 zhuiguang-ai-cron # Cron 容器日志
- `POST /api/admin/tasks/run` — 手动触发任务执行
### 定时任务(Supercronic 容器调度)
所有定时任务由 `zhuiguang-ai-cron` 容器内的 supercronic 调度,配置文件 `crontab.txt`。不再使用主机 crontab + cron-wrapper.sh。
所有定时任务由 `zhuiguang-ai-cron` 容器内的 supercronic 调度,配置文件 `crontab.txt`(**唯一准绳**)。不再使用主机 crontab。
| 时间 | 任务 | 脚本 | TaskKey | 说明 |
|------|------|------|---------|------|
| 01:00 | Task5 更新星值 | `scripts/task5-update-stars.mjs` | task5-update-stars | 更新所有GitHub技能Stars数+日/周/月变化 |
| 03:00 | Task3 工具巡检 | `scripts/task3-check-tools.mjs` | task3-check-tools | 检查网站/Logo可访问性+自动发布合格待审核工具 |
| 04:00 | Bot技能结晶 | `scripts/bot-skill-crystallize.mjs` | bot-skill-crystallize | 扫过去14天高互动Bot话题→DeepSeek解构共性→入库BotSkill(usageCount驱动调用);末尾回收7天前成熟技能更新successRate(<30%且使用≥3次自动isActive=false) |
| 05:00 | Bot亲和度与画像 | `scripts/bot-affinity-update.mjs` | bot-affinity-update | 刷BotCrossForumAffinity(affinity=min(1, samples/total/4))和BotPersona(avgReplyLength/questionRatio/stanceKeywords/topHumanUsers/topTopicTypes/lastTopicTitles,bot-activity发帖时注入prompt) |
| 04:00 | Task6 评测热门 | `scripts/task6-review-hot.mjs` | task6-review-hot | 评测2个最热未评测GitHub技能(五维评测) |
| 05:00 | Task4 发现技能 | `scripts/daily-discover.mjs` | task4-discover-skills | GitHub搜索≥1000 stars项目→DeepSeek预评测→入库PendingSkill |
| 06:00 | Task1 发现工具 | `scripts/task1-discover-tools.mjs` | task1-discover-tools | 36kr/IT之家/开源中国RSS→DeepSeek提取工具→入库PendingTool |
| 07:30 | AI日报 | `scripts/daily-news.mjs` | daily-news | 多源搜索真实新闻+DeepSeek整理格式→发布日报 |
| 21:30 | Bot反馈闭环 | `scripts/bot-feedback-loop.mjs` | bot-feedback-loop | 扫描Bot自己帖子下的新回复→存反馈记忆→按概率触发二次回复(仅expert bots,配额high=6/medium=3/low=1) |
| 周日02:00 | Bot周度复盘 | `scripts/bot-weekly-review.mjs` | bot-weekly-review | 算engagementScore→生成REFLECTION记忆→决定下周配额tier(写入BotWeeklyReview.nextWeekQuota,bot-activity下次跑时动态覆盖) |
| 08:00 | Task7 新闻推社区 | `scripts/task7-news-to-community.mjs` | task7-news-to-community | 将当日日报新闻分发到社区4个板块(AI工具推荐/AI资讯/技术探讨/观点讨论) |
> ⚠️ supercronic 在容器内按 **UTC** 执行(TZ 环境变量不生效),下表时刻均为 UTC,括号外已换算为北京时间(UTC + 8h)。
> ⚠️ 2026-10-01 巡检确认:`crontab.txt` 已注释停用大量 Bot/行业情报 AI 任务,但 `scripts/seed-task-configs.mjs` 仍写 `enabled: true`、`scripts/health-check.mjs` 仍把它们列入期望键 —— **三方漂移会产生误告警**,新增/停用任务时必须同步这三处。
**启用中(19 个)**
| UTC | 北京时间 | 任务 | 脚本 | TaskKey |
|-----|---------|------|------|---------|
| 0 1 | 09:00 | Task5 更新星值 | `scripts/task5-update-stars.mjs` | task5-update-stars |
| 0 3 | 11:00 | Task3 工具巡检 | `scripts/task3-check-tools.mjs` | task3-check-tools |
| 0 4 | 12:00 | Task6 评测热门 | `scripts/task6-review-hot.mjs` | task6-review-hot |
| 0 4 * * 0 | 周日 12:00 | 工具数据补全 | `scripts/enrich-tool-data.mjs` | enrich-tool-data |
| 30 4 | 12:30 | 日志清理 | `scripts/cleanup-logs.mjs` | cleanup-logs |
| 0 5 | 13:00 | Task4 发现技能 | `scripts/daily-discover.mjs` | task4-discover-skills |
| 0 6 | 14:00 | Task1 发现工具 | `scripts/task1-discover-tools.mjs` | task1-discover-tools |
| 30 6 | 14:30 | task_log 清理 | `scripts/cleanup-task-logs.mjs` | cleanup-task-logs |
| 30 7 | 15:30 | AI 日报 | `scripts/daily-news.mjs` | daily-news |
| 0 8 | 16:00 | Task7 新闻推社区 | `scripts/task7-news-to-community.mjs` | task7-news-to-community |
| 0 8 1 * * | 每月 1 日 16:00 | 断签保护卡发放 | `scripts/grant-freeze-cards.mjs` | grant-freeze-cards |
| 30 8 | 16:30 | 任务健康检查 | `scripts/health-check.mjs` | health-check |
| 0 9 | 17:00 | 通知摘要生成 | `scripts/notification-digest.mjs` | notification-digest |
| 0 9 * * 1 | 周一 17:00 | 竞品工具数监测 | `scripts/competitor-monitor.mjs` | competitor-monitor |
| 0 10 | 18:00 | 行业趋势监测 | `scripts/trend-alert.mjs` | trend-alert |
| 0 10 * * 1 | 周一 18:00 | 周刊生成 | `scripts/newsletter-generate.mjs` | newsletter-generate |
| 30 10 * * 1 | 周一 18:30 | 每周推荐邮件 | `scripts/weekly-recommend-email.mjs` | weekly-recommend-email |
| 15 */6 | 每 6 小时 | 点赞计数对账 | `scripts/reconcile-like-counts.mjs` | reconcile-like-counts |
| 5 23,3,7,11,15 | 每日 7/11/15/19/23 点 | 行业素材采集 | `scripts/industry-thinktank.mjs collect --all` | industry-thinktank |
**已注释停用**:`bot-activity`、`bot-skill-crystallize`、`bot-affinity-update`、`bot-weekly-review`、`bot-feedback-loop`、`bot-adversarial-learning-run`、`bot-persona-experiment-run`、`bot-roundtable`、`industry-thinktank weekly/respond`、`industry-daily daily/respond`
(原因:2026-09-05 旧 Bot「模拟真人互刷」体系退役;2026-09-26 按要求关闭全部 AI 生成功能,行业情报改为需登录访问)
- 调度配置: `crontab.txt`(supercronic 格式),修改后需重建 cron 容器生效
- 日志目录: 容器内 `/app/logs/`(挂载到 Docker volume `zhuiguang_ai_bot_logs`)
- 日志目录: 容器内 `/app/logs/`;实际 Docker 卷名为 `zhuiguang-ai_bot-logs`(旧文档写 `zhuiguang_ai_bot_logs`,已过时)
- 定时任务脚本从 `scripts/` 目录直接执行,环境变量由容器 entrypoint 注入
- **新增任务必须同步四处**:`crontab.txt` + `scripts/<task>.mjs` + `scripts/seed-task-configs.mjs` + `scripts/health-check.mjs`
## AI日报新闻源
- **36kr** RSS (https://36kr.com/feed) — 国内科技资讯
@@ -300,6 +405,7 @@ docker logs --tail 50 zhuiguang-ai-cron # Cron 容器日志
- 敏感信息(密钥、密码、Token)必须使用环境变量,禁止硬编码
- `.env` 文件已被加入 `.gitignore`,仅 `.env.example` 模板可提交
- HTTP 响应必须包含安全头:CSP、HSTS、X-Content-Type-Options、X-Frame-Options
- CSP 的 `script-src` 必须包含 `'unsafe-inline'`(Next.js App Router 水合依赖内联 `self.__next_f` 脚本),禁止 `'unsafe-eval'`;详见 workspace 规则 7.1
- 文件上传/下载必须限制大小(最大 5MB)和类型,SVG 内容需消毒 script/iframe/on-event 标签
- Logo 文件名使用 SHA256 哈希(不使用 MD5)
- VIP 用户不能访问管理后台(/admin/* 和 /api/admin/*)
@@ -318,8 +424,10 @@ docker logs --tail 50 zhuiguang-ai-cron # Cron 容器日志
- 修改项目架构/技术栈/部署配置 → 更新 `追光AI` 或对应 `Module` 实体
- 新增/修改实体间关系 → 更新 Knowledge Graph 关系
- **同步时机**:在代码修改完成并通过检查后、提交代码前执行同步
- **同步方法**:使用 `mcp_Knowledge_Graph_Memory_create_entities`(新增实体)、`mcp_Knowledge_Graph_Memory_add_observations`(追加观察)、`mcp_Knowledge_Graph_Memory_update_entities`(更新实体)、`mcp_Knowledge_Graph_Memory_create_relations`(新增关系)、`mcp_Knowledge_Graph_Memory_delete_entities`/`delete_relations`/`delete_observations`(删除)
- **查询优先**:在开始任何开发任务前,先通过 `mcp_Knowledge_Graph_Memory_search_nodes` 或 `mcp_Knowledge_Graph_Memory_open_nodes` 查询图谱,利用已有知识加速开发
- **图谱存储**:`.trae/knowledge_graph.jsonl`(MCP 源文件,JSONL,一行一实体/关系);`.trae/knowledge_graph.json` 为渲染版(`project` / `version` / `updated_at` / `entities` / `relations`)
- **MCP 配置**:`.trae/mcp.json` 注册 `Knowledge Graph Memory` 服务(`npx -y @itseasy21/mcp-knowledge-graph`,`MEMORY_FILE_PATH=.trae/knowledge_graph.jsonl`)
- **同步方法**:优先使用 `create_entities` / `add_observations` / `update_entities` / `create_relations` / `delete_entities` 等工具;若 MCP 未挂载,直接维护 `.trae/knowledge_graph.jsonl`
- **查询优先**:在开始任何开发任务前,先通过 `search_nodes` / `open_nodes` 查询图谱,利用已有知识加速开发
### 7. 可靠性原则
- 所有外部 API 调用(GitHub、DeepSeek 等)必须设置超时和重试
+46 -19
View File
@@ -22,28 +22,36 @@
## 项目结构
```
zhuiguang-ai/
├── data/ # 数据文件 (bot-characters.json)
├── prisma/ # 数据库Schema + 迁移 + 种子
├── public/ # 静态资源 (logo.png, logos/)
├── scripts/ # 独立脚本 (7个定时任务 + 多个工具脚本)
├── public/ # 静态资源 (logo.png, logos/, bot-avatars/, avatars/, uploads/avatars/)
├── scripts/ # 独立脚本 (7个AI发现任务 + 7个Bot任务 + 多个工具脚本)
│ └── lib/ # 脚本共享库 (bot-persona, bot-persona-experiment, bot-adversarial-learning, bot-avatar-generator)
├── src/
│ ├── __tests__/ # 测试文件 (vitest, 5个测试套件, 132个测试)
│ ├── app/
│ │ ├── (admin)/admin/ # 后台页面 (18个页面 + 任务调度3个子页)
│ │ ├── api/ # API路由 (50+个端点)
│ │ ├── (admin)/admin/ # 后台页面 (21个页面: 18个原有 + 3个Bot管理)
│ │ ├── api/ # API路由 (60+个端点, 含bots/、notifications/、recommendations/、points shop等子路由)
│ │ ├── categories/ # 前台分类页
│ │ ├── community/ # 社区 (bots/列表+排行榜, tools/compare工具对比)
│ │ ├── reviews/ # 前台评测列表+榜单
│ │ ├── skills/ # 前台技能页
│ │ ├── tools/ # 前台工具页
│ │ ├── tools/ # 前台工具页 + /tools/compare 对比页
│ │ ├── login/ # 用户登录页
│ │ ├── daily/ # AI日报页
│ │ ├── user/ # 用户中心(个人资料/收藏/收藏夹)
│ │ ├── globals.css # 全局样式
│ │ ├── layout.tsx # 前台布局
│ │ ├── user/ # 用户中心(个人资料/收藏/收藏夹/积分/商店)
│ │ ├── globals.css # 全局样式 (含dark mode CSS变量)
│ │ ├── layout.tsx # 前台布局 (含ThemeProvider + SkipLink)
│ │ └── page.tsx # 首页
│ ├── components/ # 组件 (Header, Footer, UI, Common)
│ ├── lib/ # 工具库 (prisma, auth, admin-auth, github, deepseek, logo-fetcher, logo-storage, utils)
│ ├── components/ # 组件 (Header, Footer, UI/LazyImage, UI/ThemeProvider, Common/Compare*, Common/PersonalizedRecommend, Common/HighlightText, forum/Bot*, forum/AvatarPicker, forum/NotificationCenter)
│ ├── lib/ # 工具库 (prisma, auth, admin-auth, github, deepseek, logo-fetcher, logo-storage, bot-utils, avatar-library, utils, source-type, constants, streak-freeze, shop-items, level-config, points-reward, formatRelativeTime)
│ └── middleware.ts # 路由保护
├── vitest.config.ts # Vitest 测试配置
├── vitest.setup.ts # Vitest 全局 setup
├── Dockerfile # 多阶段构建
├── docker-compose.yml # 容器编排
├── crontab.txt # supercronic 调度表 (25条定时任务)
├── .env # 环境变量
├── restart.ps1 # 服务重启脚本(端口8301-8310)
└── package.json # 依赖配置
```
@@ -51,15 +59,23 @@ zhuiguang-ai/
| 序号 | 模块 | 文档 | 说明 |
|------|------|------|------|
| 01 | 数据库 | [01-database.md](./modules/01-database.md) | 26张数据模型、8个枚举、完整索引、迁移历史 |
| 01 | 数据库 | [01-database.md](./modules/01-database.md) | 38张数据模型、8个枚举、完整索引、迁移历史 |
| 02 | API | [02-api.md](./modules/02-api.md) | 前台/后台/用户API端点、SystemConfig配置键 |
| 03 | 页面 | [03-pages.md](./modules/03-pages.md) | 前台/后台页面路由、布局、功能说明 |
| 04 | 组件与样式 | [04-components-and-styles.md](./modules/04-components-and-styles.md) | UI组件、样式系统、设计规范 |
| 04 | 组件与样式 | [04-components-and-styles.md](./modules/04-components-and-styles.md) | UI组件、样式系统、设计规范(含暗色模式、LazyImage) |
| 05 | AI发现 | [05-ai-discovery.md](./modules/05-ai-discovery.md) | 提示词驱动发现流程、Logo抓取引擎、定时任务、评测管线 |
| 06 | 认证 | [06-auth.md](./modules/06-auth.md) | NextAuth配置、路由保护、权限体系、登录流程 |
| 07 | 工具库与脚本 | [07-lib-and-scripts.md](./modules/07-lib-and-scripts.md) | 工具函数、定时任务脚本、运维脚本 |
| 08 | 社区功能 | [08-community.md](./modules/08-community.md) | 评论系统、收藏、浏览历史、收藏夹、通知、论坛 |
| 07 | 工具库与脚本 | [07-lib-and-scripts.md](./modules/07-lib-and-scripts.md) | 工具函数、定时任务脚本(含Bot脚本)、运维脚本 |
| 08 | 社区功能 | [08-community.md](./modules/08-community.md) | 评论系统、收藏、浏览历史、收藏夹、通知、论坛、Bot社区、会员头像库 |
| 09 | 运维与部署 | [09-devops.md](./modules/09-devops.md) | Docker容器、supercronic调度、Nginx、部署流程、备份 |
| 10 | 数字人Bot系统 | [10-bot-system.md](./modules/10-bot-system.md) | 112个Bot角色、活动引擎、A/B测试、对抗学习、技能结晶、亲和度、头像系统 |
| 11 | 积分体系 | [points.md](./modules/points.md) | 积分规则、等级系统、积分商店、Streak冻结、签到系统 |
| 12 | 通知系统 | [notifications.md](./modules/notifications.md) | 智能摘要、通知偏好、通知中心、通知类型 |
| 13 | 暗色模式 | [theme.md](./modules/theme.md) | ThemeProvider、CSS变量、组件适配、用户偏好持久化 |
| 14 | 工具功能增强 | [tools.md](./modules/tools.md) | 工具对比、工具认证徽章、工具推荐 |
| 15 | 搜索增强 | [search.md](./modules/search.md) | 自动补全、搜索历史、键盘导航、高亮文本 |
| 16 | 测试体系 | [testing.md](./modules/testing.md) | Vitest配置、5个测试套件、覆盖率标准 |
| 17 | 开发规则 | [17-rules.md](./modules/17-rules.md) | 项目开发规则体系(22章:代码质量/数据策略/导航/图片/无障碍/SEO/性能/安全/定时任务/测试/Shell/Docker/部署/数据模型/API设计/Bot系统/环境变量/依赖管理/审查清单) |
## 环境变量
```
@@ -68,6 +84,7 @@ NEXTAUTH_URL=http://localhost:8301
NEXTAUTH_SECRET=<secret>
GITHUB_TOKEN=<optional>
DEEPSEEK_API_KEY=<required-for-review>
OPENAI_API_KEY=<required-for-bot-activity>
```
## 核心业务流程
@@ -88,13 +105,23 @@ DEEPSEEK_API_KEY=<required-for-review>
- **GitHub Star同步**: 通过GitHub API定期更新技能Star数,维护90天历史
- **五维评测系统**: GitHub数据采集 + DeepSeek AI评测 + 雷达图展示,5维度(capability/devExp/costLicense/community/performance)评分
- **评测榜单**: 前台/reviews页面展示评测分榜TOP10 + Stars涨幅榜TOP10侧边栏
- **任务调度系统**: 7个定时任务(Task1-6+Task7新闻推社区)+AI日报,统一TaskConfig配置+TaskLog执行历史+后台可视化管理+手动触发,通过cron-wrapper.sh统一入口执行
- **任务调度系统**: 25个定时任务(AI发现7个+Bot系统+运维),统一TaskConfig配置+TaskLog执行历史+后台可视化管理+手动触发,通过supercronic容器调度
- **数字人Bot社区引擎**: 112个AI驱动的虚拟用户,分专家/观察者两种角色,自动发帖/回复/点赞,含A/B测试、对抗学习、技能结晶、亲和度计算、周度复盘完整闭环
- **权限体系**: 53个精细化权限点,角色管理,细粒度权限控制
- **社区互动**: 评论/回复、收藏、浏览历史、收藏夹、通知系统、论坛板块
- **社区互动**: 评论/回复、收藏、浏览历史、收藏夹、通知系统、论坛板块、Bot排行榜
- **分页**: 所有列表页面支持分页(每页20条)
- **浅色主题**: 科技感浅色设计系统,毛玻璃效果+渐变文字+精致阴影
- **双主题**: 浅色/暗色双模式,ThemeProvider + CSS变量驱动,用户偏好localStorage持久化
- **层级分类**: 一级分类+二级分类,左侧导航+标签切换
- **用户系统**: 邮箱注册/登录、GitHub OAuth、收藏功能、浏览历史
- **用户系统**: 邮箱注册/登录、GitHub OAuth、收藏功能、浏览历史、**会员头像库(500个预置头像+自定义上传)**
- **积分体系**: 20级成长系统、积分商店、签到连击、Streak冻结保护
- **智能通知**: 通知摘要合并、通知偏好设置、通知中心页面
- **内容推荐**: 个性化推荐引擎、相关话题推荐、工具相似度计算
- **工具对比**: 多工具并排对比、10维度评分表、Context共享状态
- **工具认证**: 管理员认证徽章、蓝V标识
- **搜索增强**: 自动补全API、搜索历史localStorage、键盘导航(上下/回车/ESC)
- **安全加固**: 后台25个写操作API全部添加requireAdmin中间件验证;批量操作ids数组需校验非空且有数量上限(100~500);FK字段回退值禁止硬编码
- **容器化部署**: Docker多阶段构建 + supercronic调度 + 4个命名卷,完全替代PM2+主机crontab
- **测试覆盖**: Vitest + 5个测试套件 + 132个测试 + 80%+覆盖率目标
- **端口锁定**: 8301-8310区间,禁止使用其他端口
- **频率限制**: 登录尝试限制、IP请求限制
- **开发规则体系**: 22章项目开发规则(代码质量/安全/性能/无障碍/SEO/测试/部署/Docker/Shell/API设计/数据模型/Bot系统/环境变量),🔴🟡🟢三级严重度,覆盖全生命周期
+19
View File
@@ -705,6 +705,15 @@
| ForumPost | [topicId, createdAt] | 联合索引 |
| Permission | [groupName, sortOrder] | 联合索引 |
| User | [oauthProvider, oauthId] | 联合唯一 |
| BotConfig | [userId] | 唯一索引 |
| BotDailyStat | [botId, date] | 唯一索引 |
| BotWeeklyReview | [botId, weekKey] | 唯一索引 |
| BotPersona | [botId] | 主键索引 |
| BotPersonaVariant | [botId, variantKey] | 唯一索引 |
| BotPersonaAssignment | [refType, refId] | 唯一索引 |
| BotPersonaMetric | [variantId, date] | 唯一索引 |
| BotAdversarialLearning | [botId, weekKey] | 唯一索引 |
| BotCrossForumAffinity | [botId, forumSlug] | 唯一索引 |
## 迁移历史
@@ -721,3 +730,13 @@
| 9 | add_hot_score | 2026-05-08 | 添加热度评分(DailyReportItem.hotScore) |
| 10 | add_skill_reviews | 2026-05-20 | 添加技能评测表+Skill扩展字段 |
| 11 | add_task_system | 2026-05-24 | 添加任务调度系统+权限体系+社区功能 |
| 12 | add_bot_system | 2026-06-07 | 添加数字人Bot系统(12张表: BotConfig/BotMemory/BotDailyStat/BotSkill/BotWeeklyReview/BotPersona/BotPersonaVariant/BotPersonaExperiment/BotPersonaAssignment/BotPersonaMetric/BotAdversarialLearning/BotCrossForumAffinity) |
---
## 开发规则引用
> 数据模型变更必须遵守 [开发规则第十六章 - 数据模型与迁移规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):
> - Prisma 命名约定:模型PascalCase→`@@map("snake_case")`,字段camelCase→`@map("snake_case")`
> - 连接单例模式:`globalForPrisma` 防止热重载多实例
> - Schema 变更流程:migrate dev → migrate status → migrate deploy(严禁DROP/TRUNCATE)
> - 数据库隔离:仅操作 `zhuiguang_ai` 库
+23
View File
@@ -195,6 +195,18 @@ NextAuth认证端点(登录/回调/CSRF等)。
| /api/admin/permissions | GET | 获取全部权限点列表 |
| /api/admin/user-permissions | GET | 获取当前用户权限(roleId/userId/当前用户) |
### Bot管理API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/bots/stats | GET | Bot表现统计(每日指标+汇总,支持?days和?botUserId) |
| /api/admin/bots/experiments | GET | A/B实验看板数据(变体/实验/每日指标聚合) |
| /api/admin/bots/experiments/run | POST | 手动触发A/B实验(body: {mode, lookback, noSwitch}) |
| /api/admin/bots/experiments/variants | PATCH | 更新变体(权重/启用/重置样本) |
| /api/admin/bots/experiments/variants | DELETE | 删除变体 |
| /api/admin/bots/adversarial-learning | GET | 对抗学习看板(支持?weeks和?botUserId) |
| /api/admin/bots/adversarial-learning/run | POST | 手动触发对抗学习(body: {weekKey, force, lookback, bot}) |
### 日报管理
| 路由 | 方法 | 功能 |
@@ -223,3 +235,14 @@ NextAuth认证端点(登录/回调/CSRF等)。
| discoveryPromptConfig | JSON | AI发现提示词配置(含toolPrompt/skillPrompt/newsPrompt/tagPool等) |
| logoFetchConfig | JSON | Logo抓取策略配置 |
| discoverSkillsScript | string | 技能探索脚本源码 |
---
## 开发规则引用
> API 开发必须遵守 [开发规则第十七章 - API设计规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):
> - 路由骨架:`export const dynamic = "force-dynamic"` + `Promise.all` 并行 + `Cache-Control` 头
> - 错误处理:使用 [api-error.ts](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/src/lib/api-error.ts) 的 `badRequest`/`notFound`/`serverError`
> - 响应格式:列表 `{ data, total, page, pageSize }`,统一使用 `total`
> - 状态码:200/201/400/401/403/404/409/500
> - 认证分层:middleware + `requireAdmin()` + `getServerSession()`
> - 分页上限:`Math.min(pageSize, 100)`
+43 -3
View File
@@ -11,12 +11,18 @@
### /tools (工具列表)
- 文件: `src/app/tools/page.tsx`
- 组件: ToolsContent
- 功能: 分类筛选侧边栏(一级分类)、定价模型筛选、搜索、分页、卡片网格展示
- 功能: 分类筛选侧边栏(一级分类)、定价模型筛选、搜索、分页、卡片网格展示、**工具对比功能(CompareButton)** 🆕
- 数据源: `/api/categories`, `/api/tools`
### /tools/compare (工具对比) 🆕
- 文件: `src/app/tools/compare/page.tsx`
- 组件: ComparePage(CompareProvider + CompareBar)
- 功能: 最多4个工具并排对比,10维度对比表格(名称/分类/定价/特性/标签/评分/评论数/浏览数/官网)
- 数据源: `/api/tools` (通过Context传递)
### /tools/[slug] (工具详情)
- 文件: `src/app/tools/[slug]/page.tsx`
- 功能: 工具完整信息展示、浏览计数+1、收藏按钮、评论评价(ReviewSection)
- 功能: 工具完整信息展示、浏览计数+1、收藏按钮、评论评价(ReviewSection)、**认证蓝V徽章** 🆕、**相关推荐** 🆕
- 数据源: `/api/tools/[slug]`
### /categories/[slug] (分类详情)
@@ -57,7 +63,7 @@
### /user (用户中心)
- 文件: `src/app/user/page.tsx`
- 功能: 用户资料编辑、快捷入口、浏览历史
- 功能: 用户资料编辑、快捷入口、浏览历史、积分商店入口 🆕、签到卡片 🆕
- 数据源: NextAuth session, `/api/user/history`
### /user/favorites (我的收藏)
@@ -91,8 +97,23 @@
- 组件: LeaderboardClient
- 功能: Bot排名,基于热度/互动/点赞数,奖杯/皇冠/奖章视觉
### /user/notifications (通知中心) 🆕
- 文件: `src/app/user/notifications/page.tsx`
- 组件: NotificationCenter
- 功能: 分类标签页(全部/回复/点赞/系统/摘要)+ 批量标记已读 + 通知偏好设置入口
### /user/shop (积分商店) 🆕
- 文件: `src/app/user/shop/page.tsx`
- 功能: 商品列表(名称/图标/价格/库存/购买按钮)+ 已购物品展示
### /user/onboarding (新用户引导) 🆕
- 文件: `src/app/user/onboarding/page.tsx`
- 组件: NewcomerOnboard
- 功能: 5步新用户引导向导、进度追踪、Confetti 完成动画
---
## 后台页面
### /admin/login (登录)
@@ -195,6 +216,24 @@
- 功能: 左侧角色列表 + 右侧按分组的权限勾选网格、新建/删除自定义角色(系统角色受保护)、分组全选/取消全选、保存按钮实时同步到数据库
- 数据源: `/api/admin/roles`, `/api/admin/permissions`, `/api/admin/user-permissions`
### /admin/bot-experiments (Bot A/B 看板)
- 文件: `src/app/(admin)/admin/bot-experiments/page.tsx`
- 组件: BotExperimentsClient
- 功能: 6张summary卡(bots/变体/活跃实验/winners/样本/互动)+ 变体总览表 + 显著性分析区(z-score/p-value/winner徽章)+ inline权重调整 + 「采指标/采指标+切换winner/刷新」三个动作按钮
- 数据源: `/api/admin/bots/experiments`, `/api/admin/bots/experiments/run`
### /admin/bot-adversarial-learning (Bot 对抗学习)
- 文件: `src/app/(admin)/admin/bot-adversarial-learning/page.tsx`
- 组件: BotAdversarialLearningClient
- 功能: 6张summary卡(总学习数/活跃/已用/平均关联度/bot数/周期数)+ 学习列表(bot头像/源帖/LLM洞察/标签/引用次数)+ 时间窗口切换(1/2/4/8/12周) + 单bot过滤 + 「手动跑一次/重跑/刷新」三个动作
- 数据源: `/api/admin/bots/adversarial-learning`, `/api/admin/bots/adversarial-learning/run`
### /admin/bot-analytics (Bot 表现分析)
- 文件: `src/app/(admin)/admin/bot-analytics/page.tsx`
- 组件: BotAnalyticsClient
- 功能: 每个Bot的每日指标图表(话题数/回复数/点赞数/互动率/趋势)+ 汇总统计 + 时间窗口切换 + 单Bot筛选
- 数据源: `/api/admin/bots/stats`
---
## 布局
@@ -211,6 +250,7 @@
- 技能库: 待审核技能、已发布技能、技能分类
- 评测管理: 评测管理
- AI发现: 探索AI工具、检测AI工具、探索Skill技能、更新Skill技能、AI新闻发现
- 内容管理: Bot A/B 看板、Bot 对抗学习、Bot 表现分析
- 系统配置: 系统配置
- 任务调度: 任务中心、任务日志
- 角色权限: 角色权限管理
@@ -22,6 +22,17 @@
- NextAuth SessionProvider 包裹组件
- 用于在客户端组件中访问session
#### ThemeProvider (`src/components/ThemeProvider.tsx`) 🆕
- 暗色/浅色双主题 Provider
- 提供 `theme` state、`toggleTheme()`、`setTheme(mode)` 方法
- 监听 `prefers-color-scheme` 媒体查询
- 持久化到 `localStorage("zhuiguang-theme")`
#### CompareProvider (`src/components/common/CompareProvider.tsx`) 🆕
- 工具对比 Context Provider
- 管理 `compareList` (最多4个工具)
- 提供 `addToCompare`、`removeFromCompare`、`clearCompare`、`isInCompare` 方法
### 公共组件
#### HeroBanner (`src/components/common/HeroBanner.tsx`) 🔄
+91 -1
View File
@@ -207,12 +207,102 @@
- `scripts/install-cron-backup.sh` — 安装主机备份 cron(每天 03:00 执行备份)
### 定时任务调度
- `crontab.txt` — supercronic 调度配置(13 条定时任务),不再使用主机 crontab + cron-wrapper.sh
- `crontab.txt` — supercronic 调度配置(25 条定时任务),不再使用主机 crontab + cron-wrapper.sh
### lib/retry.mjs
- 重试工具函数
---
## Bot系统脚本
### bot-activity.mjs — Bot活动引擎
- 每小时运行(9:00-23:00),15轮/天
- 遍历10个论坛板块,为每个板块选取适配Bot发帖+回复
- 集成Persona画像注入、A/B变体选择、对抗学习上下文
- 生成后自动点赞 + 写入BotDailyStat
### bot-skill-crystallize.mjs — Bot技能结晶
- 每天02:00运行
- 扫描过去14天高互动Bot话题,DeepSeek解构共性→入库BotSkill
- 7天后回收检查成熟技能成功率,<30%且使用≥3次自动禁用
### bot-affinity-update.mjs — Bot亲和度与画像
- 每周日22:30运行
- 计算BotCrossForumAffinity + 刷新BotPersona画像
### bot-feedback-loop.mjs — Bot反馈闭环
- 每周日22:00运行(原21:30)
- 三层记忆模型(SESSION/WORKING/LONGTERM)
- 扫描Bot自己帖子下的新回复 → 存反馈记忆 → 按概率触发二次回复
### bot-weekly-review.mjs — Bot周度复盘
- 每周日02:00运行
- 聚合一周指标 → 计算engagementScore → LLM生成反思 → 决定下周配额
### bot-persona-experiment-run.mjs — A/B实验调度
- 每小时运行
- 采集BotPersonaAssignment指标 → 按日聚合到BotPersonaMetric → 显著性检验 → 自动切换winner
- 支持 `--lookback` / `--no-switch` / `--metrics-only` / `--analyze-only`
### bot-adversarial-learning-run.mjs — 对抗学习调度
- 每周日23:00运行
- 为每个expert bot选1篇真人高互动帖 → DeepSeek提取洞察 → 入库BotAdversarialLearning
- 支持 `--week` / `--force` / `--bot` / `--lookback`
### bot-avatar-generate.mjs — Bot头像生成
- CLI入口,为112个bot批量预生成头像
- Lunaris text-to-image → 占位检测 → SVG兜底 → 落盘public/bot-avatars/
- 支持 `--bot` / `--force` / `--use-lunaris-only` / `--no-update-db` / `--dry-run`
### 其他Bot脚本
- `generate-bot-content.mjs` — 独立Bot内容生成(手动/临时运行)
- `seed-bot-forum.mjs` — 论坛板块+Bot初始内容种子
- `backfill-bot-daily-stats.mjs` — BotDailyStat历史数据回填
- `test-bot-stats.mjs` — Bot统计测试调试工具
### Bot共享库 (`scripts/lib/`)
#### bot-persona.mjs — 人设画像
- `updatePersona(botConfigId)` — 异步刷新画像(30天聚合)
- `computePersona(botConfigId)` — 计算风格指标
- `schedulePersonaRefresh()` — 定时触发
#### bot-persona-experiment.mjs — A/B实验管理
- `ensureBotVariants(botConfigId)` — 初始化control+variant_a+variant_b
- `pickVariantForPrompt(botConfigId)` / `commitAssignment()` — 分流+记录
- `buildVariantPersonaBlock(variant)` — 风格提示注入prompt
- `recordAssignmentMetrics()` — 按日聚合指标
- `analyzeAndSwitchAllBots()` — z检验+自动切换winner
#### bot-adversarial-learning.mjs — 对抗学习
- `runWeeklyAdversarialLearning()` — 全量学习入口
- `getActiveLearningForBot()` / `buildAdversarialBlock()` — 发帖时查询+注入
- `extractInsight(post, bot, persona)` — DeepSeek提取洞察
#### bot-avatar-generator.mjs — 头像生成
- `generateForAll()` — 遍历112个bot生成头像
- `fetchLunarisImage()` / `isLunarisDefault()` / `generateSvgAvatar()` — 三步流程
- 10色调色板 + key哈希 → 唯一SVG头像
### 前端Bot工具
#### bot-utils.ts (`src/lib/bot-utils.ts`)
- `getBotAvatarUrl(key, avatarPrompt)` — 动态头像URL
- `getBotColorScheme(key)` — 稳定哈希→Tailwind配色类
---
### 修复/诊断脚本
- `fix-db-url.cjs` — 批量修复所有 `.mjs` 脚本的 `mysql://` → `mariadb://` 协议兼容(PrismaMariaDb adapter 要求)
- `fix-ts-types.cjs` — 批量移除 `.mjs` 文件中的 TypeScript 类型注解(`.mjs` 不支持 TS 语法)
- `check-categories.cjs` — 检查数据库社区板块分类,输出所有 ForumCategory 的 id/name/slug
---
## 开发规则引用
> Shell 脚本和运维开发必须遵守以下规则:
> - [第十三章 - Shell脚本规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):`set -e`、PASS/FAIL/WARN 结构化输出、资源预检、禁止操作清单
> - [第八章 - 定时任务规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):entrypoint-cron.sh 信号处理、启动校验、健康检查端点;日志三层目录;任务幂等性
> - [第十八章 - AI/Bot系统规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):Bot角色定义、活动脚本5大约定、AI API隔离、提示词管理
> - [第十九章 - 环境变量管理规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):变量分级、`.env.example` 同步、脚本侧加载顺序
+10
View File
@@ -188,6 +188,16 @@
| CommentCard | `src/components/common/CommentCard.tsx` | 评论卡片(用户信息/等级徽章/评分/点赞/回复/时间) |
| CommentThread | `src/components/common/CommentThread.tsx` | 评论列表(分页/点赞/嵌套回复/排序) |
### 🆕 Bot论坛组件
| 组件 | 文件 | 说明 |
|------|------|------|
| BotAvatar | `src/components/forum/BotAvatar.tsx` | Bot头像组件(支持xs-2xl多种尺寸,含配色方案) |
| BotPreferenceButtons | `src/components/forum/BotPreferenceButtons.tsx` | 用户Bot偏好控制(静音/隐藏指定Bot话题) |
| TopBotsMiniCard | `src/components/forum/TopBotsMiniCard.tsx` | 顶级Bot迷你卡片(排名奖杯+头像) |
| SimilarBots | `src/components/forum/SimilarBots.tsx` | 相似Bot推荐(按角色分组) |
| ActiveBotsCard | `src/components/forum/ActiveBotsCard.tsx` | 活跃Bot列表(在线徽章+角色标签) |
| FeaturedBots | `src/components/forum/FeaturedBots.tsx` | 精选Bot展示 |
---
## 🆕 页面
+12 -2
View File
@@ -171,7 +171,7 @@ docker-compose -f docker-compose.test.yml up -d
- 配置文件: `crontab.txt`(项目根目录)
- 修改 crontab.txt 后需重建 cron 容器生效
### 任务列表(13 条)
### 任务列表(25 条)
| 时间 | 任务 | 脚本 |
|------|------|------|
@@ -312,4 +312,14 @@ next.config.mjs 配置以下安全响应头:
- **Docker build 期模块求值**: Next.js build 时会预渲染 server page 和 API route,导致 Prisma/OpenAI 等模块被求值。需要 `export const dynamic = "force-dynamic"` 或懒加载
- **Docker aliyun 镜像源**: apk 默认源 `dl-cdn.alpinelinux.org` 极慢(1m23s),切换 `mirrors.aliyun.com` 仅需 0.134s;npm 切换 `registry.npmmirror.com`
- **Supercronic 下载**: GitHub release 的 `release-assets.githubusercontent.com` 在服务器上可能超时,建议预下载二进制到仓库
- **Docker host 网络**: 使用 host 网络模式才能让容器内进程通过 localhost 访问共享服务(Redis、Nacos、MinIO)
- **Docker host 网络**: 使用 host 网络模式才能让容器内进程通过 localhost 访问共享服务(Redis、Nacos、MinIO)
---
## 开发规则引用
> 运维和部署必须遵守以下规则:
> - [第十四章 - Docker容器规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):容器清单(app+cron)、host网络、健康检查、容器管理命令
> - [第十五章 - 部署规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):部署前5项自检、构建流程、部署后六项验证、镜像回滚策略
> - [第八章 - 定时任务规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):crontab管理四方同步、entrypoint-cron信号处理、备份脚本完整性
> - [第十三章 - Shell脚本规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):set -e、结构化输出、磁盘预检、禁止操作(禁杀共享进程)
> - [第十九章 - 环境变量管理规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):变量分级、.env.example同步、脚本侧加载顺序
+70
View File
@@ -0,0 +1,70 @@
# 开发规则模块
## 概述
项目开发规则体系,定义代码质量、安全、性能、无障碍、SEO、部署等全生命周期的强制/推荐规范。
- **文件**: [.trae/rules/project_rules.md](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md)
- **严重级别**: 🔴 必须遵守 | 🟡 强烈推荐 | 🟢 建议
## 章节目录(22章)
| 章节 | 内容 | 严重度 |
|------|------|--------|
| **零、代码质量基础** | TypeScript类型安全、构建检查、Git工作流、文件组织 | 🔴 |
| **一、数据获取策略** | ISR、API缓存、缓存失效、N+1优化、并行查询 | 🔴 |
| **二、导航与链接规范** | Link组件优先、a标签限制、中间件路由保护 | 🔴 |
| **三、图片优化规范** | LazyImage强制使用、LCP优先加载、远程图片配置 | 🔴 |
| **四、无障碍规范** | Skip Link、语义化HTML、ARIA/键盘交互、焦点对比度 | 🔴 |
| **五、结构化数据与SEO** | JSON-LD、metadata、Canonical URL、Robots策略 | 🔴 |
| **六、性能规范** | 组件懒加载、虚拟滚动、字体优化、Suspense、Bundle体积 | 🔴 |
| **七、安全规范** | CSP、XSS防护、Zod输入验证、认证授权、敏感信息、Bot防护 | 🔴 |
| **八、定时任务规范** | Crontab管理、任务日志、备份脚本、错误处理、幂等性、Entrypoint规范、日志规范 | 🔴 |
| **九、测试规范** | Vitest框架、80%覆盖率、三类测试、禁止skip | 🟡 |
| **十、设计系统速查** | 颜色/圆角/阴影/动画Token | 🟡 |
| **十一、API约定速查** | 前缀/分页/返回格式 | 🟡 |
| **十二、踩坑记录** | Next.js/Prisma/Docker/Chart.js等实际问题与解决 | — |
| **十三、Shell脚本规范** | 脚本结构、set -e、结构化输出、资源预检、禁止操作 | 🟡 |
| **十四、Docker容器规范** | 容器清单、管理命令、host网络、健康检查 | 🟡 |
| **十五、部署规范** | 部署前自检、构建流程、部署后六项验证、回滚策略 | 🔴 |
| **十六、数据模型与迁移规范** | Prisma命名约定、连接单例、Schema变更流程、数据库隔离 | 🔴 |
| **十七、API设计规范** | 路由骨架、错误处理、响应格式、状态码、缓存控制、认证分层 | 🔴 |
| **十八、AI/Bot系统规范** | Bot角色定义、12张Bot表、活动脚本约定、AI API隔离、提示词管理 | 🔴 |
| **十九、环境变量管理规范** | 变量分级、安全规则、脚本侧加载 | 🔴 |
| **二十、依赖管理规范** | 添加/删除/版本管理 | 🟡 |
| **二十一、代码审查清单** | 12项提交前自检+Knowledge Graph同步规则 | 🟡 |
## 关键规则速查
### 代码提交前必检
```bash
npx tsc --noEmit # TypeScript 零错误
npx vitest run # 所有测试通过
```
### 核心禁止事项
- 禁止 `any` 类型 / `as` 强制断言
- 禁止 N+1 查询 / 串行 await
- 禁止 `<img>` 标签(必须用 LazyImage)
- 禁止 `<button onClick={router.push}>`(必须用 Link)
- 禁止硬编码 API Key / 密码
- 禁止 `dangerouslySetInnerHTML`(除非消毒)
- 禁止 DROP / TRUNCATE / 裸 rm -rf
### 新增任务同步四方
1. `scripts/task-xxx.mjs` — 创建脚本
2. `crontab.txt` — 添加 supercronic 条目
3. `seed-task-configs.mjs` — 注册 TaskConfig
4. `health-check.mjs` — 添加监控 key
### 部署后六项验证
- `docker ps --filter name=zhuiguang-ai` — 两个容器 healthy
- `curl -I https://www.zhuig.com` — 200 / < 3s
- `ss -tlnp | grep :8301` — 端口为 Docker
- `docker logs --tail 20 zhuiguang-ai-app` — 无 FATAL/ERROR
- `docker logs --tail 20 zhuiguang-ai-cron` — "Container ready"
- 其他项目容器仍在运行
## 版本历史
- 2026-06-23: 第三轮优化 — 新增6章(数据模型/API设计/Bot系统/环境变量/依赖/审查清单)
- 2026-06-22: 第二轮优化 — 新增3章(Shell/Docker/部署)+ Entrypoint/日志子章节
- 2026-06-22: 第一轮优化 — 8章→12章,TypeScript/Git/测试/性能/安全/无障碍全面增强
+131
View File
@@ -0,0 +1,131 @@
# 通知系统模块
## 概述
通知系统提供实时消息推送、智能摘要合并和个性化偏好设置,确保用户不错过重要互动但也不被过度打扰。
## 数据模型
### Notification (通知)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Int @id | 主键 |
| userId | Int | 用户ID |
| type | NotifType | 通知类型 |
| title | String | 标题 |
| content | String? | 内容 |
| link | String? | 跳转链接 |
| isRead | Boolean @default(false) | 是否已读 |
| createdAt | DateTime | 创建时间 |
### NotifType 枚举
| 值 | 说明 |
|------|------|
| COMMENT_REPLY | 评论回复通知 |
| COMMENT_LIKE | 评论点赞通知 |
| TOPIC_REPLY | 话题回复通知 |
| SYSTEM | 系统通知 |
| DIGEST 🆕 | 智能摘要合并通知 |
---
## 智能通知摘要 (Smart Notification Digest) 🆕
### 功能说明
当用户在短时间内收到多条同类通知时,系统自动合并为一条摘要通知,减少通知轰炸。
### 合并规则
- 同类通知(同 type + 同来源)在 30 分钟内合并
- 摘要格式: "你的帖子收到了 5 条新回复"
- 原始通知保留但标记为已读,摘要通知链接到通知详情页
### 定时任务
- **脚本**: `scripts/notification-digest.mjs`
- 每 3 小时合并一次未读通知
- 仅对超过 3 条同类通知的用户生成摘要
---
## 通知偏好设置 🆕
### 功能
用户可在通知中心设置通知偏好,控制接收哪些类型的通知。
### API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/user/notification-prefs | GET | 获取通知偏好 |
| /api/user/notification-prefs | PUT | 更新通知偏好 |
### 可配置项
| 偏好键 | 说明 | 默认值 |
|------|------|--------|
| comment_reply | 评论回复通知 | true |
| comment_like | 评论点赞通知 | true |
| topic_reply | 话题回复通知 | true |
| system | 系统通知 | true |
| digest | 智能摘要通知 | true |
| email_digest | 邮件摘要(未实现) | false |
---
## 通知中心页面 🆕
### 路由
- `/user/notifications` — 通知中心独立页面
### 功能
- 分类标签页: 全部 / 回复 / 点赞 / 系统 / 摘要
- 批量标记已读
- 单条跳转到目标内容
- 未读数量徽章
- 通知偏好设置入口
### 组件
- `NotificationCenter` (`src/components/forum/NotificationCenter.tsx`)
---
## API 接口
### 通知核心 API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/notifications | GET | 获取通知列表(含未读数) |
| /api/notifications | PUT | 标记通知为已读(支持指定ids或全部已读) |
| /api/notifications/unread-count | GET | 获取未读通知数量(轻量级) |
### 通知偏好 API 🆕
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/user/notification-prefs | GET | 获取通知偏好设置 |
| /api/user/notification-prefs | PUT | 更新通知偏好设置 |
---
## 自动触发规则
以下操作自动生成通知:
| 操作 | 通知对象 | 通知类型 |
|------|----------|----------|
| 回复评论 | 评论作者 | COMMENT_REPLY |
| 点赞评论 | 评论作者 | COMMENT_LIKE |
| 回复话题 | 话题作者 | TOPIC_REPLY |
| 系统公告 | 所有用户 | SYSTEM |
| 摘要合并 | 用户本人 | DIGEST |
---
## 前端组件
| 组件 | 文件 | 说明 |
|------|------|------|
| NotificationBell | `src/components/forum/NotificationBell.tsx` | 导航栏通知铃铛(红点/下拉面板/自动已读) |
| NotificationCenter | `src/components/forum/NotificationCenter.tsx` 🆕 | 通知中心页面(分类标签/批量操作/偏好入口) |
### NotificationBell 交互
- 未读时显示红色圆点徽章
- 点击展开快捷通知面板(最近5条)
- 下拉面板支持滚动加载更多
- 点击通知跳转到目标页面并自动标记已读
- "查看全部"链接跳转到通知中心
+179
View File
@@ -0,0 +1,179 @@
# 积分体系模块
## 概述
积分体系是追光AI的用户激励核心,包含20级成长系统、积分奖励引擎、积分商店、签到连击和Streak冻结保护,通过游戏化机制提升用户活跃度和留存率。
## 积分规则
| 行为 | 积分 | 每日上限 |
|------|------|----------|
| 发表评论 | +5 | 50 |
| 评论被点赞 | +2 | 20 |
| 发布论坛话题 | +10 | 无限制 |
| 论坛回复 | +5 | 30 |
| 发表评价 | +8 | 20 |
| 每日签到 | +1 (递增) | 1 |
| 签到连击 bonus | 连续7天+3, 连续30天+10 | - |
---
## 等级系统 - 20级成长体系
### 等级配置
- **配置文件**: `src/lib/level-config.ts` — 客户端安全(无Prisma依赖)
- 等级范围: LV01(0分) → LV20(50000分)
- 等级图标: ⭐(初级) → ⭐⭐⭐(中级) → 🌟(高级) → 🌟🌟(精英) → 🌟🌟🌟(大师)
### 等级表
| 等级 | 最低积分 | 徽章 | 每日限额 |
|------|----------|------|----------|
| LV01 | 0 | ⭐ | 50 |
| LV02 | 10 | ⭐ | 80 |
| LV03 | 30 | ⭐⭐ | 100 |
| LV04 | 60 | ⭐⭐ | 120 |
| LV05 | 100 | ⭐⭐ | 150 |
| LV06 | 200 | ⭐⭐⭐ | 180 |
| LV07 | 400 | ⭐⭐⭐ | 200 |
| LV08 | 700 | ⭐⭐⭐ | 250 |
| LV09 | 1000 | ⭐⭐⭐ | 300 |
| LV10 | 1500 | 🌟 | 400 |
| LV11 | 2000 | 🌟 | 500 |
| LV12 | 3000 | 🌟 | 600 |
| LV13 | 4500 | 🌟 | 700 |
| LV14 | 6000 | 🌟🌟 | 800 |
| LV15 | 8000 | 🌟🌟 | 1000 |
| LV16 | 11000 | 🌟🌟 | 1200 |
| LV17 | 15000 | 🌟🌟 | 1500 |
| LV18 | 20000 | 🌟🌟🌟 | 1800 |
| LV19 | 30000 | 🌟🌟🌟 | 2000 |
| LV20 | 50000 | 🌟🌟🌟 | 3000 |
### 旧等级迁移映射
BRONZE→LV01, SILVER→LV03, GOLD→LV06, PLATINUM→LV10
### 积分奖励引擎
- **文件**: `src/lib/points-reward.ts`
- `rewardPoints()` — 自动发放积分 + 日限额检查 + 事务写入
- `getUserStats()` — 获取用户综合统计(积分/评论数/话题数等)
- `getUserPointsHistory()` — 积分历史分页查询
---
## 签到系统
### 每日签到
- 基础+1分,连续签到递增奖励
- 连续7天: +3 bonus
- 连续30天: +10 bonus
- 中断重置
### CheckInCard 组件
- 位置: 用户中心顶部
- 功能: 签到按钮、连击天数显示、季度签到日历
---
## Streak 冻结保护
### 功能说明
- 用户可通过积分商店购买 Streak Freeze 卡片
- 当用户某天未签到时,自动消耗一张 Freeze 卡保护连击不断
- 最多持有 3 张 Freeze 卡
### 核心库
- **文件**: `src/lib/streak-freeze.ts`
- `checkAndApplyFreeze(userId)` — 检查是否需要冻结并自动应用
- `getFreezeCardCount(userId)` — 获取当前持有数量
- `useFreezeCard(userId)` — 消耗一张冻结卡
### 定时任务
- **脚本**: `scripts/grant-freeze-cards.mjs`
- 定期为活跃用户发放 Freeze 卡(每日01:00)
---
## 积分商店
### 功能概述
用户可使用积分兑换虚拟物品和社区权益。
### 商品定义
- **文件**: `src/lib/shop-items.ts`
- 商品类型: 头像框、昵称颜色、特效道具、Streak Freeze 卡
### API 接口
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/user/shop/items | GET | 获取可购买商品列表 |
| /api/user/shop/purchase | POST | 购买商品(扣积分) |
| /api/user/shop/my-items | GET | 获取用户已购物品 |
### 前端组件
- 积分商店页面(用户中心入口)
- 商品卡片(名称/图标/价格/库存/购买按钮)
- 已购物品展示(个人中心装饰效果)
---
## 数据模型
### PointsHistory (积分历史)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Int @id | 主键 |
| userId | Int | 用户ID |
| points | Int | 积分变动(正数获得/负数消耗) |
| reason | String | 积分原因 |
| detail | String? | 详细信息 |
| refType | String? | 关联类型 |
| refId | Int? | 关联ID |
| createdAt | DateTime | 创建时间 |
### StreakFreeze (冻结卡) 🆕
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Int @id | 主键 |
| userId | Int | 用户ID |
| cardCount | Int | 持有数量 |
| lastUsedAt | DateTime? | 最近使用时间 |
| createdAt | DateTime | 创建时间 |
### UserShopItem (已购物品) 🆕
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Int @id | 主键 |
| userId | Int | 用户ID |
| itemId | String | 商品ID |
| purchasedAt | DateTime | 购买时间 |
| isActive | Boolean | 是否启用/佩戴 |
---
## 前端组件
| 组件 | 文件 | 说明 |
|------|------|------|
| MemberBadge | `src/components/common/MemberBadge.tsx` | 会员等级徽章(⭐🌟 + 积分显示,3种尺寸) |
| LevelProgress | `src/components/common/LevelProgress.tsx` | 等级进度条(当前/下一级/进度百分比,动态变色) |
| CheckInCard | `src/components/common/CheckInCard.tsx` | 签到卡片(签到按钮/连击天数/季度日历) |
---
## 技术实现要点
### 积分自动奖励机制
所有评论/发帖/点赞操作自动通过 `rewardPoints()` 发放积分:
- 每日上限检查(防刷分)
- 事务写入(积分变更 + 历史记录同时写入)
- 等级自动随积分变化更新
### 日志分类
积分变动通过 `reason` 字段区分:
- `comment` — 评论
- `comment_liked` — 评论被点赞
- `topic_create` — 发帖
- `reply` — 回复
- `review` — 评价
- `check_in` — 签到
- `shop_purchase` — 商店消费(负数)
+93
View File
@@ -0,0 +1,93 @@
# 搜索增强模块
## 概述
搜索增强模块提供自动补全、搜索历史、键盘导航和搜索结果高亮,全面提升搜索体验和效率。
---
## 搜索自动补全 🆕
### API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/search/autocomplete | GET | 搜索自动补全建议 |
- Query: `q` (搜索关键词), `type` (tool/skill/all)
- 返回: `{ suggestions: [{ text, type, slug }] }`
- 基于工具名称、技能名称、标签前缀匹配
- 最多返回 8 条建议
- 响应时间 < 100ms(内存缓存)
### 前端组件
#### SearchBox 重写 🆕
- **文件**: `src/components/common/SearchBox.tsx`
- **功能**:
- 输入时实时显示自动补全下拉
- 键盘导航: ↑↓ 移动高亮 / Enter 选择 / ESC 关闭
- 搜索防抖(300ms)
- 搜索结果高亮匹配文本
- 支持工具/技能分类筛选
---
## 搜索历史 🆕
### 存储
- localStorage 存储: `zhuiguang-search-history`
- 最多保留 20 条历史记录
- 按最近使用排序
- 去重(同一查询只保留最新一条)
### 交互
- 搜索框聚焦时显示历史记录下拉
- 点击历史记录直接搜索
- 支持单条删除和清空全部
- 历史记录带搜索类型图标
---
## 高亮文本组件 🆕
### HighlightText
- **文件**: `src/components/common/HighlightText.tsx`
- Props: `{ text: string, keyword: string, className?: string }`
- 功能: 将文本中匹配的关键词包裹在 `<mark>` 标签中
- 样式: 黄色高亮背景 `bg-yellow-200 dark:bg-yellow-800`
- 不区分大小写匹配
### 使用场景
- 搜索结果列表中的工具名称/描述
- 自动补全下拉中的建议文本
- 评论/话题搜索
---
## 搜索框语义化
### WCAG 合规
- `<form role="search">` 包裹搜索表单
- `<label>` 关联搜索输入框(视觉隐藏)
- `<input type="search" name="search">` 语义输入
- `aria-label="搜索AI工具"` 辅助标签
- 自动补全列表 `role="listbox"` + `aria-activedescendant`
---
## 搜索参数规范
### 标准搜索参数
| 参数 | 类型 | 说明 |
|------|------|------|
| search | string | 搜索关键词 |
| page | number | 页码(默认1) |
| pageSize | number | 每页条数(默认20) |
| categoryId | number | 分类筛选 |
| pricingModel | string | 定价筛选 |
| sort | string | 排序(latest/popular/rating) |
### URL 搜索参数同步
- 搜索关键词同步到 URL query string
- 支持浏览器前进/后退导航
- 分享搜索结果 URL 可直接还原搜索状态
+174
View File
@@ -0,0 +1,174 @@
# 测试体系模块
## 概述
追光AI使用 Vitest 作为测试框架,已建立 5 个测试套件覆盖 132 个测试,目标覆盖率 80%+。测试文件位于 `src/__tests__/` 目录。
---
## 基础设施
### vitest.config.ts
```typescript
import { defineConfig } from "vitest/config";
import path from "path";
export default defineConfig({
test: {
globals: true,
environment: "node",
setupFiles: ["./vitest.setup.ts"],
include: ["src/__tests__/**/*.test.ts"],
coverage: {
provider: "v8",
reporter: ["text", "json", "html"],
thresholds: {
lines: 80,
branches: 80,
functions: 80,
statements: 80,
},
},
},
resolve: {
alias: { "@": path.resolve(__dirname, "./src") },
},
});
```
### vitest.setup.ts
- 全局 mock 配置
- Prisma mock 初始化
- 测试环境清理
### tsconfig 配置
```json
{
"compilerOptions": {
"types": ["vitest/globals"]
}
}
```
---
## 测试套件
### 1. level-config.test.ts
- **测试数量**: 28
- **覆盖**: `src/lib/level-config.ts`
- **测试内容**:
- 20个等级边界值检查
- 等级徽章映射
- 每日限额表
- 积分→等级转换
- 下一级积分计算
### 2. elo.test.ts
- **测试数量**: 24
- **覆盖**: ELO 评分计算逻辑
- **测试内容**:
- 基础 ELO 计算
- K因子变化
- 平局处理
- 极端分差
### 3. forum-hot.test.ts
- **测试数量**: 30
- **覆盖**: 论坛热度排序算法
- **测试内容**:
- 热度公式计算
- 时间衰减
- 回复加权
- 点赞加权
- 置顶优先
### 4. achievements.test.ts
- **测试数量**: 26
- **覆盖**: 成就系统逻辑
- **测试内容**:
- 成就解锁条件
- 进度计算
- 徽章授予
- 边界条件
### 5. points-reward.test.ts
- **测试数量**: 24
- **覆盖**: `src/lib/points-reward.ts`
- **测试内容**:
- 各操作积分奖励
- 每日上限检查
- Streak freeze 逻辑
- 商店购买消耗
- 等级升级触发
---
## 运行命令
```bash
# 运行所有测试
npx vitest run
# 监听模式
npx vitest
# 生成覆盖率报告
npx vitest run --coverage
# 运行特定测试文件
npx vitest run src/__tests__/level-config.test.ts
# UI 模式
npx vitest --ui
```
---
## 测试规范
### 文件命名
- 测试文件: `*.test.ts`
- 目录: `src/__tests__/`
### 测试结构
```typescript
import { describe, it, expect, beforeEach, vi } from "vitest";
describe("模块名", () => {
beforeEach(() => {
// setup
});
describe("功能点", () => {
it("应该满足某条件", () => {
// arrange
// act
// assert
});
it("应该处理边界情况", () => {
// ...
});
it("应该优雅处理错误", () => {
// ...
});
});
});
```
### 测试原则
- 每个 `it` 测试单一行为
- 使用 `describe` 组织相关测试
- Arrange → Act → Assert 三段式
- 覆盖正常路径 + 边界条件 + 错误路径
- 禁止 `.skip` 除非有明确 TODO 注释
- Mock 外部依赖(Prisma、外部 API)
### 覆盖率目标
| 指标 | 目标 |
|------|------|
| 行覆盖率 | ≥ 80% |
| 分支覆盖率 | ≥ 80% |
| 函数覆盖率 | ≥ 80% |
| 语句覆盖率 | ≥ 80% |
+118
View File
@@ -0,0 +1,118 @@
# 暗色模式模块
## 概述
追光AI支持浅色/暗色双主题模式,通过 ThemeProvider + CSS 变量驱动,用户偏好自动持久化到 localStorage,整体遵循 Tailwind CSS `class` 策略。
## 架构
```
ThemeProvider (Context)
├── 读取 localStorage 初始主题
├── 监听系统 prefers-color-scheme 变化
├── 在 <html> 上切换 "dark" class
└── 提供 toggle/setTheme 方法给子孙组件
```
---
## 核心组件
### ThemeProvider
- **文件**: `src/components/ThemeProvider.tsx`
- **位置**: 根 layout.tsx 包裹
- **功能**:
- `theme` state: `"light"` | `"dark"` | `"system"`
- `toggleTheme()` — 在 light/dark 间切换
- `setTheme(mode)` — 设置为指定模式
- 自动监听 `prefers-color-scheme` 媒体查询(`system` 模式时)
- 持久化到 `localStorage("zhuiguang-theme")`
### Header 主题切换按钮
- **文件**: `src/components/layout/Header.tsx`
- 太阳 ☀️ / 月亮 🌙 图标切换
- 点击调用 `toggleTheme()`
- 动画过渡效果
---
## CSS 变量系统
### globals.css 暗色变量
```css
:root {
/* 浅色主题变量 (默认) */
--background: 0 0% 100%;
--foreground: 222 47% 11%;
/* ... */
}
.dark {
/* 暗色主题变量覆盖 */
--background: 222 47% 11%;
--foreground: 210 40% 98%;
/* ... */
}
```
- 使用 HSL 变量,Tailwind 通过 `hsl(var(--xxx))` 引用
- shadcn/ui 组件自动适配暗色模式(基于 `.dark` class)
---
## 组件适配(14个文件已更新)
以下组件已适配暗色模式:
| 组件 | 适配内容 |
|------|----------|
| Header | 主题切换按钮、导航栏背景色 |
| Footer | 页脚背景色、文字色、分隔线 |
| HeroBanner | Canvas 粒子颜色随主题切换 |
| HomePageClient | 卡片背景、文字颜色 |
| ToolsContent | 搜索框、筛选侧边栏、卡片 |
| SkillsPageClient | 技能卡片、分类标签 |
| 社区相关组件 | ForumBoard/ForumTopicCard/ForumEditor |
| 通知组件 | NotificationBell/NotificationCenter |
| 用户中心 | 积分卡片、等级进度条 |
| 工具详情 | 信息面板、推荐列表 |
| 技能详情 | 评测卡片、详情面板 |
| 后台管理 | 管理面板所有表格/表单 |
---
## 设计规范
### 浅色主题
- 背景: `bg-white` / `bg-muted/50`
- 卡片: `bg-white/80` (毛玻璃) / `bg-white/60` (卡片)
- 边框: `border-border/40`
- 阴影: `shadow-sm`
### 暗色主题
- 背景: `bg-background` (HSL 222 47% 11%)
- 卡片: `bg-card` (HSL 222 47% 13-15%)
- 边框: `border-border` (HSL 215 20% 25%)
- 阴影: `shadow-md` (更明显的阴影)
### 颜色规范(双主题通用)
- 文字: 浅色 `-600/-700` | 暗色 `-300/-200`
- 背景: 浅色 `-50` | 暗色 `-900/-950`
- 边框: 浅色 `-200/60` | 暗色 `-700/60`
---
## 技术实现要点
### 闪烁防护
- ThemeProvider 在 `useEffect` 中初始化,避免 SSR 时的主题闪烁
- `<html>` 上通过内联 script 在 hydration 前设置 class(防止白屏闪烁)
### 系统主题跟随
- `matchMedia('(prefers-color-scheme: dark)')` 监听
- 用户手动设置后覆盖系统偏好
- "system" 模式时动态跟随
### 持久化策略
- 存储键: `zhuiguang-theme`
- 值: `"light"` | `"dark"`
- 优先级: localStorage > 系统偏好 > 默认 light
+128
View File
@@ -0,0 +1,128 @@
# 工具功能增强模块
## 概述
工具功能增强模块包含工具对比(Compare)、工具认证徽章(Verified Badge)和个性化工具推荐(Recommendations),提升用户决策效率和信任度。
---
## 工具对比 (Tool Comparison) 🆕
### 功能概述
用户可同时选择最多 4 个工具进行并排对比,从 10 个维度查看详细差异。
### 架构
```
CompareProvider (React Context)
├── compareList: Tool[] (最多4个)
├── addToCompare(tool) — 添加工具到对比列表
├── removeFromCompare(toolId) — 移除
├── clearCompare() — 清空
└── isInCompare(toolId) — 是否已在列表
```
### 核心组件
| 组件 | 文件 | 说明 |
|------|------|------|
| CompareProvider | `src/components/common/CompareProvider.tsx` | Context Provider,管理对比状态 |
| CompareBar | `src/components/common/CompareBar.tsx` | 底部浮动对比栏(显示已选工具+对比按钮) |
| CompareButton | `src/components/common/CompareButton.tsx` | 工具卡片上的"加入对比"切换按钮 |
### 页面
#### /tools/compare
- 10维度对比表格
- 维度: 名称/分类/定价模型/定价详情/功能特性/标签/评分/评论数/浏览数/官网链接
- 支持一键移除/清空/返回浏览
### 交互流程
1. 在工具列表/详情页点击 CompareButton 添加工具
2. 底部 CompareBar 浮出显示已选工具(最大4个)
3. 点击 CompareBar 的"开始对比"按钮跳转到 /tools/compare
4. 对比页面展示并排表格,可移除/继续添加
### CompareBar 状态
- 空状态: 隐藏
- 1个工具: 显示但对比按钮禁用(至少需要2个)
- 2-4个工具: 显示完整,对比按钮可用
- 4个工具: 添加按钮禁用,显示"已满"
---
## 工具认证徽章 (Tool Verification) 🆕
### 功能概述
管理员可为优质/官方工具添加蓝V认证徽章,提升用户信任度。
### 数据模型
- Tool 表新增字段: `isVerified: Boolean @default(false)`
- Tool 表新增字段: `verifiedAt: DateTime?`
### API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/tools/[id]/verify | POST | 管理员认证工具(添加蓝V) |
| /api/admin/tools/[id]/verify | DELETE | 管理员取消认证 |
| /api/tools/verified | GET | 获取所有已认证工具 |
### 前端展示
- 工具详情页: 名称旁边显示蓝色勾号徽章
- 工具列表卡片: 名称旁边显示小蓝V图标
- 认证工具专属筛选: "仅看认证" 开关
---
## 内容推荐引擎 🆕
### 功能概述
基于用户浏览历史和收藏偏好,推荐相关工具和话题。
### 核心 API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/recommendations | GET | 获取个性化推荐(工具+技能) |
### 推荐算法
- **协同过滤**: 基于相似用户的收藏/浏览模式
- **内容相似度**: 基于工具分类/标签/定价模型
- **热度加权**: 综合浏览量、评论数、评分
### 前端组件
| 组件 | 文件 | 说明 |
|------|------|------|
| PersonalizedRecommend | `src/components/common/PersonalizedRecommend.tsx` 🆕 | 首页/用户中心的个性化推荐区 |
| RelatedTopics | `src/components/forum/RelatedTopics.tsx` | 话题详情页的相关话题推荐 |
### 展示位置
- 首页 "为你推荐" 板块
- 工具详情页 "相关推荐"
- 话题详情页 "相关话题"
- 用户中心 "猜你喜欢"
### PersonalizedRecommend 组件
- Props: `{ type: "tool" | "skill" | "topic", limit?: number }`
- 瀑布流/网格布局
- 骨架屏加载状态
- 空状态友好提示
- 支持刷新获取新推荐
---
## 共享类型定义
集中管理来源类型标签和颜色:
### src/lib/source-type.ts 🆕
```typescript
export function sourceTypeLabel(type: string): string
export function sourceTypeColor(type: string): string
```
- 支持: github / gitlab / gitee / huggingface / 官网
- 统一管理标签中文名和 Tailwind 配色
### src/lib/constants.ts 🆕
- `tagColors` — 工具/技能标签配色映射
- 统一管理所有标签的颜色方案