feat: bring Courseweave's features into CMU Courses #10
No reviewers
Labels
No labels
needs/docs
needs/research
needs/upstream
type/bug
type/external
type/feature
type/refactor
urgency
high
urgency
immediate
urgency
low
urgency
medium
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
ScottyLabs/courses!10
Loading…
Reference in a new issue
No description provided.
Delete branch "courseweave"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Brings Courseweave's features into CMU Courses, so CMU Courses does everything Courseweave does, plus friends and the registrar's final exam schedule. Decisions 14-43 in
sites/docs/src/decisions/record the architecture choices;sites/docs/src/courseweave.mdmaps each feature and the contracts between the pieces, andsites/docs/src/features.mdlists where each feature lives.Catalog (Rust)
courses-index buildturns the scraper's output (Stellic courses and degree programs, Schedule of Classes captures,data/fces.csv, the syllabus registry, the registrar's final exam PDFs) into onecatalog.sqlitein about 4 seconds, byte-identical across rebuilds (decisions 15, 18-22). It replacesscripts/import_catalog.py.courses-catalogdefines the file: JSON documents per audience plus relational tables for server-side queries. Public documents leave out instructors, rooms, FCEs, syllabi and Stellic degree programs (decision 20).courses-scraper --mode soccaptures CMU's public Schedule of Classes.Web API (Rust)
--features dev-authsigns in locally without Keycloak (26).sites/web/src/lib/api/openapi.json.Website (Svelte)
Before deploying
catalog.sqlite) and commitdeployments/catalog.json. Startup refuses the old six-file release; seesites/docs/src/deployment.md.SYLLABI_*secrets; the currentcdn-coursesbucket is publicly readable (decision 24).Testing
cargo test --workspace: catalog format, builder (including parity tests against Courseweave's output, run with--ignoredand the inputs), web API (44 tests).deno task check,deno task test(160 tests),deno task buildinsites/web.🤖 Generated with Claude Code
https://claude.ai/code/session_01To6tQkufybQpWVMd4tD5UH
src/lib/api is a same-origin JSON client: `{ code, message }` errors as a typed ApiError (offline, 401, 409 with the stored record, 429 with Retry-After), one function per route, and the types generated from the API's openapi.json (`deno task generate-api`). dev/mock-api.ts answers /api and /auth from memory when MOCK_API=1, with catalog documents read from a directory of Courseweave-format files. It is a serve-only Vite plugin loaded only when enabled, so it never reaches a build. Claude-Session: https://claude.ai/code/session_01To6tQkufybQpWVMd4tD5UHThe Friends section from the Figma: friend cards with what each friend shares (their schedule and the courses they're taking, with courses in common first), requests to accept, decline or cancel, adding friends by Andrew ID, invite links to make, copy, share or revoke, removing a friend after a confirmation, and the two sharing switches with what each shows. A friend's schedule opens in a dialog for any semester. The invite page says who sent an invite before it's accepted, through a new GET /api/friends/invites/{token} for members (ADR 38), and handles the student's own link, existing friends, pending requests and used links. Claude-Session: https://claude.ai/code/session_01To6tQkufybQpWVMd4tD5UHThe presets never break their labels ("6 / Units") and sit closer together, so all four fit down to a 260px rail. Claude-Session: https://claude.ai/code/session_01To6tQkufybQpWVMd4tD5UHThe scraper read every response as Latin-1, but the SOC's detail pages are UTF-8, so catalog descriptions with curly quotes, dashes or bullets were garbled ("Todayâ\u0080\u0099s"). Captures store each page's text as UTF-8, but the builder read them back as Latin-1, garbling accented titles in every SOC term ("Pokémon GO") and leaving a stray character after two. Both now decode by the declared charset and read captures as UTF-8, as Courseweave does. Claude-Session: https://claude.ai/code/session_01To6tQkufybQpWVMd4tD5UHView command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.