agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites,…
Expert guide for writing Effect-TS code, including project setup, core principles, data modeling with Schema, error handling, and the Context.Tag service pattern. Use when writing, refactoring, or analyzing TypeScript code using the Effect library.
$ npx -y skills add pedronauck/skills --skill effect-ts --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/effect-tsContext preview
The summary Claude sees to decide when to auto-load this skill.
Expert guide for writing Effect-TS code, including project setup, core principles, data modeling with Schema, error handling, and the Context.Tag service pattern. Use when writing, refactoring, or analyzing TypeScript code using the Effect library.
name: effect-ts description: Expert guide for writing Effect-TS code, including project setup, core principles, data modeling with Schema, error handling, and the Context.Tag service pattern. Use when writing, refactoring, or analyzing TypeScript code using the Effect library. allowed-tools: Read, Grep, Glob
Guidelines, patterns, and best practices for Effect-TS in this project.
Read the relevant reference before writing code. `references/core-patterns.md` is the master index.
| Reference | Topics | |---|---| | `references/foundations.md` | Setup, imports, TypeScript config | | `references/construction-and-style.md` | `Effect.gen`, `pipe`, `Effect.fn`, `Effect.fnUntraced` | | `references/schema-errors-config.md` | Schema modeling, errors, config, retry | | `references/pattern-matching.md` | **`Match.type`, `Match.value`, `Match.tag`, `Match.exhaustive`** — mandatory for tagged unions | | `references/control-flow-and-runtime.md` | `Effect.if`, `Effect.when`, loops, `runSync`, `runPromise`, `ManagedRuntime` | | `references/data-types.md` | **All data types**: `Option`, `Either`, `Data`, `Exit`, `Cause`, `Duration`, `DateTime`, `BigDecimal`, `Chunk`, `HashSet`, `Redacted` | | `references/data-and-testing.md` | Option/Either/Array quick ref, `@effect/vitest` setup | | `references/concurrency-and-resources.md` | Concurrency, `Scope`, finalizers, resources | | `references/streams-deep-dive.md` | Creating, operations, grouping, partitioning, broadcasting, buffering, throttling, error handling | | `references/sink.md` | Sink constructors, collecting, folding, operations, concurrency, leftovers, `Stream.transduce` | | `references/batching-and-caching.md` | Request batching (`RequestResolver`), `cachedWithTTL` | | `references/schema-transforms-and-filters.md` | `Schema.transform`, `Schema.filter`, refinements | | `references/api-platform-observability.md` | `HttpApi`, logging, tracing, spans | | `references/class-patterns.md` | `Context.Tag` service pattern, layers, memoization, testing | | `references/error-handling-patterns.md` | `Data.TaggedError`, `Schema.TaggedError`, error composition, recovery | | `references/library-development-patterns.md` | Forbidden patterns, `Effect.fn` vs `Effect.fnUntraced`, resource management | | `references/testing-patterns.md` | `@effect/vitest` with `assert`, `TestClock`, service mocking | | `references/quality-tooling-and-resources.md` | Anti-patterns, validation checklist, packages |
1. **Effect is not just for async** — Use `Effect` for any fallible operation 2. **Immutability** — Use Effect's immutable data structures (`Data`, `Chunk`, `HashSet`) 3. **Type Safety** — Track errors in types. No `any` or `unknown` in error channels 4. **Composition** — Build programs by composing small Effects 5. **Schema-First** — Define data models using `Schema` with branded types 6. **Pattern Matching** — Use `Match` for all branching over tagged unions (never `switch`/`if-else` on `_tag`) 7. **Effect Data Types** — Use `Option` (not null), `Either` (not ad-hoc), `Duration` (not raw ms), `DateTime` (not Date), `BigDecimal` (not floats), `Redacted` (for secrets). See `references/data-types.md`
import * as Context from "effect/Context";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import * as Schema from "effect/Schema";
import * as Match from "effect/Match";
import * as Option from "effect/Option";
import * as Either from "effect/Either";
import * as Data from "effect/Data";
import * as Duration from "effect/Duration";
import { pipe } from "effect/Function";
// Also: DateTime, BigDecimal, Chunk, HashSet, Exit, Cause, Redacted// Effect.gen — complex logic with branching
Effect.gen(function* () {
const user = yield* fetchUser(id);
if (user.isAdmin) yield* logAdminAccess(user);
return user;
});
// pipe — linear transformations
pipe(fetchData(), Effect.map(transform), Effect.flatMap(save));
// Effect.fn — traced reusable functions (public API)
const processUser = Effect.fn("processUser")(function* (userId: string) {
const user = yield* getUser(userId);
return yield* processData(user);
});`Data.TaggedError` for in-process discrimination, `Schema.TaggedError` for serializable errors. See `references/error-handling-patterns.md`.
export class NotFoundError extends Data.TaggedError("NotFoundError")<{
id: string;
}> {}
// Recovery
pipe(riskyOp, Effect.catchTag("NotFoundError", (e) => Effect.succeed(null)));**Always use `Match`** — `Match.exhaustive` catches missing cases at compile time. See `references/pattern-matching.md`.
// Match.type — reusable matcher function
const handle = Match.type<Status>().pipe(
Match.tag("Pending", (s) => `Pending since ${s.requestedAt}`),
Match.tag("Approved", (s) => `Approved by ${s.approvedBy}`),
Match.exhaustive // Compile error if any variant is missing
);
// Match.valueTags — shorthand for immediate matching
Match.valueTags(status, {
Pending: (s) => `Pending since ${s.requestedAt}`,
Approved: (s) => `Approved by ${s.approvedBy}`,
});See `references/class-patterns.md` for full pattern with factory methods and layers.
export class MyService extends Context.Tag("@myapp/MyService")<
MyService,
{ readonly find: (id: string) => Effect.Effect<Result, NotFoundError> }
>() {
static readonly layer = Layer.effect(MyService, Effect.gen(function* () {
const db = yield* Database;
return MyService.of({ find: MyService.createFind(db) });
}));
}**CRITICAL**: Use `assert` from `@effect/vitest` for `it.effect`. Never `expect` with `it.effect`. See `references/testing-patterns.md`.
import { assertA curated collection of 87 agent skills for Claude Code and compatible AI coding assistants — 40 original (⭐️), 34 hand-picked (💎), and 13 marketing & business (📣).
Repo: pedronauck/skills
Browser automation CLI for AI agents. Use when the user needs to interact with websites,…
Answer questions about the AI SDK and help build AI-powered features. Use when developers:…
Autonomously optimize any Claude Code skill by running it repeatedly, scoring outputs against…
Centrifugo real-time messaging server expert for WebSocket PUB/SUB, channel management, JWT…
Retrieves up-to-date documentation, API references, and code examples for any developer…
Diátaxis Documentation Expert. An expert technical writer specializing in creating…