← 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
M server.jsM test/smoke.js
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 →