From tenequm-skills
Effect-TS (Effect) comprehensive development guide for TypeScript. Use when building, debugging, reviewing, or generating Effect code. Covers typed error modeling (expected errors vs defects), structured concurrency (fibers), dependency injection (Context + Layers), resource management (Scope), retry/scheduling (Schedule), streams, Schema validation, observability (OpenTelemetry), HTTP client/server, Effect AI (LLM integration), and MCP servers. Critical for AI code generation: includes exhaustive wrong-vs-correct API tables preventing hallucinated Effect code. Supports both Effect v3 (stable) and v4 (beta). Use this skill whenever code imports from 'effect', '@effect/platform', '@effect/ai', or the user mentions Effect-TS, typed errors with Effect, functional TypeScript with Effect, Context, ServiceMap, Layer, or Schema from Effect. Also trigger when generating new TypeScript projects that could benefit from Effect patterns, even if the user doesn't explicitly name the library.
npx claudepluginhub tenequm/skills --plugin gh-cliThis skill uses the workspace's default tool permissions.
Effect is a TypeScript library for building production-grade software with typed errors, structured concurrency, dependency injection, and built-in observability.
LICENSE.txtevals/evals.jsonreferences/concurrency.mdreferences/core-patterns.mdreferences/dependency-injection.mdreferences/effect-ai.mdreferences/error-modeling.mdreferences/http.mdreferences/llm-corrections.mdreferences/migration-async.mdreferences/migration-v4.mdreferences/observability.mdreferences/resource-management.mdreferences/retry-scheduling.mdreferences/schema.mdreferences/streams.mdreferences/testing.mdSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Checks Next.js compilation errors using a running Turbopack dev server after code edits. Fixes actionable issues before reporting complete. Replaces `next build`.
Effect is a TypeScript library for building production-grade software with typed errors, structured concurrency, dependency injection, and built-in observability.
Before writing Effect code, detect which version the user is on:
# Check installed version
cat package.json | grep '"effect"'
Context.Tag, Effect.catchAll, Effect.fork, Data.TaggedErrorContext.Service, Effect.catch, Effect.forkChild, Schema.TaggedErrorClassNote: v4 beta briefly used a
ServiceMapmodule, renamed back toContexton 2026-04-07 (PR #1961). If you seeServiceMap.*in any doc or older beta code, it is the currentContext.*. Both v3 and v4 importContextfrom"effect"; the exports inside differ (Context.Tagin v3 vsContext.Servicein v4).
If the version is unclear, ask the user. Default to v3 patterns for existing codebases, v4 for new projects.
LLM outputs frequently contain incorrect Effect APIs. Verify every API against the reference docs before using it.
Common hallucinations (both versions):
| Wrong (AI often generates) | Correct |
|---|---|
Effect.cachedWithTTL(...) | Cache.make({ capacity, timeToLive, lookup }) |
Effect.cachedInvalidateWithTTL(...) | cache.invalidate(key) / cache.invalidateAll() |
Effect.mapError(effect, fn) | Effect.mapError(fn) in pipe, or use Effect.catchTag |
import { Schema } from "@effect/schema" | import { Schema } from "effect" (v3.10+ and all v4) |
import { JSONSchema } from "@effect/schema" | import { JSONSchema } from "effect" (v3.10+) |
| JSON Schema Draft 2020-12 | Effect Schema generates Draft-07 |
| "thread-local storage" | "fiber-local storage" via FiberRef (v3) / Context.Reference (v4) |
| fibers are "cancelled" | fibers are "interrupted" |
| all queues have back-pressure | only bounded queues; sliding/dropping do not |
new MyError("message") | new MyError({ message: "..." }) (Schema errors take objects) |
v3-specific hallucinations:
| Wrong | Correct (v3) |
|---|---|
Effect.Service (function call) | class Foo extends Effect.Service<Foo>()("id", {}) |
Effect.match(effect, { ... }) | Effect.match(effect, { onSuccess, onFailure }) |
Effect.provide(layer1, layer2) | Effect.provide(Layer.merge(layer1, layer2)) |
v4-specific hallucinations (AI may mix v3/v4):
| Wrong (v3 API used in v4 code) | Correct (v4) |
|---|---|
Context.Tag("X") (v3 shape) | Context.Service<X>(id) or class syntax |
ServiceMap.Service / ServiceMap.Reference | Renamed back to Context.Service / Context.Reference on 2026-04-07 |
Effect.catchAll(fn) | Effect.catch(fn) |
Effect.fork(effect) | Effect.forkChild(effect) |
Effect.forkDaemon(effect) | Effect.forkDetach(effect) |
Data.TaggedError | Schema.TaggedErrorClass |
FiberRef.get(ref) | yield* References.X (a Context.Reference) |
yield* ref (Ref as Effect) | yield* Ref.get(ref) (Ref is no longer an Effect) |
yield* fiber (Fiber as Effect) | yield* Fiber.join(fiber) (Fiber is no longer Effect) |
Logger.Default / Logger.Live | Logger.layer (v4 naming convention) |
Schema.TaggedError | Schema.TaggedErrorClass |
Schema.makeUnsafe(input) | Schema.make(input) (throws SchemaError); also Schema.makeOption, Schema.makeEffect |
ParseResult (from "effect") | SchemaIssue module + SchemaError class; narrow with Schema.isSchemaError |
HttpApiEndpoint.get(n, p).pipe(HttpApiEndpoint.setPath(...), setPayload(...), setSuccess(...)) | HttpApiEndpoint.get(n, p, { params, query, payload, success, error }) (object-option form) |
Otlp.layer({ url, serviceName }) | OtlpTracer.layer({ url, resource: { serviceName } }) + OtlpSerialization.layerJson + FetchHttpClient.layer |
import { HttpApi } from "@effect/platform" (v4) | import { HttpApi } from "effect/unstable/httpapi" |
| HttpApi endpoint schema errors are typed errors by default | Since PR #2057 (2026-04-20) they default to defects unless transformed |
Read references/llm-corrections.md for the exhaustive corrections table.
Read only the reference files relevant to your task:
references/error-modeling.mdreferences/dependency-injection.mdreferences/retry-scheduling.mdreferences/concurrency.mdreferences/streams.mdreferences/resource-management.mdreferences/schema.mdreferences/observability.mdreferences/http.mdreferences/http.md (covers both client and server)references/effect-ai.mdreferences/testing.mdreferences/migration-async.mdreferences/migration-v4.mdreferences/core-patterns.mdreferences/llm-corrections.mdpackage.json before writing any codeEffect valuesEffect.gen for sequential logic, pipelines for simple transforms. In v4, prefer Effect.fn("name") for named functionsE channel; treat bugs as defectsScope when opening/closing things (files, connections, etc.)NodeRuntime.runMain or ManagedRuntime)Start with these ~20 functions (the official recommended set):
Creating effects: Effect.succeed, Effect.fail, Effect.sync, Effect.tryPromise
Composition: Effect.gen (+ Effect.fn in v4), Effect.andThen, Effect.map, Effect.tap, Effect.all
Running: Effect.runPromise, NodeRuntime.runMain (preferred for entry points)
Error handling: Effect.catchTag, Effect.catchAll (v3) / Effect.catch (v4), Effect.orDie
Resources: Effect.acquireRelease, Effect.acquireUseRelease, Effect.scoped
Dependencies: Effect.provide, Effect.provideService
Key modules: Effect, Schema, Layer, Option, Either (v3) / Result (v4), Array, Match
DI (v3): Context.Tag, Context.Reference
DI (v4): Context.Service, Context.Reference, Layer.effect, Effect.fn("name")
Always use barrel imports from "effect":
import { Context, Effect, Schema, Layer, Option, Stream } from "effect"
For companion packages, import from the package name. v3 and v4 differ here:
// v3 (stable) companion packages
import { NodeRuntime } from "@effect/platform-node"
import { HttpClient } from "@effect/platform"
import { NodeSdk } from "@effect/opentelemetry"
// v4 (beta) - platform transports still separate, but HttpApi / observability
// moved under effect/unstable/*
import { NodeRuntime } from "@effect/platform-node"
import { FetchHttpClient } from "effect/unstable/http"
import { HttpApi, HttpApiEndpoint, HttpApiGroup, HttpApiBuilder, HttpApiScalar } from "effect/unstable/httpapi"
import { OtlpLogger, OtlpSerialization, OtlpTracer } from "effect/unstable/observability"
Avoid deep module imports (effect/Effect) unless your bundler requires it for tree-shaking.
Effect.gen (imperative) for multi-step logic; pipelines for transformsEffect.fn("name") instead of bare Effect.gen for named functionsEffect.runPromise / Effect.runSync inside library code - only at program edgesNodeRuntime.runMain for CLI/server entry points (handles SIGINT gracefully)ManagedRuntime when integrating Effect into non-Effect frameworks (Hono, Express, etc.)return yield* when raising an error in a generator (ensures TS understands control flow)Effect.map((x) => fn(x)) not Effect.map(fn) (generics get erased)Effect<A, E, R> shape when it helps design decisionsBefore outputting Effect code, verify:
"effect" (not @effect/schema, @effect/io, etc.)E; unexpected failures are defectsrun* is called only at program edges, not inside library codeacquireRelease are wrapped in Effect.scopedR requirements)yield* (not yield without *)return yield* pattern