# Les 2 — Lesstof
## OpenCode — AI Code Assistants in de terminal

**Vak:** AI Fundamentals
**Opleiding:** NOVI Hogeschool Utrecht
**Vorige les:** Les 1 — Introductie AI + LLMs
**Volgende les:** Les 3 — Cursor Basics

---

## Inhoud

1. [Het idee — AI als pair-programmer](#1-het-idee--ai-als-pair-programmer)
2. [Wat is OpenCode](#2-wat-is-opencode)
3. [OpenCode vs Cursor vs Claude Code](#3-opencode-vs-cursor-vs-claude-code)
4. [Installatie + setup](#4-installatie--setup)
5. [Basis-workflow in OpenCode](#5-basis-workflow-in-opencode)
6. [AGENTS.md — context geven](#6-agentsmd--context-geven)
7. [Plan mode vs Act mode](#7-plan-mode-vs-act-mode)
8. [Slim werken — context-management](#8-slim-werken--context-management)
9. [Limitaties + valkuilen](#9-limitaties--valkuilen)
10. [Productie-workflow tips](#10-productie-workflow-tips)

---

## 1. Het idee — AI als pair-programmer

In Les 1 zag je hoe AI je kan helpen prototypes maken (v0.dev → website in 10 minuten). Vandaag een ander gebruik van AI: **in je terminal, naast je code, als pair-programmer**.

Dit type AI-tool noemt men een **coding agent**. Verschil met chat-AI:

- Chat-AI (ChatGPT): typ prompt → antwoord in browser. Jij implementeert handmatig.
- Coding agent: typ prompt → AI **bewerkt direct je files**, runt commando's, ziet errors, fixt zelf.

OpenCode is zo'n coding agent — open-source, in je terminal, werkt met elk model (OpenAI, Anthropic, Gemini, lokale modellen).

---

## 2. Wat is OpenCode

**OpenCode** is een open-source CLI coding agent. Geïnstalleerd via npm, je runt 'm in je project-folder en chat met AI die direct in je codebase werkt.

### Kernfeatures

- **Multi-model** — kies OpenAI, Anthropic, Google, OpenRouter, Ollama (local)
- **Tool calling** — AI kan files lezen/schrijven, terminal commands runnen, tests draaien
- **AGENTS.md** — een markdown-file in je repo die AI als project-context gebruikt
- **Plan mode** — AI maakt eerst een plan voor je akkoord geeft (veiliger)
- **Open-source** — gratis, audit-baar, geen vendor lock-in

### Wat krijg je niet (vs. paid tools)

- Geen visuele editor zoals Cursor
- Geen IDE-integratie (werkt in terminal)
- Geen background agents zoals Cursor's cloud agents

Voor: developers die in terminal werken, willen experimenteren met models, of geen subscription willen.

---

## 3. OpenCode vs Cursor vs Claude Code

Drie populaire coding-agents in 2025. Allemaal anders.

| | OpenCode | Cursor | Claude Code |
|---|----------|--------|-------------|
| **Type** | CLI (terminal) | Full IDE (VS Code fork) | CLI (terminal) |
| **Cost** | Gratis (API-cost zelf) | $20/mnd Pro | $20/mnd Pro |
| **Model** | Elk (provider keuze) | Cursor's models + own keys | Alleen Claude |
| **Best voor** | Backend, scripts, experimenteren | Frontend, IDE-flow, leerlingen | Diepere code-tasks, agents |
| **Curve** | Steiler — terminal | Vlakker — IDE | Steiler — terminal |

**In deze leerlijn:**
- Les 2: OpenCode (begrijpen wat een coding agent doet, terminal-flow)
- Les 3: Cursor (full IDE-ervaring)
- Later: combineer beide naar smaak

Veel pro-devs gebruiken **beide** — Cursor voor IDE-werk, OpenCode/Claude Code voor swift terminal-tasks.

---

## 4. Installatie + setup

### Installeren

Eén command:

```bash
npm install -g opencode-ai
```

Of via brew:
```bash
brew install opencode-ai/tap/opencode
```

### API key

OpenCode heeft een model nodig. Twee opties:

**Optie A — OpenRouter** (aanbevolen voor leerlingen)
- Account op openrouter.ai
- $5 credit toevoegen — werkt met alle modellen, prepaid
- Eén key voor OpenAI, Anthropic, Google, etc.

**Optie B — Direct provider**
- OpenAI key, Anthropic key, etc. — directe billing

### Configureren

```bash
opencode auth login
# kies provider, plak key
```

Of via env:
```bash
export OPENROUTER_API_KEY=sk-or-v1-...
```

### Starten

In je project-folder:

```bash
cd ~/projects/mijn-app
opencode
```

Terminal opent een chat-interface. Type je vraag.

---

## 5. Basis-workflow in OpenCode

### Workflow 1 — Quick file edit

```
[opencode] > Voeg een README.md toe met basic install instructions

AI: [maakt README.md aan]
Je accepteert.
```

### Workflow 2 — Multi-file feature

```
[opencode] > Voeg een /about pagina toe in Next.js. Match de styling
            van de homepage.

AI: [leest app/page.tsx voor stijl, maakt app/about/page.tsx]
Diff getoond. Je accepteert per file.
```

### Workflow 3 — Bug fix

```
[opencode] > De Send button werkt niet. Console toont een TypeError.

AI: [leest console output, vindt de bug, fixt 'm]
```

### Slash commands

- `/init` — genereer AGENTS.md voor dit project
- `/clear` — clear conversation history
- `/model` — switch tussen models
- `/plan` — toggle plan mode

### Approval-flow

OpenCode vraagt approval voor:
- File-edits (per file, diff zichtbaar)
- Terminal commands (per command)

Goeie gewoonte: lees diff voordat je accepteert.

---

## 6. AGENTS.md — context geven

**AGENTS.md** = een markdown file in je project-root die AI gebruikt als "project context". Vergelijkbaar met `.cursorrules` (Cursor) of `CLAUDE.md` (Claude Code).

### Wat zet je erin?

```markdown
# AGENTS.md

## Project
- Naam: QuickPoll
- Stack: Next.js 16, TypeScript, Tailwind, Supabase
- Hosting: Vercel

## Conventies
- Use Tailwind classes, geen CSS-files
- Server Components by default, "use client" alleen waar nodig
- Maak geen comments tenzij gevraagd
- Run `pnpm lint` na elke file-edit

## Belangrijke files
- `app/` — Next.js App Router pages
- `lib/supabase.ts` — DB client
- `types/database.ts` — generated DB types
```

### Effect

AI gebruikt deze context bij elke prompt. Geen "ik gebruik Next.js met App Router" herhalen — AI weet het al.

### Best practice

Genereer eerst met `/init`, edit daarna handmatig. Hou 'm tussen 50-200 regels.

---

## 7. Plan mode vs Act mode

OpenCode heeft twee werkmodes.

### Act mode (default)

AI doet direct wat je vraagt. Snelle iteratie. Voor: kleine taken, je weet wat je wilt.

### Plan mode

AI maakt eerst een **plan** in tekst — welke files, welke wijzigingen, welke risk. Jij keurt af/goed. Pas daarna doet AI de wijzigingen.

```
[opencode] > /plan
[plan-mode] > Refactor /lib/auth.ts naar gebruik van Supabase auth

AI Plan:
1. Lees lib/auth.ts huidige logic (~80 regels)
2. Vervang door @supabase/ssr client
3. Update import in 3 files: app/login, app/api, middleware
4. Genereer types via supabase gen types

Akkoord? (y/n)
```

Voor: complexe refactors, onbekend gebied, code je niet wilt breken.

**Vuistregel:** plan mode bij twijfel. Kost je 30 seconden extra, voorkomt uren herstelwerk.

---

## 8. Slim werken — context-management

AI heeft een **context window** — wat het tegelijk kan onthouden. Bij OpenCode meestal 128k-200k tokens. Voelt veel, maar in een groot project ben je er snel doorheen.

### Tips

**Start nieuwe sessie per feature** — `/clear` na elke voltooide feature voorkomt context-pollution.

**Geef expliciet de juiste files** — AI hoeft niet je hele repo te lezen. "Werk in app/auth/login.tsx" is beter dan "fix de login".

**Houd AGENTS.md compact** — meer is niet beter. AI leest dit bij elke prompt.

**Skip large generated files** — node_modules, .next/, dist/. OpenCode doet dit by default maar check.

### Wanneer crasht context

- Mega-files (>5000 regels)
- Veel back-and-forth in één sessie (>50 berichten)
- Veel terminal-output (test-failures, log-dumps)

Symptoom: AI vergeet eerdere instructies, hallucineert files die niet bestaan. → `/clear`, herstart, kleinere scope.

---

## 9. Limitaties + valkuilen

### AI maakt fouten

- Verzint imports die niet bestaan
- Gebruikt verouderde APIs (Next.js 14 syntax in een Next.js 16 project)
- Hallucineert function-signatures

**Maatregel:** lint na elke change, draai tests, lees diff.

### AI is overtuigd van fout

Een fout antwoord klinkt soms net zo overtuigend als een goed. AI presenteert beide met evenveel zelfvertrouwen.

**Maatregel:** vraag "weet je dit zeker?", "geef bronnen", "test dit met de runtime".

### Over-engineering

AI maakt soms te veel — wrapper-classes, abstracties, type-gymnastics. Voor productie OK, voor leren niet.

**Maatregel:** "houd het simpel, kortste werkende versie".

### Onveilige commands

AI kan `rm -rf` voorstellen, of `git push --force`. Standaard moet je goedkeuren — maar dat is jouw veiligheidsmechanisme.

**Maatregel:** lees commands voor accepteren. Bij twijfel: weiger.

---

## 10. Productie-workflow tips

### Tip 1 — Klein per commit

AI kan een uur aan code in 10 minuten schrijven. Verleidelijk om alles tegelijk te doen. **Commit per logische eenheid** — kleinere PRs, makkelijker review, makkelijker rollback.

### Tip 2 — Test direct

"AI heeft het gemaakt, maar werkt het?" — runnen. Lint, build, unit tests. AI ziet eigen fouten via test-output en kan ze fixen — als je 'm de output geeft.

### Tip 3 — Lees diffs

Sla geen diffs over door snelheid. Aandachtig lezen voorkomt dat verkeerde wijzigingen in main belanden.

### Tip 4 — AGENTS.md als living doc

Update AGENTS.md als project evolueert. Nieuwe afspraken, nieuwe libraries, nieuwe gotchas → erin. AI-output verbetert.

### Tip 5 — Combineer met handmatig denken

AI is sneller, maar jij snapt de business. Architectuurkeuzes, productdecisies, security-tradeoffs — daar ben jij verantwoordelijk. AI is een hulp, geen vervanger.

---

## Bronnen

- **OpenCode docs:** https://opencode.ai/docs
- **OpenCode GitHub:** https://github.com/sst/opencode
- **OpenRouter:** https://openrouter.ai
- **AGENTS.md spec:** https://github.com/openai/agents.md
- **Cursor rules vs AGENTS.md:** https://docs.cursor.com/context/rules
- **Anthropic — Building effective agents:** https://www.anthropic.com/research/building-effective-agents
