Files
ImaGen/internal/server/server.go
mAi 237270b204 mAi: #211 - bootstrap ImaGen framework skeleton
First step of the model-agnostic image-generation framework. Lands the
plumbing other components (skill, ComfyUI/Replicate adapters, agents)
will plug into:

- internal/backend: Backend interface (Request/Result), thread-safe
  Registry with init-time Register, plus a Mock reference adapter that
  emits a deterministic gradient PNG for smoke tests.
- internal/config: YAML loader for ~/.config/imagen.yaml. Framework owns
  default_backend + output settings + a per-backend block; each adapter
  owns the schema below its own block via BackendSpec.Raw.
- internal/output: filename templating ({date}/{time}/{slug}/{seed}/
  {backend}/{ext}), JSON metadata sidecar, --output override path.
- internal/prompt: embedded styles.yaml, style-preset suffix application.
- internal/server: 501 stub — HTTP surface lands in a follow-up issue.
- cmd/imagen: generate / backends / config (init|validate|path) / serve
  / version subcommands. Stdlib-only flag parsing with a small helper to
  honour positional prompt args ahead of flags (matches the issue spec).
- Tests for output (slug, naming template, sidecar), backend (mock PNG
  validity + determinism, registry build + duplicate panic), config
  (round-trip + validation), prompt (style apply + unknown-style error).
- CLAUDE.md, README.md, docs/architecture.md, docs/usage.md, Makefile.

Acceptance criteria from #211:
1. go build ./... — clean
2. imagen backends — lists registered backends, exits 0
3. imagen generate "test prompt" --backend mock --output /tmp/x.png —
   writes a 1024x1024 PNG plus an x.png.json sidecar
4. imagen config init | imagen config validate — round-trips cleanly
5. CLAUDE.md "Adding a new adapter" — six-step recipe
2026-05-08 14:37:05 +02:00

32 lines
1.1 KiB
Go

// Package server is a placeholder for the HTTP surface that lets non-Go
// callers (skills, agents, otto) drive imagen without exec-ing the CLI.
//
// The CLI already covers the v0 use cases, so this package intentionally
// ships only an interface and a 501 stub. A follow-up issue (tracked after
// the ComfyUI + Replicate adapters land) will flesh it out.
package server
import (
"fmt"
"net/http"
)
// Server is the eventual HTTP shape. Concrete implementations can wrap a
// backend.Registry + config.Config and expose POST /v1/generate.
type Server interface {
Handler() http.Handler
}
// NotImplemented is the placeholder the CLI wires up if someone calls
// `imagen serve` before the real server lands.
type NotImplemented struct{}
// Handler returns an http.Handler that responds 501 to every request.
func (NotImplemented) Handler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHeader(http.StatusNotImplemented)
fmt.Fprintln(w, "imagen HTTP server: not implemented yet — use the CLI for now")
})
}