关于 convert-farcaster-miniapp-to-app
用于将 Farcaster Mini App 转为标准 Base 和 Web 应用的技能。它引导开发者选择移除 Farcaster 功能或保留独立区域,并按流程分析、转换、清理和验证项目。
主要功能
- 01扫描项目并通过问答选择转换路径
- 02只读分析代码与依赖
- 03移除 Mini App 运行时耦合
- 04隔离保留的 Farcaster 功能
- 05清理项目并验证构建
适用场景
- 01将 Mini App 转为常规 Base/Web 应用
- 02把有限的 Farcaster 页面与主应用分开
- 03转换前查找 Farcaster SDK、认证和连接器用法
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ base/ skills --skill convert-farcaster-miniapp-to-app安装后在 Claude Code 中输入/convert-farcaster-miniapp-to-app确认已加载。
详细介绍
将 Farcaster Miniapp 转换为 Base App
将 Farcaster miniapp 转换为 Base 上的普通应用。默认结果是一个常规 Web 应用,既能在 Base 应用内置浏览器中运行,也能在开放网络上运行,并移除与 Farcaster Mini App 宿主环境的耦合。
如果确实需要保留某些 Farcaster 功能,请将其与应用的主要界面分开。优先保留只读数据。只有在用户明确要求时,才保留 Mini App 专属行为,并将其隔离在专用路由或页面中,而不是让它贯穿整个应用。
核心原则
始终将以下决策分开处理:
- 移除与 Mini App 宿主环境/运行时的耦合。
- 决定是否保留面向 Farcaster 的功能。
- 如果保留某些功能,应将其与主应用隔离开,并默认避免引入新的供应商依赖。
不要自动将“保留部分 Farcaster 功能”变成“迁移到 Neynar”。如果项目已经使用 Neynar,且用户希望保留一个隔离的 Farcaster 专用区域,可以保留现有集成。不要默认建议引入对 Neynar 的新依赖。
快速开始
依次完成以下五个阶段:
- 探索 — 快速扫描并通过问答选择路径
- 分析 — 根据所选路径进行详细的只读分析
- 转换 — 移除 Mini App SDK 模式,并隔离有意保留的 Farcaster 界面
- 清理 — 移除无用代码、环境变量和依赖
- 验证 — 类型检查、构建并总结
转换路径
问答应引导用户选择以下两条路径之一:
| 路径 | 名称 | 适用对象 | 处理方式 |
|---|---|---|---|
| A | 普通应用(默认) | 大多数项目 | 移除 Farcaster Mini App 耦合,将其转换为普通的 Base/Web 应用 |
| B | 隔离的 Farcaster 界面 | 仍需要少量 Farcaster 专属功能的应用 | 将主应用转换为普通应用,然后仅为剩余功能保留单独的 Farcaster 路由/页面 |
路径 B 仍以降低复杂度为优先:
- 优先使用 Farcaster 只读数据。
- 除非用户明确要求,否则避免保留 Mini App 宿主环境/运行时行为。
- 将保留的 Farcaster 逻辑排除在主应用外壳、共享提供程序和主要身份验证流程之外。
阶段 0:探索
0A. 快速扫描(自动执行,无需用户交互)
提问前先进行轻量级扫描,并生成内部统计:
- 从
package.json检测框架(next、vite、react-scripts、@remix-run/*) - 统计
dependencies和devDependencies中的 Farcaster 包数量 - 在源文件(
.ts、.tsx、.js、.jsx)中搜索:sdk.actions.*调用(总数)sdk.quickAuth用法(是/否)sdk.context用法(是/否).well-known/farcaster.json(是/否)farcasterMiniApp/miniAppConnector连接器(是/否)- 含有任何
@farcaster/导入的文件总数 @neynar/导入或对api.neynar.com的 fetch 调用(是/否)
- 确认影响范围:
- Farcaster 引用是否分散在主应用外壳中?
- 这些引用是否已基本限制在类似
app/farcaster/、pages/farcaster/的路由或少量组件中? - 是否存在明显仅供宿主环境使用的功能,例如触觉反馈、通知、
openMiniApp或sdk.context.client?
使用这些统计来辅助提供问答建议。不要在询问用户之前,将原始扫描结果全部展示给用户。
0B. 交互式问答
逐个提问。利用快速扫描结果,建议最可能的答案。
Q1(始终提问):
根据扫描结果,你的项目中有 [X] 个文件使用了 Farcaster SDK,使用情况如下:[summary of what is used]。
你想要哪种结果?
- (a) 所有地方都使用常规应用 — 移除 Farcaster 专属行为,只保留常规 Base/Web 应用
- (b) 以常规应用为主,同时保留独立的 Farcaster 区域 — 保持主应用简洁,但在确有需要时保留一个小型、隔离的路由/页面
Q2(始终提问):
目前 Mini App SDK 的使用程度如何?
- (a) 最少 — 主要使用
sdk.actions.ready()和少量辅助工具- (b) 中等 — 使用了一些
context、openUrl、个人资料链接或条件式isInMiniApp逻辑- (c) 大量 — 使用了身份验证、钱包连接器、通知、撰写流程或特定宿主的行为
Q3(当 Q1 = b 时提问):
你实际需要保留的最小 Farcaster 功能集是什么?
- (a) 仅只读 — 显示个人资料或 cast、链接到 Farcaster 个人资料,或许还包括一个小型社交页面
- (b) 一些 Farcaster 专属交互 — 有独立页面/路径仍需要只读之外的功能
- (c) 不确定 — 分析哪些部分已经隔离,并建议尽可能精简的保留范围
Q4(当 Q1 = b,且已有隔离的 Farcaster 代码或已有 Neynar 用法时提问):
项目是否已经有独立的 Farcaster 专属路由/页面或集成,并且你希望尽可能原样保留?
- (a) 是 — 只保留该隔离区域
- (b) 否 — 除非有充分理由保留,否则优先移除
Q5(存在 quick auth 或其他 Mini App 身份验证时提问):
转换后,主应用应使用哪种身份验证方式?
- (a) SIWE — 为常规应用使用基于钱包的身份验证
- (b) 现有的非 Farcaster 身份验证 — 保留已有的常规 Web 身份验证
- (c) 无身份验证 — 完全移除身份验证
0C. 路径选择
将答案对应到路径:
| 期望结果 | 典型结果 |
|---|---|
Q1 = regular app everywhere | 路径 A — 默认常规应用 |
Q1 = regular app first, plus separate Farcaster area | 路径 B — 隔离的 Farcaster 区域 |
然后进一步调整建议:
- 如果用户选择了
Path B,除非用户明确要求其他方案,否则优先采用只读保留。 - 如果扫描结果显示与宿主/运行时存在大量耦合,但用户想要
Path A,请提醒用户,部分功能将被删除,而非重新实现。 - 如果项目已使用 Neynar,只有在其仍处于隔离的 Farcaster 区域内时才予以保留。不要将其扩展到主应用。
宣布所选路径:
根据你的回答,我将采用路径 [X]:[Name]。这将 [one-sentence description]。现在我会对你的项目进行详细分析。
在内部记录问答结果。这些结果将决定 Agent 是否应:
- 完全移除 Farcaster 功能
- 只保留隔离的只读区域
- 将不可避免的 Farcaster 专属逻辑隔离到专用路由/页面
继续进入阶段 1。
阶段 1:分析(只读)
1A. 检测框架
读取 package.json:
next→ Next.jsvite→ Vitereact-scripts→ Create React App@remix-run/*→ Remix
1B. 扫描 Farcaster 依赖
列出所有匹配以下内容的包:
@farcaster/miniapp-sdk、@farcaster/miniapp-core、@farcaster/miniapp-wagmi-connector@farcaster/frame-sdk、@farcaster/frame-wagmi-connector@farcaster/quick-auth、@farcaster/auth-kit@neynar/*(仅用于兼容性;不要假定会保留)
1C. 搜索 Farcaster 代码
搜索源文件(.ts、.tsx、.js、.jsx)中的:
SDK 导入:
@farcaster/miniapp-sdk
@farcaster/miniapp-core
@farcaster/miniapp-wagmi-connector
@farcaster/frame-sdk
@farcaster/frame-wagmi-connector
@farcaster/quick-auth
@farcaster/auth-kit
@neynar/
SDK 调用:
sdk.actions.ready
sdk.actions.openUrl
sdk.actions.close
sdk.actions.composeCast
sdk.actions.addMiniApp
sdk.actions.requestWalletAddress
sdk.actions.viewProfile
sdk.actions.viewToken
sdk.actions.sendToken
sdk.actions.swapToken
sdk.actions.signIn
sdk.actions.setPrimaryButton
sdk.actions.openMiniApp
sdk.quickAuth
sdk.context
sdk.isInMiniApp
sdk.getCapabilities
sdk.haptics
sdk.back
sdk.wallet
连接器和提供程序:
farcasterMiniApp()
miniAppConnector()
farcasterFrame()
MiniAppProvider
MiniAppContext
useMiniApp
useMiniAppContext
清单和元数据:
.well-known/farcaster.json
fc:miniapp
fc:frame
环境变量:
NEYNAR_API_KEY
NEXT_PUBLIC_NEYNAR_CLIENT_ID
FARCASTER_
FC_
1D. 检查现有 Web3 配置
查找:
- wagmi 配置中的
coinbaseWalletconnector - SIWE /
siwepackage 的使用情况 connectkit、rainbowkit或@coinbase/onchainkit- 现有的钱包连接 UI
1E. 检查隔离边界
梳理 Farcaster 逻辑目前所在的位置:
- 根 providers 或应用外壳
- 共享 hooks 或身份验证中间件
- 一次性组件
- 专用路由/页面,例如
app/farcaster/* - 仅供 Farcaster 功能使用的服务端路由
为每个位置标记一项操作:
- 移除
- 设为空壳
- 移至隔离的路由/页面
- 仅保留为只读
1F. 汇报调查结果
创建限定路径范围的摘要。
所有路径均包含:
## Conversion Analysis — Path [X]: [Name]
**Framework:** [detected]
**Farcaster packages:** [list]
**Files with Farcaster code:** [count]
### Wagmi Connector
- File: [path]
- Current connector: [farcasterMiniApp / miniAppConnector / farcasterFrame / none]
- Other connectors: [list]
- Action: [replace with coinbaseWallet / leave existing wallet setup / remove only]
### MiniApp Provider
- File: [path]
- Pattern: [simple / complex]
- Consumers: [files importing from this]
- Action: [stub / remove / isolate]
### SDK Action Calls
[list each: file, what it does, action]
### Manifest & Meta
- Manifest route: [path or N/A]
- Meta tags: [file or N/A]
Path A 额外包含:
### Main App Outcome
- Action: remove Farcaster-specific UI and flows from the main app entirely
### Authentication
- Quick Auth used: [yes/no, file]
- Action: replace with SIWE / keep existing non-Farcaster auth / remove
### Existing Neynar Usage
- Package or files: [list or N/A]
- Action: remove entirely unless the user later re-scopes to Path B
### Environment Variables
[list all FC/Neynar vars that will be removed]
Path B 额外包含:
### Main App Outcome
- Action: convert the main app into a normal web app first
### Isolated Farcaster Surface
- Route/page to keep: [path or proposed path]
- Scope: [read-only / mixed / host-specific]
- Recommended target scope: [prefer read-only / quarantine existing behavior / remove]
### Authentication
- Quick Auth used: [yes/no, file]
- Main app action: replace with SIWE / keep existing non-Farcaster auth / remove
- Isolated Farcaster surface action: [remove auth coupling / preserve existing isolated flow only if explicitly requested]
### Existing Neynar Usage
- Package or files: [list or N/A]
- Action: [remove / keep only inside isolated surface]
### Environment Variables
- Remove from main app: [FC_*, FARCASTER_*, etc.]
- Keep only if isolated surface truly still needs them: [NEYNAR_API_KEY, etc. or N/A]
所有路径均以以下内容结尾:
### Potential Issues
- [ ] FID used as database primary key
- [ ] Farcaster colors in tailwind config
- [ ] `isInMiniApp` branches with unique else logic
- [ ] Components only meaningful inside Farcaster
- [ ] Farcaster code mixed into shared providers or root layout
询问:
这份分析看起来正确吗?可以继续转换了吗?
停止并等待用户确认后再进入 Phase 2。
Phase 2:转换
各步骤按功能领域组织。每一步都说明适用的路径,以及 Path B 需要采取的不同做法。
2A. Wagmi Connector(所有路径)
找到 wagmi 配置文件(lib/wagmi.ts、config/wagmi.ts、providers/wagmi-provider.tsx 等):
- 移除从
@farcaster/miniapp-wagmi-connector导入farcasterMiniApp或miniAppConnector的语句 - 从
connectors数组中移除farcasterMiniApp()/miniAppConnector()调用 - 如果没有剩余的钱包 connector,则添加:
import { coinbaseWallet } from "wagmi/connectors"; coinbaseWallet({ appName: "<app name>" }) - 如果已有
coinbaseWallet,则保持原样 - 清理空行和过时的导入
如果项目中没有使用 wagmi,则跳过此步骤。
2B. MiniApp Provider / Context(所有路径)
如果应用有共享的 Mini App provider,则从主应用中移除对宿主/运行时的假设。
模式 A:简单 provider
替换为安全的空壳:
'use client'
import React, { createContext, useContext, useMemo } from "react";
interface MiniAppContextType {
context: undefined;
ready: boolean;
isInMiniApp: boolean;
}
const MiniAppContext = createContext<MiniAppContextType | undefined>(undefined);
export function useMiniAppContext() {
const context = useContext(MiniAppContext);
if (context === undefined) {
throw new Error("useMiniAppContext must be used within a MiniAppProvider");
}
return context;
}
export default function MiniAppProvider({ children }: { children: React.ReactNode }) {
const value = useMemo(
() => ({
context: undefined,
ready: true,
isInMiniApp: false,
}),
[]
);
return <MiniAppContext.Provider value={value}>{children}</MiniAppContext.Provider>;
}
保留导出形式和 hook 名称,避免影响调用方。
模式 B:复杂 provider
- 如果许多调用方依赖它,先将其设为空壳。
- 如果只有少数文件使用它,则移除它并直接更新这些文件中的导入。
- 在
Path B中,不要让隔离的 Farcaster 界面通过根应用外壳继续接入此 provider。必要时,仅在隔离路由内使用它。
2C. 身份验证
主应用应使用常规 Web 身份验证,而非 Mini App 身份验证。
两条路径的默认规则:
- 如果使用了
sdk.quickAuth.getToken(),则将其替换为 SIWE 或移除。 - 如果已有常规的非 Farcaster 身份验证系统,优先使用该系统,而不是新增身份验证。
- 不要将新的 Farcaster 或 Neynar 身份验证设为默认转换目标。
SIWE 替换模式
客户端(例如 useSignIn.ts):
- 移除
import sdk from "@farcaster/miniapp-sdk" - 移除
sdk.quickAuth.getToken() - 替换为:
- 使用
useAccount()(wagmi)获取钱包地址 - 使用
siwe创建 SIWE 消息 - 使用
useSignMessage()(wagmi)签名 - 将签名和消息发送至后端进行验证
- 使用
服务端(例如 app/api/auth/sign-in/route.ts):
- 移除
@farcaster/quick-auth验证 - 替换为 SIWE 验证:
- 解析 SIWE 消息
- 使用
siwe或viem验证签名 - 使用恢复出的钱包地址作为常规应用身份
如果将 FID 用作数据库主键:
- 不要自动更改 schema
- 添加 TODO 注释,以便后续迁移
- 在 Phase 4 摘要中发出警告
Path B 注意事项:
- 如果隔离的 Farcaster 界面已有自己的身份验证或集成流程,并且用户明确希望保留,则仅在该界面内隔离保留。
- 不要让此流程继续作为全应用默认身份验证系统。
2D. SDK 操作调用
2D-1. 两种路径均适用的主要替换项
| 原内容 | 替换为 |
|---|---|
sdk.actions.ready() | 完全移除 |
sdk.actions.openUrl(url) | window.open(url, "_blank") |
sdk.actions.close() | window.close() 或移除 |
sdk.actions.composeCast(...) | 从主应用中移除 |
sdk.actions.addMiniApp() | 移除调用和 UI |
sdk.actions.requestWalletAddress() | 移除;wagmi 负责钱包访问 |
sdk.actions.viewProfile(fid) | window.open(\https://warpcast.com/~/profiles/${fid}\`, "_blank")` |
sdk.actions.viewToken(opts) | window.open(\https://basescan.org/token/${opts.token}\`, "_blank")` |
sdk.actions.sendToken(opts) | 如果该功能很重要,则替换为 wagmi 工作流;否则移除 |
sdk.actions.swapToken(opts) | 移除调用和 UI,除非存在 Farcaster 之外真实的应用专属兑换功能 |
sdk.actions.signIn(...) | 移除;由常规 Web 身份验证处理 |
sdk.actions.setPrimaryButton(...) | 完全移除 |
sdk.actions.openMiniApp(...) | 从主应用中移除 |
sdk.isInMiniApp() | 移除条件判断,并保留非 Farcaster 分支 |
sdk.context | 从主应用中移除 |
sdk.getCapabilities() | 移除或替换为 async () => [] |
sdk.haptics.* | 完全移除 |
sdk.back.* | 完全移除 |
sdk.wallet.* | 移除;wagmi 负责钱包访问 |
对于条件式 isInMiniApp 分支:
// BEFORE
if (isInMiniApp) {
sdk.actions.openUrl(url);
} else {
window.open(url, "_blank");
}
// AFTER
window.open(url, "_blank");
始终保留常规 Web 分支。
2D-2. 路径 B 的特殊处理
Path B 并不意味着“重建所有功能”,而是意味着“保持主应用简洁,并尽可能保留最小化的独立 Farcaster 界面”。
-
sdk.context- 从主应用中移除
- 对于独立界面,优先替换为只读获取的数据或显式路由参数
- 移除
context.location、context.client、安全区域及其他依赖宿主环境的假设,除非用户明确要求保留特定于宿主环境的页面
-
sdk.actions.composeCast(...)- 从主应用中移除
- 如果用户只需要只读功能,则彻底删除
- 如果用户坚持保留,则将其隔离在专用页面/路径中,并将其标记为需要手动跟进,而不是默认重建
-
sdk.actions.openMiniApp(...)- 从主应用中移除
- 只有用户明确需要仅供 Farcaster 使用的界面时,才在独立路由中保留
-
通知/触觉反馈/宿主按钮
- 从主应用中移除
- 只有在独立路由确实依赖这些功能,且用户明确选择接受这种复杂性时,才予以保留
2E. 可选的只读 Farcaster 数据(仅限路径 B)
如果用户需要独立的 Farcaster 界面,优先使用只读数据。
仅在应用确实需要时,创建 lib/farcaster-readonly.ts(或同等文件):
const HUB_URL = "https://hub.farcaster.xyz";
export async function getUserData(fid: number) {
const res = await fetch(`${HUB_URL}/v1/userDataByFid?fid=${fid}`);
if (!res.ok) throw new Error(`Hub user data fetch failed: ${res.status}`);
return res.json();
}
export async function getCastsByFid(fid: number, pageSize = 25) {
const res = await fetch(`${HUB_URL}/v1/castsByFid?fid=${fid}&pageSize=${pageSize}`);
if (!res.ok) throw new Error(`Hub casts fetch failed: ${res.status}`);
return res.json();
}
然后:
- 仅在独立路由/页面中保留这些调用
- 不要将 Farcaster 数据需求贯穿到主应用外壳中
- 如果项目已有一个精简的、基于 Neynar 的只读集成,且移除它造成的改动会比带来的收益更多,则可以保留
- 默认不要为此添加新的 Neynar 包
2F. 清单路由(所有路径)
删除 .well-known/farcaster.json 路由:
app/.well-known/farcaster.json/route.tspublic/.well-known/farcaster.jsonapi/farcaster-manifest.ts或类似辅助文件
如果 .well-known 目录变为空目录,则将其删除。
2G. Meta 标签(所有路径)
在根布局或元数据文件中,移除:
property="fc:miniapp*"或property="fc:frame*"的<meta>标签- 仅用于 Farcaster 标签的
Metadata.other条目 - 仅用于生成 Mini App 元数据的
generateMetadata逻辑
2H. 依赖项
所有路径 — 移除:
@farcaster/miniapp-sdk、@farcaster/miniapp-wagmi-connector、@farcaster/miniapp-core@farcaster/frame-sdk、@farcaster/frame-wagmi-connector@farcaster/quick-auth、@farcaster/auth-kit
路径 A — 还需移除:
@neynar/nodejs-sdk、@neynar/react- 任何其他 Neynar 包或辅助工具
路径 B — 默认移除:
@neynar/nodejs-sdk、@neynar/react和 Neynar 辅助工具,除非它们仍位于有意隔离的 Farcaster 界面中
所有路径 — 仅在确实需要时添加:
- 如果引入了 SIWE 身份验证且尚未安装,则添加
siwe
默认转换过程中不要添加新的 Neynar 包。
2I. Farcaster 专属路由和组件
路径 A:
- 完全删除
app/farcaster/、pages/farcaster/和 Farcaster 专属组件 - 删除 Farcaster 专属 API 路由,例如
/api/farcaster/*和/api/neynar/* - 移除所有指向已删除路由的导航链接
路径 B:
- 保持主应用的路由树整洁
- 如果保留的 Farcaster UI 尚未隔离,则将其移至一个专用路由/页面
- 优先使用
app/farcaster/或app/social/等名称,避免将 Farcaster 逻辑散布到通用共享页面中 - 移除在该隔离界面之外没有用途的组件
- 如有剩余的 Neynar 用法,仅将其保留在该隔离路由/页面及其服务端辅助工具中
第 3 阶段:清理
3A. 更新 package.json
所有路径 — 移除 Mini App 包:
@farcaster/miniapp-sdk、@farcaster/miniapp-wagmi-connector、@farcaster/miniapp-core@farcaster/frame-sdk、@farcaster/frame-wagmi-connector@farcaster/quick-auth、@farcaster/auth-kit
路径 A — 还需移除:
- 所有
@neynar/*包
路径 B — 除非仍被隔离并有意保留,否则移除:
@neynar/*
所有路径 — 如果引入了 siwe,则添加:
siwe
3B. 环境变量
路径 A — 从所有 .env* 文件中移除:
NEYNAR_API_KEYNEXT_PUBLIC_NEYNAR_CLIENT_IDFARCASTER_*FC_*NEXT_PUBLIC_FC_*NEXT_PUBLIC_FARCASTER_*
路径 B — 默认从主应用中移除:
FARCASTER_*FC_*NEXT_PUBLIC_FC_*NEXT_PUBLIC_FARCASTER_*
仅当隔离界面明确仍依赖现有 Neynar 集成时,才保留 NEYNAR_* 变量。
同时更新环境变量验证模式(env.ts、env.mjs、zod 模式等)。
3C. 清理无用代码
- 从已修改的文件中移除未使用的导入
- 移除未使用的 Farcaster 类型和辅助函数
- 移除空的导入语句
- 移除仅为 Mini App SDK 服务的无用 Hook 或 API 封装
3D. Tailwind 颜色
如果 tailwind.config.ts 或 tailwind.config.js 包含 Farcaster 品牌色(例如 farcaster: "#8B5CF6"),除非有意在隔离的 Farcaster 专属界面中保留该品牌标识,否则请将其移除。
3E. 安装依赖
告诉用户:
npm install
第 4 阶段:验证
4A. 搜索剩余引用
所有路径 — 搜索:
@farcaster
farcasterMiniApp
miniAppConnector
sdk.actions
sdk.quickAuth
sdk.context
fc:miniapp
fc:frame
路径 A — 还需搜索:
@neynar
NEYNAR_API_KEY
NEXT_PUBLIC_NEYNAR_CLIENT_ID
api.neynar.com
路径 B — 如果有意保留了 Neynar:
- 确认剩余的
@neynar导入和环境变量仅存在于隔离的 Farcaster 界面及其服务端辅助工具中
报告所有源代码匹配项;忽略 node_modules、锁文件和 Git 历史记录。
4B. 类型检查
npx tsc --noEmit
报告并修复类型错误。
4C. 构建检查
npm run build
报告并修复构建错误。
4D. 转换摘要
## Conversion Complete — Path [X]: [Name]
**Files modified:** [count]
**Files deleted:** [count]
**Files created:** [count, if any]
**Packages removed:** [list]
**Packages added:** [list, if any]
### What was done
- [x] Removed Farcaster Mini App wagmi connector
- [x] Stubbed or removed Mini App provider/context
- [x] Replaced Mini App auth with normal web auth or removed it
- [x] Removed or replaced SDK action calls
- [x] Deleted manifest route
- [x] Removed Farcaster meta tags
- [x] Cleaned up dependencies and env vars
路径 B 的摘要还需包括:
- [x] Kept the main app as a normal web app
- [x] Confined remaining Farcaster functionality to a dedicated route/page
- [x] Preferred read-only Farcaster data where possible
- [x] Removed Farcaster host/runtime coupling from shared app infrastructure
所有路径均以此结束:
### Manual steps
- [ ] Run `npm install`
- [ ] Test wallet connection flow
- [ ] If FID migration is needed, migrate from FID-based identity to wallet address
- [ ] If Path B preserves a Farcaster-only area, verify it stays isolated from the main app shell
### Verification
- TypeScript: [pass/fail]
- Build: [pass/fail]
- Remaining Farcaster references: [none / list]
特殊情况
没有 wagmi
跳过第 2A 阶段。除非应用确实需要钱包连接功能,否则不要引入 wagmi。
没有身份验证系统
跳过第 2C 阶段。不要不必要地添加 SIWE。
@farcaster/frame-sdk(旧版)
按与 @farcaster/miniapp-sdk 完全相同的方式处理。
Monorepo
询问要转换哪些工作区。仅修改这些工作区。
将 FID 用作数据库主键
不要自动更改架构。在第 4 阶段标记并发出警告。
条件式 isInMiniApp 分支
始终保留普通 Web 分支,并移除 Mini App 分支。
没有非 Farcaster 用途的组件
在 Path A 中完全删除它们。在 Path B 中,仅当它们位于隔离的 Farcaster 路由/页面内时才保留。
现有 Neynar 用法
如果项目已经在使用 Neynar:
- 在
Path A中移除它 - 仅当它仍位于隔离的
Path B界面内时才保留 - 除非用户明确提出要求,否则不要增加超出现有范围的 Neynar 用法
通常只读就足够了
如果用户表示想“保留 Farcaster 相关内容”,优先考虑:
- 个人资料链接
- 只读的个人资料或 cast 展示
- 专门的社交页面
不要假设他们需要写入权限、通知或宿主/运行时行为。
问答歧义
如果扫描结果与问答结果冲突,请指出这一点,并先请用户确认较小的保留范围。
安全性
- 验证钱包设置 — 确保已正确配置
coinbaseWallet或所选的钱包连接器 - 基于 FID 的身份标识 — 如果将其用作主键,则需要手动迁移数据库
- SIWE 验证 — 在信任签名之前,先在服务器端验证
- 保留的隔离界面 — 不要让仅用于 Farcaster 的路由/页面将宿主/运行时假设泄漏到主应用外壳中
- 现有 Neynar 用法 — 仅当该隔离界面仍依赖 API 密钥时才保留,并且密钥只能保存在服务器端