Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
a74cd19
scaffold extn
anchen9 Apr 16, 2026
e77eb90
extension frontend 70%
anchen9 Apr 17, 2026
756a450
token change
anchen9 Apr 17, 2026
45dd9ca
dashboard updates
NikhillA Apr 18, 2026
4894bcf
Dashboard
NikhillA Apr 22, 2026
a491293
prettier fixes pt2
anchen9 Apr 22, 2026
a085691
Merge remote-tracking branch 'origin/annie/extension' into annie/exte…
anchen9 Apr 23, 2026
3781b5c
new pages
NikhillA Apr 23, 2026
05f78b7
profile changes
NikhillA Apr 23, 2026
7fcdd67
Merge remote-tracking branch 'origin/main' into annie/extension
anchen9 Apr 23, 2026
ca3f539
prettier fix
anchen9 Apr 23, 2026
ca698a5
quick fixes
anchen9 Apr 23, 2026
6fa9d16
checkpoint: landing page
megany128 Apr 24, 2026
2d1572b
wip: dashboard home layout + sample data
megany128 Apr 24, 2026
adfb63b
merge: pull design system updates from annie/setup-design-system
megany128 Apr 24, 2026
7c75857
ui: wire up home page
megany128 Apr 24, 2026
8baadf5
checkpoint: dashboard ui
megany128 Apr 26, 2026
9a5eb8e
Add admin internal management page
benkoppe Apr 27, 2026
dce21f4
Add templates for easier joining
benkoppe Apr 27, 2026
ebb0de2
Automatic status and better confirmation queue logic
benkoppe Apr 27, 2026
d25d823
ui: finish landing page
megany128 Apr 27, 2026
5919461
chore: add convex AI files
megany128 Apr 27, 2026
ac2553d
Join tab treat cleared confirmation as authoritative
benkoppe Apr 27, 2026
fb32e9d
Add ai-based parsing
benkoppe Apr 27, 2026
3a36bf3
Reduce parser ambiguity
benkoppe Apr 27, 2026
a40ae7a
Store tab in search params
benkoppe Apr 27, 2026
2b0c1bb
feat: initial FE+BE wiring
megany128 Apr 27, 2026
f795408
Rewrite admin panel with claude
benkoppe Apr 27, 2026
55263e3
Security pass
benkoppe Apr 27, 2026
78f26f9
Auto-assign org when creating on Sources page
benkoppe Apr 27, 2026
d24dc7d
Consolidate source creation / org assignment
benkoppe Apr 27, 2026
70dba59
Allow for source editing
benkoppe Apr 27, 2026
779f513
Remove seed functionality for initial listservs
benkoppe Apr 27, 2026
b571db4
extension wrap up work
anchen9 Apr 27, 2026
a07fc56
prettier fix again
anchen9 Apr 27, 2026
ab8fc2c
Merge remote-tracking branch 'origin/nikhill/dashboard-cont' into int…
benkoppe Apr 27, 2026
2df7588
Merge remote-tracking branch 'origin/ben/get-emails' into integration…
benkoppe Apr 27, 2026
4199589
Integrate AI summaries and recommendation schema
benkoppe Apr 27, 2026
d9b2f38
Format ported ingestion files
benkoppe Apr 27, 2026
fba4008
Add root Convex scripts
benkoppe Apr 27, 2026
35d7cad
Run convex setup
benkoppe Apr 27, 2026
389fd91
Fix Convex event ordering index
benkoppe Apr 27, 2026
3108f54
Allow dev auth without deployment env
benkoppe Apr 27, 2026
0fddce4
Rename admin oauth vars
benkoppe Apr 27, 2026
67d97e7
Consolidate accidentally doubled organizations tables
benkoppe Apr 27, 2026
5360134
Fix edit organization name box
benkoppe Apr 27, 2026
0906ed3
Add panel for editing organizations
benkoppe Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "cd \"$CLAUDE_PROJECT_DIR\" && bun run type-check && bun run lint && bun run format:check",
"timeout": 120
}
]
}
]
}
}
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,11 @@ dist-ssr

# AI
CLAUDE.md
.cursor/
.cursor/

