Official agent skill

Typed Dependencies with fp-go Effect

by IBM in IBM/fp-go

Teaches an agent to write fp-go v2 services with the Effect type, carrying dependencies in its type parameter instead of in context.Context or parameters.

OfficialApache-2.0Auto-check passedDevelopment

Install Typed Dependencies with fp-go Effect

skills CLI
$ npx skills add IBM/fp-go --skill fp-go-effect -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install IBM/fp-go fp-go-effect --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/fp-go-effect .claude/skills/fp-go-effect && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
fp-go-effect
GitHub stars
2k
Token cost
~4.3k tokens
SKILL.md length
1,510 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
Apache-2.0

At a glance

Teaches an agent to write fp-go v2 services with the Effect type, carrying dependencies in its type parameter instead of in context.Context or parameters.

  • Works in 5 steps: Every dependency goes into C. Never… → C is a type, so the compiler checks the… → Declare the narrowest C per function. A… → …
  • Writing or reviewing fp-go v2 service code built on the effect package
  • SKILL.md covers Core Principle: C Is for…, Before You Generate, When to Use Effect and Designing the Dependency Type, plus 10 more sections
  • Calls go

What it does

The skill explains Effect[C, A] from the fp-go v2 effect package, where the type parameter C carries long-lived dependencies such as repositories, database and HTTP clients, configuration and tool registries, while context.Context keeps request-scoped data such as cancellation and trace IDs. Rules follow from that split: declare the narrowest C per function, never store dependencies in the context or a global, and Provide once at startup and RunSync per request so the compiler checks the wiring.

It also covers designing capability interfaces (XxxDeps with getters, MakeXxxDeps and AsXxxDeps), narrowing and widening them with Local, lifting ordinary Go functions and methods with Eitherize, Eitherize1, Asks and FromIdiomatic, building dependencies with an Effect, and testing with fakes. Because fp-go is thinly represented in training data, the agent should look up unfamiliar combinators through the fp-go MCP server, then run go build and go vet before presenting code.

When your agent uses it

  • Writing or reviewing fp-go v2 service code built on the effect package
  • Adding database, HTTP client or config dependencies to an Effect-based service
  • Replacing clients stored in context.Context with typed dependencies
  • Testing Effect code with fake dependencies

Example prompts

  • “Refactor this user service so the repository and HTTP client arrive through Effect dependencies instead of context.”
  • “Design a capability interface for our billing dependencies and narrow it with Local.”
  • “Write a test for the order Effect using fake dependencies.”
  • “RunSync fails in my handler, so check how I Provide the dependencies.”

Requirements

  • Go with the fp-go v2 library
  • The fp-go MCP server for looking up combinators

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Every dependency goes into C. Never store it in context.Context (untyped, unchecked, panics on a missing key). Never pass it as a…
  2. C is a type, so the compiler checks the wiring. A function's signature Effect[UserDeps, User] states exactly what it needs. Code that…
  3. Declare the narrowest C per function. A function that only reads users asks for UserDeps, not for the whole application. Widen it with…
  4. Provide once, run many times. Build the dependency graph at startup, Provide it, and RunSync per request with that request's context.
  5. Request-scoped data stays in context.Context (see the fp-go-context skill). If a value differs per request, it is not a dependency.

What it can do on your machine

Read from SKILL.md and the folder at commit 1c4245d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • go

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Typed Dependencies with fp-go Effect loads about 4.3k tokens when it runs. Until then it costs about 250 tokens; SKILL.md has 1,510 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~250
When it runs · the whole SKILL.md, loaded when a task matches
~4.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from IBM/fp-go at commit 1c4245d, republished under its Apache-2.0 licence (© IBM). 1,510 words, ~4,326 tokens.

