[object Object]

← back to build-pages

ui: visible export affordances — fleet.csv in footer + commits.csv/feed.atom/json on each project page + 2 smoke

29d618dbe35a75ec241bdc27b3abffa84ce3d584 · 2026-05-13 14:53:09 -0700 · SteveStudio2

Files touched

Diff

commit 29d618dbe35a75ec241bdc27b3abffa84ce3d584
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Wed May 13 14:53:09 2026 -0700

    ui: visible export affordances — fleet.csv in footer + commits.csv/feed.atom/json on each project page + 2 smoke
---
 server.js     | 12 ++++++++++++
 test/smoke.js |  2 ++
 2 files changed, 14 insertions(+)

diff --git a/server.js b/server.js
index 5d3ef07..0fcd2cb 100644
--- a/server.js
+++ b/server.js
@@ -212,6 +212,8 @@ function shell(title, body, headExtra = '', meta = {}) {
     <a href="/api">JSON API</a>
     <span class="bp-ftr-sep">·</span>
     <a href="/sitemap.xml">sitemap</a>
+    <span class="bp-ftr-sep">·</span>
+    <a href="/fleet.csv">fleet.csv</a>
   </footer>
 </body>
 </html>`;
@@ -473,6 +475,16 @@ app.get('/p/:slug', async (req, res, next) => {
         <p class="bp-meta">${files.length} files tracked. Click any to browse the source at HEAD.</p>
         <ul class="bp-files">${fileLis}</ul>
       </section>
+
+      <section class="bp-section">
+        <h2>Export</h2>
+        <p class="bp-meta">
+          <a href="/p/${esc(req.params.slug)}/commits.csv">commits.csv</a> ·
+          <a href="/p/${esc(req.params.slug)}/feed.atom">feed.atom</a> ·
+          <a href="/api/projects/${esc(req.params.slug)}">project.json</a> ·
+          <a href="/api/projects/${esc(req.params.slug)}/commits">commits.json</a>
+        </p>
+      </section>
     `, `
       <script>
         const DATA = ${idxData};
diff --git a/test/smoke.js b/test/smoke.js
index 5596085..fd44450 100644
--- a/test/smoke.js
+++ b/test/smoke.js
@@ -98,6 +98,7 @@ function check(name, cond, hint = '') {
   check('home: fleet search input',/id="fleet-q"/.test(r.body));
   check('home: footer /api link',  /href="\/api"/.test(r.body));
   check('home: footer sitemap link', /href="\/sitemap.xml"/.test(r.body));
+  check('home: footer fleet.csv',  /href="\/fleet.csv"/.test(r.body));
 
   // 5b. fleet search ?q= deep-link
   r = await fetch('/?q=whisper');
@@ -114,6 +115,7 @@ function check(name, cond, hint = '') {
   r = await fetch('/p/butlr?q=whisper');
   check('butlr ?q=: hydrated',     /value="whisper"/.test(r.body));
   check('butlr: SoftwareSourceCode JSON-LD', /"@type":"SoftwareSourceCode"/.test(r.body));
+  check('butlr: export section',   /commits\.csv.*feed\.atom.*project\.json/s.test(r.body));
 
   // 6d. commit detail page — BreadcrumbList JSON-LD
   // Probe a commit hash that's known to exist via /api/projects/butlr/commits

← f2d7363 csv: /fleet.csv — every commit across every project in one f  ·  back to build-pages  ·  Makefile: audit target c814a15 →