@tokcalc/mcp-server 0.1.3 → 0.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +86 -406
  2. package/dist/http.js +23504 -0
  3. package/dist/index.js +21290 -0
  4. package/package.json +36 -92
  5. package/.zscripts/build.sh +0 -175
  6. package/.zscripts/database-runtime-build.sh +0 -33
  7. package/.zscripts/dev.pid +0 -1
  8. package/.zscripts/dev.sh +0 -154
  9. package/.zscripts/mini-services-build.sh +0 -78
  10. package/.zscripts/mini-services-install.sh +0 -65
  11. package/.zscripts/mini-services-start.sh +0 -123
  12. package/.zscripts/python-runtime-build.sh +0 -120
  13. package/.zscripts/start.sh +0 -145
  14. package/CAPACITY_STUDY.md +0 -283
  15. package/CODE_OF_CONDUCT.md +0 -55
  16. package/CONTRIBUTING.md +0 -177
  17. package/Caddyfile +0 -23
  18. package/LICENSE +0 -204
  19. package/bun.lock +0 -1965
  20. package/components.json +0 -21
  21. package/db/custom.db +0 -0
  22. package/download/README.md +0 -1
  23. package/download/tokcalc-dark-calculator.png +0 -0
  24. package/download/tokcalc-dark-default.png +0 -0
  25. package/download/tokcalc-demo.webm +0 -0
  26. package/download/tokcalc-github-link.png +0 -0
  27. package/download/tokcalc-hydration-fixed.png +0 -0
  28. package/download/tokcalc-issue-resolved.png +0 -0
  29. package/download/tokcalc-light-mode.png +0 -0
  30. package/download/tokcalc-light-reference.png +0 -0
  31. package/download/tokcalc-long-context-qwen.png +0 -0
  32. package/download/tokcalc-long-context.png +0 -0
  33. package/download/tokcalc-og-image-preview.png +0 -0
  34. package/download/tokcalc-phase2-3.png +0 -0
  35. package/download/tokcalc-plain-english.png +0 -0
  36. package/download/tokcalc-preview.png +0 -0
  37. package/download/tokcalc-share-bvb.png +0 -0
  38. package/download/tokcalc-share-feature.png +0 -0
  39. package/download/tokcalc-tab-build-vs-buy.png +0 -0
  40. package/download/tokcalc-tab-calculator.png +0 -0
  41. package/download/tokcalc-tab-reference.png +0 -0
  42. package/eslint.config.mjs +0 -50
  43. package/examples/websocket/frontend.tsx +0 -196
  44. package/examples/websocket/server.ts +0 -138
  45. package/mini-services/.gitkeep +0 -0
  46. package/mini-services/mcp-server/README.md +0 -86
  47. package/mini-services/mcp-server/bun.lock +0 -202
  48. package/mini-services/mcp-server/index.ts +0 -504
  49. package/mini-services/mcp-server/package.json +0 -40
  50. package/next.config.ts +0 -12
  51. package/postcss.config.mjs +0 -5
  52. package/prisma/schema.prisma +0 -32
  53. package/public/google6f58ca6be85fa903.html +0 -1
  54. package/public/logo.svg +0 -29
  55. package/public/manifest.json +0 -51
  56. package/public/og-icon-256.png +0 -0
  57. package/public/og.png +0 -0
  58. package/public/robots.txt +0 -25
  59. package/public/sitemap.xml +0 -23
  60. package/public/tokcalc-demo.gif +0 -0
  61. package/scripts/og-template.html +0 -120
  62. package/scripts/render-og.mjs +0 -43
  63. package/server.json +0 -21
  64. package/src/app/api/pricing/aws/route.ts +0 -186
  65. package/src/app/api/pricing/azure/route.ts +0 -168
  66. package/src/app/api/pricing/gcp/route.ts +0 -230
  67. package/src/app/api/pricing/vast-ai/route.ts +0 -164
  68. package/src/app/api/route.ts +0 -5
  69. package/src/app/compare/h100-vs-h200/layout.tsx +0 -30
  70. package/src/app/compare/h100-vs-h200/page.tsx +0 -328
  71. package/src/app/globals.css +0 -122
  72. package/src/app/layout.tsx +0 -276
  73. package/src/app/page.tsx +0 -2670
  74. package/src/components/azure-live-pricing.tsx +0 -185
  75. package/src/components/benchmark-import.tsx +0 -340
  76. package/src/components/confidence-badge.tsx +0 -116
  77. package/src/components/live-pricing-comparison.tsx +0 -241
  78. package/src/components/theme-provider.tsx +0 -11
  79. package/src/components/theme-toggle.tsx +0 -55
  80. package/src/components/ui/accordion.tsx +0 -66
  81. package/src/components/ui/alert-dialog.tsx +0 -157
  82. package/src/components/ui/alert.tsx +0 -66
  83. package/src/components/ui/aspect-ratio.tsx +0 -11
  84. package/src/components/ui/avatar.tsx +0 -53
  85. package/src/components/ui/badge.tsx +0 -46
  86. package/src/components/ui/breadcrumb.tsx +0 -109
  87. package/src/components/ui/button.tsx +0 -59
  88. package/src/components/ui/calendar.tsx +0 -213
  89. package/src/components/ui/card.tsx +0 -92
  90. package/src/components/ui/carousel.tsx +0 -241
  91. package/src/components/ui/chart.tsx +0 -353
  92. package/src/components/ui/checkbox.tsx +0 -32
  93. package/src/components/ui/collapsible.tsx +0 -33
  94. package/src/components/ui/command.tsx +0 -184
  95. package/src/components/ui/context-menu.tsx +0 -252
  96. package/src/components/ui/dialog.tsx +0 -143
  97. package/src/components/ui/drawer.tsx +0 -135
  98. package/src/components/ui/dropdown-menu.tsx +0 -257
  99. package/src/components/ui/form.tsx +0 -167
  100. package/src/components/ui/hover-card.tsx +0 -44
  101. package/src/components/ui/input-otp.tsx +0 -77
  102. package/src/components/ui/input.tsx +0 -21
  103. package/src/components/ui/label.tsx +0 -24
  104. package/src/components/ui/menubar.tsx +0 -276
  105. package/src/components/ui/navigation-menu.tsx +0 -168
  106. package/src/components/ui/pagination.tsx +0 -127
  107. package/src/components/ui/popover.tsx +0 -48
  108. package/src/components/ui/progress.tsx +0 -31
  109. package/src/components/ui/radio-group.tsx +0 -45
  110. package/src/components/ui/resizable.tsx +0 -56
  111. package/src/components/ui/scroll-area.tsx +0 -58
  112. package/src/components/ui/select.tsx +0 -185
  113. package/src/components/ui/separator.tsx +0 -28
  114. package/src/components/ui/sheet.tsx +0 -139
  115. package/src/components/ui/sidebar.tsx +0 -726
  116. package/src/components/ui/skeleton.tsx +0 -13
  117. package/src/components/ui/slider.tsx +0 -63
  118. package/src/components/ui/sonner.tsx +0 -25
  119. package/src/components/ui/switch.tsx +0 -31
  120. package/src/components/ui/table.tsx +0 -116
  121. package/src/components/ui/tabs.tsx +0 -66
  122. package/src/components/ui/textarea.tsx +0 -18
  123. package/src/components/ui/toast.tsx +0 -129
  124. package/src/components/ui/toaster.tsx +0 -35
  125. package/src/components/ui/toggle-group.tsx +0 -73
  126. package/src/components/ui/toggle.tsx +0 -47
  127. package/src/components/ui/tooltip.tsx +0 -61
  128. package/src/components/vast-ai-live-pricing.tsx +0 -176
  129. package/src/hooks/use-mobile.ts +0 -19
  130. package/src/hooks/use-toast.ts +0 -194
  131. package/src/lib/benchmark-parser-sglang.ts +0 -150
  132. package/src/lib/benchmark-parser-tokcalc.ts +0 -247
  133. package/src/lib/benchmark-parser-trtllm.ts +0 -152
  134. package/src/lib/benchmark-parser-vllm.ts +0 -198
  135. package/src/lib/benchmark-schema.ts +0 -263
  136. package/src/lib/db.ts +0 -13
  137. package/src/lib/engine-presets.ts +0 -183
  138. package/src/lib/price-schema.ts +0 -141
  139. package/src/lib/token-calc.ts +0 -808
  140. package/src/lib/track.ts +0 -31
  141. package/src/lib/url-state.ts +0 -256
  142. package/src/lib/utils.ts +0 -6
  143. package/tailwind.config.ts +0 -64
  144. package/tests/database-runtime-build.sh +0 -75
  145. package/tests/python-runtime-build.sh +0 -64
  146. package/tests/python-runtime-container.sh +0 -31
  147. package/tool-results/bash_1789888171144_2c5381860539.txt +0 -161
  148. package/tool-results/bash_1789888175925_49c53ba3c61b.txt +0 -191
  149. package/tool-results/bash_1789888181202_49c53ba3c61b.txt +0 -191
  150. package/tool-results/bash_1789888195219_4a86a5c91411.txt +0 -200
  151. package/tool-results/bash_1789888203128_6cca13c71b47.txt +0 -199
  152. package/tool-results/bash_1789929256963_2a52aff0d0a8.txt +0 -160
  153. package/tool-results/read_1789888151021_69f58eec6a5b.txt +0 -653
  154. package/tool-results/read_1789888153837_1d3a8bfc2a94.txt +0 -653
  155. package/tool-results/read_1789888163087_ccc406d47505.txt +0 -122
  156. package/tool-results/read_1789888167347_67d1d7c9830a.txt +0 -122
  157. package/tool-results/read_1789929252529_d90e8f383a25.txt +0 -285
  158. package/tsconfig.json +0 -42
  159. package/upload/Pasted Content_1789887800864.txt +0 -652
  160. package/upload/Pasted Content_1789887909561.txt +0 -652
  161. package/upload/Pasted Content_1789887918428.txt +0 -652
  162. package/upload/Pasted Content_1789887959420.txt +0 -652
  163. package/upload/Pasted Content_1789888020485.txt +0 -652
  164. package/upload/Pasted Content_1789888058079.txt +0 -652
  165. package/upload/Pasted Content_1789888885033.txt +0 -686
  166. package/upload/Pasted Content_1789928912741.txt +0 -285
  167. package/upload/Pasted Content_1789928938402.txt +0 -285
  168. package/upload/Pasted Content_1789929160389.txt +0 -285
  169. package/upload/Pasted Content_1789929176660.txt +0 -285
  170. package/upload/issue_vision.json +0 -28
  171. package/upload/pasted_image_1789883175209.png +0 -0
  172. package/upload/pasted_image_1789899056690.png +0 -0
  173. package/upload/pasted_image_1789900371483.png +0 -0
  174. package/upload/pasted_image_1789900472823.png +0 -0
  175. package/upload/pasted_image_1789900490374.png +0 -0
  176. package/upload/pasted_image_1789900585552.png +0 -0
  177. package/upload/pasted_image_1789900606519.png +0 -0
  178. package/upload/pasted_image_1789901598705.png +0 -0
  179. package/upload/pasted_image_1789901613545.png +0 -0
  180. package/upload/pasted_image_1789978382674.png +0 -0
  181. package/upload/pasted_image_1789978392749.png +0 -0
  182. package/upload/pasted_image_1789978474879.png +0 -0
  183. package/upload/pasted_image_1789978523652.png +0 -0
  184. package/upload/pasted_image_1789984219089.png +0 -0
  185. package/upload/pasted_image_1789984491896.png +0 -0
  186. package/upload/pasted_image_1789985017950.png +0 -0
  187. package/upload/pasted_image_1789985036765.png +0 -0
  188. package/upload/pasted_image_1789985049848.png +0 -0
  189. package/upload/pasted_image_1790002427833.png +0 -0
  190. package/upload/pasted_image_1790002659944.png +0 -0
  191. package/upload/pasted_image_1790037038476.png +0 -0
  192. package/upload/screenshot_analysis.json +0 -28
  193. package/upload/vision_output.json +0 -28
