go/CLAUDE.md
Snider 60c0d4f6c7 refactor: Update import path for Core and add CLAUDE.md documentation
Signed-off-by: Snider <snider@host.uk.com>
2026-01-04 20:16:52 +00:00

3 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

Core is a Web3 Framework written in Go using Wails v3 to replace Electron for desktop applications. It provides a dependency injection framework for managing services with lifecycle support.

Build & Development Commands

This project uses Task for automation. Key commands:

# Run all tests
task test

# Generate test coverage
task cov
task cov-view          # Opens coverage HTML report

# GUI application (Wails)
task gui:dev           # Development mode with hot-reload
task gui:build         # Production build

# CLI application
task cli:build         # Build CLI
task cli:run           # Build and run CLI

# Code review
task review            # Submit for CodeRabbit review
task check             # Run mod tidy + tests + review

Run a single test: go test -run TestName ./...

Architecture

Core Framework (core.go, interfaces.go)

The Core struct is the central application container managing:

  • Services: Named service registry with type-safe retrieval via ServiceFor[T]() and MustServiceFor[T]()
  • Actions/IPC: Message-passing system where services communicate via ACTION(msg Message) and register handlers via RegisterAction()
  • Lifecycle: Services implementing Startable (OnStartup) and/or Stoppable (OnShutdown) interfaces are automatically called during app lifecycle

Creating a Core instance:

core, err := core.New(
    core.WithService(myServiceFactory),
    core.WithAssets(assets),
    core.WithServiceLock(),  // Prevents late service registration
)

Service Registration Pattern

Services are registered via factory functions that receive the Core instance:

func NewMyService(c *core.Core) (any, error) {
    return &MyService{runtime: core.NewServiceRuntime(c, opts)}, nil
}

core.New(core.WithService(NewMyService))
  • WithService: Auto-discovers service name from package path, registers IPC handler if service has HandleIPCEvents method
  • WithName: Explicitly names a service

Runtime (runtime_pkg.go)

Runtime is the Wails service wrapper that bootstraps the Core and its services. Use NewWithFactories() for custom service registration or NewRuntime() for basic setup.

ServiceRuntime Generic Helper (runtime.go)

Embed ServiceRuntime[T] in services to get access to Core and typed options:

type MyService struct {
    *core.ServiceRuntime[MyServiceOptions]
}

Error Handling (e.go)

Use the E() helper for contextual errors:

return core.E("service.Method", "what failed", underlyingErr)

Test Naming Convention

Tests use _Good, _Bad, _Ugly suffix pattern:

  • _Good: Happy path tests
  • _Bad: Expected error conditions
  • _Ugly: Panic/edge cases

Go Workspace

Uses Go 1.25 workspaces. The workspace includes:

  • Root module (Core framework)
  • cmd/core-gui (Wails GUI application)
  • cmd/examples/* (Example applications)

After adding modules: go work sync