From c7cdaa77cbe710e9abcde29215e054bc097967ac Mon Sep 17 00:00:00 2001 From: Michael Pursifull Date: Sat, 7 Feb 2026 13:59:15 -0600 Subject: [PATCH] fix: address review feedback on CSV validator extension - Surface CSV parse errors visibly instead of silently swallowing (no Layer 2c schema validator exists yet to catch these) - Add explanatory comments for the !VERBOSE logging pattern (non-verbose prints file headers only when issues found) - Add verbose-mode diagnostics for extensionless path handling ([SKIP] when nothing exists, [OK-DIR] for valid directories) --- tools/validate-file-refs.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tools/validate-file-refs.js b/tools/validate-file-refs.js index 0d076866e..aa886b40b 100644 --- a/tools/validate-file-refs.js +++ b/tools/validate-file-refs.js @@ -303,8 +303,15 @@ function extractCsvRefs(filePath, content) { skip_empty_lines: true, relax_column_count: true, }); - } catch { - return refs; // Skip unparseable CSV + } catch (error) { + // No CSV schema validator exists yet (planned as Layer 2c) — surface parse errors visibly. + // YAML equivalent (line ~198) defers to validate-agent-schema.js; CSV has no such fallback. + const rel = path.relative(PROJECT_ROOT, filePath); + console.error(` [CSV-PARSE-ERROR] ${rel}: ${error.message}`); + if (process.env.GITHUB_ACTIONS) { + console.log(`::warning file=${rel},line=1::${escapeAnnotation(`CSV parse error: ${error.message}`)}`); + } + return refs; } // Only process if workflow-file column exists @@ -421,6 +428,8 @@ if (require.main === module) { // Resolve and check const broken = []; + // Verbose mode: print file header for every file with refs (so [OK] lines have context). + // Non-verbose mode prints the header later, only when issues are found (see below). if (VERBOSE && refs.length > 0) { console.log(`\n${relativePath}`); } @@ -430,10 +439,18 @@ if (require.main === module) { const resolved = resolveRef(ref); if (resolved && !fs.existsSync(resolved)) { - // For paths without extensions, also check if it's a directory + // Extensionless paths may be directory references or partial templates. + // If the path has no extension, check whether it exists as a directory. + // Flag it if nothing exists at all — likely a real broken reference. const hasExt = path.extname(resolved) !== ''; if (!hasExt) { - // Could be a directory reference — skip if not clearly a file + if (!fs.existsSync(resolved)) { + if (VERBOSE) { + console.log(` [SKIP] ${ref.raw} (no extension, target not found)`); + } + } else if (VERBOSE) { + console.log(` [OK-DIR] ${ref.raw}`); + } continue; } broken.push({ ref, resolved: path.relative(PROJECT_ROOT, resolved) }); @@ -453,6 +470,8 @@ if (require.main === module) { // Report issues for this file if (broken.length > 0 || leaks.length > 0) { filesWithIssues++; + // Non-verbose: print file header only when reporting issues. + // Verbose mode already printed it above (for every file with refs). if (!VERBOSE) { console.log(`\n${relativePath}`); }