@@ -15,6 +15,7 @@ import { checkCrossFile } from "../src/drift/checkers/cross-file.js";
1515import { checkIndexSync } from "../src/drift/checkers/index-sync.js" ;
1616import { checkToolConfigSync } from "../src/drift/checkers/tool-config-sync.js" ;
1717import { checkTodoFixme } from "../src/drift/checkers/todo-fixme.js" ;
18+ import { checkFrontmatterCompleteness } from "../src/drift/checkers/frontmatter-completeness.js" ;
1819import type { Claim , ScaffoldFrontmatter } from "../src/types.js" ;
1920
2021vi . mock ( "../src/git.js" , ( ) => ( {
@@ -468,3 +469,39 @@ describe("checkTodoFixme", () => {
468469 expect ( issues . map ( ( i ) => i . line ) ) . toEqual ( [ 1 , 1 ] ) ;
469470 } ) ;
470471} ) ;
472+
473+ // ── Frontmatter completeness ──
474+
475+ describe ( "checkFrontmatterCompleteness" , ( ) => {
476+ it ( "warns on missing recommended fields in context/" , ( ) => {
477+ const issues = checkFrontmatterCompleteness (
478+ { name : "Auth" } ,
479+ "context/auth.md"
480+ ) ;
481+ expect ( issues ) . toHaveLength ( 2 ) ;
482+ expect ( issues . every ( ( i ) => i . severity === "warning" ) ) . toBe ( true ) ;
483+ expect ( issues . map ( ( i ) => i . message ) ) . toEqual (
484+ expect . arrayContaining ( [
485+ "Missing recommended frontmatter field: description" ,
486+ "Missing recommended frontmatter field: last_updated" ,
487+ ] )
488+ ) ;
489+ } ) ;
490+
491+ it ( "passes when all recommended fields are present" , ( ) => {
492+ const issues = checkFrontmatterCompleteness (
493+ {
494+ name : "Auth" ,
495+ description : "Authentication overview" ,
496+ last_updated : "2026-06-01" ,
497+ } ,
498+ "patterns/auth.md"
499+ ) ;
500+ expect ( issues ) . toHaveLength ( 0 ) ;
501+ } ) ;
502+
503+ it ( "ignores ROUTER.md and other scaffold files" , ( ) => {
504+ const issues = checkFrontmatterCompleteness ( null , "ROUTER.md" ) ;
505+ expect ( issues ) . toHaveLength ( 0 ) ;
506+ } ) ;
507+ } ) ;
0 commit comments