docs: record shipped web tasks and dev tooling updates
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.
server: embed web SPA at /, wire build pipeline
- Add internal/server/web/embed.go with //go:embed all:dist and a
SPA fallback shim: file-not-found → serve index.html at 200.
- Commit dist/.gitkeep and dist/index.html (placeholder) so go build
works on a fresh clone; real build output stays gitignored.
- Mount web.Handler() as GET /* catch-all in server.go after /api/v1
so API routes and probe endpoints shadow the wildcard.
- Add three server tests: ServesSPAAtRoot, SPAFallbackForNonAPIPath,
APIPathsBypassSPA; update NotFoundReturnsProblemJSON for SPA era.
- Extend Justfile with web-{install,dev,build,test,lint,clean} targets;
build now depends on web-build.
- Add node:20-alpine web-builder stage to Dockerfile; COPY dist into
the Go builder stage before compiling.
feat(db): SQLite schema with FTS5 + migration runner
feat: bootstrap lethe server skeleton + wire contract