test(scanning): add regression tests for dot-folder exclusions

- codebase-generator: verify .claude/, .plans/, .cursor/, .vscode/ excluded
- detection: verify scanProjectFiles skips .claude, .gsd, .planning, .plans, .cursor, .vscode
This commit is contained in:
Jeremy 2026-04-08 13:08:12 -05:00
parent 757ce56594
commit 2c1e4b695e
2 changed files with 59 additions and 0 deletions

View file

@ -138,6 +138,28 @@ test("generateCodebaseMap: excludes .gsd/ files", () => {
}
});
test("generateCodebaseMap: excludes .claude/ and other tool directories", () => {
const base = makeTmpRepo();
try {
addFile(base, "src/main.ts");
addFile(base, ".claude/CLAUDE.md");
addFile(base, ".claude/memory/user.md");
addFile(base, ".plans/plan.md");
addFile(base, ".cursor/settings.json");
addFile(base, ".vscode/settings.json");
const result = generateCodebaseMap(base);
assert.ok(result.content.includes("`src/main.ts`"), "should include src/main.ts");
assert.ok(!result.content.includes("CLAUDE.md"), "should exclude .claude/ files");
assert.ok(!result.content.includes("user.md"), "should exclude .claude/memory/ files");
assert.ok(!result.content.includes(".plans"), "should exclude .plans/ files");
assert.ok(!result.content.includes(".cursor"), "should exclude .cursor/ files");
assert.ok(!result.content.includes(".vscode"), "should exclude .vscode/ files");
} finally {
cleanup(base);
}
});
test("generateCodebaseMap: excludes binary and lock files", () => {
const base = makeTmpRepo();
try {

View file

@ -17,6 +17,7 @@ import {
detectProjectState,
detectV1Planning,
detectProjectSignals,
scanProjectFiles,
} from "../detection.ts";
function makeTempDir(prefix: string): string {
@ -1188,3 +1189,39 @@ test("detectProjectSignals: Spring Boot settings-defined catalog accessor emits
cleanup(dir);
}
});
// ─── scanProjectFiles: RECURSIVE_SCAN_IGNORED_DIRS ──────────────────────
test("scanProjectFiles: excludes .claude, .gsd, .planning, .plans, .cursor, .vscode directories", () => {
const dir = makeTempDir("scan-ignore-dotdirs");
try {
// Create project files that should be included
mkdirSync(join(dir, "src"), { recursive: true });
writeFileSync(join(dir, "src", "main.ts"), "// main\n", "utf-8");
writeFileSync(join(dir, "README.md"), "# Project\n", "utf-8");
// Create tool directories that should be excluded
const excludedDirs = [".claude", ".gsd", ".planning", ".plans", ".cursor", ".vscode"];
for (const d of excludedDirs) {
mkdirSync(join(dir, d), { recursive: true });
writeFileSync(join(dir, d, "config.json"), "{}\n", "utf-8");
}
// Nested .claude directory
mkdirSync(join(dir, ".claude", "memory"), { recursive: true });
writeFileSync(join(dir, ".claude", "memory", "user.md"), "# Memory\n", "utf-8");
const files = scanProjectFiles(dir);
// Should include project files
assert.ok(files.includes("src/main.ts"), "should include src/main.ts");
assert.ok(files.includes("README.md"), "should include README.md");
// Should exclude all tool directories
for (const d of excludedDirs) {
const hasExcluded = files.some((f) => f.startsWith(`${d}/`));
assert.ok(!hasExcluded, `should exclude ${d}/ directory but found: ${files.filter((f) => f.startsWith(`${d}/`)).join(", ")}`);
}
} finally {
cleanup(dir);
}
});