docs: add CLAUDE.md and README.md

Agent instructions and quick start guide with RouteGroup example.

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Snider 2026-02-20 15:57:44 +00:00
parent 095c38a8c4
commit 17ae94530d
2 changed files with 87 additions and 0 deletions

32
CLAUDE.md Normal file
View file

@ -0,0 +1,32 @@
# CLAUDE.md
This file provides guidance to Claude Code when working with the go-api repository.
## Project Overview
**go-api** is the REST framework for the Lethean Go ecosystem. It provides a Gin-based HTTP engine with middleware, response envelopes, WebSocket integration, and OpenAPI generation. Subsystems implement the `RouteGroup` interface to register their own endpoints.
- **Module path**: `forge.lthn.ai/core/go-api`
- **Language**: Go 1.25
- **Licence**: EUPL-1.2
See `docs/` for architecture, tool reference, and development guide.
## Build & Test Commands
```bash
go test ./... # Run all tests
go test -run TestName ./... # Run a single test
go test -v -race ./... # Verbose with race detector
go build ./... # Build (library — no main package)
go vet ./... # Vet
```
## Coding Standards
- **UK English** in comments and user-facing strings (colour, organisation, unauthorised)
- **Conventional commits**: `type(scope): description`
- **Co-Author**: `Co-Authored-By: Virgil <virgil@lethean.io>`
- **Error handling**: Return wrapped errors with context, never panic
- **Test naming**: `_Good` (happy path), `_Bad` (expected errors), `_Ugly` (panics/edge cases)
- **Licence**: EUPL-1.2

55
README.md Normal file
View file

@ -0,0 +1,55 @@
# go-api
REST framework + OpenAPI SDK generation for the Lethean Go ecosystem.
## Overview
go-api provides a Gin-based HTTP engine that subsystems plug into via the `RouteGroup` interface. Each ecosystem package (go-ml, go-rag, go-agentic, etc.) registers its own route group, and go-api handles the HTTP plumbing, middleware, response envelopes, WebSocket integration, and OpenAPI spec generation.
## Quick Start
```go
import api "forge.lthn.ai/core/go-api"
engine, _ := api.New(
api.WithAddr(":8080"),
api.WithBearerAuth("my-token"),
api.WithCORS("*"),
api.WithRequestID(),
api.WithSwagger("My API", "Description", "0.1.0"),
)
engine.Register(myRoutes)
engine.Serve(ctx)
```
## Implementing a RouteGroup
```go
type Routes struct{ service *mypackage.Service }
func (r *Routes) Name() string { return "mypackage" }
func (r *Routes) BasePath() string { return "/v1/mypackage" }
func (r *Routes) RegisterRoutes(rg *gin.RouterGroup) {
rg.GET("/items", r.ListItems)
rg.POST("/items", r.CreateItem)
}
func (r *Routes) ListItems(c *gin.Context) {
items, _ := r.service.List(c.Request.Context())
c.JSON(200, api.OK(items))
}
```
## Features
- **Response envelope**`api.OK()`, `api.Fail()`, `api.Paginated()` for consistent JSON responses
- **Middleware** — Bearer auth, CORS, request ID generation, panic recovery
- **WebSocket**`WithWSHandler()` mounts any `http.Handler` at `/ws`
- **Swagger UI**`WithSwagger()` serves interactive API docs at `/swagger/`
- **Health check** — Built-in `GET /health` endpoint
## Licence
EUPL-1.2