Official agent skill

fp-go Pipe and Flow

by IBM in IBM/fp-go

Shows how to compose Go functions with fp-go v2 Pipe and Flow: point-free pipelines, predicates, the reader monad, do-notation and tests for pipelines.

OfficialApache-2.0Auto-check passedDevelopment

Install fp-go Pipe and Flow

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

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

GitHub CLI
$ gh skill install IBM/fp-go fp-go-pipe-flow --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-pipe-flow .claude/skills/fp-go-pipe-flow && 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-pipe-flow
GitHub stars
2k
Token cost
~3.5k tokens
SKILL.md length
851 words
Files
2
Skills in repo
10
Repo updated
First seen
Licence
Apache-2.0

At a glance

Shows how to compose Go functions with fp-go v2 Pipe and Flow: point-free pipelines, predicates, the reader monad, do-notation and tests for pipelines.

  • Writing point-free pipelines with fp-go v2
  • SKILL.md covers Before You Generate, Core Concepts, Prefer Functions over Variables and Point-Free Style, plus 7 more sections
  • Calls go
  • Choosing between Pipe and Flow for a new function

What it does

The skill covers composing functions with the fp-go v2 library for Go. Pipe threads a starting value through a sequence of functions, and Flow builds a reusable function that waits for its input. The rule of thumb is Pipe when you already have the value and Flow when you are building something reusable. Numbered variants run from Pipe1 to Pipe20 and Flow1 to Flow20, with nothing above 20. Imports must come from github.com/IBM/fp-go/v2, never the v1 path, and pipeline results go in named functions instead of package-level vars.

Further topics include point-free style, the Predicate and Endomorphism type aliases, the generic reader monad with Ask, Asks, Map and Chain, and do-notation with Do, Bind, ApS, Let and LetTo. Because fp-go is rare in training data, the agent should look up unfamiliar combinators through the fp-go MCP server instead of guessing, and run go build and go vet after writing code. An evals file ships with the skill. Lenses and context.Context are handled by the fp-go-lens and fp-go-context skills.

When your agent uses it

  • Writing point-free pipelines with fp-go v2
  • Choosing between Pipe and Flow for a new function
  • Refactoring nested calls or imperative Go into a pipeline
  • Writing unit tests for fp-go pipelines

Example prompts

  • “Refactor this nested call chain into an fp-go Pipe and return it from a function.”
  • “Should I use Flow or Pipe for a reusable validation step? Show me the code.”
  • “Rewrite this handler using the reader monad with Asks and Chain.”
  • “Convert this imperative loop into do-notation with Bind and Let.”

Requirements

  • A Go project that uses fp-go v2
  • The Go toolchain for go build and go vet

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

fp-go Pipe and Flow loads about 3.5k tokens when it runs. Until then it costs about 159 tokens; SKILL.md has 851 words of instructions outside code blocks.

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

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). 851 words, ~3,547 tokens.

Download SKILL.mdSave it as .claude/skills/fp-go-pipe-flow/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
fp-go-pipe-flow
description
Use this skill when composing fp-go v2 functions with Pipe and Flow: building point-free pipelines, choosing Pipe vs Flow, returning pipelines from functions instead of package-level vars, Predicate and Endomorphism helpers, the generic reader monad (reader.Reader[R, A] with Ask, Asks, Map, Chain), do-notation (Do, Bind, ApS, Let, LetTo) and unit tests for pipelines. Trigger on mentions of Pipe, Flow, PipeN/FlowN, point-free style, kleisli, reader monad, do-notation, Bind, ApS, or refactoring nested calls or imperative Go into a pipeline. For building lenses use fp-go-lens; for context.Context use fp-go-context.

fp-go Pipe and Flow Patterns

All imports must come from github.com/IBM/fp-go/v2, never from github.com/IBM/fp-go (the v1 path).


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.


Core Concepts

Pipe — Data-First Composition

Pipe takes an initial value and threads it through a sequence of functions. Use it when you already have a value to start from.

go
import F "github.com/IBM/fp-go/v2/function"

// PipeN threads a value through N functions
result := F.Pipe3(initialValue, step1, step2, step3)

The number suffix matches the number of transformation steps. Pipe1–Pipe20 and Flow1–Flow20 are generated; there is nothing above 20.

