Claude-skill-registry effect-service
Generate new Effect-TS services with proper patterns. Use when creating new services, layers, or adding methods to existing services.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/effect-service" ~/.claude/skills/majiayu000-claude-skill-registry-effect-service && rm -rf "$T"
manifest:
skills/data/effect-service/SKILL.mdsource content
Effect Service Generator
Generate Effect-TS services following project conventions.
Service Template
import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; // Interface defines the contract export interface MyServiceInterface { readonly doSomething: ( input: InputType, ) => Effect.Effect<OutputType, MyError>; } // Tag for dependency injection export class MyService extends Context.Tag("@wowlab/services/MyService")< MyService, MyServiceInterface >() {} // Live implementation export const MyServiceLive: Layer.Layer<MyService, never, Dependencies> = Layer.effect( MyService, Effect.gen(function* () { const dep = yield* SomeDependency; return { doSomething: (input) => Effect.gen(function* () { // implementation return result; }), } satisfies MyServiceInterface; }), );
Alternative: Effect.Service Pattern
For simpler services with built-in Default layer:
export class MyService extends Effect.Service<MyService>()("MyService", { dependencies: [Dep1.Default, Dep2.Default], effect: Effect.gen(function* () { const dep1 = yield* Dep1; const dep2 = yield* Dep2; return { doSomething: (input) => Effect.gen(function* () { ... }), }; }), }) {}
File Location
- New service:
packages/wowlab-services/src/internal/{domain}/ - Re-export from:
packages/wowlab-services/src/{Domain}.ts
Naming Conventions
- Interface:
or{Name}Interface{Name}Service - Tag:
@wowlab/services/{Name} - Layer:
or{Name}Live{Name}.Default - Errors:
using{Name}ErrorData.TaggedError
Instructions
- Ask what the service should do
- Identify dependencies needed
- Generate interface with typed methods
- Generate Layer implementation
- Add re-export to barrel file