P8: 'the same story goes out as short posts'. Waves have pages (/:owner/:name/waves, src/web/pages/waves.ts), and the repository has activity.atom, but nothing lets a reader follow the waves.
Done:
[ ] GET /:owner/:name/waves.atom answers Atom (application/atom+xml), one entry per wave, newest first, capped at 50. Each entry carries the wave's headline as its title, its note as escaped HTML summary, and a link to the wave page. The ETag comes from the newest wave.
[ ] The waves page links to it with rel="alternate" type="application/atom+xml".
[ ] Read access matches the waves page: a private repository is a 404 to a reader who may not see it.
[ ] Tests: two waves give two entries in order; markup in a note is escaped; a private repository is a 404; a repeat with If-None-Match is a 304.
Files: src/web/pages/waves.ts, src/http/server.ts (one route), a test.
Before pushing: bun x tsc --noEmit and the tests you touched.
P8: 'the same story goes out as short posts'. Waves have pages (
/:owner/:name/waves,src/web/pages/waves.ts), and the repository hasactivity.atom, but nothing lets a reader follow the waves.Done:
GET /:owner/:name/waves.atomanswers Atom (application/atom+xml), one entry per wave, newest first, capped at 50. Each entry carries the wave's headline as its title, its note as escaped HTML summary, and a link to the wave page. The ETag comes from the newest wave.rel="alternate" type="application/atom+xml".Files: src/web/pages/waves.ts, src/http/server.ts (one route), a test. Before pushing:
bun x tsc --noEmitand the tests you touched.