Token导航 LogoToken导航TokenDH.com
研究检索需要联网github未标认证来源可访问许可证需确认审计通过

effect-advanced效果进阶

Agent Skill

effect-advanced 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

838

周安装

36

GitHub Stars

4

下载量

294
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:effect-advanced(效果进阶)
来源仓库:https://github.com/trancong12102/agentskills
仓库路径:skills/effect-advanced
安装命令:
npx skills add https://github.com/trancong12102/agentskills --skill effect-advanced
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/trancong12102/agentskills --skill effect-advanced

简介

effect-advanced 提供 Effect-TS 生产级应用的模式、约定与陷阱规避指南。

  • 适合在 Codex、Claude、Cursor、Gemini CLI 中构建可维护、可扩展的 Effect 项目时使用。
  • 通过 GitHub 安装,使用 npx skills add 命令添加指定仓库的 skill/effect-advanced 路径。
  • 建议先查阅官方 Effect 源码以验证模式,避免依赖滞后文档。
  • 适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

SKILL.md

Effect Advanced: Patterns, Conventions & Pitfalls

This skill defines the rules, conventions, and architectural decisions for building production Effect-TS applications. It is intentionally opinionated to prevent common pitfalls and enforce patterns that scale.

For detailed API documentation, use other appropriate tools (documentation lookup, web search, etc.) — this skill focuses on how and why to use Effect idiomatically, not the full API surface.

Table of Contents

  1. Core Conventions
  2. Error Handling Philosophy
  3. Dependency Injection Architecture
  4. Resource & Scope Rules
  5. Concurrency Model
  6. Common Pitfalls
  7. Reference Files

Core Conventions

Use Effect.gen for business logic

Generators read like synchronous code and are strongly preferred over long .pipe / .flatMap chains for anything beyond trivial composition:

const program = Effect.gen(function* () {
  const config = yield* ConfigService;
  const user = yield* UserRepo.findById(config.userId);
  return user;
});

Reserve pipe for data transformation pipelines and short combinator chains.

Never throw — use Effect's error channel

Instead of...Use
throw new Error()Effect.fail(new MyError())
try/catch on promisesEffect.tryPromise({try, catch})
Callback APIsEffect.async((resume) =>...)
Unrecoverable crashesEffect.die(defect)

Functions over methods

Prefer Effect.map(e, f) over e.pipe(Effect.map(f)) for composability and tree-shaking. Flat imports (import {Effect} from "effect") are fine for applications; namespace imports (import * as Effect from "effect/Effect") are better for libraries.

@effect/schema is deprecated

Schema has been merged into core effect. Import from "effect" directly:

import { Schema } from "effect";
// NOT: import { Schema } from "@effect/schema"

Use NodeRuntime.runMain in production

Effect.runPromise does not handle SIGINT/SIGTERM gracefully:

import { NodeRuntime } from "@effect/platform-node";
NodeRuntime.runMain(program.pipe(Effect.provide(AppLayer)));

Error Handling Philosophy

Failures vs defects — the fundamental distinction

AspectFailure (expected)Defect (unexpected)
APIEffect.fail(new MyError())Effect.die(new Error())
Type channelTracked in ENever appears in E (never)
RecoverycatchTag, catchAll, retryOnly at system boundaries
Rule of thumbYou intend to handle it at call siteBug or impossible state

Always use tagged errors

Plain Error or string failures miss the value of Effect's typed error channel:

class UserNotFound extends Data.TaggedError("UserNotFound")<{
  readonly id: string;
}> {}

// Tagged errors are yieldable — no Effect.fail wrapper needed
const program = Effect.gen(function* () {
  const user = yield* db.findUser(id);
  if (!user) yield* new UserNotFound({ id });
  return user;
});

catchAll does NOT catch defects

This is the #1 error handling mistake:

Effect.catchAll(program, handler); // catches E only — NOT defects
Effect.catchAllCause(program, handler); // catches everything (E + defects + interrupts)

Only use catchAllCause / catchAllDefect at system boundaries (top-level error handlers, HTTP response mappers).


Dependency Injection Architecture

Service → Layer → Provide (once)

1. Define services with Context.Tag  →  "what do I need?"
2. Implement via Layers              →  "how is it built?"
3. Provide once at entry point       →  "wire it all together"

Service methods must have R = never

Dependencies belong in Layer composition, not method signatures:

// WRONG: leaks dependency to callers
findById: (id: string) => Effect.Effect<User, UserNotFound, Database>;

// RIGHT: Database is wired in the Layer
findById: (id: string) => Effect.Effect<User, UserNotFound>;

