Files
2026-06-17 07:15:32 +02:00

448 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Les 14 — Lesstof
## Cursor + Vercel: van leeg project naar preview-deploys
**Vak:** AI-Assisted Development
**Opleiding:** NOVI Hogeschool Utrecht
**Vorige les:** Les 13 — Agents
**Volgende les:** Les 15 — RAG + Embeddings
---
## Doel van deze les
Aan het einde van deze les heb je:
- Een vers Next.js project gescaffold via `npx create-next-app`
- Een GitHub-repo met je code
- Een Vercel-project met productie-URL én preview-URL's per branch
- Vercel CLI lokaal gekoppeld + één keer `vercel env pull` gedaan
- Een werkende `.cursor/rules/general.mdc` en `AGENTS.md` in je repo
- Twee features gebouwd via Cursor in eigen branches → twee preview-URL's
- Eén Pull Request gemerged naar productie
---
## 1. Scaffolden met `npx create-next-app`
### Wat het doet
`create-next-app` is het officiële scaffold-commando van het Next.js team. Eén commando, een paar interactieve vragen, en je hebt een werkende Next.js-app met sane defaults.
```bash
npx create-next-app@latest mijn-portfolio
```
### De prompts uitgelegd
| Vraag | Aanbevolen | Waarom |
|-------|-----------|--------|
| TypeScript? | **Ja** | strict typing voorkomt veel bugs |
| ESLint? | **Ja** | code-style consistency |
| Tailwind CSS? | **Ja** | utility-first styling, breed gebruikt |
| `src/` directory? | **Ja** | houdt project-root schoon |
| App Router? | **Ja** | de moderne Next.js flow (server components) |
| Turbopack? | **Ja** | snellere dev-builds |
| Import alias? | **`@/*`** | `@/components/foo` ipv `../../components/foo` |
### Wat je krijgt
```
mijn-portfolio/
├── .gitignore # node_modules, .next, .env.local zijn al gegitignored
├── next.config.ts
├── package.json
├── tsconfig.json
├── src/
│ └── app/
│ ├── layout.tsx # root layout
│ ├── page.tsx # homepage
│ └── globals.css
└── public/
```
Direct `npm run dev``localhost:3000` werkt. Vanaf hier ben je productief.
---
## 2. Git + GitHub
### Init en eerste push
```bash
git init
git add .
git commit -m "init"
git branch -M main
# Met gh CLI (snelst):
gh repo create mijn-portfolio --public --source=. --push
# Of handmatig:
# 1. github.com → New repository → naam → Create (leeg, GEEN README)
# 2. git remote add origin <url>
# 3. git push -u origin main
```
### Veelgemaakte fouten
| Fout | Oplossing |
|------|-----------|
| `gh: command not found` | `brew install gh` (Mac) / `winget install GitHub.cli` (Windows) |
| `Authentication required` | `gh auth login` doorlopen |
| `error: src refspec main does not match any` | Eerst `git add . && git commit -m "init"` |
| `fatal: remote origin already exists` | `git remote remove origin` en opnieuw |
### Wat zit er NIET in je commit
Check je `.gitignore` — Next.js zet er standaard de juiste regels in:
```
node_modules/
.next/
.env.local
.env*.local
```
**Belangrijk:** controleer altijd na je eerste push op github.com dat `.env.local` daar NIET staat. Een gelekte secret-key is dezelfde dag onveilig.
---
## 3. Vercel — drie stappen naar productie
### Project importeren
1. Ga naar **vercel.com/new**
2. Klik **Import Git Repository**
3. Kies je `mijn-portfolio` repo
4. Framework auto-detect: **Next.js**
5. Klik **Deploy**
Wacht ±45 seconden. Wat Vercel doet:
- Kloont je repo
- Detecteert framework
- Draait `npm install`
- Draait `npm run build`
- Deploy't naar Edge Network
- Geeft je een productie-URL
### Twee URL-types
| Type | URL-format | Trigger |
|------|------------|---------|
| **Productie** | `mijn-portfolio-<scope>.vercel.app` | push naar `main` |
| **Preview** | `mijn-portfolio-git-<branch>-<scope>.vercel.app` | push naar elke andere branch |
### Wat je vanaf nu krijgt zonder extra werk
- Elke push naar GitHub → automatische deploy
- Elke nieuwe branch → eigen preview-URL
- Pull Request → Vercel-bot post preview-URL als comment
- Productie-URL update vanzelf bij merge naar `main`
---
## 4. Environment Variables in Vercel
### Drie environments
| Environment | Actief bij |
|-------------|-----------|
| Production | deploys vanaf `main` |
| Preview | alle andere branches |
| Development | `vercel dev` lokaal |
Je kunt env vars in één, twee of alle drie tegelijk zetten.
### `NEXT_PUBLIC_` prefix
| Prefix | Wat gebeurt | Voorbeeld |
|--------|-------------|-----------|
| `NEXT_PUBLIC_FOO` | wordt in browser-bundle gestopt | publieke API-URL, Supabase anon-key |
| `FOO` (geen prefix) | alleen server-side beschikbaar | OpenAI key, Stripe secret, DB password |
**Regel:** zet `NEXT_PUBLIC_` ALLEEN op variabelen die echt publiek mogen zijn. Twijfel? Geen prefix.
### Via het dashboard
Settings → Environment Variables → Add. Vul naam + waarde, kies environments, save.
---
## 5. Vercel CLI
### Installeren
```bash
npm i -g vercel
vercel login # opent browser voor auth
```
### Belangrijkste commando's
```bash
vercel link # lokale folder → Vercel project
vercel env pull .env.local # productie env vars → lokaal
vercel env pull --environment=preview .env.local
vercel env add OPENAI_API_KEY production
vercel env rm OPENAI_API_KEY production
vercel env ls # lijst alle vars
vercel # interactieve deploy
vercel --prod # productie deploy (handmatig)
vercel logs # runtime logs
vercel logs --follow # stream logs live
```
### Typische workflow
```bash
# Project klaarzetten (eenmalig):
vercel link
# Bij elke nieuwe env var op productie:
vercel env pull .env.local
# Bij env var rotatie:
vercel env rm DATABASE_URL production
vercel env add DATABASE_URL production
```
---
## 6. Cursor — de IDE
### Wat is Cursor
Cursor is een VS Code-fork met AI als kernfeature. Niet een extensie — het is de editor. Werkt met Claude, GPT, Gemini en lokale modellen.
### Cursor 3 — twee windows
In Cursor 3 zijn er **twee hoofdvensters**:
| Window | Wat je er doet | Switch met |
|--------|----------------|-----------|
| **Editor Window** (classic) | Code schrijven en reviewen — als VS Code | Cmd+Shift+N → Editor |
| **Agents Window** | Meerdere agents parallel managen | Cmd+Shift+N → Agents |
**Sneltoets om te onthouden:** `Cmd+Shift+N` switcht tussen beide.
**Binnen het Editor Window:**
- **Cmd+L** — chat-paneel (kies modus: Ask / Agent / Plan)
- **Cmd+K** — inline edit op selectie
- **Tab** — accepteer AI auto-completion
- **Cmd+P** — file search (zoals VS Code)
**Binnen het Agents Window:**
- Overzicht met lokale, cloud en remote agents
- Op één plek alle running + done agents
**Gouden regel:**
- Code schrijven of 1 feature bouwen → **Editor Window** + **Agent mode** in chat
- Meerdere features parallel → **Agents Window** met Background agents
- Snelle tweak in 1 file → **Cmd+K**
> **Versie-noot:** info hieronder is gebaseerd op de officiële Cursor 3 documentatie (`cursor.com/docs`). Cursor 3.7 en hoger heeft alle besproken features. Sommige UI-details kunnen per minor-versie iets verschillen.
### Editor Window — stap voor stap
Je hoofdwerkplek voor code:
1. **Cmd+Shift+N** — switcht naar Editor Window (als je in Agents Window zat)
2. Layout: file explorer links, editor midden, terminal beneden (klassieke VS Code-stijl)
3. **Cmd+L** opent chat-paneel rechts
4. Voor snelle inline edits: selecteer code → **Cmd+K** → beschrijf wijziging
5. Cursor toont **diff inline** in de editor (niet in een aparte panel)
6. **Tab** om te accepteren, **Esc** om te rejecten
7. **Cmd+P** voor file search
8. **Tab** accepteert AI auto-completion suggesties
**Wanneer:** je standaard coding-flow, files reviewen met split screens, VS Code extensies gebruiken (linters, formatters, debugger).
**Tip:** kun je Cursor laten starten in Editor Window als default? Ja. Settings → "Open Agents Window on startup" → uit. Of start vanuit terminal met `cursor --classic`.
### Agent mode (binnen chat in Editor Window) — stap voor stap
De AI-modus *binnen* het chat-paneel:
1. **Cmd+L** opent chat-paneel rechts (in Editor Window)
2. Bovenaan chat: **mode-selector** → kies **"Agent"**
3. Typ de **hele taak** (niet een specifieke kleine wijziging)
4. *"Bouw een /about pagina met team-grid in onze huisstijl"*
5. **Enter** — agent start zelfstandig
6. Cursor toont een lopende **takenlijst** + voortgang per stap
7. Agent edit meerdere files, runt terminal-commando's (vraagt vooraf), kan zelfs **web browsen**
8. **Geen limiet** op aantal tool-calls per taak
9. Aan het einde: samenvatting → **Keep / Accept all** of per file
**Wanneer:** grotere features die meerdere bestanden raken, refactors, nieuwe pagina's of API-routes.
**Belangrijke tip:** hou je prompt specifiek. *"Bouw een about-pagina met team-grid"* = goed. *"Bouw een mooie website"* = veel te open.
### Background agents (Agents Window) — stap voor stap
**Async cloud-based agents** in geïsoleerde VMs:
**Cmd+Shift+N** → Agents Window opent.
**Een agent aanmaken:**
1. In Agents Window: klik **New agent** (of `+`)
2. Kies environment: **local / cloud / remote SSH**
3. Beschrijf de taak — specifiek, als een ticket
4. Optioneel: branch-naam (`feature/about`)
5. Klik **Start**
6. **Cmd+Shift+N** terug naar Editor Window — agent babysit zichzelf
**Resultaat ophalen:**
1. **Cmd+Shift+N** naar Agents Window
2. Klare agents staan op **Done** in de agents-lijst
3. Klik agent → zie **diff + commit message + alle stappen**
4. **Open in PR** → automatische PR op GitHub
5. Vercel maakt preview-URL → review → merge
**Triggers van buitenaf:** Background agents kun je in Cursor 3 ook starten vanuit je telefoon, Slack, GitHub of Linear — handig tijdens vergaderingen.
**Wanneer:** 24 parallelle features, lange refactors die je niet wilt babysitten, taken vanaf mobiel.
### Context — `@`-mentions
In chat type je `@` voor een autocomplete. Wat je kunt mention'en:
| Tag | Wat het doet |
|-----|--------------|
| `@file:foo.tsx` | inclusief één specifiek bestand |
| `@folder:components` | hele map als context |
| `@code:functionName` | losse functie of class |
| `@docs` | externe documentatie |
| `@web` | live web-search |
| `@git` | git history / blame |
| `@recommended` | Cursor suggereert zelf relevante bestanden |
**Tip:** hou de scope klein. Veel mentions in één chat verslechtert de output, niet verbetert.
### Cursor Rules
Markdown-bestanden in `.cursor/rules/` die aan elke prompt worden toegevoegd als systeem-instructie.
**Voorbeeld `.cursor/rules/general.mdc`:**
```markdown
---
description: Algemene project-conventies
alwaysApply: true
---
- TypeScript strict mode
- Tailwind voor styling — geen CSS modules
- Server components by default; "use client" alleen waar nodig
- Imports met @/ alias
- Geen any-types
```
YAML front-matter opties:
- `alwaysApply: true/false` — actief in elke prompt
- `globs: ["**/*.test.ts"]` — alleen actief op matching bestanden
- `description: "..."` — wat de rule doet
### Project context — `AGENTS.md`
Eén markdown-bestand in je repo-root dat beschrijft:
- Tech stack + waarom die keuzes
- Architectuur en belangrijke patronen
- Hoe lokaal draaien, hoe deployen
- Pointers naar belangrijke bestanden
`AGENTS.md` wordt door Cursor, Claude Code én GitHub Copilot gelezen. Eén file, meerdere tools.
### Background agents — async cloud
Tweede Cursor-sessie die asynchroon op een feature werkt, in een eigen Git branch, in een aparte tab.
**Workflow:**
1. Beschrijf feature → klik "open in background"
2. Agent werkt in eigen branch, jij blijft in main editor
3. Agent meldt zich klaar → review diff → apply/iterate/discard
**Wanneer:** voor parallelle features. Drie of vier agents tegelijk is normaal.
### Top 7 tips voor power-users
1. **Cmd+I** voor Composer met multi-file context (niet alleen Cmd+L)
2. **`@-recommended`** laat Cursor zelf relevante bestanden voorstellen
3. **Plan + Apply per stap** — niet alles in één klap accepteren
4. **`alwaysApply: false`** rules voor opt-in conventies
5. **Auto-mode** — Cursor kiest beste model per taak
6. **Cmd+Shift+Enter** voor diff-preview vóór accept
7. **Notepads** — herbruikbare prompt-snippets per project
---
## 7. De feature-workflow
### Vijf stappen, één feature
```
1. Plan → Cursor chat: beschrijf de feature, vraag plan
2. Branch → git checkout -b feature/x (Cursor kan dit ook)
3. Build → Apply het plan, eventueel inline tweaks
4. Commit+ → git add . && git commit -m "feat: x" && git push
Push
5. Preview → Vercel maakt preview-URL, test & itereer
```
### Eén feature ≈ 10 minuten
Inclusief AI denkwerk. Wat dit versnelt is niet dat AI mooier code schrijft — het is dat de **cycle korter wordt**.
### Anti-patterns
- Geen branch maken, direct op `main` werken (geen preview, geen rollback)
- 5 features in één commit ("WIP" commits)
- Plan niet lezen → Apply → het deugt niet → terugkrabbelen
- Background agents starten zonder duidelijke prompt → bagger output
---
## 8. Production checklist
Voordat je een app "klaar" beschouwt:
| Check | Waarom |
|-------|--------|
| Productie-URL werkt voor alle routes | Anders krijgen gebruikers 404 |
| Env vars staan goed (alle environments) | Anders crashen API routes |
| `.env.local` staat in `.gitignore` | Anders lekken keys op GitHub |
| Eerste feature-branch + PR gedaan | Bewijs dat preview-flow werkt |
| `.cursor/rules/general.mdc` is ingevuld | Anders weet Cursor je conventies niet |
| `AGENTS.md` is ingevuld | Anders weet AI de architectuur niet |
| Build slaagt zonder warnings | Anders begin je met technical debt |
| `404` en `error.tsx` pages bestaan | Voor nette foutmeldingen |
---
## 9. Verder lezen
- **Cursor docs** — `docs.cursor.com` — features, shortcuts, Rules-syntax
- **Vercel docs** — `vercel.com/docs` — alle CLI-commando's, env vars, domains
- **Next.js docs** — `nextjs.org/docs` — App Router, server components, routing
- **AGENTS.md spec** — `agentsmd.org` — community-gedragen format
- **Pro Git** (gratis online) — `git-scm.com/book` — definitieve Git-referentie
---
## Samenvatting
Vandaag heb je geleerd:
- Scaffolden met `npx create-next-app` — alle defaults uitgelegd
- Git init + GitHub push (via `gh` CLI of handmatig)
- Vercel project koppelen — productie + preview URLs gratis erbij
- Vercel CLI — `link`, `env pull/add/rm`, `logs`, `--prod`
- Environment variables — drie environments, `NEXT_PUBLIC_` prefix
- Cursor: chat, plan, build, inline edit, rules, AGENTS.md, background agents
- Feature workflow: plan → branch → build → push → preview
- Top tips voor Cursor power-users
Volgende les bouwen we hier RAG bovenop — een PDF Q&A-app met embeddings.