Flow — Function-First Composition

Flow composes N functions into a single function that awaits its input. Use it to build reusable pipeline functions, especially as arguments to Map, Chain, or TraverseArray.

go
// FlowN returns func(T0) TN
pipeline := F.Flow3(step1, step2, step3)
result := pipeline(initialValue)

Rule of thumb: prefer Pipe when you have the starting value; use Flow when you are building a reusable function.


Prefer Functions over Variables

Go does not eliminate dead variables, but unused functions are zero-cost. Always wrap a Pipe/Flow result in a named function rather than storing it in a package-level var.

go
// WRONG — var is allocated even if never called
var processUser = F.Flow2(getName, strings.ToUpper)

// CORRECT — zero cost until called; also more composable
func processUser() func(User) string {
    return F.Flow2(getName, strings.ToUpper)
}

Use var only for lenses and pre-bound combinator helpers (like lens.Get assigned to a named getter), not for full pipeline results.


Point-Free Style

Avoid explicit argument names wherever a named combinator or Flow can express the same thing.

go
// WRONG — explicit argument
func isAdult(u User) bool { return getAge(u) > 18 }

// CORRECT — point-free, returns typed Predicate
func isAdult() P.Predicate[User] {
    return F.Flow2(getAge, N.MoreThan(18))
}
Type Aliases to Use
TypePackageMeaning
P.Predicate[A]github.com/IBM/fp-go/v2/predicatefunc(A) bool
EM.Endomorphism[A]github.com/IBM/fp-go/v2/endomorphismfunc(A) A

Use these as return types for functions that act as predicates or self-transformations — they communicate intent and enable direct use in combinators like A.Filter, A.Map, F.Ternary.

go
import (
    F "github.com/IBM/fp-go/v2/function"
    N "github.com/IBM/fp-go/v2/number"
    P "github.com/IBM/fp-go/v2/predicate"
    EM "github.com/IBM/fp-go/v2/endomorphism"
    A "github.com/IBM/fp-go/v2/array"
)

// Predicate — point-free using N.MoreThan
func isAdult() P.Predicate[User] {
    return F.Flow2(getAge, N.MoreThan(18))
}

// Endomorphism — self-transformation
func doubleAll() EM.Endomorphism[[]int] {
    return A.Map[int, int](N.Mul(2))
}
Numeric Combinators

Prefer N.MoreThan, N.LessThan, N.Mul, N.Add etc. over inline comparisons or arithmetic in lambdas:

go
N.MoreThan(18)   // func(int) bool   — x > 18
N.LessThan(100)  // func(int) bool   — x < 100
N.Mul(2)         // func(int) int    — x * 2
N.Add(1)         // func(int) int    — x + 1

Pure Pipelines vs the Reader Monad

Only use the reader monad when the computation genuinely needs an environment (context, config, DB, logger, etc.). For pure transformations that don't need external input, use Flow or Pipe directly — no reader wrapping needed.

go
// WRONG — forces reader monad on a pure computation
func adultNames(users []User) RD.Reader[Env, string] {
    return F.Pipe1(
        RD.Of[Env](users),
        RD.Map[Env](pureTransform),
    )
}

// CORRECT — pure; no environment needed
func adultNames() func([]User) string {
    return F.Flow2(
        A.FilterMap(toAdultName()),
        A.Intercalate(S.Monoid)(","),
    )
}
Per-Element Filter+Map: Use A.FilterMap

When filtering and then extracting a field, combine both into a single pass with A.FilterMap and O.FromPredicate:

go
import (
    F "github.com/IBM/fp-go/v2/function"
    A "github.com/IBM/fp-go/v2/array"
    O "github.com/IBM/fp-go/v2/option"
    N "github.com/IBM/fp-go/v2/number"
    P "github.com/IBM/fp-go/v2/predicate"
    S "github.com/IBM/fp-go/v2/string"
)

// isAdult — point-free predicate
func isAdult() P.Predicate[User] {
    return F.Flow2(getAge, N.MoreThan(18))
}

// toAdultName — User -> Option[string]: Some(name) if adult, None otherwise
func toAdultName() func(User) O.Option[string] {
    return F.Flow2(
        O.FromPredicate(isAdult()),  // User -> Option[User]
        O.Map(getName),              // Option[User] -> Option[string]
    )
}

