关于 btst-integration
btst-integration 是指导在应用中集成 BTST stack 的技能,涵盖后端和客户端插件配置、路由、Provider、数据库架构与迁移。它还介绍框架专用入口和适配器的选择。
主要功能
- 01配置后端与客户端插件
- 02接入 API 和页面路由
- 03设置 Provider 与 CSS 导入
- 04生成数据库架构
- 05执行 Kysely 迁移
适用场景
- 01为应用添加 BTST 插件
- 02将插件路由接入框架
- 03为数据库适配器生成架构
- 04准备 Kysely 数据库迁移
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ better-stack-ai/ better-stack --skill btst-integration安装后在 Claude Code 中输入/btst-integration确认已加载。
附带文件REFERENCE.md
详细介绍
BTST 库集成
快速开始
- 安装
@btst/stack、@tanstack/react-query和一个@btst/adapter-*。 - 安装并注册每个插件的后端和客户端部分。
- 创建
lib/stack.ts→ 导出{ handler, dbSchema }。 - 使用框架 API 入口工厂,将
handler挂载到/api/data/*。 - 在全局 CSS 中,按插件添加
@import "@btst/stack/plugins/{plugin}/css"。 - 创建
lib/stack-client.tsx、lib/query-client.ts,以及使用框架页面入口工厂的/pages/*全捕获路由。 - 创建页面的 layout 文件,包含
QueryClientProvider+StackProvider。 - 运行
@btst/cli generate(Kysely 还需运行migrate)。
请参阅 REFERENCE.md,了解每个文件的完整代码结构。
工作流
1) 安装前置条件和软件包
- 前置条件:shadcn/ui(已启用 CSS 变量)、Sonner
<Toaster />、Tailwind v4。 - 安装:
@btst/stack、@tanstack/react-query和一个适配器:@btst/adapter-prisma/@btst/adapter-drizzle/@btst/adapter-kysely/@btst/adapter-mongodb@btst/adapter-memory— 仅用于开发/测试,不适用于生产环境
- 在
@btst/stack旁安装每个插件软件包(它们随 monorepo 软件包一同提供)。
2) 注册插件(后端 + 客户端)
- 后端(
lib/stack.ts):从@btst/stack/plugins/{plugin}/api导入{plugin}BackendPlugin。- 在后端插件选项对象中传入钩子和配置(例如
blogBackendPlugin({ hooks }))。 - 对名称由多个部分组成的插件使用 camelCase 键:
aiChat、formBuilder、uiBuilder。
- 在后端插件选项对象中传入钩子和配置(例如
- 客户端(
lib/stack-client.tsx):从@btst/stack/plugins/{plugin}/client导入{plugin}ClientPlugin。- 客户端定义仅接收插件专属选项,例如
seo、钩子或页面组件。在createClientStack()上配置一次api、site和queryClient;其解析器会将该运行时绑定到每个定义。 - 通过顶层
createClientStack({ api: { headers } })配置传递传入的 SSR 请求标头。 - 在服务器上解析一个可信的 API/站点来源快照,并将其注入提供程序。托管后端可以使用独立的
BTST_API_URL;水合后切勿根据window.location重新构造该地址。
- 客户端定义仅接收插件专属选项,例如
3) 配置后端堆栈
- 在启用应用授权时,调用
createBackendStack({ basePath: "/api/data", plugins: { ... }, adapter: (db) => createXxxAdapter(..., db, {}), auth: serverAuth })。 - 使用
createServerAuth({ authorization, getIdentity })创建serverAuth。省略auth会有意保留无授权的宽松兼容性;AI Chat 的access: "authorized"等插件标签本身并不构成强制执行边界。 - 导出
handler和dbSchema。 - Memory 适配器 + Next.js:固定到
globalThis,以避免同一进程中出现两个实例:function createAppStack() { return createBackendStack({ ... }) } type AppStack = ReturnType<typeof createAppStack> const g = globalThis as typeof globalThis & { __btst__?: AppStack } export const myStack = g.__btst__ ??= createAppStack() export const { handler, dbSchema } = myStack
4) CSS — 编辑全局样式表
在 Tailwind 层之前,为每个插件添加一行:
@import "@btst/stack/plugins/blog/css";
@import "@btst/stack/plugins/cms/css";
@import "@btst/stack/plugins/ai-chat/css";
/* …one per selected plugin */
请勿重复添加 — 补丁程序和手动编辑都必须具有幂等性。
5)连接框架路由和客户端运行时
- API 路由:使用框架入口点中的
toNextRouteHandlers、toReactRouterHandlers或toTanStackHandlers。 - Pages 路由:使用
createNextPage、createReactRouterPage或createTanStackPageOptions。工厂负责路由匹配、加载器排序、水合、元数据和 404 处理。 - Pages 布局(Next.js 中的
"use client"):先封装QueryClientProvider,再封装StackProvider:- 通过
stack={clientStack}传入解析后的客户端 stack。其顶层site.basePath必须与 Pages 的 catch-all 前缀匹配。 - 使用
router={nextRouter()}/reactRouter()/tanstackRouter(),为整个框架提供链接、图片、导航和刷新功能。 - 当插件需要身份信息或权限展示门控时,使用
auth={createClientAuth({ authorization, getIdentity, loginPath })}。 - 仅在需要针对特定插件进行自定义时使用
overrides={{ pluginKey: { uploadImage?, ...pluginSpecificValues } }}。 - 让解析后的插件映射推断覆盖项的键和值;不要重复创建手动 provider 映射。
- 有关 provider 连接和各插件的覆盖项结构,请参阅 REFERENCE.md。
- 通过
- 仅适用于 ai-chat 插件:在
StackProvider上方的根布局中封装PageAIContextProvider:
然后,Pages 调用import { PageAIContextProvider } from "@btst/stack/plugins/ai-chat/client/context" // root layout.tsx (not the pages layout) export default function RootLayout({ children }) { return <PageAIContextProvider>{children}</PageAIContextProvider> }useRegisterPageAIContext(...)注册其 AI 上下文 — 请参阅btst-ai-context技能。
6)生成架构并运行迁移
- 将
@btst/cli安装为开发依赖。 - Prisma:
npx @btst/cli generate --config=lib/stack.ts --orm=prisma --output=schema.prisma - Drizzle:
npx @btst/cli generate --config=lib/stack.ts --orm=drizzle --output=src/db/schema.ts - Kysely:
npx @btst/cli generate --config=lib/stack.ts --orm=kysely --output=migrations/schema.sql --database-url=... - Kysely 迁移:
npx @btst/cli migrate --config=lib/stack.ts --database-url=... - Prisma/Drizzle:生成后使用原生迁移工具。
验证清单
stack.ts同时导出handler和dbSchema。- 受保护的应用将
createServerAuth(...)传入createBackendStack({ auth });省略 auth 会有意采用宽松策略。 - 每个插件都在后端和客户端两侧注册。
- API
basePath与createBackendStack({ basePath })完全匹配。 - API 和页面 catch-all 路由都使用框架入口工厂。
- Pages 布局使用
"use client",并依次封装QueryClientProvider和StackProvider。 - 解析后的客户端 stack 的
site.basePath与/pagescatch-all 路由前缀匹配。 - 全局 CSS 为每个选定插件各包含一行
@import。 /pages/*路由会渲染预期的插件页面。- CLI 命令运行时,所需的环境变量均已生效。
注意事项
- Pages 布局缺少
"use client"—StackProvider使用 hooks,必须在客户端运行。 - 键的大小写错误 — 后端和客户端插件映射的键必须匹配;复合名称使用 camelCase(
aiChat,而不是ai-chat)。 - 缺少 CSS 导入 — 即使数据加载正常,插件 UI 也会在无提示的情况下失效。
- 插件仅在一侧注册 — 仅注册后端时,路由不存在;仅注册客户端时,数据调用会返回 404。
- Memory 适配器 + Next.js — 始终绑定到
globalThis,以便在 API 和页面 bundle 之间共享同一个内存存储。 - CLI 中的路径别名 —
@btst/cli会直接执行你的配置文件;在lib/stack.ts及其依赖项中使用相对导入。 - Kysely 生成需要数据库 — 传入
DATABASE_URL或--database-url;对于.env.local,请使用dotenv-cli。 - 将 provider 服务复制到插件覆盖项中 — 切勿将
Link、Image、导航、刷新、API 路径、身份或登录值添加到内置插件覆盖项中。请使用顶层的router、api和auth。
评论
支持 Markdown