go-options-gen/SKILL.md
Expert in generating functional options for Go structs using the options-gen library.
npx skillsauth add metalagman/agent-skills go-options-genInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert in using the options-gen library (https://github.com/kazhuravlev/options-gen) to create robust, type-safe functional options for Go components. You prioritize unexported option fields to maintain encapsulation while providing a clean, exported API for configuration.
options.go, and generated code MUST be in options_generated.go.MyService, the struct (e.g., MyServiceOptions) MUST be in myservice_options.go, and generated code MUST be in myservice_options_generated.go.go tool options-gen.go.mod using:
go get -tool github.com/kazhuravlev/options-gen/cmd/options-gen@latest
go-playground/validator syntax) for configuration fields.Validate() method within the component's constructor.opts within your component struct.Installation: Ensure the tool is tracked in your project:
go get -tool github.com/kazhuravlev/options-gen/cmd/options-gen@latest
Define Options (options.go):
Define your options struct with unexported fields. Use the //go:generate directive to specify the output filename and the target struct.
package mypackage
import "time"
//go:generate go tool options-gen -from-struct=Options -out-filename=options_generated.go
type Options struct {
timeout time.Duration `option:"mandatory" validate:"required"`
maxRetries int `default:"3" validate:"min=1"`
endpoints []string `option:"variadic=true"`
}
Generate: Run the generator:
go generate ./options.go
Integration:
Use the generated types in your component's constructor and store them in an opts field.
type Component struct {
opts Options
}
func New(setters ...OptionOptionsSetter) (*Component, error) {
opts := NewOptions(setters...)
if err := opts.Validate(); err != nil {
return nil, fmt.Errorf("invalid options: %w", err)
}
return &Component{opts: opts}, nil
}
option:"mandatory" for fields that have no safe default (e.g., API keys, target URLs). These become required arguments in NewOptions().default:"value" for sensible defaults. options-gen supports basic types and time.Duration.For complex types (like maps or nested structs), use -defaults-from=func in the generate directive and define a provider function:
//go:generate go tool options-gen -from-struct=Options -out-filename=options_generated.go -defaults-from=func
func defaultOptions() Options {
return Options{
headers: map[string]string{"User-Agent": "my-client"},
}
}
validate:"required" for any field that must not be zero-valued.validate:"oneof=tcp udp" for enum-like string fields.validate:"min=1" for counters or sizes.For slice fields, use option:"variadic=true" to generate a setter that accepts multiple arguments (e.g., WithEndpoints("a", "b")) instead of a single slice (e.g., WithEndpoints([]string{"a", "b"})).
By keeping fields unexported in options.go, you ensure that the only way to configure the component is through the generated With* setters, which can include validation logic.
When a package contains multiple components (e.g., Client and Server), use prefixes to avoid name collisions in generated types and functions.
<prefix>_options.go and <prefix>_options_generated.go.-out-prefix to prefix the generated NewOptions and Option...Setter types.Example for MyService (myservice_options.go):
//go:generate go tool options-gen -from-struct=MyServiceOptions -out-filename=myservice_options_generated.go -out-prefix=MyService
type MyServiceOptions struct {
timeout time.Duration `option:"mandatory"`
}
This will generate NewMyServiceOptions and OptionMyServiceOptionsSetter, allowing them to coexist with other options in the same package.
development
Use this skill to design, document, and structure AI agent skills for Gemini, Claude, and Codex. It provides architectural rules, directory standards, and writing best practices.
development
Use this skill to initialize, configure, and run omnidist release workflows for Go projects (`init`, `ci`, `build`, `stage`, `verify`, `publish`) including npm and uv publishing setup.
development
Use this skill to install and use the upstream powerman/golangci-lint-strict config for an exact golangci-lint version by fetching the versioned config file unchanged.
development
Use this skill to write, refactor, or review Go code according to the Uber Go Style Guide. It ensures strict adherence to correctness, safety, and idiomatic patterns.