// adultNames — pure pipeline, no reader monad needed
func adultNames() func([]User) string {
    return F.Flow2(
        A.FilterMap(toAdultName()),       // []User -> []string
        A.Intercalate(S.Monoid)(","),     // []string -> string
    )
}

Reader Monad

The reader monad Reader[R, A] is func(R) A — a computation that reads from an environment R and produces A. Only reach for it when the computation needs to thread an environment (a config struct, a repository, …). For context.Context plus IO and errors use context/readerioresult (RIO) instead — see the fp-go-context skill.

go
import (
    F  "github.com/IBM/fp-go/v2/function"
    RD "github.com/IBM/fp-go/v2/reader"
)

type Env struct {
    Users map[string]User
}

// Leaf accessor (or a generated lens' .Get)
func getUsers(e Env) map[string]User { return e.Users }

// lookupUser is curried: func(id string) func(map[string]User) User

// Kleisli arrow: string -> Reader[Env, User], built from a pure projection
func fetchUser(id string) RD.Reader[Env, User] {
    return RD.Asks(F.Flow2(getUsers, lookupUser(id)))
}
When to Use reader.Map vs Full Pipe with Reader Operations
  • reader.Map inside Flow — when the step is pure and the environment does not need to appear explicitly. This is the "abbreviation" pattern.
  • Pipe with reader.Chain, reader.Bind, reader.ApS — when the sequence needs the environment (e.g. calls another kleisli arrow) or when do-notation makes the data flow clearer.
go
// reader.Map inside Flow — no env name, clean point-free.
// NOTE: RD.Map returns an Operator over Reader values, so the PRECEDING step in the
// Flow must already produce a Reader. A plain func([]User) []string composed with
// RD.Map does not type-check.
func renderUsers() func(string) RD.Reader[Env, string] {
    return F.Flow2(
        fetchTeam,                   // string -> Reader[Env, []User]
        RD.Map[Env](F.Flow2(         // Reader[Env, []User] -> Reader[Env, string]
            A.Map(getName),
            A.Intercalate(S.Monoid)(","),
        )),
    )
}

// Pipe with reader monad — env access required
func enrichedUser(id string) RD.Reader[Env, EnrichedUser] {
    return F.Pipe3(
        fetchUser(id),
        RD.Chain(fetchProfile),
        RD.Chain(fetchPermissions),
        RD.Map[Env](combineToEnriched),
    )
}

Do-Notation: Do / Bind / ApS / Let

Do-notation is the idiomatic way to assemble multiple reader (or IO/result) computations into a named-field record. Always use it inside a Pipe.

go
import (
    F  "github.com/IBM/fp-go/v2/function"
    L  "github.com/IBM/fp-go/v2/optics/lens"
    RD "github.com/IBM/fp-go/v2/reader"
)

// Lenses — generated (`// fp-go:Lens`) or built once with L.MakeLens.
// lens.Set already has the setter shape func(T) func(S) S — no hand-written setters.
var (
    userIDLens = L.MakeLens(
        func(s RequestState) string { return s.UserID },
        func(s RequestState, v string) RequestState { s.UserID = v; return s },
    )
    profileLens = L.MakeLens(
        func(s RequestState) Profile { return s.Profile },
        func(s RequestState, v Profile) RequestState { s.Profile = v; return s },
    )
    permsLens = L.MakeLens(
        func(s RequestState) Perms { return s.Perms },
        func(s RequestState, v Perms) RequestState { s.Perms = v; return s },
    )
)

// Kleisli arrows — named functions, never inline:
//   fetchProfile: func(userID string) Reader[Env, Profile]
//   fetchPerms:   func(p Profile)     Reader[Env, Perms]

// Pipeline — returned as a function, not a var
func buildRequestState(userID string) RD.Reader[Env, RequestState] {
    return F.Pipe3(
        RD.Do[Env](RequestState{}),
        RD.LetTo[Env](userIDLens.Set, userID),
        RD.Bind(profileLens.Set, F.Flow2(userIDLens.Get, fetchProfile)),
        RD.Bind(permsLens.Set, F.Flow2(profileLens.Get, fetchPerms)),
    )
}

F.Flow2(lens.Get, kleisli) is the point-free way to feed one field of the accumulated state into the next step.

