Auto-Discover Meeting Files from Frontmatter
Implement the following plan:
Auto-Discover Meeting Files from Frontmatter
Problem
The current meetingsRegistry in apps/web/lib/meetings.ts duplicates data from MDX frontmatter. When a meeting MDX file is created, it must also be manually added to the registry - which is error-prone (as demonstrated by the missing AI Scavenger Hunt meeting).
Solution
Auto-discover meeting files from the content/{semester}/meetings/ directory and extract metadata from their frontmatter. This eliminates the manual registry entirely.
Implementation
Modify apps/web/lib/meetings.ts
Replace the manual registry with file system scanning:
import fs from "fs";
import path from "path";
import matter from "gray-matter";
const CONTENT_DIR = path.join(process.cwd(), "../../content");
// Cache for discovered meetings
const meetingsCache = new Map<string, MeetingMeta[]>();
// Discover meetings by scanning the filesystem and reading frontmatter
function discoverMeetings(semesterId: string): MeetingMeta[] {
if (meetingsCache.has(semesterId)) {
return meetingsCache.get(semesterId)!;
}
const meetingsDir = path.join(CONTENT_DIR, semesterId, "meetings");
if (!fs.existsSync(meetingsDir)) {
return [];
}
const files = fs.readdirSync(meetingsDir)
.filter(f => f.endsWith(".mdx"));
const meetings: MeetingMeta[] = files.map(filename => {
const filePath = path.join(meetingsDir, filename);
const content = fs.readFileSync(filePath, "utf-8");
const { data } = matter(content);
return {
slug: filename.replace(".mdx", ""),
date: data.date,
title: data.title,
summary: data.summary,
};
});
meetingsCache.set(semesterId, meetings);
return meetings;
}
Update Existing Functions
getMeetings()→ callsdiscoverMeetings()instead of reading from registrygetMeetingSlugs()→ same change- Remove
meetingsRegistryentirely
Files to Modify
apps/web/lib/meetings.ts- Replace registry with auto-discoveryapps/web/package.json- Addgray-matterdependency
Commands
cd apps/web && bun add gray-matter
Verification
- Run
bun run devand check/spring2026/meetings - Verify both meetings appear (Welcome and AI Scavenger Hunt)
- Verify the AI Scavenger Hunt meeting is shown as "Upcoming" (since today is Jan 26, meeting is Jan 27)
- Click through to verify meeting pages load correctly
- Run
bun run buildto ensure static generation works
If you need specific details from before exiting plan mode (like exact code snippets, error messages, or content you generated), read the full transcript at: ~/.claude/projects/-Users-challen-www-usingandunderstanding-ai/ddad923f-a276-444b-ae3e-835237130518.jsonl
I'll implement the auto-discovery plan. Let me start by reading the current meetings.ts file and adding the dependency.
Let me check the meeting files to understand the frontmatter format.
Now let me update meetings.ts to auto-discover meetings from the filesystem.
Let me run TypeScript check to ensure there are no type errors.
Those are pre-existing errors unrelated to my changes. Let me specifically check the meetings.ts file.
Let me fix the import syntax for TypeScript compatibility.
The base config has esModuleInterop: true so the imports should work in the full project context. Let me check if the dev server is running and verify.
There's an error. Let me check the server logs for more details.
Let me debug by checking the content path resolution. I'll look at what path the web app is actually using.
I see the issue. Gray-matter automatically parses dates as Date objects, but the MeetingMeta interface expects strings. Let me fix this.
The page is working correctly. I can see both meetings:
- Upcoming: "AI Scavenger Hunt" (Tuesday, January 27, 2026)
- Past: "Welcome & AI Perspectives" (Thu, Jan 22)
Now let me verify the build works.
There's a Turbopack internal error during build. This appears to be related to synchronous file system operations during build time. Let me check if this was a pre-existing issue or if it's caused by my changes by checking the original build.
The build error is pre-existing and not caused by my changes. Let me restore my changes.
Implementation complete. Here's what was done:
Changes made:
-
Added
gray-matterdependency toapps/web/package.jsonfor parsing MDX frontmatter -
Replaced manual registry with auto-discovery in
apps/web/lib/meetings.ts:- Removed the hardcoded
meetingsRegistryobject - Added
discoverMeetings()function that scanscontent/{semester}/meetings/directory - Reads each
.mdxfile and extracts metadata from frontmatter using gray-matter - Added caching to avoid repeated file system reads
- Handles gray-matter's automatic date parsing by converting Date objects back to strings
- Removed the hardcoded
Verification:
- The meetings page at
/spring2026/meetingsnow shows both meetings:- Upcoming: "AI Scavenger Hunt" (January 27, 2026)
- Past: "Welcome & AI Perspectives" (January 22, 2026)
Note: The bun run build command fails with a Turbopack internal error, but this is a pre-existing issue unrelated to these changes (the build also fails with the original code).
Benefits:
- New meeting MDX files are automatically discovered - no need to update a registry
- Single source of truth - metadata lives only in frontmatter
- Eliminates the error-prone manual synchronization between MDX files and the registry
Your task
First, run git status, git diff, and git log --oneline -10 to understand the current state.
Then add and commit all modified files with a descriptive message. Break the changes into multiple commits if appropriate. If there are untracked files, ask if they should be added or added to the appropriate .gitignore file. The user may also want to take over at this point, so provide an abort option as well. Always check changes for unnecessary debugging statements or logging that might have been accidentally included. Prompt the user if you find any, and offer to remove each one by one. Do not use interactive git staging (git add -p) as it does not work.
The changes look clean - no debugging statements or unnecessary logging. Here's a summary:
Modified files:
apps/web/lib/meetings.ts- Replaced manual registry with auto-discovery from MDX frontmatterapps/web/package.json- Addedgray-matterdependencybun.lock- Updated lockfile
This is a single logical change (auto-discover meetings from frontmatter), so one commit is appropriate.
Committed successfully:
fbf4d8f Auto-discover meetings from MDX frontmatter
Your branch is 1 commit ahead of origin/main. Let me know if you'd like to push.
OK. Now, we need some kind of instructor view for group activities and stages. Right now the group activity shows the Find a Partner dialog to me, but I should not need to do that since I'm an instructor.
I'll explore the codebase to understand how the group activity components work and how instructor roles are handled.
This is a different task. Let me read the key files to understand the current GroupActivity implementation and design an instructor view.
Now I have a complete understanding. Let me write the plan.