Layer composition — know the operators

OperationWhenBehavior
Layer.merge(A, B)Independent servicesBoth build concurrently
Layer.provide(downstream, upstream)A feeds Bupstream builds first
Layer.fresh(layer)Force new instanceBypasses memoization

Critical: Layer.merge does NOT sequence construction. If B depends on A, use Layer.provide, not Layer.merge.

One Effect.provide at the entry point

Scattered provide calls create hidden dependencies and layer duplication:

// WRONG: provide scattered throughout codebase
const getUser = UserRepo.findById(id).pipe(Effect.provide(DbLayer));

// RIGHT: compose and provide once
const main = program.pipe(Effect.provide(AppLayer));
NodeRuntime.runMain(main);

Resource & Scope Rules

Effect.scoped is mandatory for acquireRelease

Forgetting Effect.scoped is the #1 resource management pitfall — resources accumulate until the program exits:

// WRONG: scope never closes, connection leaks
const result = yield * getDbConnection;

// RIGHT: scope closes when block completes
const result =
  yield *
  Effect.scoped(
    Effect.gen(function* () {
      const conn = yield* getDbConnection;
      return yield* conn.query("SELECT 1");
    }),
  );

Release finalizers always run

On success, failure, AND interruption — guaranteed. The finalizer receives the Exit value for conditional cleanup.

Multiple resources in one scope

Effect.scoped(
  Effect.gen(function* () {
    const conn = yield* Effect.acquireRelease(openConn(), closeConn);
    const file = yield* Effect.acquireRelease(openFile(), closeFile);
    // both released when scope closes, in REVERSE acquisition order
  }),
);

Concurrency Model

Prefer high-level APIs over raw fork

APIUse case
Effect.all([], {concurrency: N})Bounded parallel execution
Effect.forEach(items, fn, {concurrency: N})Worker pool pattern
Effect.race(a, b)First to complete wins, others interrupted
Effect.timeout(e, dur)Deadline on any effect

Only reach for Effect.fork / Fiber when high-level APIs are insufficient.

Fork variants — know the lifecycle

FunctionScopeCleanup
Effect.forkParent's scopeAuto-interrupted with parent
Effect.forkDaemonGlobal scopeNothing cleans it up — you must
Effect.forkScopedNearest ScopeTied to resource lifecycle

Gotcha: forkDaemon leaks fibers if you forget to interrupt them.


Common Pitfalls

  1. Floating effects — creating an Effect without yielding or running it is a silent bug. Effect.log("msg") inside a generator does nothing unless yield*-ed.
  2. catchAll won't catch defects — use catchAllCause at system boundaries for full failure visibility.
  3. Missing Effect.scopedacquireRelease without a scope boundary leaks resources until program exit.
  4. Scattered Effect.provide — compose all layers and provide once at the entry point.
  5. Point-free on overloaded functionsEffect.map(myOverloadedFn) silently erases generics. Use explicit lambdas: Effect.map((x) => myOverloadedFn(x)).
  6. Effect.async resume called multiple times — resume must be called exactly once. Multiple calls cause undefined behavior.
  7. orDie silences errors — converts typed failures to untyped defects. Handle errors properly instead.
  8. Layer.merge for dependent services — merge doesn't sequence construction. Use Layer.provide when one layer needs another's output.
  9. Fiber.join vs Fiber.awaitjoin can cause premature finalizer execution in edge cases. Prefer await when resource safety matters.
  10. runCollect on infinite streams — never call without a prior take. It will never terminate and consume unbounded memory.
  11. Using it.effect for scoped tests — effects requiring Scope must use it.scoped, not it.effect, or you get a type error.

Reference Files

Read the relevant reference file when working with a specific concern:

FileWhen to read
references/error-handling.mdTagged errors, Cause, defect recovery, error mapping patterns
references/dependency-injection.mdServices, Layers, composition, memoization, provide patterns
references/concurrency.mdFibers, fork variants, Deferred, Semaphore, structured concurrency
references/resource-management.mdScope, acquireRelease, Layer resources, fork + scope interaction
references/schema.mdSchema definition, transforms, branded types, recursive schemas
references/stream.mdStream operators, chunking, backpressure, resourceful streams
references/testing.md@effect/vitest, TestClock, Layer mocking, Config mocking
references/platform.mdHTTP client, FileSystem, Command, runtime, framework integration

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

39.52%
按下载量换算116

Claude

29.41%
按下载量换算86

Cursor

19.07%
按下载量换算56

Gemini CLI

9.62%
按下载量换算28

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills