kessoku-di

Kessoku compile-time DI with parallel initialization for Go. Use when writing or debugging kessoku providers/injectors, enabling async dependencies, migrating from google/wire, or fixing go:generate/codegen issues in Go services.

$ Installieren

git clone https://github.com/mazrean/kessoku /tmp/kessoku && cp -r /tmp/kessoku/internal/llmsetup/skills/kessoku-di ~/.claude/skills/kessoku

// tip: Run this command in your terminal to install the skill


name: kessoku-di description: Kessoku compile-time DI with parallel initialization for Go. Use when writing or debugging kessoku providers/injectors, enabling async dependencies, migrating from google/wire, or fixing go:generate/codegen issues in Go services.

Kessoku: Parallel DI for Go

Kessoku is a compile-time dependency injection library that speeds up Go application startup through parallel initialization. Unlike google/wire (sequential), kessoku runs independent providers concurrently.

Use this skill when you are building or debugging kessoku injectors/providers, wiring async dependencies, migrating from google/wire, or troubleshooting go tool kessoku generation problems.

Supporting files: PATTERNS.md for examples, MIGRATION.md for wire migration, TROUBLESHOOTING.md for common errors.

When to Use Kessoku

  • Slow startup: Multiple DB connections, API clients, or cache initialization
  • Cold start optimization: Serverless/Lambda functions timing out
  • google/wire alternative: Want compile-time DI with parallel execution

Quick Start

//go:generate go tool kessoku $GOFILE

package main

import "github.com/mazrean/kessoku"

var _ = kessoku.Inject[*App](
    "InitializeApp",
    kessoku.Async(kessoku.Provide(NewDB)),     // Parallel
    kessoku.Async(kessoku.Provide(NewCache)),  // Parallel
    kessoku.Provide(NewApp),                   // Waits for deps
)

Run: go generate ./... → generates *_band.go

API Reference

APISyntaxPurpose
Injectvar _ = kessoku.Inject[T]("Name", ...)Define injector function
Providekessoku.Provide(NewFn)Wrap provider function
Asynckessoku.Async(kessoku.Provide(...))Enable parallel execution
Bindkessoku.Bind[Interface](provider)Interface→implementation
Valuekessoku.Value(v)Inject constant value
Setkessoku.Set(providers...)Group providers
Structkessoku.Struct[T]()Expand struct fields as deps

Common Patterns

Basic Injector

var _ = kessoku.Inject[*App](
    "InitializeApp",
    kessoku.Provide(NewConfig),
    kessoku.Provide(NewDB),
    kessoku.Provide(NewApp),
)
// Generates: func InitializeApp() *App

Parallel Initialization (Async)

var _ = kessoku.Inject[*App](
    "InitializeApp",
    kessoku.Async(kessoku.Provide(NewDB)),      // }
    kessoku.Async(kessoku.Provide(NewCache)),   // } Run in parallel
    kessoku.Async(kessoku.Provide(NewClient)),  // }
    kessoku.Provide(NewApp),
)
// Generates: func InitializeApp(ctx context.Context) (*App, error)

Interface Binding

var _ = kessoku.Inject[*App](
    "InitializeApp",
    kessoku.Bind[Repository](kessoku.Provide(NewPostgresRepo)),
    kessoku.Provide(NewApp),  // Receives Repository interface
)

Provider Sets (Reusability)

var DatabaseSet = kessoku.Set(
    kessoku.Provide(NewConfig),
    kessoku.Async(kessoku.Provide(NewDB)),
)

var _ = kessoku.Inject[*App]("InitializeApp",
    DatabaseSet,
    kessoku.Provide(NewApp),
)

Struct Field Expansion

var _ = kessoku.Inject[*DB](
    "InitializeDB",
    kessoku.Provide(NewConfig),   // Returns *Config{Host, Port}
    kessoku.Struct[*Config](),    // Expands to Host, Port fields
    kessoku.Provide(NewDB),       // Receives Host, Port separately
)

Key Points

  • No build tag needed: Unlike wire's //go:build wireinject
  • Async requires context: Generated function gets context.Context parameter
  • Error propagation: Providers returning error make injector return error
  • Cleanup functions: Providers can return func() for cleanup

Support Files

For detailed information, see:

Resources