Download SKILL.mdSave it as .claude/skills/fp-go-effect/SKILL.md (or your agent's skills folder).
name
fp-go-effect
description
Use this skill when writing, refactoring, or reviewing fp-go v2 service code built on the effect package (github.com/IBM/fp-go/v2/effect), and whenever a service needs dependencies such as database or HTTP clients, repositories, configuration, environment access or tool registries. Explains Effect[C, A], why the type parameter C carries the dependencies (and context.Context does not), how to design capability interfaces (XxxDeps with getters, MakeXxxDeps, AsXxxDeps), how to narrow and widen them with Local, how to lift Go functions and interface methods with Eitherize, Eitherize1, Asks and FromIdiomatic, how to build dependencies with an Effect, and how to Provide and RunSync at the edge and test with fakes. Trigger on mentions of Effect, effect.Effect, dependency injection in fp-go, Provide, RunSync, Asks, Local, LocalEffectK, Eitherize1, typed dependencies, ReaderReaderIOResult, or on code that stores clients in context.Context or threads them through function parameters.

fp-go Effect: Typed Dependencies

Core Principle: C Is for Dependencies

go
// Effect[C, A] = func(C) func(context.Context) func() Result[A]
type Effect[C, A any] = readerreaderioresult.ReaderReaderIOResult[C, A]

An Effect takes three inputs, and each input has its own job:

InputCarriesSupplied
Cdependencies: long-lived collaborators such as repositories, DB and HTTP clients, SDK clients, configuration, environment access, tool registries, clocksonce, at the composition root, with EF.Provide
context.Contextrequest scope: cancellation, deadlines, request / trace IDs, authenticated principal, request loggeronce per run, with EF.RunSync(...)(ctx)
Kleisli argument (func(A) Effect[C, B])per-call input: IDs, payloads, the value flowing through the pipelineas a function argument

Rules that follow from this:

  1. Every dependency goes into C. Never store it in context.Context (untyped, unchecked, panics on a missing key). Never pass it as a parameter through every layer, and never keep it in a package-level global.
  2. C is a type, so the compiler checks the wiring. A function's signature Effect[UserDeps, User] states exactly what it needs. Code that forgets to provide something does not compile.
  3. Declare the narrowest C per function. A function that only reads users asks for UserDeps, not for the whole application. Widen it with Local where it is composed.
  4. Provide once, run many times. Build the dependency graph at startup, Provide it, and RunSync per request with that request's context.
  5. Request-scoped data stays in context.Context (see the fp-go-context skill). If a value differs per request, it is not a dependency.

Before You Generate

fp-go is low-frequency in training data, so signatures are easy to misremember. For any combinator not shown below, look it up via the fp-go MCP server's search_examples / get_example tools (see the fp-go-mcp skill) instead of guessing. After writing code, run go build ./... and go vet ./... and fix any type-parameter or argument-order errors before presenting it.

When to Use Effect

SituationUse
Needs only context.Context (no collaborators)context/readerioresult (RIO)
Needs any collaborator: client, repository, config, env, registryEffect[C, A]
Pure computationa plain function or Flow, no monad

Effect is the recommended top-level monad for service code. Every RIO operator still works inside it (see "Runtime Context Inside an Effect").

Designing the Dependency Type

One Capability Interface per Package

Each package that needs something from outside declares a small capability interface with getter methods, a private implementation, a constructor and a generic upcast helper:

go
package users

// UserRepo is the port; the adapter (Postgres, in-memory, fake) implements it.
type UserRepo interface {
    FindUser(ctx context.Context, id int) (User, error)
}

// UserDeps is what this package needs from its environment.
type UserDeps interface {
    GetUserRepo() UserRepo
}

type userDeps struct{ repo UserRepo }

func (d *userDeps) GetUserRepo() UserRepo { return d.repo }

// MakeUserDeps is the only way to build the dependency.
func MakeUserDeps(repo UserRepo) UserDeps { return &userDeps{repo} }

// AsUserDeps upcasts any wider dependency that embeds UserDeps.
// It is used with EF.Local to run a UserDeps effect inside a wider C.
func AsUserDeps[R UserDeps](r R) UserDeps { return r }
  • Getters, not fields. An interface lets callers supply any implementation and lets tests supply fakes. The implementation stays private.
  • Getters may return capabilities as functions, for example GetLookupEnv() IOR.Kleisli[string, string] or GetRequestOptions() EF.Thunk[[]Option]. A capability that is a function is trivial to fake and is only evaluated when the effect runs.
  • Keep it small. A XxxDeps interface lists what this package uses, typically one to three getters.

A plain struct of fields (type Deps struct{ DB DB; Config Config }) also works for a small program. Capability interfaces scale better, because every package keeps its own narrow view and the composite is assembled by embedding.

Composite Dependencies by Embedding

Higher layers combine the capabilities of the packages they use. The interface embeds interfaces, and the implementation embeds the implementations:

go
package app

type AppDeps interface {
    users.UserDeps
    mail.MailDeps
}

type appDeps struct {
    users.UserDeps
    mail.MailDeps
}

func MakeAppDeps(u users.UserDeps, m mail.MailDeps) AppDeps { return &appDeps{u, m} }

Because Go generics are invariant, an Effect[UserDeps, A] is not an Effect[AppDeps, A], even though AppDeps embeds UserDeps. Local performs that conversion (next sections).

Lifting Leaves

The leaves are where Go code meets the effect. Lift, never hand-write the nested closures:

Go shapeLift withResult
interface method func(Repo, ctx, A) (B, error) (method expression Repo.Find)EF.Eitherize1(Repo.Find)Kleisli[Repo, A, B]
func(C, ctx) (B, error)EF.Eitherize(f)Effect[C, B]
func(C, ctx, A) (B, error)EF.Eitherize1(f)Kleisli[C, A, B]
service method func(A) func(ctx, C) (B, error)EF.FromIdiomatic(f)Kleisli[C, A, B]
pure getter / projection func(C) AEF.Asks(f), e.g. EF.Asks(MailDeps.GetSender)Effect[C, A]
the whole dependencyEF.Ask[C]()Effect[C, C]
dependency-free ReaderIOResult[A]EF.FromThunk[C](t)Effect[C, A]
Result[A], IO[A], value, errorEF.FromResult[C], EF.FromIO[C], EF.Of[C], EF.Fail[C, A]Effect[C, A]

Interface method expressions make the leaves point-free. The receiver becomes the dependency, and Local with the getter fetches it from the capability interface:

go
func FindUser() EF.Kleisli[UserDeps, int, User] {
    return F.Flow2(
        EF.Eitherize1(UserRepo.FindUser),     // Kleisli[UserRepo, int, User]
        EF.Local[User](UserDeps.GetUserRepo), // run it on UserDeps
    )
}

Asks is for pure projections only. Effect[C, A] is func(C) ReaderIOResult[A], so EF.Asks(func(c C) ReaderIOResult[A] {...}) silently yields the nested Effect[C, ReaderIOResult[A]]. For a getter that returns an effectful capability, use Asks followed by ChainThunkK:

go
func LookupEnv(key string) EF.Effect[EnvDeps, string] {
    return F.Pipe1(
        EF.Asks(EnvDeps.GetLookupEnv), // Effect[EnvDeps, IOR.Kleisli[string, string]]
        EF.ChainThunkK[EnvDeps](F.Flow2(
            RD.Read[IOR.IOResult[string]](key), // apply the capability to key
            RIO.FromIOResult[string],
        )),
    )
}

Narrowing with Local

EF.Local[A](f) takes f: C1 → C2 (from what you have to what the effect needs) and turns an Effect[C2, A] into an Effect[C1, A]. With the AsXxxDeps helpers this is how a narrow effect runs inside a wide dependency:

go
func NotifyUser() EF.Kleisli[AppDeps, int, MessageID] {
    findUser := F.Flow2(users.FindUser(), EF.Local[User](users.AsUserDeps[AppDeps]))
    sendMail := F.Flow2(mail.SendMail(), EF.Local[MessageID](mail.AsMailDeps[AppDeps]))

    return F.Flow3(
        findUser,
        EF.Map[AppDeps](F.Flow2(getEmail, welcome)),
        EF.Chain(sendMail),
    )
}
  • Local needs only the value type [A]. C1 and C2 are inferred from f, and AsXxxDeps[Wide] fixes the generic helper to the wide type.
  • Asks + Map versus Local: build a new effect from a getter and a pure function with EF.Asks(getter) plus EF.Map[C](f). Use Local when you already have an Effect[C2, A] (a Kleisli defined elsewhere) and want to reuse it unchanged under another C.
  • EF.ContraMap is an alias of Local.
  • Compose with the effect combinators (Asks, Map, Ap, Chain, ChainThunkK, FromThunk, Local). Do not rebuild Effect's nested reader shape by hand with reader / context/readerioresult. That also type-checks, but it depends on the internal representation and is hard to read.

When deriving the inner dependency needs more than a pure function, use the Local*K variants (f goes from the outer to the inner dependency):

fOperator
C1 → C2, pureLocal / ContraMap
C1 → Reader[context.Context, C2]LocalReaderK
C1 → IO[C2]LocalIOK
C1 → Result[C2] (validation)LocalResultK
C1 → IOResult[C2]LocalIOResultK
C1 → ReaderIOResult[C2]LocalThunkK
C1 → Effect[C1, C2] (most general)LocalEffectK
Show full SKILL.md (626 more words)Show less

Composing

Effect has the full API of the other monads. Mind the leading type parameters, which C often cannot be inferred for:

OperationForm
transform the valueEF.Map[C](f) (Map[C, A, B]: annotate C)
sequence a KleisliEF.Chain(k) (inferred from k)
combine independent effectsEF.Ap[B](fa) on an Effect[C, func(A) B]
do-notationEF.Do[C](S{}), EF.Bind(lens.Set, k), EF.ApS(lens.Set, eff), EF.ApSL(lens, eff), EF.Let
lift other monads mid-pipelineEF.ChainResultK, EF.ChainIOK, EF.ChainThunkK[C], EF.ChainReaderK
side effectsEF.Tap(k), EF.TapIOK[C](f), EF.TapThunkK[C](f)
recover / alternativeEF.ChainLeft(k), EF.Alt(LZ.Of(other)), EF.TapLeft[A](k)
slicesEF.TraverseArray(k)
retriesEF.Retrying(policy, action, check)
runEF.Provide[A](deps), then EF.RunSync(thunk)(ctx)

Ap[B, C, A] and Provide[A, C] lead with the type that cannot be inferred. Write EF.Ap[ChatDeps](apiKey) and EF.Provide[User](deps).

Building Dependencies with an Effect

Constructing a dependency is often effectful itself: reading an environment variable, loading a file, opening a connection. Model the constructor as an Effect over the bootstrap capabilities:

go
type BootDeps interface {
    env.EnvDeps
    GetMailer() Mailer
}

// The sender address is read lazily from the environment when the effect runs.
func MakeMailDepsFromEnv() EF.Effect[BootDeps, MailDeps] {
    sender := F.Pipe1(env.LookupEnv("MAIL_SENDER"), EF.Local[string](env.AsEnvDeps[BootDeps]))

    return F.Pipe1(
        EF.Asks(F.Flow2(BootDeps.GetMailer, F.Curry2(MakeMailDeps))), // Effect[BootDeps, func(string) MailDeps]
        EF.Ap[MailDeps](sender),
    )
}

Run it once at startup and provide the result. Alternatively, EF.LocalEffectK[A](F.Constant1[BootDeps](MakeMailDepsFromEnv())) runs a MailDeps effect directly on BootDeps, building the dependency on every run. A missing variable fails the effect with a normal error. Nothing panics.

Running at the Edge

The composition root (main, server setup, CLI command) is the only place that builds concrete dependencies and runs effects:

go
func main() {
    deps := app.MakeAppDeps(
        users.MakeUserDeps(postgres.NewUserRepo(db)),
        mail.MakeMailDeps(smtp.NewMailer(cfg), cfg.Sender),
    )

    http.HandleFunc("/notify", func(w http.ResponseWriter, r *http.Request) {
        id, err := EF.RunSync(EF.Provide[MessageID](deps)(app.NotifyUser()(userID(r))))(r.Context())
        // write id or err
    })
}
  • Provide eliminates C and yields a ReaderIOResult[A]. RunSync runs it with a context.Context and returns an idiomatic (A, error). Alternatively, thunk(ctx)() yields a Result[A].
  • Build the dependencies once, not per request. Pass the request's context, not context.Background().
  • Library code returns Effect or Kleisli values. Only the edge calls Provide and RunSync.

Runtime Context Inside an Effect

EF.Local, EF.Ask and EF.Asks operate on C. To scope the runtime context.Context, lift any context/readerioresult operator over C with reader.Map:

go
F.Pipe1(
    app.NotifyUser()(42),
    RD.Map[AppDeps](RIO.WithTimeout[MessageID](2*time.Second)), // Effect[AppDeps, MessageID]
)
RD.Map[AppDeps](RIO.WithValue[MessageID](requestIDKey, id))
RD.Map[AppDeps](RIO.LogEntryExit[MessageID]("notifyUser"))

Testing

Tests supply fakes through the same constructors production code uses. No mocking framework and no global state are needed:

go
type fakeRepo map[int]User

func (r fakeRepo) FindUser(_ context.Context, id int) (User, error) {
    if u, ok := r[id]; ok {
        return u, nil
    }
    return User{}, errNotFound
}

func TestFindUser(t *testing.T) {
    deps := users.MakeUserDeps(fakeRepo{1: {ID: 1, Email: "a@x"}}) // only what FindUser declares

    u, err := EF.RunSync(EF.Provide[User](deps)(users.FindUser()(1)))(t.Context())
    assert.NoError(t, err)
    assert.Equal(t, "a@x", u.Email)

    _, err = EF.RunSync(EF.Provide[User](deps)(users.FindUser()(2)))(t.Context())
    assert.ErrorIs(t, err, errNotFound)
}
  • Test each function with the narrowest dependency it declares. That is the pay-off of narrow Cs.
  • Run with t.Context().
  • A fake capability can also be a function value, e.g. MakeToolDeps(fakeCaller) where the getter returns a lookup function built from a map.

Common Mistakes

MistakeFix
ctx.Value("db").(DB) or context.WithValue(ctx, dbKey, db)The DB is a dependency: put it in C behind a getter
Passing db, client, cfg as parameters through every functionReturn Effect[XxxDeps, A] / Kleisli; the dependency travels in C
Package-level var client = ... singletonsBuild in MakeXxxDeps, provide at the edge
Request IDs, principal or deadlines in CThey vary per request: context.Context (RIO.WithValue, RIO.WithTimeout via RD.Map[C])
One huge AppDeps as C of every functionDeclare the narrowest XxxDeps; widen with EF.Local[A](AsXxxDeps[Wide])
Effect[AppDeps, A] expected, Effect[UserDeps, A] given, "fixed" with a type assertionGenerics are invariant: use EF.Local with the AsXxxDeps helper
EF.Asks(func(c C) RIO.ReaderIOResult[A] {...})Yields Effect[C, ReaderIOResult[A]]. Use EF.Eitherize / Eitherize1 / FromIdiomatic, or Asks + ChainThunkK
Hand-written func(c C) func(ctx) func() Result[A] around a Go methodEF.Eitherize1(Iface.Method) + EF.Local[B](Deps.GetIface)
Rebuilding Effect with reader.Map / RIO internalsCompose with EF.Asks, Map, Ap, Chain, ChainThunkK, FromThunk, Local
EF.Map(f), EF.Provide(deps) without annotationEF.Map[C](f), EF.Provide[A](deps)
Building dependencies inside the request handlerBuild once at startup; provide per run
Provide / RunSync inside library codeReturn the Effect; only the edge runs it
C = context.ContextThat is RIO; use context/readerioresult directly

Review Checklist

  • Every collaborator (client, repository, config, env access, registry) comes from C, not from context.Context, globals or threaded parameters.
  • Each package defines a small XxxDeps interface with getters, a private implementation, MakeXxxDeps and AsXxxDeps.
  • Functions declare the narrowest C and are widened with EF.Local[A](AsXxxDeps[Wide]).
  • Leaves are lifted with Eitherize / Eitherize1 / FromIdiomatic / Asks; no hand-written nested closures.
  • Asks receives only pure projections.
  • Request-scoped data stays in context.Context; runtime scoping uses RD.Map[C](RIO.…).
  • Dependencies are built once at the composition root; Provide and RunSync appear only there and in tests.
  • Tests provide fakes through MakeXxxDeps and run with t.Context().

Import Reference

go
import (
    EF  "github.com/IBM/fp-go/v2/effect"
    RIO "github.com/IBM/fp-go/v2/context/readerioresult"
    RD  "github.com/IBM/fp-go/v2/reader"
    IOR "github.com/IBM/fp-go/v2/ioresult"
    F   "github.com/IBM/fp-go/v2/function"
    LZ  "github.com/IBM/fp-go/v2/lazy"
    R   "github.com/IBM/fp-go/v2/result"
)

See also the fp-go skill (core types, aliases), fp-go-context (request-scoped values, timeouts) and fp-go-logging.

© IBM, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/fp-go-effect of IBM/fp-go.

Open the folder on GitHubat commit 1c4245d

Compare with similar skills

Typed Dependencies with fp-go Effect next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Typed Dependencies with fp-go Effect compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Typed Dependencies with fp-go Effect this skillIBM/fp-go2k—~4.3kAutomated safety check: PassApache-2.0
RTK Rust Design Patternsrtk-ai/rtk83k—~1.9kAutomated safety check: PassApache-2.0
AST Visitor Pattern for Unionsprisma/orm48k—~830Automated safety check: PassApache-2.0
Valgocohesivestack/valgo508—~2.4kAutomated safety check: PassMIT
Gograph Go Repository Intelligenceozgurcd/gograph227—~4.8kAutomated safety check: NotesMIT
Golang Dependency Injectionsamber/cc-skills-golang3.4k—~3.2kAutomated safety check: PassMIT

Similar skills

  • Describes seven Rust design patterns for the RTK CLI filter modules, with when to use each, RTK examples, and notes on when a pattern is overkill.

    83k GitHub stars~1.9k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Official

    Replaces a plain TypeScript union plus switch statements with frozen subclasses and a visitor interface when several places dispatch on the same variants.

    48k GitHub stars~830 tokensUpdated today
    DevelopmentAuto-check passed
  • Valgo

    cohesivestack/valgo

    Add, refactor, debug, review, explain, or migrate type-safe validation in consumer Go applications using github.com/cohesivestack/valgo.

    508 GitHub stars~2.4k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Gives an agent working in a Go codebase a structural view through a local MCP server: call graphs, blast-radius and impact analysis, and bounded first-call exploration.

    227 GitHub stars~4.8k tokensUpdated yesterday
    DevelopmentAuto-check: notes
  • Golang Dependency Injection

    samber/cc-skills-golang

    Comprehensive guide for dependency injection (DI) in Golang.

    3.4k GitHub stars~3.2k tokensUpdated 7 days ago
    DevelopmentAuto-check passed
  • Golang Gopls

    context-labs/whip

    Golang semantic code intelligence via gopls — go-to-definition, references, call hierarchy, symbols, diagnostics, rename, refactors.

    1.1k GitHub starsUsed in 1 repo~2.3k tokens
    DevelopmentAuto-check passed

More from IBM/fp-go

All 10 skills in this repo
  • Official

    Covers handling Go's context.Context idiomatically in fp-go code: reading and scoping context through operators, timeouts, cancellation and converting ctx-first functions.

    2k GitHub stars~4.2k tokensUpdated yesterday
    Auto-check passed
  • Official

    Shows how to build composable, context-aware HTTP pipelines in Go using fp-go's ReaderIOResult monad instead of raw net/http calls.

    2k GitHub stars~4.4k tokensUpdated yesterday
    Auto-check passed
  • Official

    Generates or hand-writes composable lenses for the fp-go library so nested Go structs can be read and updated immutably.

    2k GitHub stars~4.3k tokensUpdated yesterday
    Auto-check passed
  • Official

    Adds logging to fp-go functional pipelines with Tap operators, entry and exit logs and error context, so that logging never changes the value or error flowing through.

    2k GitHub stars~3.7k tokensUpdated yesterday
    Auto-check passed
  • Official

    Configures and queries the fp-go MCP server so Claude Code, Claude Desktop or another MCP client can search fp-go's examples and skills directly.

    2k GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Official

    Guides writing or reviewing point-free, first-match-wins case lists in fp-go v2 Go code instead of switch statements and if-else chains.

    2k GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Typed Dependencies with fp-go Effect

What does Typed Dependencies with fp-go Effect do?

Teaches an agent to write fp-go v2 services with the Effect type, carrying dependencies in its type parameter instead of in context.Context or parameters. Context keeps request-scoped data such as cancellation and trace IDs. Rules follow from that split: declare the narrowest C per function, never store dependencies in the context or a global, and Provide once at startup and RunSync per request so the compiler checks the wiring.

When should I use Typed Dependencies with fp-go Effect?

Typed Dependencies with fp-go Effect fits situations like: writing or reviewing fp-go v2 service code built on the effect package; adding database, HTTP client or config dependencies to an Effect-based service; replacing clients stored in context.Context with typed dependencies; testing Effect code with fake dependencies.

How do I install Typed Dependencies with fp-go Effect in Claude Code?

Run `npx skills add IBM/fp-go --skill fp-go-effect -a claude-code`. Or copy the skill folder (skills/fp-go-effect in IBM/fp-go) into .claude/skills/fp-go-effect in your project. Claude Code loads it when a task matches its description.

How do I install Typed Dependencies with fp-go Effect in Codex?

Run `npx skills add IBM/fp-go --skill fp-go-effect -a codex`. Or copy the skill folder (skills/fp-go-effect in IBM/fp-go) into .agents/skills/fp-go-effect in your project. Codex loads it when a task matches its description.

Can I use Typed Dependencies with fp-go Effect in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add IBM/fp-go --skill fp-go-effect -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fp-go-effect, .gemini/skills/fp-go-effect, .github/skills/fp-go-effect and .opencode/skills/fp-go-effect in your project.

What does Typed Dependencies with fp-go Effect need to run?

Going by SKILL.md and its folder, Typed Dependencies with fp-go Effect needs the command-line tools its instructions call (go). Our summary lists: Go with the fp-go v2 library; The fp-go MCP server for looking up combinators.

Does Typed Dependencies with fp-go Effect access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Typed Dependencies with fp-go Effect safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Typed Dependencies with fp-go Effect use?

Typed Dependencies with fp-go Effect is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Typed Dependencies with fp-go Effect use?

About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Typed Dependencies with fp-go Effect?

Skills that share tags, products or a category with Typed Dependencies with fp-go Effect: RTK Rust Design Patterns (rtk-ai/rtk, 83k stars), AST Visitor Pattern for Unions (prisma/orm, 48k stars), Valgo (cohesivestack/valgo, 508 stars) and Gograph Go Repository Intelligence (ozgurcd/gograph, 227 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Typed Dependencies with fp-go Effect?

IBM (a GitHub organization, an official publisher) maintains it in IBM/fp-go, which has 2,029 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.

Source: IBM/fp-go on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.