关于 effect-v3-to-v4
effect-v3-to-v4 是将 Effect 项目从 v3 迁移到 v4 的开发技能,面向需要更新依赖、导入和 API 调用的开发者。它要求依据 Effect 仓库的迁移资料逐项查证,并以类型检查通过作为完成条件。
主要功能
- 01核验并准备 v3 与 v4 仓库
- 02按迁移参考查找 API 变更
- 03更新依赖版本与导入路径
- 04迭代修复类型错误
- 05记录测试结果与迁移摘要
适用场景
- 01将 Effect v3 项目升级到 v4
- 02定位已移除或签名变更的 API
- 03检查迁移后的 TypeScript 类型
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ effect-ts/ skills --skill effect-v3-to-v4安装后在 Claude Code 中输入/effect-v3-to-v4确认已加载。
详细介绍
Effect v3 到 v4 迁移
根据 Effect 仓库随附的生成式迁移参考资料,执行 Effect v3 → v4 迁移。每项重命名、移除和签名变更都能通过上游数据查明——不要猜测替代方案。
工作流
按顺序完成以下步骤;每个步骤的详细说明见相应章节。
- 设置并验证本地检出 — 两个浅克隆;在信任任何现有的
.repos/effect之前,先验证它。参见 设置:本地检出。 - 阅读
MIGRATION.md并查看ls .repos/effect/migration/,了解背景和指南索引。参见 阅读顺序。 - 迁移
package.json— 移除已合并的包,并确保所有保留的 Effect 包使用同一个 v4 版本。务必在类型检查之前完成,否则首次运行会被已不存在的包所导致的未解析导入错误淹没。参见 仓库级变更。 - 运行项目的类型检查(例如
tsc --noEmit),获取初始错误清单。 - 反复处理,直到类型检查通过。 对于每个错误,按照查找规范解析 API——在
migration/v3-to-v4.md中搜索符号,并根据 阅读顺序 逐级查证——然后修复调用处;按文件将修复工作委派给子 Agent,参见 委派给子 Agent。切勿通过屏蔽错误来代替解决错误;参见 严格禁止事项。 - 收尾 — 类型检查通过;运行测试并如实报告结果(测试不是门槛);撰写最终总结。参见 完成条件。
设置:本地检出
迁移基于 Effect 官方仓库的两个浅克隆、单分支克隆进行:
git clone --depth 1 --single-branch https://github.com/Effect-TS/effect .repos/effect
git clone --depth 1 --single-branch --branch v3 https://github.com/Effect-TS/effect .repos/effect-v3
.repos/effect— v4(main)。包含MIGRATION.md、migration/指南和 v4 源码。.repos/effect-v3— v3(v3分支)。仅在需要进一步查证时用作旧语义的参考。
每个克隆都可以单独重复运行,也可以单独删除。不要使用 git worktree 在同一个克隆间共享不同分支。
信任现有检出前先进行验证
./.repos/effect 可能已经存在,且是根据旧设置说明从已弃用的 Effect-TS/effect-smol 仓库克隆的。该检出已过时,不包含 migration/v3-to-v4.md。使用前请验证:
git -C .repos/effect remote get-url origin # must be the canonical Effect-TS/effect repo
node -p "require('./.repos/effect/packages/effect/package.json').version" # must be 4.x
如果远程源指向 effect-smol,或者版本不是 4.x,请删除该目录并按上述步骤重新克隆。
阅读顺序
- 预先完整阅读一次
MIGRATION.md(.repos/effect/MIGRATION.md)。 migration/v3-to-v4.md— 每个 API 的首要查找位置。 生成式参考涵盖了所有已移除或已变更的 API。搜索该文件(见下文);切勿从头到尾阅读。- 按主题划分的指南(
.repos/effect/migration/*.md):当映射表明需要重写而非重命名时阅读,例如,Context.Tag→Context.Service是结构性变更,不是简单的符号替换。根据需要从MIGRATION.md的索引查找这些指南,不要预先通读。 - v4 源码(
.repos/effect/packages/*/src/):在据此编写代码前,确认替代 API 的实际签名。 - v3 源码(
.repos/effect-v3)仅用于进一步查证——在不确定旧版 v3 语义时使用。
切勿通读整份参考文档
这是本技能中最重要的一条规则。 migration/v3-to-v4.md 约有 17,000 行/35 万个 token。一次性通读会耗尽上下文窗口,并拖垮整个迁移。
务必搜索该文件,只阅读匹配行及其周边上下文。该文件分为四个部分——导入映射、无对应项的导入、已移除的模块和 API 参考(每个模块对应一个 ### `<v3 module path>` 标题)。条目均为可通过 grep 搜索的单行格式 - `Old.symbol` -> `New.symbol`: <rationale>;移除项会以 -> `none` 明确列出,并说明替代方案。
具体示例:
# Look up a specific v3 symbol
rg -n 'AnthropicTokenizer\.layer' .repos/effect/migration/v3-to-v4.md
# Read a whole module's section via its heading
rg -n -A 40 '^### `@effect/platform/FileSystem`' .repos/effect/migration/v3-to-v4.md
# Resolve a v3 import path in the Import Map
rg -n '^@effect/platform/FileSystem ' .repos/effect/migration/v3-to-v4.md
# List every module section for a package
rg -n '^### `@effect/cluster/' .repos/effect/migration/v3-to-v4.md
遇到 API 时逐个搜索查找。若在导入映射中找不到,不要就此止步——得出结论前,请先检查 已移除的模块 和 无对应项的导入 两个部分。
仓库级更改
仅按 API 忠实地查找仍会导致 package.json 损坏。请提前一次性处理以下事项:
- 合并软件包。
@effect/platform、@effect/rpc、@effect/cluster等已合并到核心effect软件包中。从package.json中移除它们,并根据导入映射重写其导入。仍保持独立的软件包(@effect/platform-*、@effect/sql-*、@effect/ai-*、@effect/opentelemetry、@effect/atom-*、@effect/vitest等)仍作为依赖保留。已合并的 v3 软件包(包括@effect/sql和@effect/cli)的 npmlatest标签仍指向0.x;应移除它们,而不是将所有内容都升级到latest。 - 版本对齐。 目标版本为当前稳定的
latest4.x 版本。v4 中所有 Effect 生态系统软件包共用同一个版本号,因此每个剩余的effect/@effect/*依赖都必须使用相同且匹配的版本。 - 模块路径与稳定性。 GA 导入使用
effect/http、effect/rpc和effect/ai/LanguageModel等路径。稳定性由 JSDoc 标签声明,而不是由导入路径中的片段声明:@stability unstableAPI 可能在次要版本中收到破坏性更改,@stability experimentalAPI 可能在补丁版本中收到破坏性更改。 如果迁移的代码针对的是使用effect/unstable/<module>导入的 beta 或 RC 版本,请移除unstable片段(例如,effect/unstable/http→effect/http)。旧路径没有兼容性导出;移动模块不会使其 API 变得稳定。
委派给子 Agent
逐文件迁移非常耗费上下文;请交由子 Agent 处理,以便主会话在整个迁移过程中保留上下文。
- 每个文件(或每个模块)启动一个子 Agent,并告知它该文件中需要解析的具体 v3 符号。
- 子 Agent 返回所做的编辑和使用的映射;主会话保留错误清单和进行中的摘要。
- 子 Agent 遵循相同的查找规范(阅读顺序、
rg配方)和严格禁止事项。 - 子 Agent 也不得完整读取参考文档;子 Agent 上下文耗尽,同样会影响该文件的迁移。
严格禁止事项
- 切勿重新引入 v3 风格的兼容层。 编写重新导出旧名称的
v3-compat.ts会让类型错误消失,并永久将代码库冻结在两个版本之间。应将调用点迁移到 v4 API。 - 不要使用
any或as类型断言来消除迁移后的类型错误。 这类错误通常表明替代项的结构有所不同;类型断言会抹去这些信息。请返回参考文档或 v4 源码查证。 - 不要臆造 API。 每个替代项都必须有据可查,来源可以是参考文档、主题指南或 v4 源码。
完成条件
项目能够通过针对 v4 的类型检查。 v4 迁移本质上是类型层面的工作;未解决的导入和签名变更会在类型检查中显现,其他地方不会。运行项目的类型检查(例如 tsc --noEmit),直到检查通过。
建议运行测试套件,并且必须如实报告测试结果——但测试并非门槛。仓库处于迁移过程中时,测试可能因无关原因无法运行;不要为了让测试通过而削弱测试。
最终摘要必须说明:类型检查结果、测试结果(或未运行测试的原因)、每个构造的替代项,以及所有已报告但未进行兼容处理的缺口。