WORK-084
ID:WORK-084Status:done

Inject $file.created and $file.modified Variables into Content Pipeline

Priority:highComplexity:moderateMilestone:v1.0.0Source:SPEC-029
changeset-release/main View source

Criteria completion

No incremental history — criteria tracking started on Apr 19.

Branches 3
History 7
  1. f2b3512
    Content editedby Claude
    Add {ID}-{slug}.md filename convention + migrate filenames subcommand
  2. 59ded4a
    Content editedby Claude
    Implement SPEC-037 plan package hardening: all 7 work items
  3. f262d7b
    Content editedby Claude
    Backfill source attributes on all 123 work items
  4. f0a845a
    Content editedby Claude
    chore(plan): check off acceptance criteria for 14 completed v1.0.0 work
  5. f87ae8d
    Content editedby Claude
    feat: implement file-derived timestamps for runes (SPEC-029)
  6. 2a05e00
    Content editedby Claude
    plan: assign WORK-083 through WORK-087 to milestone v1.0.0
  7. 43cadfe
    Created (done)by Claude
    plan: break down SPEC-029 into work items WORK-083 through WORK-087

Summary

Wire the shared git timestamp utility into packages/content/src/site.ts so that every page's Markdoc transform config includes $file.created and $file.modified variables. These join the existing $page and $frontmatter variables, making file timestamps available to any rune via standard Markdoc variable references.

Acceptance Criteria

  • loadContent() in packages/content/src/site.ts calls the git timestamp utility once before the page loop
  • Each page's contentVariables includes a file object with created and modified string properties
  • Three-tier resolution order: frontmatter override > git history > fs.stat fallback
  • When no timestamp is available, the variable is undefined (not an empty string or null)
  • Variables are accessible in Markdoc schemas as $file.created and $file.modified
  • Existing $page and $frontmatter variables are unaffected
  • Integration test: a page with no frontmatter dates gets git-derived $file.created and $file.modified
  • Integration test: a page with explicit frontmatter created/modified uses those values instead of git data

Approach

  1. Import the git timestamp utility in packages/content/src/site.ts
  2. Call it once at the start of loadContent() with the content root directory
  3. In the per-page loop, look up timestamps for each file path and merge into contentVariables
  4. Apply the three-tier fallback: check frontmatter first, then git map, then fs.stat

References

  • SPEC-029 (Phase 2 — Variable Injection)
  • WORK-083 (shared git timestamp utility — dependency)
  • packages/content/src/site.ts — existing variable injection point