Show full SKILL.md (338 more words)Show less
Bind vs ApS vs Let
CombinatorWhen to use
Bind(setter, kleisli)Result depends on accumulated state (sequential)
ApS(setter, reader)Result is independent of other fields
Let(setter, pureFunc)Pure transformation of accumulated state, no reader needed
LetTo(setter, value)Attach a constant value to state

Use ApS when values can be computed independently; Bind when a later step depends on an earlier one. Mixing them in the same pipeline is normal. A Bind whose Kleisli ignores the state (func(_ S) M[T] { return m }) is always an ApS(setter, m).


Lenses for Struct Field Access

Never access struct fields with inline functions inside a Pipe. Create a lens (preferably generated with // fp-go:Lens, see the fp-go-lens skill) or a named leaf accessor so the pipeline stays point-free.

go
import (
    L "github.com/IBM/fp-go/v2/optics/lens"
)

var hostLens = L.MakeLens(
    func(c Config) string { return c.Host },
    func(c Config, v string) Config { c.Host = v; return c },
)

// Assign lens.Get to a named var — then pass it anywhere point-free
var getHost = hostLens.Get   // func(Config) string
var getPort = portLens.Get   // func(Config) int

Use RD.ApSL(lens, reader) / RD.BindL(lens, kleisli) as do-notation variants that take a lens directly instead of a setter function.


Unit Tests

Generate a _test.go for every non-trivial pipeline or flow.

go
func TestAdultNames(t *testing.T) {
    users := []User{{Name: "Alice", Age: 25}, {Name: "Bob", Age: 16}}
    assert.Equal(t, "Alice", adultNames()(users))
}

func TestBuildRequestState(t *testing.T) {
    env := Env{Users: map[string]User{"user-42": {ID: "user-42"}}}
    state := buildRequestState("user-42")(env)
    assert.Equal(t, "user-42", state.UserID)
}
Testing Guidelines
  • For pure Flow/Pipe functions: call the returned function with a concrete value and assert with assert.Equal.
  • For reader pipelines: call the reader with a concrete environment struct.
  • For IOResult/ReaderIOResult: call the innermost IO thunk and compare with R.Of(expected); run a ReaderIOResult with t.Context().
  • Prefer table-driven tests for pipelines with multiple input/output pairs.
  • Do not mock the environment — pass a real (but lightweight) struct.

Common Import Aliases

These follow the canonical alias table in the fp-go skill.

go
import (
    F   "github.com/IBM/fp-go/v2/function"
    A   "github.com/IBM/fp-go/v2/array"
    O   "github.com/IBM/fp-go/v2/option"
    E   "github.com/IBM/fp-go/v2/either"
    R   "github.com/IBM/fp-go/v2/result"
    IOR "github.com/IBM/fp-go/v2/ioresult"
    RD  "github.com/IBM/fp-go/v2/reader"
    RIO "github.com/IBM/fp-go/v2/context/readerioresult"
    L   "github.com/IBM/fp-go/v2/optics/lens"
    N   "github.com/IBM/fp-go/v2/number"
    S   "github.com/IBM/fp-go/v2/string"
    P   "github.com/IBM/fp-go/v2/predicate"
    EM  "github.com/IBM/fp-go/v2/endomorphism"
)

Quick Reference

GoalPattern
Thread a value through N stepsF.PipeN(value, f1, f2, …)
Build a reusable functionF.FlowN(f1, f2, …)
Point-free numeric predicateF.Flow2(getField, N.MoreThan(n)) returning P.Predicate[T]
Filter+map in one passA.FilterMap(F.Flow2(O.FromPredicate(pred), O.Map(f)))
Lift a pure function into ReaderRD.Map[Env](pureFunc)
Chain kleisli arrowsRD.Chain(kleisliFunc)
Start do-notation blockRD.Do[Env](emptyStruct)
Add dependent fieldRD.Bind(lens.Set, F.Flow2(otherLens.Get, kleisliFunc))
Add independent fieldRD.ApS(lens.Set, readerValue)
Add pure derived fieldRD.Let[Env](lens.Set, F.Flow2(otherLens.Get, pureFunc))
Lens getter in pipelinevar getX = xLens.Get
Do-notation with lensRD.ApSL(lens, readerValue)
Access full environmentRD.Ask[Env]()
Access field of environmentRD.Asks(getX)
Read a context.Context valueRIO.AskValue[V](key) → Option[V] (not ctx.Value(key).(V))
Scope a value / timeout to a stepRIO.WithValue[A](key, v), RIO.WithTimeout[A](d) as the last Pipe step

© 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

SKILL.md and 1 other file in skills/fp-go-pipe-flow of IBM/fp-go.

  • SKILL.md
  • evals/evals.json

Open the folder on GitHubat commit 1c4245d

Compare with similar skills

fp-go Pipe and Flow 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.

fp-go Pipe and Flow compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
fp-go Pipe and Flow this skillIBM/fp-go2k—~3.5kAutomated safety check: PassApache-2.0
Golang Dependency Injectionsamber/cc-skills-golang3.4k—~3.2kAutomated safety check: PassMIT
Golang Samber Docontext-labs/whip1.1k1 repos~2.3kAutomated safety check: PassMIT
Swiftui View RefactorDimillian/Skills4k5 repos~2kAutomated safety check: PassMIT
RTK Rust Design Patternsrtk-ai/rtk83k—~1.9kAutomated safety check: PassApache-2.0
Architecture PatternsKartikLabhshetwar/better-shot2.4k2 repos~1.4kAutomated safety check: PassCustom licence

Similar skills

  • 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 Samber Do

    context-labs/whip

    Dependency injection in Go using samber/do — service containers, lifecycle, scopes, health checks, graceful shutdown, module organization.

    1.1k GitHub starsUsed in 1 repo~2.3k tokens
    DevelopmentAuto-check passed
  • Swiftui View Refactor

    Dimillian/Skills

    Refactor and review SwiftUI view files with strong defaults for small dedicated subviews, MV-over-MVVM data flow, stable view trees, explicit dependency injection, and correct Observation usage.

    4k GitHub starsUsed in 5 repos~2k tokens
    DevelopmentAuto-check passed
  • 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
  • Architecture Patterns

    KartikLabhshetwar/better-shot

    Deep dive into software architecture for macOS. An agent skill from KartikLabhshetwar/better-shot.

    2.4k GitHub starsUsed in 2 repos~1.4k tokens
    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

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
  • 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.

    2k GitHub stars~4.3k 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

Works with

Categories

Questions about fp-go Pipe and Flow

What does fp-go Pipe and Flow do?

Shows how to compose Go functions with fp-go v2 Pipe and Flow: point-free pipelines, predicates, the reader monad, do-notation and tests for pipelines. The skill covers composing functions with the fp-go v2 library for Go. Pipe threads a starting value through a sequence of functions, and Flow builds a reusable function that waits for its input.

When should I use fp-go Pipe and Flow?

fp-go Pipe and Flow fits situations like: writing point-free pipelines with fp-go v2; choosing between Pipe and Flow for a new function; refactoring nested calls or imperative Go into a pipeline; writing unit tests for fp-go pipelines.

How do I install fp-go Pipe and Flow in Claude Code?

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

How do I install fp-go Pipe and Flow in Codex?

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

Can I use fp-go Pipe and Flow 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-pipe-flow -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-pipe-flow, .gemini/skills/fp-go-pipe-flow, .github/skills/fp-go-pipe-flow and .opencode/skills/fp-go-pipe-flow in your project.

What does fp-go Pipe and Flow need to run?

Going by SKILL.md and its folder, fp-go Pipe and Flow needs the command-line tools its instructions call (go). Our summary lists: A Go project that uses fp-go v2; The Go toolchain for go build and go vet.

Does fp-go Pipe and Flow 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 fp-go Pipe and Flow 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 fp-go Pipe and Flow use?

fp-go Pipe and Flow 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 fp-go Pipe and Flow use?

About 3.5k tokens (SKILL.md is roughly 14k 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 fp-go Pipe and Flow?

Skills that share tags, products or a category with fp-go Pipe and Flow: Golang Dependency Injection (samber/cc-skills-golang, 3.4k stars), Golang Samber Do (context-labs/whip, 1.1k stars), Swiftui View Refactor (Dimillian/Skills, 4k stars) and RTK Rust Design Patterns (rtk-ai/rtk, 83k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains fp-go Pipe and Flow?

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.