mcpField
C
convert-farcaster-miniapp-to-app

convert-farcaster-miniapp-to-app

github.com/base开发120213 次安装1 天前更新
代码仓库

关于 convert-farcaster-miniapp-to-app

用于将 Farcaster Mini App 转为标准 Base 和 Web 应用的技能。它引导开发者选择移除 Farcaster 功能或保留独立区域,并按流程分析、转换、清理和验证项目。

主要功能

  1. 01扫描项目并通过问答选择转换路径
  2. 02只读分析代码与依赖
  3. 03移除 Mini App 运行时耦合
  4. 04隔离保留的 Farcaster 功能
  5. 05清理项目并验证构建

适用场景

  1. 01将 Mini App 转为常规 Base/Web 应用
  2. 02把有限的 Farcaster 页面与主应用分开
  3. 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 专属行为,并将其隔离在专用路由或页面中,而不是让它贯穿整个应用。

核心原则

始终将以下决策分开处理:

  1. 移除与 Mini App 宿主环境/运行时的耦合。
  2. 决定是否保留面向 Farcaster 的功能。
  3. 如果保留某些功能,应将其与主应用隔离开,并默认避免引入新的供应商依赖。

不要自动将“保留部分 Farcaster 功能”变成“迁移到 Neynar”。如果项目已经使用 Neynar,且用户希望保留一个隔离的 Farcaster 专用区域,可以保留现有集成。不要默认建议引入对 Neynar 的新依赖。

快速开始

依次完成以下五个阶段:

  1. 探索 — 快速扫描并通过问答选择路径
  2. 分析 — 根据所选路径进行详细的只读分析
  3. 转换 — 移除 Mini App SDK 模式,并隔离有意保留的 Farcaster 界面
  4. 清理 — 移除无用代码、环境变量和依赖
  5. 验证 — 类型检查、构建并总结

转换路径

问答应引导用户选择以下两条路径之一:

路径名称适用对象处理方式
A普通应用(默认)大多数项目移除 Farcaster Mini App 耦合,将其转换为普通的 Base/Web 应用
B隔离的 Farcaster 界面仍需要少量 Farcaster 专属功能的应用将主应用转换为普通应用,然后仅为剩余功能保留单独的 Farcaster 路由/页面

路径 B 仍以降低复杂度为优先:

  • 优先使用 Farcaster 只读数据。
  • 除非用户明确要求,否则避免保留 Mini App 宿主环境/运行时行为。
  • 将保留的 Farcaster 逻辑排除在主应用外壳、共享提供程序和主要身份验证流程之外。

阶段 0:探索

0A. 快速扫描(自动执行,无需用户交互)

提问前先进行轻量级扫描,并生成内部统计:

  1. 从 package.json 检测框架(next、vite、react-scripts、@remix-run/*)
  2. 统计 dependencies 和 devDependencies 中的 Farcaster 包数量
  3. 在源文件(.ts、.tsx、.js、.jsx)中搜索:
    • sdk.actions.* 调用(总数)
    • sdk.quickAuth 用法(是/否)
    • sdk.context 用法(是/否)
    • .well-known/farcaster.json(是/否)
    • farcasterMiniApp/miniAppConnector 连接器(是/否)
    • 含有任何 @farcaster/ 导入的文件总数
    • @neynar/ 导入或对 api.neynar.com 的 fetch 调用(是/否)
  4. 确认影响范围:
    • 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.js
  • vite → Vite
  • react-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 配置中的 coinbaseWallet connector
  • SIWE / siwe package 的使用情况
  • 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 等):

  1. 移除从 @farcaster/miniapp-wagmi-connector 导入 farcasterMiniApp 或 miniAppConnector 的语句
  2. 从 connectors 数组中移除 farcasterMiniApp() / miniAppConnector() 调用
  3. 如果没有剩余的钱包 connector,则添加:
    import { coinbaseWallet } from "wagmi/connectors";
    
    coinbaseWallet({ appName: "<app name>" })
    
  4. 如果已有 coinbaseWallet,则保持原样
  5. 清理空行和过时的导入

如果项目中没有使用 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()
  • 替换为:
    1. 使用 useAccount()(wagmi)获取钱包地址
    2. 使用 siwe 创建 SIWE 消息
    3. 使用 useSignMessage()(wagmi)签名
    4. 将签名和消息发送至后端进行验证

服务端(例如 app/api/auth/sign-in/route.ts):

  • 移除 @farcaster/quick-auth 验证
  • 替换为 SIWE 验证:
    1. 解析 SIWE 消息
    2. 使用 siwe 或 viem 验证签名
    3. 使用恢复出的钱包地址作为常规应用身份

如果将 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.ts
  • public/.well-known/farcaster.json
  • api/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_KEY
  • NEXT_PUBLIC_NEYNAR_CLIENT_ID
  • FARCASTER_*
  • 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 密钥时才保留,并且密钥只能保存在服务器端

评论

支持 Markdown