Golang Dependency Injection
samber/cc-skills-golang
Comprehensive guide for dependency injection (DI) in Golang.
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.
$ npx skills add IBM/fp-go --skill fp-go-pattern-matching -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install IBM/fp-go fp-go-pattern-matching --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/fp-go-pattern-matching .claude/skills/fp-go-pattern-matching && rm -rf skills-srcUse ~/.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/
Install the "fp-go-pattern-matching" agent skill from https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matching into .claude/skills/fp-go-pattern-matching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fp-go-pattern-matching", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matchingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add IBM/fp-go --skill fp-go-pattern-matching -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install IBM/fp-go fp-go-pattern-matching --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/fp-go-pattern-matching .agents/skills/fp-go-pattern-matching && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fp-go-pattern-matching" agent skill from https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matching into .agents/skills/fp-go-pattern-matching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fp-go-pattern-matching", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add IBM/fp-go --skill fp-go-pattern-matching -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install IBM/fp-go fp-go-pattern-matching --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/fp-go-pattern-matching .cursor/skills/fp-go-pattern-matching && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fp-go-pattern-matching" agent skill from https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matching into .cursor/skills/fp-go-pattern-matching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fp-go-pattern-matching", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/IBM/fp-go.git --path skills/fp-go-pattern-matching--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add IBM/fp-go --skill fp-go-pattern-matching -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install IBM/fp-go fp-go-pattern-matching --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/fp-go-pattern-matching .gemini/skills/fp-go-pattern-matching && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fp-go-pattern-matching" agent skill from https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matching into .gemini/skills/fp-go-pattern-matching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fp-go-pattern-matching", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install IBM/fp-go fp-go-pattern-matchingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add IBM/fp-go --skill fp-go-pattern-matching -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/fp-go-pattern-matching .github/skills/fp-go-pattern-matching && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fp-go-pattern-matching" agent skill from https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matching into .github/skills/fp-go-pattern-matching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fp-go-pattern-matching", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add IBM/fp-go --skill fp-go-pattern-matching -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install IBM/fp-go fp-go-pattern-matching --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/fp-go.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/fp-go-pattern-matching .opencode/skills/fp-go-pattern-matching && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fp-go-pattern-matching" agent skill from https://github.com/IBM/fp-go/tree/main/skills/fp-go-pattern-matching into .opencode/skills/fp-go-pattern-matching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fp-go-pattern-matching", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fp-go-pattern-matchingGuides writing or reviewing point-free, first-match-wins case lists in fp-go v2 Go code instead of switch statements and if-else chains.
This skill applies to Go code written with the fp-go v2 functional library, covering a model where a case is a function returning an Option and a match is an ordered list of cases in which the first Some wins. It steers you toward composing cases from guards, getters, and formatters, reserving lambdas for leaf accessors or deliberate side effects inside tests.
It points to the library's own long-form reference and tested examples instead of relying on memorized signatures, since fp-go is described as rare in training data. After writing code it expects you to run the Go build and vet commands and fix any type-parameter or argument-order mistakes before presenting the result, and it recommends looking up unfamiliar combinators through a project MCP server rather than guessing at them.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1c4245d. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
goFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
fp-go Pattern Matching loads about 2.8k tokens when it runs. Until then it costs about 168 tokens; SKILL.md has 760 words of instructions outside code blocks.
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.
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.
The full file from IBM/fp-go at commit 1c4245d, republished under its Apache-2.0 licence (© IBM). 760 words, ~2,782 tokens.
.claude/skills/fp-go-pattern-matching/SKILL.md (or your agent's skills folder).All imports come from github.com/IBM/fp-go/v2 and use the canonical aliases of the fp-go skill. The canonical long-form
reference is v2/docs/PATTERN_MATCHING.md. Tested examples are in
v2/array/example_pattern_matching_test.go and v2/array/pattern_matching_test.go.
import (
A "github.com/IBM/fp-go/v2/array"
F "github.com/IBM/fp-go/v2/function"
N "github.com/IBM/fp-go/v2/number"
O "github.com/IBM/fp-go/v2/option"
P "github.com/IBM/fp-go/v2/predicate"
R "github.com/IBM/fp-go/v2/result"
RD "github.com/IBM/fp-go/v2/reader"
RO "github.com/IBM/fp-go/v2/readeroption"
S "github.com/IBM/fp-go/v2/string"
"github.com/IBM/fp-go/v2/optics/prism"
"github.com/IBM/fp-go/v2/readerresult" // generic ReaderResult[T, B]; not context/readerresult
)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.
func(T) Option[B]: Some(b) if it matches, None otherwise.
RO.ReaderOption[T, B], O.Kleisli[T, B] and prism.Prism[T, B].GetOption
are all aliases of this type, so values from these packages mix freely in one slice.Some wins.Option[B]) into a total function.Flow/Pipe. Lambdas are allowed only for leaves (field
accessors, multi-field formatters, deliberate side effects in tests).func getMethod(r Request) string { return r.Method } // leaf accessor (or lens.Get)
func getPath(r Request) string { return r.Path }
func on(guard P.Predicate[Request], branch func(Request) string) RO.ReaderOption[Request, string] {
return F.Flow2(O.FromPredicate(guard), O.Map(branch))
}
func isMethod(m string) P.Predicate[Request] {
return F.Flow2(getMethod, P.IsStrictEqual[string]()(m))
}
func HandleRequest() func(Request) string {
return F.Pipe2(
A.From( // ordered, specific -> general
on(isMethod("GET"), F.Flow2(getPath, S.Format[string]("Fetching: %s"))),
on(isMethod("DELETE"), F.Flow2(getPath, S.Format[string]("Deleting: %s"))),
),
A.Fold(RO.AltMonoid[Request, string]()), // lazy first-match
RO.GetOrElse(F.Flow2(getMethod, S.Format[string]("Unsupported: %s"))), // default
)
}func (never a
package-level var), call the constructor once during setup, and reuse the result.Empty(), which is None for all inputs.Generic helper for the most common case shape:
func when[T, B any](guard P.Predicate[T], b B) RO.ReaderOption[T, B] {
return F.Flow2(O.FromPredicate(guard), O.Map(F.Constant1[T](b)))
}Alternatives, all lazy and point-free:
// append one or two fallback cases
F.Pipe2(c1, RO.Alt(F.Constant(c2)), RO.Alt(F.Constant(c3)))
// FindFirstMap over a slice of cases
F.Flow3(
RD.Read[O.Option[B], T], // x -> apply-a-case-to-x
A.FindFirstMap[RO.ReaderOption[T, B], B], // -> first case that matches
RD.Read[O.Option[B]](cases), // run over the cases
)| Instead of | Write |
|---|---|
func(r Req) bool { return r.Method == m } | F.Flow2(getMethod, P.IsStrictEqual[string]()(m)) |
func(e Ev) bool { return e.Priority > 8 } | F.Flow2(getPriority, N.MoreThan(8)) |
p(x) && q(x) | F.Pipe1(p, P.And(q)), also P.Or, P.Not |
strings.HasPrefix(s, p) | F.Bind2nd(strings.HasPrefix, p) |
strings.TrimPrefix(s, p) | F.Bind2nd(strings.TrimPrefix, p) |
fmt.Sprintf("x %v", v) | S.Format[T]("x %v") |
"INFO: " + s | S.Prepend("INFO: "), S.Append |
func(T) B { return b } | F.Constant1[T](b) |
strconv.ParseInt(s, base, 64) | F.Bind23of3(R.Eitherize3(strconv.ParseInt))(base, 64) |
strconv.Atoi(s) | R.Eitherize1(strconv.Atoi) |
Result -> Option | R.ToOption[A] |
func() Option[B] { return c(x) } | F.Nullary2(F.Constant(x), c) |
func(s Shape) any { return s } | F.ToAny[Shape] |
| replace any error | R.MapLeft[A](F.Constant1[error](err)) |
(number has no Equal/LessThanEqual. Use P.IsStrictEqual, P.IsZero[T](), N.LessThan(n+1).)
// BAD: all three cases run, because Go evaluates the slice literal first
O.AltAllArray(O.None[B]())([]O.Option[B]{c1(x), c2(x), c3(x)})
// its point-free equivalent shows why: SequenceArray runs every case first
F.Pipe2(cases, RD.SequenceArray[T, O.Option[B]], RD.Map[T](O.AltAllArray(O.None[B]())))AltAllArray stops scanning at the first Some but cannot prevent the calls
that built the slice. Use it only when the Option values already exist.
When reviewing code, rewrite this form to A.Fold(RO.AltMonoid[T, B]())(A.From(c1, c2, c3)).
The same applies to either.AltAllArray and result.AltAllArray.
| Need | Build with |
|---|---|
| guard -> constant | when(guard, b) = F.Flow2(O.FromPredicate(guard), O.Map(F.Constant1[T](b))) |
| guard -> computed | F.Flow2(O.FromPredicate(guard), O.Map(f)) |
| guard -> transform -> partial parse | F.Flow3(O.FromPredicate(g), O.Map(f), O.Chain(k)) |
func(A) (B, bool) | O.FromValidation(f), for example O.FromValidation(os.LookupEnv) |
type switch on any | F.Flow2(O.InstanceOf[Variant], O.Map(handler)) |
| type switch on named interface | F.Flow3(F.ToAny[Shape], O.InstanceOf[Variant], O.Map(handler)) |
| parse / extract | prism.ParseInt().GetOption, ParseInt64, ParseFloat64, ParseBool, ParseDate(layout), RegexMatcher(re) |
| pointer non-nil | O.FromNillable2 |
| catch-all | RO.Of[T](b) as the last case |
| no combinator fits | small named func(T) O.Option[B] leaf |
Prefix-parse case, fully point-free:
func withPrefix(prefix string, base int) RO.ReaderOption[string, int64] {
return F.Flow3(
O.FromPredicate(F.Bind2nd(strings.HasPrefix, prefix)),
O.Map(F.Bind2nd(strings.TrimPrefix, prefix)),
O.Chain(F.Flow2(F.Bind23of3(R.Eitherize3(strconv.ParseInt))(base, 64), R.ToOption[int64])),
)
}Sum-type cases via an adapter:
func caseOf[T Shape, B any](f func(T) B) RO.ReaderOption[Shape, B] {
return F.Flow3(F.ToAny[Shape], O.InstanceOf[T], O.Map(f))
}
describe := A.Fold(RO.AltMonoid[Shape, string]())(A.From(
caseOf(S.Format[Circle]("circle %v")),
caseOf(S.Format[Rect]("rect %v")),
))Go has no exhaustiveness checking. A default guarantees a result, not coverage. Add one test per variant.
F.Pipe1(match, RO.GetOrElse(F.Flow2(getX, S.Format[X]("no match: %v")))) // default sees input
F.Pipe1(match, RO.GetOrElse(F.Constant1[T](dflt))) // constant default
A.From(c1, c2, RO.Of[T](dflt)) // catch-all case, still Option| Input | Use |
|---|---|
Option[A] | O.Fold(onNone func() B, onSome func(A) B), e.g. O.Fold(F.Constant("none"), S.Format[int]("got %d")) |
Either[E, A] | either.Fold(onLeft, onRight) |
Result[A] | R.Fold(onErr func(error) B, onOk func(A) B) |
| predicate | P.Fold(onFalse, onTrue func(A) B)(pred) |
| slice empty/non-empty | A.Match(onEmpty func() B, onNonEmpty func([]A) B), A.MatchLeft(onEmpty, func(head A, tail []A) B) |
| Goal | Use |
|---|---|
| first element matching any case | A.FindFirstMap(match) (lazy over elements) |
| last element | A.FindLastMap(match) |
| with index | A.FindFirstMapWithIndex(func(int, A) O.Option[B]) |
| all matches | A.FilterMap(match) -> []B |
When a failing case should say why, use Result cases and the error-aware monoid:
func withPrefixR(prefix string, base int, err error) readerresult.ReaderResult[string, int64] {
return F.Flow4(
R.FromPredicate(F.Bind2nd(strings.HasPrefix, prefix), F.Constant1[string](err)),
R.Map(F.Bind2nd(strings.TrimPrefix, prefix)),
R.Chain(F.Bind23of3(R.Eitherize3(strconv.ParseInt))(base, 64)),
R.MapLeft[int64](F.Constant1[error](err)),
)
}
parse := A.Fold(readerresult.AltMonoid(F.Constant(readerresult.Left[string, int64](errNoMatch))))(A.From(
withPrefixR("0x", 16, errHex),
withPrefixR("", 10, errDec),
))
// two alternatives: F.Pipe1(c1, readerresult.Alt(F.Constant(c2)))zero is returned.func(string) R.Result[int64],
A.From may need an explicit type argument: A.From[readerresult.ReaderResult[string, int64]](...).readereither.AltMonoid(zero) is the equivalent for custom error types.AltAllArray([]Option{c(x), ...}) over case applications. Rewrite to A.Fold(RO.AltMonoid...).func, once, not inside a loop or per request.RO.GetOrElse, so Option does not leak.Option[IOResult[B]]) instead of running it in the guard.switch. Do not force this pattern where it adds nothing.© 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
Just SKILL.md in skills/fp-go-pattern-matching of IBM/fp-go.
Open the folder on GitHubat commit 1c4245d
fp-go Pattern Matching 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| fp-go Pattern Matching this skillIBM/fp-go | 2k | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Golang Dependency Injectionsamber/cc-skills-golang | 3.4k | — | ~3.2k | Automated safety check: Pass | MIT | |
| Golang Samber Docontext-labs/whip | 1.1k | 1 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Swiftui View RefactorDimillian/Skills | 4k | 5 repos | ~2k | Automated safety check: Pass | MIT | |
| RTK Rust Design Patternsrtk-ai/rtk | 83k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Architecture PatternsKartikLabhshetwar/better-shot | 2.4k | 2 repos | ~1.4k | Automated safety check: Pass | Custom licence |
samber/cc-skills-golang
Comprehensive guide for dependency injection (DI) in Golang.
context-labs/whip
Dependency injection in Go using samber/do — service containers, lifecycle, scopes, health checks, graceful shutdown, module organization.
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.
rtk-ai/rtk
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.
KartikLabhshetwar/better-shot
Deep dive into software architecture for macOS. An agent skill from KartikLabhshetwar/better-shot.
prisma/orm
Replaces a plain TypeScript union plus switch statements with frozen subclasses and a visitor interface when several places dispatch on the same variants.
IBM/fp-go
Covers handling Go's context.Context idiomatically in fp-go code: reading and scoping context through operators, timeouts, cancellation and converting ctx-first functions.
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.
IBM/fp-go
Shows how to build composable, context-aware HTTP pipelines in Go using fp-go's ReaderIOResult monad instead of raw net/http calls.
IBM/fp-go
Generates or hand-writes composable lenses for the fp-go library so nested Go structs can be read and updated immutably.
IBM/fp-go
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.
IBM/fp-go
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.
Works with
Categories
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. This skill applies to Go code written with the fp-go v2 functional library, covering a model where a case is a function returning an Option and a match is an ordered list of cases in which the first Some wins. It steers you toward composing cases from guards, getters, and formatters, reserving lambdas for leaf accessors or deliberate side effects inside tests.
fp-go Pattern Matching fits situations like: replacing a Go switch or if-else chain with composable pattern matching; writing a router, classifier, or multi-format parser in fp-go v2; reviewing fp-go code that chains Alt, FindFirstMap, or similar combinators.
Run `npx skills add IBM/fp-go --skill fp-go-pattern-matching -a claude-code`. Or copy the skill folder (skills/fp-go-pattern-matching in IBM/fp-go) into .claude/skills/fp-go-pattern-matching in your project. Claude Code loads it when a task matches its description.
Run `npx skills add IBM/fp-go --skill fp-go-pattern-matching -a codex`. Or copy the skill folder (skills/fp-go-pattern-matching in IBM/fp-go) into .agents/skills/fp-go-pattern-matching in your project. Codex loads it when a task matches its description.
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-pattern-matching -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-pattern-matching, .gemini/skills/fp-go-pattern-matching, .github/skills/fp-go-pattern-matching and .opencode/skills/fp-go-pattern-matching in your project.
Going by SKILL.md and its folder, fp-go Pattern Matching needs the command-line tools its instructions call (go). Our summary lists: Go with the github.com/IBM/fp-go/v2 package.
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.
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.
fp-go Pattern Matching 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.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with fp-go Pattern Matching: 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.
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.