Files
Meshtastic-Android/scripts/check-doc-freshness.js

56 lines
1.8 KiB
JavaScript

#!/usr/bin/env node
// scripts/check-doc-freshness.js
// Reports doc pages whose last_updated frontmatter is older than a threshold.
// Exit 0 = all fresh, Exit 1 = stale pages found (advisory).
//
// Usage: node scripts/check-doc-freshness.js [docs-dir] [--max-age-days=180]
"use strict";
const fs = require("fs");
const path = require("path");
const { parseFrontmatter, forEachDocPage } = require("./lib/frontmatter");
const args = process.argv.slice(2);
const positional = args.filter(a => !a.startsWith("--"));
const DOCS_DIR = path.resolve(positional[0] || path.join("docs", "en"));
const maxAgeArg = args.find(a => a.startsWith("--max-age-days="));
const MAX_AGE_DAYS = maxAgeArg ? parseInt(maxAgeArg.split("=")[1], 10) : 180;
const now = new Date();
let staleCount = 0;
let totalCount = 0;
console.log(`Checking doc freshness (max age: ${MAX_AGE_DAYS} days)...`);
console.log("");
forEachDocPage(DOCS_DIR, (filePath, slug, section) => {
totalCount++;
const content = fs.readFileSync(filePath, "utf-8");
const { fields } = parseFrontmatter(content);
if (!fields.last_updated) {
console.log(`${section}/${slug}.md — missing last_updated field`);
staleCount++;
return;
}
const lastUpdated = new Date(fields.last_updated);
const ageDays = Math.floor((now - lastUpdated) / (1000 * 60 * 60 * 24));
if (ageDays > MAX_AGE_DAYS) {
console.log(`${section}/${slug}.md — ${ageDays} days old (last: ${fields.last_updated})`);
staleCount++;
}
});
console.log("");
if (staleCount > 0) {
console.log(`${staleCount}/${totalCount} page(s) need review (older than ${MAX_AGE_DAYS} days or missing date).`);
process.exit(1);
} else {
console.log(`All ${totalCount} pages are fresh (updated within ${MAX_AGE_DAYS} days).`);
process.exit(0);
}