tooling: adopt go tool directives; rename air→dev; bundle fmt drift - Justfile: rename `air:` to `dev:`, body uses `go tool air`; the three migrate recipes use `go tool migrate`; `fmt` adds `go fix ./...`. Stale `brew install golang-migrate` comment block replaced with the one-line `go get -tool` bootstrap hint. - README.md: quickstart says `just dev`. - go.mod: declare github.com/air-verse/air and golang-migrate's cmd in the `tool` block (Go 1.24+) so contributors never need a separate install step. Updates go.sum accordingly. - internal/domain/stats/repository.go: pre-existing `HostSplit` indent drift + trailing newline, surfaced by goimports inside the new fmt recipe.
stats: add /api/v1/stats aggregate endpoint Implements Phase 2 of lethe-web-ui-aggregates: a single-round-trip /api/v1/stats endpoint that bundles per-tool rollup, daily time-series, 84-cell activity heatmap, top-cwd ranking, hour-of-day distribution, and host split. All six aggregations run fresh per request; no server cache. - internal/domain/stats/buckets.go: pure helpers DailyWindow, FillDaily, HeatmapWindow, HourWindow — fully deterministic, tested independently. - internal/domain/stats/repository.go: Filter/Stats types and Repository.Stats — six SQL queries joined via sessions+turns, owner scope via OwnerScope (AllOwners / SpecificOwner / default), sparkline capped at 60 buckets. - internal/domain/stats/handler.go: Handler.List — ?range=7d|30d|90d|all (default 30d); ?range=<other> → 400 INVALID; ?owner= non-admin → 403. - internal/server/server.go: register *stats.Handler alongside project/sessions. - cmd/lethe/main.go: add statsRepo/statsHnd to var block and steward graph. - cmd/lethe/main_e2e_test.go: add stats.Repository/Handler to e2e graph.