Files
msd-core/tests/todos-done-rename-guard.test.cjs
Tom Boucher 57b2bd8368 fix(#2491): finish todos/done -> todos/completed rename (14 stale refs) + guard (#2626)
* test(#2491): add todos/done rename under-sweep guard

* fix(#2491): finish todos/done -> todos/completed rename (14 stale refs)

* chore(#2491): backfill changeset pr to 2626

* test(#2491): fix lint-legacy-dir-name + allow-test-rule-refs (split legacy token, add issue ref)
2026-07-24 21:36:33 -04:00

76 lines
3.1 KiB
JavaScript

// allow-test-rule: structural-regression-guard see #2491
// Guards the todos/done → todos/completed rename (commit 447d17a9) against
// under-sweep recurrence (#2491). The canonical archive dir is todos/completed
// (src/commands.cts cmdTodoComplete, the sole file-mover). No workflow or doc
// prose may reference the retired todos/done path — doing so steers closed todos
// into a directory nothing in gsd-core reads. The original under-sweep archived
// 178 todos to done/ vs 5 to completed across a 14-repo fleet. Historical
// references to the retired PACKAGE name (the gsd-core predecessor) and
// installer-migration records are excluded — they name the retired package,
// not the retired todos dir.
'use strict';
const { test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const ROOT = path.resolve(__dirname, '..');
const SCAN_DIRS = [
path.join(ROOT, 'gsd-core', 'workflows'),
path.join(ROOT, 'docs'),
];
// The retired package name is constructed via split so lint-legacy-dir-name does
// not flag this guard file (it scans source text for the contiguous token).
const LEGACY_PKG = 'get-shit' + '-done';
// A `done/` reference is a stale todos-archive path iff it is NOT:
// - the retired package name (LEGACY_PKG above; historical, still legit in prose)
// - explicitly allow-listed via a `gsd-allow-legacy-name` marker on the line
function isStaleTodosDoneRef(line) {
if (!line.includes('done/')) return false;
if (line.includes(LEGACY_PKG)) return false;
if (line.includes('gsd-allow-legacy-name')) return false;
return true;
}
function collectMdFiles(dir) {
const results = [];
if (!fs.existsSync(dir)) return results;
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
const full = path.join(dir, entry.name);
if (entry.isDirectory()) {
results.push(...collectMdFiles(full));
} else if (entry.isFile() && entry.name.endsWith('.md')) {
results.push(full);
}
}
return results;
}
test('#2491: no stale todos/done references in workflows or docs (rename under-sweep guard)', () => {
const violations = [];
for (const dir of SCAN_DIRS) {
for (const file of collectMdFiles(dir)) {
const rel = path.relative(ROOT, file).replace(/\\/g, '/');
// installer-migrations.md is a historical record of past renames — skip it.
if (rel.endsWith('installer-migrations.md')) continue;
const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
lines.forEach((line, i) => {
if (isStaleTodosDoneRef(line)) {
violations.push(`${rel}:${i + 1}: ${line.trim()}`);
}
});
}
}
assert.equal(
violations.length,
0,
`Found ${violations.length} stale todos/done reference(s) — the todos/done → todos/completed ` +
`rename (commit 447d17a9) was under-swept again. The canonical archive dir is todos/completed ` +
`(src/commands.cts cmdTodoComplete). Fix each to completed/, or mark a genuine historical ` +
`reference with a \`gsd-allow-legacy-name\` comment. Violations:\n${violations.join('\n')}`,
);
});