Files
ai-directory-platform/package.json
T
CoolChange.AIandClaude Fable 5 845503ad2f feat: 用户收藏、定价筛选、分类落地页、ISR 与 Newsletter/Docker 完善
- 收藏功能:favorite server actions + FavoritesProvider/FavoriteButton(乐观更新、未登录引导登录),列表卡片/详情页收藏按钮,仪表盘"我的收藏"
- 前台定价筛选(免费/免费增值/付费)与卡片定价徽标;首页"精选"改为查询 featured=true,不足时按最新补齐
- /category/[slug] 从 redirect 壳子改为真实落地页:分类双语描述 + 工具网格 + 完整 metadata + JSON-LD
- ISR:首页/工具详情/分类页 revalidate 3600 + generateStaticParams,[locale] layout 补 generateStaticParams;verify-email 与 reset-password 的 useSearchParams 包 Suspense
- 新增共享 ToolLogo 组件(next/image 优化 + data URL 降级 + 首字母占位),核心页面裸 img 全部替换;next.config 补 remotePatterns(R2 域名/Google favicon/https 通配)
- getCategoriesWithCount 只统计 published 工具;featured-tools 文案迁移至 next-intl
- Newsletter:footer 订阅表单 + 落库 + 可选同步 Resend Audience + 退订路由
- Docker:多阶段 Dockerfile(standalone)+ docker-compose(含 Postgres)+ 构建期数据库不可用的容错回退
- i18n:新增 pnpm i18n:check 一致性检查并补齐双语缺失键

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 20:35:17 -07:00

114 lines
3.4 KiB
JSON

{
"name": "toolso-ai",
"version": "1.0.0",
"description": "An open-source AI tools directory to help you discover the best AI tools across various categories.",
"private": false,
"keywords": [
"ai-tools",
"ai-directory",
"ai-tools-directory",
"artificial-intelligence",
"machine-learning",
"nextjs",
"typescript",
"tailwindcss",
"open-source"
],
"license": "Apache-2.0",
"homepage": "https://toolso.ai",
"repository": {
"type": "git",
"url": "https://github.com/coolchange-ai/toolso-ai-open.git"
},
"bugs": {
"url": "https://github.com/coolchange-ai/toolso-ai-open/issues"
},
"author": {
"name": "CoolChange.AI",
"url": "https://coolchange.ai"
},
"scripts": {
"dev": "node scripts/run-dev.mjs",
"build": "npm run generate:blog-manifest && next build",
"start": "next start",
"lint": "eslint .",
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:push": "drizzle-kit push",
"db:studio": "drizzle-kit studio",
"admin:setup": "tsx scripts/setup-admin.ts",
"seed:tools": "tsx scripts/seed-tools.ts",
"generate:blog-manifest": "node scripts/generate-blog-manifest.mjs",
"typecheck": "tsc --noEmit",
"i18n:check": "node scripts/check-i18n.mjs"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.958.0",
"@better-auth/client": "0.0.2-alpha.3",
"@hookform/resolvers": "^3.4.2",
"@mapbox/rehype-prism": "^0.9.0",
"@mdx-js/loader": "^3.0.1",
"@mdx-js/react": "^3.0.1",
"@next/mdx": "^14.2.3",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-slot": "^1.0.2",
"@react-email/components": "^0.5.3",
"@tabler/icons-react": "^3.5.0",
"@tailwindcss/typography": "^0.5.13",
"@tanstack/react-store": "^0.7.5",
"@types/mdx": "^2.0.13",
"@vercel/analytics": "^1.5.0",
"@vercel/speed-insights": "^1.2.0",
"better-auth": "^1.4.10",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cobe": "^0.6.3",
"date-fns": "^3.6.0",
"drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.5",
"fast-glob": "^3.3.2",
"framer-motion": "^11.2.9",
"geist": "^1.3.0",
"lucide-react": "^0.562.0",
"nanoid": "^5.1.6",
"next": "16.1.1",
"next-intl": "^4.7.0",
"next-themes": "^0.4.6",
"next-view-transitions": "^0.3.5",
"postgres": "^3.4.7",
"prettier": "^3.7.4",
"prismjs": "^1.29.0",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"react-email": "^4.2.11",
"react-hook-form": "^7.51.5",
"react-icons": "^5.2.1",
"react-markdown": "^10.1.0",
"react-wrap-balancer": "^1.1.1",
"reading-time": "^1.5.0",
"rehype-highlight": "^7.0.2",
"remark-gfm": "^4.0.0",
"resend": "^6.1.0",
"sonner": "^2.0.7",
"tailwind-merge": "^2.3.0",
"zod": "^3.23.8"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"dotenv": "^17.2.2",
"eslint": "^9.39.5",
"eslint-config-next": "16.1.1",
"pg": "^8.16.3",
"playwright": "^1.57.0",
"png-to-ico": "^3.0.1",
"postcss": "^8",
"sharp": "^0.34.5",
"tailwindcss": "^3.4.1",
"tsx": "^4.20.5",
"typescript": "^5"
},
"packageManager": "pnpm@10.11.1+sha512.e519b9f7639869dc8d5c3c5dfef73b3f091094b0a006d7317353c72b124e80e1afd429732e28705ad6bfa1ee879c1fce46c128ccebd3192101f43dd67c667912"
}