AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Effectts

skill-artimath-effect-skills-effectts · by artimath

Idiomatic Effect-TS patterns for TypeScript functional programming. USE THIS SKILL WHEN: Writing new Effect services or layers, debugging Effect type errors (layer composition, error types), choosing between Effect patterns, setting up Effect testing. TRIGGERS ON: 'effect pattern', 'Layer.provide', 'Context.Tag', 'effect service', 'effect error', 'effect test', 'idiomatic effect'. NOT FOR: genera…

No reviews yet
0 installs
36 views
0.0% view→install

Install

$ agentstack add skill-artimath-effect-skills-effectts

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-artimath-effect-skills-effectts)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
6mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Effectts? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Idiomatic Effect-TS

Write Effect code that looks like it came from the Effect core team.

Prerequisites (Optional)

  • Effect source (recommended): git clone https://github.com/Effect-TS/effect for pattern verification
  • Effect MCP: https://github.com/tim-smart/effect-mcp for API lookups (fallback: https://effect.website/docs)

Research First (ALWAYS)

1. Effect Docs MCP (preferred for concepts)

If you have effect-mcp configured:

// Search documentation
mcp__effect-docs__effect_docs_search({ query: "Layer composition" })

// Then read specific doc
mcp__effect-docs__get_effect_doc({ documentId: 123 })

Otherwise, check https://effect.website/docs for API reference.

2. Effect Source (preferred for real patterns)

# Clone Effect source for pattern verification (if not already done)
# git clone https://github.com/Effect-TS/effect 

# Service patterns (Context.Tag for libraries)
rg "class .* extends Context\.Tag" /packages/workflow/src
rg "class .* extends Context\.Tag" /packages/cluster/src

# Effect.Service for concrete impls/tests
rg "Effect\.Service" /packages/cluster/src

# Error patterns
rg "Schema\.TaggedError" /packages/cluster/src

# Layer composition
rg "Layer.provideMerge" /packages/platform/src

Use parallel searches when patterns are unclear.

Quick Reference

Service Patterns (Choose Based on Use Case)

| Pattern | Use When | Layer Access | |---------|----------|--------------| | Context.Tag | Library interfaces, multiple impls | ServiceName.Live | | Effect.Service | Concrete impls, tests, apps | ServiceName.Default |

// Library interface (Context.Tag) - canonical for libraries
export class MyService extends Context.Tag("app/MyService") Effect.Effect
}>() {
  static readonly Live: Layer.Layer = Layer.effect(...)
}

// Concrete impl (Effect.Service) - convenient for apps/tests
export class AppCache extends Effect.Service()("app/Cache", {
  effect: Effect.gen(function* () {
    return { get: (k) => ..., set: (k, v) => ... }
  }),
  dependencies: [SomeDep.Default]  // auto-composed
}) {}

Domain Errors

export class MyError extends Schema.TaggedError()("MyError", {
  reason: Schema.Literal("NotFound", "Invalid"),
  cause: Schema.optional(Schema.Defect)
}) {
  static is(u: unknown): u is MyError {
    return hasProperty(u, "_tag") && isTagged(u, "MyError")
  }
}

Domain Types

// Value objects
export class Address extends Schema.Class("Address")({
  host: Schema.String,
  port: Schema.Number
}) {}

// Branded IDs — always with REAL constraints
export const UserId = Schema.NonEmptyString.pipe(
  Schema.pattern(/^usr_[a-z0-9]+$/),
  Schema.brand("UserId")
)
export type UserId = typeof UserId.Type

Layer Composition — COMMON GOTCHA

This causes most Effect type errors. Know the difference:

| Method | Deps Satisfied | Available to Program | Use When | |--------|---------------|---------------------|----------| | Layer.provide | Yes | No | Internal layer building | | Layer.provideMerge | Yes | Yes | Tests using multiple services | | Layer.mergeAll | No | Yes | Combining independent layers |

// WRONG - test can't access FileSystem
const TestLive = MyService.Live.pipe(Layer.provide(PlatformLive))
// yield* FileSystem.FileSystem -> ERROR

// RIGHT - both services available
const TestLive = MyService.Live.pipe(Layer.provideMerge(PlatformLive))
// yield* MyService -> works
// yield* FileSystem.FileSystem -> also works!

Error pattern to recognize:

Effect is not assignable to Effect

or diagnostic: Missing 'SomeService' in the expected Effect context

-> Means SomeService still required. Use provideMerge instead of provide.

Test Pattern

it.effect("works", () =>
  Effect.gen(function* () {
    const svc = yield* MyService
    expect(yield* svc.doThing("x")).toBe(expected)
  }).pipe(Effect.provide(TestLive))  // <- MUST provide at boundary
)

References (Read When Needed)

| Topic | File | When to Read | |-------|------|--------------| | Service & Layer patterns | [references/services.md](references/services.md) | Creating services, Context.Tag vs Effect.Service, layer composition | | Layer dependencies | [references/layer-dependencies.md](references/layer-dependencies.md) | How services access deps (yield + closure), why NOT factory functions | | Schema decision matrix | [references/schema-decision.md](references/schema-decision.md) | Schema.Class vs Struct vs TaggedClass, branded types, migration patterns | | Error handling | [references/errors.md](references/errors.md) | Schema.TaggedError, TypeId, refail patterns | | Domain types | [references/domain-types.md](references/domain-types.md) | Schema.Class, branded types, TaggedRequest | | Testing | [references/testing.md](references/testing.md) | @effect/vitest setup, TDD workflow, test helpers | | Collections & State | [references/data.md](references/data.md) | Chunk, Option, Ref patterns | | Process management | [references/processes.md](references/processes.md) | Scope, Command, background processes |

Anti-Patterns

| Anti-Pattern | Fix | |--------------|-----| | Data.TaggedError for domain errors | Use Schema.TaggedError | | Layer.mergeAll with dependent layers | Use Layer.provideMerge | | try/catch in Effect.gen | Use Effect.try or mapError | | Missing Effect.provide(...) in tests | Always provide at test boundary | | Plain interfaces for domain types | Use Schema.Struct (or Schema.Class if needs behavior) | | String IDs without branding | Use Schema.brand() | | Guessing patterns | Grep Effect source first | | Effect.Service for library interfaces | Use Context.Tag | | Factory function with service param | Yield deps in Effect.gen, close over (see layer-dependencies.md) | | Schema.Class for simple DTOs | Use Schema.Struct unless needs Equal/Hash | | String literal union in struct | Use Schema.TaggedClass for variants | | Phantom type & { _tag } | Use Schema.brand() for runtime validation | | Bare Schema.String.pipe(Schema.brand(...)) | Add real constraints: NonEmptyString, pattern(), etc. |

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.