# Visual-QA artefacts (generated by scripts/screenshot-home.mjs)
specs/iterations/*.png

# Env
.env
.env.local
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ node_modules
dist
pnpm-lock.yaml
convex/_generated
apps/dashboard/test-results
apps/dashboard/playwright-report
75 changes: 75 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Cornell Loop — Agent Guide

Loop is an event-discovery dashboard for Cornell student orgs. Students follow clubs, RSVP to events, and browse a feed of upcoming happenings. Convex backs auth + data; a browser extension surface is also planned.

Keep this file concise — it loads every new session.

## Repo layout

- `apps/dashboard/` — Vite + React 19 + TypeScript SPA (the main web app).
- `shared/ui/` — design system (components, tokens, utils). Imported in the dashboard via the `@app/ui` alias (see `apps/dashboard/vite.config.ts`).
- `ai/`, `scripts/`, `specs/` — docs, codegen helpers, and visual-QA artefacts.

No other apps today; workspace is set up to grow (e.g. extension).

## Tech stack

- **React 19** + **React Router v7** (see `apps/dashboard/src/App.tsx` for routes).
- **Convex** (`@convex-dev/auth`) for auth. `ProtectedRoute` has a **dev bypass** — protected routes render without login when `import.meta.env.DEV`. Great for iteration. **Always read `apps/dashboard/convex/_generated/ai/guidelines.md` first** before touching Convex code — its rules override training data.
- **Tailwind CSS v4** via `@tailwindcss/vite`. No config file; content scanning is via `@source` directives inside `apps/dashboard/src/index.css`. **Important:** `shared/ui/src` is explicitly `@source`'d so design-system classes land in the generated CSS. If a design-system class silently stops working, check that this `@source` is still present.
- **Design tokens** are plain CSS custom properties in `shared/ui/src/styles/tokens.css` (`--color-*`, `--space-*`, `--font-*`, `--radius-*`, `--shadow-*`, etc.). **Never hardcode colors/spacing/fonts.** Reference tokens with Tailwind arbitrary-value syntax, e.g. `bg-[var(--color-surface)]`, `gap-[var(--space-4)]`.
- **Fonts**: DM Sans (body), Inter (UI), Manrope (brand wordmark). Loaded in `apps/dashboard/index.html`.
- **SVG** via `vite-plugin-svgr` (`import Icon from './x.svg?react'`).

## Package manager

- This repo uses **bun** (not pnpm — ignore any older doc that says otherwise).
- Root scripts forward into the dashboard package:
- `bun run dev` — start Vite (default 5173, falls back to 5174 if busy).
- `bun run build` — `tsc -b && vite build`.
- `bun run type-check` — `tsc --noEmit`.
- `bun run lint` — ESLint.
- `bun run format` / `bun run format:check` — Prettier (with tailwind plugin).
- If bun is unavailable in a sandbox, `node scripts/*.mjs` still works for scripts.

## Automated checks (Claude Stop hook)

A `Stop` hook in `.claude/settings.json` runs `bun run type-check && bun run lint && bun run format:check` at the end of every turn. If it fails, address the errors before finishing — even pre-existing ones.

## Visual QA workflow

- **Screenshot the dashboard** with Playwright:
- `node scripts/screenshot-home.mjs <label>` — screenshots `/home` at 1280/1440/1920 viewports into `specs/iterations/`.
- `node scripts/screenshot-scroll.mjs <label>` — screenshots scrolled state to verify sticky sidebar behaviour.
- Requires the dev server running: `bun run dev &`. The scripts assume `http://localhost:5174/home`; override with `HOME_URL=...`.
- `specs/iterations/*.png` is gitignored.
- Design-system gallery route (dev-only): `/design-system` renders every token and component with sample data. Use it as the visual source of truth when the Figma file conflicts with component behaviour.

## Sample data

`apps/dashboard/src/data/sampleHome.ts` exports `SAMPLE_POSTS`, `SAMPLE_RSVP_GROUPS`, `SAMPLE_CLUBS`. These feed `/home` until Convex tables exist.

## Coding rules

- **Ask clarifying questions** when a prompt or approach is unclear — don't guess.
- **Default to delegating** cohesive / repetitive / multi-file tasks to subagents. Reserve the main conversation for decision-making, proposals, and review. Brief subagents with: files to touch, pattern to follow, and "run type-check/lint/format when done".
- **Fix pre-existing warnings** in files you touch, regardless of origin.
- **Never use `any` or `as` casts.** Fix the type or schema properly.
- **Never leave TODOs.** Implement everything.
- **Never hardcode design values.** Reference `tokens.css` via `var(--…)`.
- When adding files, prefer editing existing ones. Don't create docs or READMEs unless asked.

## Figma MCP rules

Required flow for any Figma-driven change:

1. `get_design_context` with the exact node id(s).
2. If truncated, `get_metadata` → re-fetch specific nodes.
3. `get_screenshot` for the visual reference.
4. Download assets only after you have both context + screenshot. Start implementation then.
5. Translate the Tailwind output into **this repo's** tokens and existing components. Do not import icon packages — assets come from Figma. Reuse `Button`, `Tag`, `Avatar`, `DashboardPost`, `SearchPanel`, etc. from `@app/ui`.
6. Validate against the Figma screenshot.

The Figma MCP output is a representation, not final code. Use localhost image URLs directly when provided; never invent placeholders when one exists.

**When Figma and the design system disagree, the design system is the source of truth.** Confirm by checking `/design-system` or `shared/ui/src/components/*`.
26 changes: 26 additions & 0 deletions ai/prompts/eventSummary.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export function eventSummaryPrompt(description: string) {
return `
You are summarizing a single listserv event description for structured storage.

Your output will be saved directly as a short field in a database (e.g. \`aiDescription\` in Convex).

### Goal
Rewrite the description into one compact, high-signal summary.

### Requirements
- Keep the meaning accurate to the input.
- Focus on: what it is, who it is for, and the key value/CTA.
- Keep it between **14 and 28 words**.
- Use plain, neutral language.
- Do not include hype, emojis, hashtags, or marketing fluff.
- Do not invent details that are not present in the input.
- Avoid repeating exact phrases from the original when possible.

### Output format
- Return **only** the final condensed summary text.
- No labels, no quotes, no bullets, no markdown.

Description to summarize:
"""${description}"""
`;
}
Loading
Loading