package/package.json CHANGED
@@ -1,97 +1,41 @@
1
1
  {
2
2
  "name": "@tokcalc/mcp-server",
3
- "version": "0.1.3",
4
- "mcpName": "io.github.stevecrates489-commits/tokcalc",
5
- "private": false,
6
- "scripts": {
7
- "dev": "next dev -p 3000 2>&1 | tee dev.log",
8
- "build": "next build",
9
- "vercel-build": "next build",
10
- "start": "NODE_ENV=production bun .next/standalone/server.js 2>&1 | tee server.log",
11
- "lint": "eslint .",
12
- "postinstall": "prisma generate || true",
13
- "db:push": "prisma db push --accept-data-loss",
14
- "db:generate": "prisma generate",
15
- "db:migrate": "prisma migrate dev",
16
- "db:reset": "prisma migrate reset"
3
+ "version": "0.2.0-alpha.1",
4
+ "description": "tokcalc MCP server — open-source LLM serving capacity planner for AI agents. v0.2.0-alpha.1: stdio + stateless HTTP transports. 7 read-only tools: estimate_capacity, compare_gpus, recommend_topology, estimate_api_vs_self_host, list_models, list_gpus, get_mlperf_benchmarks.",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "bin": {
8
+ "tokcalc-mcp": "./dist/index.js",
9
+ "tokcalc-mcp-server": "./dist/index.js",
10
+ "mcp-server": "./dist/index.js",
11
+ "tokcalc-mcp-http": "./dist/http.js"
17
12
  },
18
- "dependencies": {
19
- "@dnd-kit/core": "^6.3.1",
20
- "@dnd-kit/sortable": "^10.0.0",
21
- "@dnd-kit/utilities": "^3.2.2",
22
- "@hookform/resolvers": "^5.1.1",
23
- "@mdxeditor/editor": "^3.39.1",
24
- "@prisma/client": "^6.11.1",
25
- "@radix-ui/react-accordion": "^1.2.11",
26
- "@radix-ui/react-alert-dialog": "^1.1.14",
27
- "@radix-ui/react-aspect-ratio": "^1.1.7",
28
- "@radix-ui/react-avatar": "^1.1.10",
29
- "@radix-ui/react-checkbox": "^1.3.2",
30
- "@radix-ui/react-collapsible": "^1.1.11",
31
- "@radix-ui/react-context-menu": "^2.2.15",
32
- "@radix-ui/react-dialog": "^1.1.14",
33
- "@radix-ui/react-dropdown-menu": "^2.1.15",
34
- "@radix-ui/react-hover-card": "^1.1.14",
35
- "@radix-ui/react-label": "^2.1.7",
36
- "@radix-ui/react-menubar": "^1.1.15",
37
- "@radix-ui/react-navigation-menu": "^1.2.13",
38
- "@radix-ui/react-popover": "^1.1.14",
39
- "@radix-ui/react-progress": "^1.1.7",
40
- "@radix-ui/react-radio-group": "^1.3.7",
41
- "@radix-ui/react-scroll-area": "^1.2.9",
42
- "@radix-ui/react-select": "^2.2.5",
43
- "@radix-ui/react-separator": "^1.1.7",
44
- "@radix-ui/react-slider": "^1.3.5",
45
- "@radix-ui/react-slot": "^1.2.3",
46
- "@radix-ui/react-switch": "^1.2.5",
47
- "@radix-ui/react-tabs": "^1.1.12",
48
- "@radix-ui/react-toast": "^1.2.14",
49
- "@radix-ui/react-toggle": "^1.1.9",
50
- "@radix-ui/react-toggle-group": "^1.1.10",
51
- "@radix-ui/react-tooltip": "^1.2.7",
52
- "@reactuses/core": "^6.0.5",
53
- "@tanstack/react-query": "^5.82.0",
54
- "@tanstack/react-table": "^8.21.3",
55
- "class-variance-authority": "^0.7.1",
56
- "clsx": "^2.1.1",
57
- "cmdk": "^1.1.1",
58
- "date-fns": "^4.1.0",
59
- "embla-carousel-react": "^8.6.0",
60
- "framer-motion": "^12.23.2",
61
- "input-otp": "^1.4.2",
62
- "lucide-react": "^0.525.0",
63
- "next": "^16.1.1",
64
- "next-auth": "^4.24.11",
65
- "next-intl": "^4.3.4",
66
- "next-themes": "^0.4.6",
67
- "prisma": "^6.11.1",
68
- "react": "^19.0.0",
69
- "react-day-picker": "^9.8.0",
70
- "react-dom": "^19.0.0",
71
- "react-hook-form": "^7.60.0",
72
- "react-markdown": "^10.1.0",
73
- "react-resizable-panels": "^3.0.3",
74
- "react-syntax-highlighter": "^15.6.1",
75
- "recharts": "^2.15.4",
76
- "sharp": "^0.34.3",
77
- "sonner": "^2.0.6",
78
- "tailwind-merge": "^3.3.1",
79
- "tailwindcss-animate": "^1.0.7",
80
- "uuid": "^11.1.0",
81
- "vaul": "^1.1.2",
82
- "z-ai-web-dev-sdk": "^0.0.18",
83
- "zod": "^4.0.2",
84
- "zustand": "^5.0.6"
13
+ "files": [
14
+ "dist/",
15
+ "README.md"
16
+ ],
17
+ "keywords": [
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "llm",
21
+ "inference",
22
+ "capacity-planner",
23
+ "gpu",
24
+ "vllm",
25
+ "h100",
26
+ "h200",
27
+ "tokcalc"
28
+ ],
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/stevecrates489-commits/tokcalc"
32
+ },
33
+ "homepage": "https://tokcalc.vercel.app",
34
+ "engines": {
35
+ "node": ">=18"
85
36
  },
86
- "devDependencies": {
87
- "@tailwindcss/postcss": "^4",
88
- "@types/react": "^19",
89
- "@types/react-dom": "^19",
90
- "bun-types": "^1.3.4",
91
- "eslint": "^9",
92
- "eslint-config-next": "^16.1.1",
93
- "tailwindcss": "^4",
94
- "tw-animate-css": "^1.3.5",
95
- "typescript": "^5"
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.30.1",
39
+ "zod-to-json-schema": "^3.25.2"
96
40
  }
97
- }
41
+ }
@@ -1,175 +0,0 @@
1
- #!/bin/bash
2
-
3
- # 将 stderr 重定向到 stdout,避免 execute_command 因为 stderr 输出而报错
4
- exec 2>&1
5
-
6
- set -e
7
-
8
- # 获取脚本所在目录(.zscripts 目录,即 workspace-agent/.zscripts)
9
- # 使用 $0 获取脚本路径(兼容 sh 和 bash)
10
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
11
-
12
- # Next.js 项目路径
13
- NEXTJS_PROJECT_DIR="/home/z/my-project"
14
-
15
- # 检查 Next.js 项目目录是否存在
16
- if [ ! -d "$NEXTJS_PROJECT_DIR" ]; then
17
- echo "❌ 错误: Next.js 项目目录不存在: $NEXTJS_PROJECT_DIR"
18
- exit 1
19
- fi
20
-
21
- echo "🚀 开始构建 Next.js 应用和 mini-services..."
22
- echo "📁 Next.js 项目路径: $NEXTJS_PROJECT_DIR"
23
-
24
- # 切换到 Next.js 项目目录
25
- cd "$NEXTJS_PROJECT_DIR" || exit 1
26
-
27
- # 设置环境变量
28
- export NEXT_TELEMETRY_DISABLED=1
29
-
30
- BUILD_DIR="/tmp/build_fullstack_$BUILD_ID"
31
- echo "📁 清理并创建构建目录: $BUILD_DIR"
32
- mkdir -p "$BUILD_DIR"
33
-
34
- # 安装依赖
35
- echo "📦 安装依赖..."
36
- bun install
37
-
38
- # 构建 Next.js 应用
39
- echo "🔨 构建 Next.js 应用..."
40
- bun run build
41
-
42
- # 校验 standalone 服务端入口是否生成(部署成功率守卫)。
43
- # Next 仅在 next.config 含 output:"standalone" 时产出 .next/standalone/server.js。
44
- # 若用户/AI 编辑项目时改写或删除了该配置,bun run build 仍会成功(static 照常
45
- # 产出、退出码 0),但 standalone 缺失——打出的包里没有 server.js,部署到 FC 后
46
- # start.sh 找不到 next-service-dist/server.js → 不启动 Next → Caddy:81 反代空的
47
- # 3000 → FC 健康检查 120s 超时失败(线上 warmup_412 / FunctionNotStarted 的主因)。
48
- # 这里做一次自愈:仅在确实缺失时,给 next.config 补回 output:"standalone" 并重建。
49
- # 正常项目(已生成 server.js)整段跳过,不读写任何用户文件。
50
- if [ ! -f ".next/standalone/server.js" ]; then
51
- echo "⚠️ 构建未产出 .next/standalone/server.js,开始自愈 next.config 的 output 配置..."
52
- NEXT_CONFIG_FILE="$(ls next.config.ts next.config.js next.config.mjs next.config.cjs 2>/dev/null | head -1)"
53
-
54
- if [ -z "$NEXT_CONFIG_FILE" ]; then
55
- echo "❌ 构建失败:未找到 next.config.*,无法生成 standalone 部署产物。"
56
- exit 1
57
- fi
58
-
59
- if grep -Eq "output\s*:\s*['\"]standalone['\"]" "$NEXT_CONFIG_FILE"; then
60
- # 已声明 standalone 却仍没产出 server.js,说明不是配置缺失(可能 build 真
61
- # 出错、自定义 distDir 等)。不臆改用户配置,直接失败并暴露原因。
62
- echo "❌ 构建失败:$NEXT_CONFIG_FILE 已含 output:\"standalone\",但仍未生成 .next/standalone/server.js。"
63
- echo " 请检查上方构建日志中的报错或项目自定义的构建配置。"
64
- exit 1
65
- fi
66
-
67
- if grep -Eq "output\s*:\s*['\"]" "$NEXT_CONFIG_FILE"; then
68
- # 已显式声明了其它 output(如 "export" 静态导出 / "standalone" 之外的值)。
69
- # "export" 与本部署模型(standalone + 自定义 server)互斥——不能注入第二个
70
- # output 覆盖用户意图(JS 对象重复 key 后者生效,注入也无效)。明确失败。
71
- echo "❌ 构建失败:$NEXT_CONFIG_FILE 已声明非 standalone 的 output(如 \"export\" 静态导出),与当前部署模型不兼容。"
72
- echo " 当前部署需要 output:\"standalone\"。请改为 standalone,或确认该项目是否应走静态托管而非部署沙箱。"
73
- exit 1
74
- fi
75
-
76
- echo "🔧 检测到 $NEXT_CONFIG_FILE 缺少 output:\"standalone\",自动注入后重新构建..."
77
- cp "$NEXT_CONFIG_FILE" "${NEXT_CONFIG_FILE}.zbak"
78
- # 在第一个配置对象字面量起始的 { 之后插入 output:"standalone",
79
- # 覆盖脚手架常见写法:const nextConfig...= { / export default { / module.exports = {
80
- perl -0pi -e 's/((?:const\s+\w+[^=]*=|export\s+default|module\.exports\s*=)\s*\{)/$1\n output: "standalone",/' "$NEXT_CONFIG_FILE"
81
-
82
- if ! grep -Eq "output\s*:\s*['\"]standalone['\"]" "$NEXT_CONFIG_FILE"; then
83
- echo "❌ 未能匹配到可注入的配置对象,next.config 写法非常规,需人工添加 output:\"standalone\"。"
84
- echo " 当前 $NEXT_CONFIG_FILE 内容:"
85
- cat "$NEXT_CONFIG_FILE"
86
- mv "${NEXT_CONFIG_FILE}.zbak" "$NEXT_CONFIG_FILE"
87
- exit 1
88
- fi
89
-
90
- echo "🔨 已注入 output:\"standalone\",重新构建..."
91
- bun run build
92
-
93
- if [ ! -f ".next/standalone/server.js" ]; then
94
- echo "❌ 注入 output:\"standalone\" 并重建后,仍未生成 .next/standalone/server.js。"
95
- exit 1
96
- fi
97
- echo "✅ 自愈成功:standalone 服务端入口已生成。"
98
- fi
99
-
100
- # 构建 mini-services
101
- # 检查 Next.js 项目目录下是否有 mini-services 目录
102
- if [ -d "$NEXTJS_PROJECT_DIR/mini-services" ]; then
103
- echo "🔨 构建 mini-services..."
104
- # 使用 workspace-agent 目录下的 mini-services 脚本
105
- sh "$SCRIPT_DIR/mini-services-install.sh"
106
- sh "$SCRIPT_DIR/mini-services-build.sh"
107
-
108
- # 复制 mini-services-start.sh 到 mini-services-dist 目录
109
- echo " - 复制 mini-services-start.sh 到 $BUILD_DIR"
110
- cp "$SCRIPT_DIR/mini-services-start.sh" "$BUILD_DIR/mini-services-start.sh"
111
- chmod +x "$BUILD_DIR/mini-services-start.sh"
112
- else
113
- echo "ℹ️ mini-services 目录不存在,跳过"
114
- fi
115
-
116
- # 将所有构建产物复制到临时构建目录
117
- echo "📦 收集构建产物到 $BUILD_DIR..."
118
-
119
- # 复制 Next.js standalone 构建输出
120
- if [ -d ".next/standalone" ]; then
121
- echo " - 复制 .next/standalone"
122
- cp -r .next/standalone "$BUILD_DIR/next-service-dist/"
123
- fi
124
-
125
- # 复制 Next.js 静态文件
126
- if [ -d ".next/static" ]; then
127
- echo " - 复制 .next/static"
128
- mkdir -p "$BUILD_DIR/next-service-dist/.next"
129
- cp -r .next/static "$BUILD_DIR/next-service-dist/.next/"
130
- fi
131
-
132
- # 复制 public 目录
133
- if [ -d "public" ]; then
134
- echo " - 复制 public"
135
- cp -r public "$BUILD_DIR/next-service-dist/"
136
- fi
137
-
138
- # Python 不继承 workspace-agent 的 /home/z/.venv。若项目包含 Python 源码或
139
- # 依赖清单,在构建期将生产依赖固化到产物,并保持 Python 源码的项目相对路径。
140
- PROJECT_DIR="$NEXTJS_PROJECT_DIR" BUILD_DIR="$BUILD_DIR" \
141
- bash "$SCRIPT_DIR/python-runtime-build.sh"
142
-
143
- # 有 Preview 数据库时复制现有数据;没有时直接在部署产物中初始化空库。
144
- # 模板源码不携带 db/custom.db,不能依赖 dev.sh 必须在 Deploy 前成功运行过。
145
- PROJECT_DIR="$NEXTJS_PROJECT_DIR" BUILD_DIR="$BUILD_DIR" \
146
- bash "$SCRIPT_DIR/database-runtime-build.sh"
147
-
148
- # 复制 Caddyfile(如果存在)
149
- if [ -f "Caddyfile" ]; then
150
- echo " - 复制 Caddyfile"
151
- cp Caddyfile "$BUILD_DIR/"
152
- else
153
- echo "ℹ️ Caddyfile 不存在,跳过"
154
- fi
155
-
156
- # 复制 start.sh 脚本
157
- echo " - 复制 start.sh 到 $BUILD_DIR"
158
- cp "$SCRIPT_DIR/start.sh" "$BUILD_DIR/start.sh"
159
- chmod +x "$BUILD_DIR/start.sh"
160
-
161
- # 打包到 $BUILD_DIR.tar.gz
162
- PACKAGE_FILE="${BUILD_DIR}.tar.gz"
163
- echo ""
164
- echo "📦 打包构建产物到 $PACKAGE_FILE..."
165
- cd "$BUILD_DIR" || exit 1
166
- tar -czf "$PACKAGE_FILE" .
167
- cd - > /dev/null || exit 1
168
-
169
- # # 清理临时目录
170
- # rm -rf "$BUILD_DIR"
171
-
172
- echo ""
173
- echo "✅ 构建完成!所有产物已打包到 $PACKAGE_FILE"
174
- echo "📊 打包文件大小:"
175
- ls -lh "$PACKAGE_FILE"
@@ -1,33 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -euo pipefail
4
-
5
- PROJECT_DIR="${PROJECT_DIR:-/home/z/my-project}"
6
- BUILD_DIR="${BUILD_DIR:?BUILD_DIR is required}"
7
- SOURCE_DB_DIR="$PROJECT_DIR/db"
8
- SOURCE_DB_PATH="$SOURCE_DB_DIR/custom.db"
9
- TARGET_DB_DIR="$BUILD_DIR/db"
10
- TARGET_DB_PATH="$TARGET_DB_DIR/custom.db"
11
-
12
- mkdir -p "$TARGET_DB_DIR"
13
-
14
- if [ -f "$SOURCE_DB_PATH" ]; then
15
- echo "🗄️ 复制 Preview 数据库到构建产物..."
16
- cp -a "$SOURCE_DB_DIR/." "$TARGET_DB_DIR/"
17
- else
18
- echo "ℹ️ 未找到 Preview 数据库 db/custom.db,将初始化空的生产数据库"
19
- fi
20
-
21
- echo "🗄️ 同步构建产物中的数据库结构..."
22
- (
23
- cd "$PROJECT_DIR"
24
- DATABASE_URL="file:$TARGET_DB_PATH" bun run db:push
25
- )
26
-
27
- if [ ! -f "$TARGET_DB_PATH" ]; then
28
- echo "❌ 数据库初始化命令执行成功,但未生成 $TARGET_DB_PATH"
29
- exit 1
30
- fi
31
-
32
- echo "✅ 构建产物数据库已准备完成"
33
- ls -lah "$TARGET_DB_DIR"
package/.zscripts/dev.pid DELETED
@@ -1 +0,0 @@
1
- 1204
package/.zscripts/dev.sh DELETED
@@ -1,154 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -euo pipefail
4
-
5
- # 获取脚本所在目录(.zscripts)
6
- # 使用 $0 获取脚本路径(与 build.sh 保持一致)
7
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
- PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
9
-
10
- log_step_start() {
11
- local step_name="$1"
12
- echo "=========================================="
13
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting: $step_name"
14
- echo "=========================================="
15
- export STEP_START_TIME
16
- STEP_START_TIME=$(date +%s)
17
- }
18
-
19
- log_step_end() {
20
- local step_name="${1:-Unknown step}"
21
- local end_time
22
- end_time=$(date +%s)
23
- local duration=$((end_time - STEP_START_TIME))
24
- echo "=========================================="
25
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] Completed: $step_name"
26
- echo "[LOG] Step: $step_name | Duration: ${duration}s"
27
- echo "=========================================="
28
- echo ""
29
- }
30
-
31
- start_mini_services() {
32
- local mini_services_dir="$PROJECT_DIR/mini-services"
33
- local started_count=0
34
-
35
- log_step_start "Starting mini-services"
36
- if [ ! -d "$mini_services_dir" ]; then
37
- echo "Mini-services directory not found, skipping..."
38
- log_step_end "Starting mini-services"
39
- return 0
40
- fi
41
-
42
- echo "Found mini-services directory, scanning for sub-services..."
43
-
44
- for service_dir in "$mini_services_dir"/*; do
45
- if [ ! -d "$service_dir" ]; then
46
- continue
47
- fi
48
-
49
- local service_name
50
- service_name=$(basename "$service_dir")
51
- echo "Checking service: $service_name"
52
-
53
- if [ ! -f "$service_dir/package.json" ]; then
54
- echo "[$service_name] No package.json found, skipping..."
55
- continue
56
- fi
57
-
58
- if ! grep -q '"dev"' "$service_dir/package.json"; then
59
- echo "[$service_name] No dev script found, skipping..."
60
- continue
61
- fi
62
-
63
- echo "Starting $service_name in background..."
64
- (
65
- cd "$service_dir"
66
- echo "[$service_name] Installing dependencies..."
67
- bun install
68
- echo "[$service_name] Running bun run dev..."
69
- exec bun run dev
70
- ) >"$PROJECT_DIR/.zscripts/mini-service-${service_name}.log" 2>&1 &
71
-
72
- local service_pid=$!
73
- echo "[$service_name] Started in background (PID: $service_pid)"
74
- echo "[$service_name] Log: $PROJECT_DIR/.zscripts/mini-service-${service_name}.log"
75
- disown "$service_pid" 2>/dev/null || true
76
- started_count=$((started_count + 1))
77
- done
78
-
79
- echo "Mini-services startup completed. Started $started_count service(s)."
80
- log_step_end "Starting mini-services"
81
- }
82
-
83
- wait_for_service() {
84
- local host="$1"
85
- local port="$2"
86
- local service_name="$3"
87
- local max_attempts="${4:-60}"
88
- local attempt=1
89
-
90
- echo "Waiting for $service_name to be ready on $host:$port..."
91
-
92
- while [ "$attempt" -le "$max_attempts" ]; do
93
- if curl -s --connect-timeout 2 --max-time 5 "http://$host:$port" >/dev/null 2>&1; then
94
- echo "$service_name is ready!"
95
- return 0
96
- fi
97
-
98
- echo "Attempt $attempt/$max_attempts: $service_name not ready yet, waiting..."
99
- sleep 1
100
- attempt=$((attempt + 1))
101
- done
102
-
103
- echo "ERROR: $service_name failed to start within $max_attempts seconds"
104
- return 1
105
- }
106
-
107
- cleanup() {
108
- if [ -n "${DEV_PID:-}" ] && kill -0 "$DEV_PID" >/dev/null 2>&1; then
109
- echo "Stopping Next.js dev server (PID: $DEV_PID)..."
110
- kill "$DEV_PID" >/dev/null 2>&1 || true
111
- fi
112
- }
113
-
114
- trap cleanup EXIT INT TERM
115
-
116
- cd "$PROJECT_DIR"
117
-
118
- if ! command -v bun >/dev/null 2>&1; then
119
- echo "ERROR: bun is not installed or not in PATH"
120
- exit 1
121
- fi
122
-
123
- log_step_start "bun install"
124
- echo "[BUN] Installing dependencies..."
125
- bun install
126
- log_step_end "bun install"
127
-
128
- log_step_start "bun run db:push"
129
- echo "[BUN] Setting up database..."
130
- bun run db:push
131
- log_step_end "bun run db:push"
132
-
133
- log_step_start "Starting Next.js dev server"
134
- echo "[BUN] Starting development server..."
135
- bun run dev &
136
- DEV_PID=$!
137
- log_step_end "Starting Next.js dev server"
138
-
139
- log_step_start "Waiting for Next.js dev server"
140
- wait_for_service "localhost" "3000" "Next.js dev server"
141
- log_step_end "Waiting for Next.js dev server"
142
-
143
- log_step_start "Health check"
144
- echo "[BUN] Performing health check..."
145
- curl -fsS localhost:3000 >/dev/null
146
- echo "[BUN] Health check passed"
147
- log_step_end "Health check"
148
-
149
- start_mini_services
150
-
151
- echo "Next.js dev server is running in background (PID: $DEV_PID)."
152
- echo "Use 'kill $DEV_PID' to stop it."
153
- disown "$DEV_PID" 2>/dev/null || true
154
- unset DEV_PID
@@ -1,78 +0,0 @@
1
- #!/bin/bash
2
-
3
- # 配置项
4
- ROOT_DIR="/home/z/my-project/mini-services"
5
- DIST_DIR="/tmp/build_fullstack_$BUILD_ID/mini-services-dist"
6
-
7
- main() {
8
- echo "🚀 开始批量构建..."
9
-
10
- # 检查 rootdir 是否存在
11
- if [ ! -d "$ROOT_DIR" ]; then
12
- echo "ℹ️ 目录 $ROOT_DIR 不存在,跳过构建"
13
- return
14
- fi
15
-
16
- # 创建输出目录(如果不存在)
17
- mkdir -p "$DIST_DIR"
18
-
19
- # 统计变量
20
- success_count=0
21
- fail_count=0
22
-
23
- # 遍历 mini-services 目录下的所有文件夹
24
- for dir in "$ROOT_DIR"/*; do
25
- # 检查是否是目录且包含 package.json
26
- if [ -d "$dir" ] && [ -f "$dir/package.json" ]; then
27
- project_name=$(basename "$dir")
28
-
29
- # 智能查找入口文件 (按优先级查找)
30
- entry_path=""
31
- for entry in "src/index.ts" "index.ts" "src/index.js" "index.js"; do
32
- if [ -f "$dir/$entry" ]; then
33
- entry_path="$dir/$entry"
34
- break
35
- fi
36
- done
37
-
38
- if [ -z "$entry_path" ]; then
39
- echo "⚠️ 跳过 $project_name: 未找到入口文件 (index.ts/js)"
40
- continue
41
- fi
42
-
43
- echo ""
44
- echo "📦 正在构建: $project_name..."
45
-
46
- # 使用 bun build CLI 构建
47
- output_file="$DIST_DIR/mini-service-$project_name.js"
48
-
49
- if bun build "$entry_path" \
50
- --outfile "$output_file" \
51
- --target bun \
52
- --minify; then
53
- echo "✅ $project_name 构建成功 -> $output_file"
54
- success_count=$((success_count + 1))
55
- else
56
- echo "❌ $project_name 构建失败"
57
- fail_count=$((fail_count + 1))
58
- fi
59
- fi
60
- done
61
-
62
- if [ -f ./.zscripts/mini-services-start.sh ]; then
63
- cp ./.zscripts/mini-services-start.sh "$DIST_DIR/mini-services-start.sh"
64
- chmod +x "$DIST_DIR/mini-services-start.sh"
65
- fi
66
-
67
- echo ""
68
- echo "🎉 所有任务完成!"
69
- if [ $success_count -gt 0 ] || [ $fail_count -gt 0 ]; then
70
- echo "✅ 成功: $success_count 个"
71
- if [ $fail_count -gt 0 ]; then
72
- echo "❌ 失败: $fail_count 个"
73
- fi
74
- fi
75
- }
76
-
77
- main
78
-
@@ -1,65 +0,0 @@
1
- #!/bin/bash
2
-
3
- # 配置项
4
- ROOT_DIR="/home/z/my-project/mini-services"
5
-
6
- main() {
7
- echo "🚀 开始批量安装依赖..."
8
-
9
- # 检查 rootdir 是否存在
10
- if [ ! -d "$ROOT_DIR" ]; then
11
- echo "ℹ️ 目录 $ROOT_DIR 不存在,跳过安装"
12
- return
13
- fi
14
-
15
- # 统计变量
16
- success_count=0
17
- fail_count=0
18
- failed_projects=""
19
-
20
- # 遍历 mini-services 目录下的所有文件夹
21
- for dir in "$ROOT_DIR"/*; do
22
- # 检查是否是目录且包含 package.json
23
- if [ -d "$dir" ] && [ -f "$dir/package.json" ]; then
24
- project_name=$(basename "$dir")
25
- echo ""
26
- echo "📦 正在安装依赖: $project_name..."
27
-
28
- # 进入项目目录并执行 bun install
29
- if (cd "$dir" && bun install); then
30
- echo "✅ $project_name 依赖安装成功"
31
- success_count=$((success_count + 1))
32
- else
33
- echo "❌ $project_name 依赖安装失败"
34
- fail_count=$((fail_count + 1))
35
- if [ -z "$failed_projects" ]; then
36
- failed_projects="$project_name"
37
- else
38
- failed_projects="$failed_projects $project_name"
39
- fi
40
- fi
41
- fi
42
- done
43
-
44
- # 汇总结果
45
- echo ""
46
- echo "=================================================="
47
- if [ $success_count -gt 0 ] || [ $fail_count -gt 0 ]; then
48
- echo "🎉 安装完成!"
49
- echo "✅ 成功: $success_count 个"
50
- if [ $fail_count -gt 0 ]; then
51
- echo "❌ 失败: $fail_count 个"
52
- echo ""
53
- echo "失败的项目:"
54
- for project in $failed_projects; do
55
- echo " - $project"
56
- done
57
- fi
58
- else
59
- echo "ℹ️ 未找到任何包含 package.json 的项目"
60
- fi
61
- echo "=================================================="
62
- }
63
-
64
- main
65
-