refactor: 主题系统 → monorepo 五个独立网站
- packages/core: @aidir/core 底座库(src/pages 页面组件体 1:1 镜像路由树 / kit 站点外壳工厂 / content/blog / scripts) - sites/: 5 个独立 Next.js 网站(ai-stack / launchai / the-ai-ledger / devai-tools / findai) - 每站独立 package.json / next.config / tailwind / messages / .env / 构建 - src/app 约 56 个薄路由文件(re-export 底座页面 + 内联路由段配置 revalidate/dynamic) - src/site/brand.tsx 站点配置 + src/site/home.tsx 站点首页(createMarketingLayout / createHomePage 工厂) - generate-site.mjs: 站点生成器(新增网站 = SITES 加条目,零 Core 修改) - start-all-sites.sh: 一键启动 3001-3005 - next-config.mjs: 底座统一 Next 配置工厂(next-intl + MDX + standalone) - 五站共享同一套 PostgreSQL / Better Auth / Admin(设计文档 §42) - 验证: 5 站 build OK / typecheck OK / 55 路由冒烟 200 / 品牌-内容-截图 差异确认 / 登录-投票-重复检测 e2e PASS
This commit is contained in:
+16
-113
@@ -1,118 +1,21 @@
|
||||
{
|
||||
"name": "toolso-ai",
|
||||
"name": "ai-directory-platform",
|
||||
"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"
|
||||
"description": "AI Directory Platform — 可复用 AI Directory 底座 + 多站点(monorepo)",
|
||||
"private": true,
|
||||
"workspaces": [
|
||||
"packages/*",
|
||||
"sites/*"
|
||||
],
|
||||
"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",
|
||||
"seed:platform": "bun scripts/seed-platform.ts",
|
||||
"build:theme": "next build",
|
||||
"test:e2e": "bun scripts/e2e-interaction.ts",
|
||||
"shots": "bun scripts/screenshot-pages.ts"
|
||||
},
|
||||
"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": "^12",
|
||||
"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/bun": "^1.4.2",
|
||||
"@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"
|
||||
"build:core": "bun run --filter '@aidir/core' generate:blog-manifest",
|
||||
"gen:sites": "bun packages/core/scripts/generate-site.mjs all",
|
||||
"db:push": "bun run --filter '@aidir/core' db:push",
|
||||
"db:migrate": "bun run --filter '@aidir/core' db:migrate",
|
||||
"seed": "bun packages/core/scripts/seed-platform.ts --force",
|
||||
"test": "bun test packages/core/tests",
|
||||
"typecheck": "tsc --noEmit -p packages/core && tsc --noEmit -p sites/ai-stack && tsc --noEmit -p sites/launchai && tsc --noEmit -p sites/the-ai-ledger && tsc --noEmit -p sites/devai-tools && tsc --noEmit -p sites/findai",
|
||||
"build:all": "for s in ai-stack launchai the-ai-ledger devai-tools findai; do (cd sites/$s && bun run build); done",
|
||||
"start:all": "bash packages/core/scripts/start-all-sites.sh"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user