# Agent-Sicherheit
Source: https://docs.cursor.com/de/account/agent-security
Sicherheitsaspekte bei der Verwendung von Cursor Agent
Prompt-Injection, KI-Halluzinationen und andere Probleme können dazu führen, dass sich KI unerwartet und potenziell bösartig verhält. Während wir weiter daran arbeiten, Prompt-Injection auf einer grundlegenderen Ebene zu lösen, bestehen unsere wichtigsten Schutzmechanismen in Cursor-Produkten aus Leitplanken für das Handeln eines Agents – einschließlich der standardmäßigen Anforderung einer manuellen Bestätigung für sensible Aktionen. Ziel dieses Dokuments ist es, unsere Leitplanken zu erklären und was du von ihnen erwarten kannst.
Alle unten aufgeführten Steuerungen und Verhaltensweisen sind unsere Standard- und empfohlenen Einstellungen.
## First-party-Toolaufrufe
Cursor wird mit Tools ausgeliefert, die dem Agent helfen, dir beim Coden zu helfen. Dazu gehören Dateilesen, Bearbeitungen, das Ausführen von Terminalbefehlen, die Suche im Web nach Doku und mehr.
Lese-Tools erfordern keine Freigabe (z. B. das Lesen von Dateien, die Suche im Code). Du kannst [.cursorignore](/de/context/ignore-files) verwenden, um dem Agent den Zugriff auf bestimmte Dateien komplett zu blockieren; ansonsten sind Lesevorgänge in der Regel ohne Freigabe erlaubt. Für Aktionen, die das Risiko der Exfiltration sensibler Daten bergen, verlangen wir eine explizite Freigabe.
Das Ändern von Dateien im aktuellen Workspace erfordert keine explizite Freigabe, mit einigen Ausnahmen. Wenn ein Agent Dateien ändert, werden die Änderungen sofort auf die Festplatte geschrieben. Wir empfehlen, Cursor in versionierten Workspaces zu nutzen, sodass Dateiinhalte jederzeit zurückgesetzt werden können. Wir verlangen eine explizite Freigabe, bevor Dateien geändert werden, die die Konfiguration unserer IDE/CLI anpassen, z. B. die Workspace-Einstellungsdatei des Editors. Wenn bei dir ein automatisches Neuladen bei Dateänderungen aktiv ist, beachte, dass Agent-Änderungen an Dateien eine automatische Ausführung auslösen können, bevor du sie prüfen konntest.
Jeder vom Agent vorgeschlagene Terminalbefehl erfordert standardmäßig eine Freigabe. Wir empfehlen, jeden Befehl zu prüfen, bevor der Agent ihn ausführt. Wenn du das Risiko akzeptierst, kannst du dem Agent erlauben, alle Befehle ohne Freigabe auszuführen. Wir bieten in Cursor eine [Allowlist](/de/agent/tools) an, betrachten sie jedoch nicht als Sicherheitskontrolle. Manche Nutzer erlauben bestimmte Befehle, aber das ist ein Best-Effort-System, und Umgehungen sind möglich. Wir empfehlen nicht „Run Everything“, da damit alle konfigurierten Allowlists umgangen werden.
## Aufrufe von Drittanbieter-Tools
Cursor ermöglicht das Einbinden externer Tools über [MCP](/de/context/mcp). Alle MCP-Verbindungen von Drittanbietern müssen ausdrücklich von dir genehmigt werden. Sobald du eine MCP-Verbindung genehmigt hast, muss in Agent Mode standardmäßig jeder vorgeschlagene Tool-Aufruf für jede externe MCP-Integration vor der Ausführung ausdrücklich bestätigt werden.
## Netzwerk-Anfragen
Netzwerk-Anfragen können von Angreifern genutzt werden, um Daten zu exfiltrieren. Wir unterstützen derzeit keine First‑Party‑Tools, die Netzwerk-Anfragen an andere Hosts als eine sehr kleine, ausgewählte Gruppe (z. B. GitHub) stellen, keine expliziten Linkabrufe und nur Websuche mit einer ausgewählten Gruppe von Anbietern. Beliebige Agenten‑Netzwerk-Anfragen werden in den Standardeinstellungen verhindert.
## Workspace-Trust
Die Cursor-IDE unterstützt die standardmäßige [Workspace-Trust](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust)-Funktion, die *deaktiviert* ist. Workspace-Trust zeigt dir beim Öffnen eines neuen Workspaces einen Dialog, in dem du zwischen normalem und eingeschränktem Modus wählen kannst. Der eingeschränkte Modus deaktiviert AI und andere Features, für die Nutzer Cursor typischerweise verwenden. Wir empfehlen dafür andere Tools, z. B. einen einfachen Texteditor, wenn du mit Repos arbeitest, denen du nicht vertraust.
Workspace-Trust kann in den Benutzereinstellungen aktiviert werden, indem du diese Schritte ausführst:
1. Öffne deine user settings.json-Datei
2. Füge die folgende Konfiguration hinzu:
```json theme={null}
"security.workspace.trust.enabled": true
```
Diese Einstellung kann auch organisationsweit über Mobile-Device-Management-(MDM)-Lösungen erzwungen werden.
## Verantwortungsvolle Offenlegung
Wenn du glaubst, eine Sicherheitslücke in Cursor gefunden zu haben, folge bitte der Anleitung auf unserer GitHub-Sicherheitsseite und reiche den Bericht dort ein. Wenn du GitHub nicht nutzen kannst, erreichst du uns auch unter [security@cursor.com](mailto:security@cursor.com).
Wir sagen zu, Meldungen über Sicherheitslücken innerhalb von 5 Werktagen zu bestätigen und sie so schnell wie möglich zu bearbeiten. Wir veröffentlichen die Ergebnisse als Sicherheitshinweise auf unserer GitHub-Sicherheitsseite. Kritische Vorfälle werden sowohl auf der GitHub-Sicherheitsseite als auch per E-Mail an alle Nutzer kommuniziert.
# Abrechnung
Source: https://docs.cursor.com/de/account/billing
Verwaltung von Cursor-Abos, Erstattungen und Rechnungen
### Wie greife ich auf die Abrechnungseinstellungen zu?
Greif über das [Dashboard](https://cursor.com/dashboard) auf das Abrechnungsportal zu, indem du in deinem Dashboard auf „Billing“ klickst. Dadurch öffnet sich ein sicheres Portal für alle Abrechnungsaufgaben.
### Wie laufen Cursors Abrechnungszyklen?
Abrechnungszyklen laufen monatlich oder jährlich und beginnen an deinem Abo-Startdatum. Team-Accounts werden pro Sitzplatz abgerechnet, mit anteiliger Verrechnung für neue Mitglieder.
### Wie funktionieren Sitzplätze bei Team-Accounts?
Team-Accounts berechnen pro Sitzplatz (einer pro Teammitglied). Wenn du Mitglieder mitten im Zyklus hinzufügst, zahlst du nur für die verbleibende Zeit. Wenn ein Mitglied Credits genutzt hat und entfernt wird, bleibt sein Sitz bis zum Ende des Abrechnungszyklus belegt – anteilige Rückerstattungen gibt’s nicht. Team-Admins können Sitze über das Dashboard verwalten.
### Kann ich zwischen monatlicher und jährlicher Abrechnung wechseln?
Ja! So geht’s:
**Pro-Plan**
1. Geh zum Cursor-[Dashboard](https://cursor.com/dashboard)
2. Klick links in der Seitenleiste auf „Billing and Invoices“, um zur Abrechnungsseite zu gelangen
3. Klick auf „Manage subscription“
4. Klick auf „Update subscription“
5. Wähl „Yearly“ oder „Monthly“ und klick dann auf „Continue“
**Teams-Plan**
1. Geh zum Cursor-[Dashboard](https://cursor.com/dashboard)
2. Klick links in der Seitenleiste auf „Billing and Invoices“, um zur Abrechnungsseite zu gelangen
3. Klick auf den Button „Upgrade Now“, um auf jährliche Abrechnung zu wechseln
Du kannst nur selbst von monatlicher auf jährliche Abrechnung wechseln. Um von jährlicher auf monatliche Abrechnung zu wechseln, kontaktier uns unter
[hi@cursor.com](mailto:hi@cursor.com).
### Wo finde ich meine Rechnungen?
Deinen kompletten Abrechnungsverlauf findest du im Abrechnungsportal. Dort kannst du aktuelle und frühere Rechnungen ansehen und herunterladen.
### Kann ich Rechnungen automatisch per E-Mail bekommen?
Rechnungen müssen derzeit manuell aus dem Abrechnungsportal heruntergeladen werden. Wir arbeiten an automatischen Rechnungs-E-Mails. Sobald verfügbar, kannst du dich dafür anmelden.
### Wie aktualisiere ich meine Abrechnungsinformationen?
Aktualisiere Zahlungsmethode, Firmenname, Adresse und Steuerinformationen im Abrechnungsportal. Wir verwenden Stripe für sichere Transaktionen. Änderungen wirken nur für zukünftige Rechnungen; historische Rechnungen können wir nicht anpassen.
### Wie kündige ich mein Abonnement?
Kündige dein Abo auf der Seite „Billing and Invoices“, indem du bei „Manage Subscription“ den Button „Cancel subscription“ klickst. Dein Zugriff bleibt bis zum Ende deines aktuellen Abrechnungszeitraums bestehen.
### Ich habe andere Abrechnungsprobleme. Wie bekomme ich Hilfe?
Für Abrechnungsfragen, die hier nicht beantwortet werden, schreib von der mit deinem Account verknüpften E-Mail-Adresse an [hi@cursor.com](mailto:hi@cursor.com). Bitte füge deine Account-Details und dein Anliegen bei.
# Preise
Source: https://docs.cursor.com/de/account/pricing
Cursor‑Pläne und ihre Preise
Du kannst Cursor kostenlos ausprobieren oder einen Einzel- oder Team‑Plan kaufen.
## Individuell
Alle individuellen Pläne enthalten:
* Unbegrenzte Tab-Vervollständigungen
* Erhöhte Agent-Nutzungslimits für alle Modelle
* Zugriff auf Bugbot
* Zugriff auf Background Agents
Jeder Plan umfasst nutzungsbasierte Abrechnung zu den [API-Preisen](/de/models#model-pricing) für Modellinferenz:
* Pro enthält \$20 an API-Agent-Nutzung + zusätzliche Bonusnutzung
* Pro Plus enthält \$70 an API-Agent-Nutzung + zusätzliche Bonusnutzung
* Ultra enthält \$400 an API-Agent-Nutzung + zusätzliche Bonusnutzung
Wir arbeiten hart daran, dir zusätzliche Bonuskapazität über die garantierte enthaltene Nutzung hinaus bereitzustellen. Da verschiedene Modelle unterschiedliche API-Kosten haben, beeinflusst deine Modellauswahl den Token-Output und wie schnell deine enthaltene Nutzung aufgebraucht wird. Nutzung und Token-Aufschlüsselungen findest du in [deinem Dashboard](https://cursor.com/dashboard?tab=usage). Limit-Benachrichtigungen werden regelmäßig im Editor angezeigt.
### Wie viel Nutzung brauche ich?
Basierend auf unseren Nutzungsdaten kannst du mit folgenden Nutzungsstufen rechnen:
* **Tägliche Tab-User**: Bleiben immer innerhalb von \$20
* **Gelegentliche Agent-User**: Bleiben oft innerhalb der enthaltenen \$20
* **Tägliche Agent-User**: Typischerweise $60–$100/Monat Gesamtnutzung
* **Power-User (mehrere Agents/Automatisierung)**: Oft \$200+/Monat Gesamtnutzung
Basierend auf unseren Nutzungsdaten entsprechen die Limits in etwa Folgendem für eine*n Median-User*in:
* Pro: \~225 Sonnet‑4‑Requests, \~550 Gemini‑Requests oder \~500 GPT‑5‑Requests
* Pro+: \~675 Sonnet‑4‑Requests, \~1.650 Gemini‑Requests oder \~1.500 GPT‑5‑Requests
* Ultra: \~4.500 Sonnet‑4‑Requests, \~11.000 Gemini‑Requests oder \~10.000 GPT‑5‑Requests
### Was passiert, wenn ich mein Limit erreiche?
Wenn du dein monatlich enthaltenes Nutzungskontingent überschreitest, wirst du im Editor benachrichtigt und kannst Folgendes tun:
* **On-Demand-Nutzung hinzufügen**: Cursor weiterhin zu den gleichen API-Preisen mit nutzungsbasierter Abrechnung verwenden
* **Deinen Plan upgraden**: Auf eine höhere Stufe wechseln, um mehr inkludierte Nutzung zu erhalten
On-Demand-Nutzung wird monatlich zu den gleichen Preisen wie deine inkludierte Nutzung abgerechnet. Anfragen werden niemals in Qualität oder Geschwindigkeit herabgestuft.
## Teams
Es gibt zwei Team-Pläne: Teams (\$40/Nutzer/Monat) und Enterprise (individuell).
Team-Pläne bieten zusätzliche Features wie:
* Erzwingen des Privacy Mode
* Admin-Dashboard mit Nutzungsstatistiken
* Zentrale Team-Abrechnung
* SAML/OIDC-SSO
Wir empfehlen Teams für alle, die sich gerne selbst versorgen. Wir empfehlen [Enterprise](/de/contact-sales) für Kunden, die Priority Support, geteilte Nutzung, Rechnungsstellung, SCIM oder erweiterte Sicherheitskontrollen benötigen.
Erfahre mehr über die [Teams-Preise](/de/account/teams/pricing).
## Auto
Wenn du Auto aktivierst, wählt Cursor basierend auf der aktuellen Auslastung das Premium‑Modell aus, das am besten zur jeweiligen Aufgabe passt und die höchste Zuverlässigkeit bietet. Diese Funktion erkennt degradierte Output‑Performance und wechselt bei Bedarf automatisch das Modell, um das Problem zu beheben.
Wir haben viel in die Qualität und Gesamtleistung von Auto investiert. Ab deiner nächsten Abrechnungsverlängerung nach dem 15. September wird Auto zu den folgenden API‑Tarifen abgerechnet.
* **Input + Cache Write**: \$1.25 pro 1M Tokens
* **Output**: \$6.00 pro 1M Tokens
* **Cache Read**: \$0.25 pro 1M Tokens
Sowohl der Editor als auch das Dashboard zeigen deinen Verbrauch an, einschließlich Auto. Wenn du ein Modell direkt auswählst, wird der Verbrauch zum Listen‑API‑Preis dieses Modells abgerechnet.
## Max-Modus
Bestimmte Modelle unterstützen den [Max-Modus](/de/models#max-mode), der längeres Reasoning und größere Kontextfenster mit bis zu 1 Mio. Tokens ermöglicht. Für die meisten Coding-Aufgaben ist der Max-Modus nicht nötig, kann aber bei komplexeren Anfragen hilfreich sein, insbesondere bei großen Dateien oder Codebases. Die Nutzung des Max-Modus verbraucht mehr Kontingent. Alle Anfragen und Token-Breakdowns findest du in [deinem Dashboard](https://cursor.com/dashboard?tab=usage).
## Bugbot
Bugbot ist ein eigenes Produkt, getrennt von Cursor-Abos, und hat seinen eigenen Preisplan.
* **Pro** (\$40/Monat): Unbegrenzte Reviews für bis zu 200 PRs/Monat, unbegrenzter Zugriff auf Cursor Ask, Integration mit Cursor zum Beheben von Bugs sowie Zugriff auf Bugbot Rules
* **Teams** (\$40/Nutzer/Monat): Unbegrenzte Code-Reviews für alle PRs, unbegrenzter Zugriff auf Cursor Ask, gemeinsamer Team-Pool für die Nutzung sowie erweiterte Regeln und Einstellungen
* **Enterprise** (Individuell): Alles aus Teams plus erweiterte Analysen und Reports, priorisierter Support und Account-Management
Erfahre mehr über die [Bugbot-Preise](https://cursor.com/bugbot#pricing).
## Background-Agent
Background-Agents werden zu den API-Preisen für das ausgewählte [Modell](/de/models) abgerechnet. Wenn du sie zum ersten Mal nutzt, wirst du gebeten, ein Ausgabenlimit für Background-Agents festzulegen.
Compute für virtuelle Maschinen (VM) für Background-Agents wird künftig separat bepreist.
# Admin-API
Source: https://docs.cursor.com/de/account/teams/admin-api
Greif per API auf Teammetriken, Nutzungsdaten und Ausgabeninformationen zu
Die Admin-API gibt dir programmgesteuerten Zugriff auf die Daten deines Teams, darunter Mitgliederinfos, Nutzungsmetriken und Ausgabendetails. Bau eigene Dashboards und Monitoring-Tools oder integrier sie in bestehende Workflows.
Die API ist in ihrer ersten Version. Wir erweitern die Funktionen basierend auf Feedback – sag uns, welche Endpunkte du brauchst!
## Authentifizierung
Alle API-Requests erfordern eine Authentifizierung mit einem API-Key. Nur Team-Admins können API-Keys erstellen und verwalten.
API-Keys sind an die Organisation gebunden, für alle Admins sichtbar und bleiben unabhängig vom Kontostatus der ursprünglichen Erstellerperson.
### Erstellen eines API-Schlüssels
1. Navigier zu **cursor.com/dashboard** → Tab **Settings** → **Cursor Admin API Keys**
2. Klick auf **Create New API Key**
3. Gib deinem Schlüssel einen aussagekräftigen Namen (z. B. „Usage Dashboard Integration“)
4. Kopier den generierten Schlüssel sofort – du wirst ihn nicht wieder sehen
Format: `key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
### Verwende deinen API‑Schlüssel
Verwende deinen API‑Schlüssel als Benutzernamen bei der Basic-Authentifizierung:
**Mit curl und Basic Auth:**
```bash theme={null}
curl https://api.cursor.com/{route} -u API_KEY:
```
**Oder setz den Authorization-Header direkt:**
```bash theme={null}
Authorization: Basic {base64_encode('API_KEY:')}
```
## Basis-URL
Alle API-Endpunkte verwenden:
```
https://api.cursor.com
```
## Endpoints
### Teammitglieder abrufen
Ruf alle Teammitglieder und ihre Details ab.
```
GET /teams/members
```
#### Antwort
Gibt ein Array von Teammitgliedern (Objekten) zurück:
```typescript theme={null}
{
teamMembers: {
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
}[];
}
```
#### Beispielantwort
```json theme={null}
{
"teamMembers": [
{
"name": "Alex",
"email": "developer@company.com",
"role": "Member"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "Owner"
}
]
}
```
#### Beispielanfrage
```bash theme={null}
curl -X GET https://api.cursor.com/teams/members \
-u DEIN_API_KEY:
```
### Tägliche Nutzungsdaten abrufen
Hol dir detaillierte tägliche Nutzungsmetriken für dein Team für einen bestimmten Zeitraum. Liefert Einblicke in Code-Änderungen, die Nutzung von KI-Unterstützung und Akzeptanzraten.
```
POST /teams/daily-usage-data
```
#### Request Body
| Parameter | Typ | Erforderlich | Beschreibung |
| :---------- | :----- | :----------- | :-------------------------------- |
| `startDate` | number | Ja | Startdatum in Epoch-Millisekunden |
| `endDate` | number | Ja | Enddatum in Epoch-Millisekunden |
Hol dir detaillierte Nutzungsereignisse für dein Team mit umfassenden Filter-, Such- und Paginierungsoptionen. Dieser Endpoint liefert granulare Einblicke in einzelne API-Aufrufe, die Nutzung von Modellen, den Tokenverbrauch und die Kosten.
```
POST /teams/filtered-usage-events
```
#### Request-Body
| Parameter | Typ | Erforderlich | Beschreibung |
| :---------- | :----- | :----------- | :---------------------------------------------- |
| `startDate` | number | Nein | Startdatum in Unix-Epoche (Millisekunden) |
| `endDate` | number | Nein | Enddatum in Unix-Epoche (Millisekunden) |
| `userId` | number | Nein | Nach bestimmter User-ID filtern |
| `page` | number | Nein | Seitennummer (1-basiert). Standard: `1` |
| `pageSize` | number | Nein | Anzahl der Ergebnisse pro Seite. Standard: `10` |
| `email` | string | Nein | Nach der E-Mail-Adresse des Users filtern |
| Field | Description |
| :---------------------- | :------------------------------------------------------------------------ |
| `totalUsageEventsCount` | Gesamtzahl der Nutzungsereignisse, die der Abfrage entsprechen |
| `pagination` | Paginierungsmetadaten zur Navigation durch die Ergebnisse |
| `timestamp` | Ereigniszeitstempel in Millisekunden seit Epoch |
| `model` | Für die Anfrage verwendetes KI-Modell |
| `kind` | Nutzungskategorie (z. B. „Usage-based“, „Included in Business“) |
| `maxMode` | Ob der Max‑Modus aktiviert war |
| `requestsCosts` | Kosten in Request‑Einheiten |
| `isTokenBasedCall` | True, wenn das Ereignis nutzungsbasiert abgerechnet wird |
| `tokenUsage` | Detaillierter Token‑Verbrauch (verfügbar, wenn isTokenBasedCall true ist) |
| `isFreeBugbot` | Ob dies eine kostenlose Bugbot‑Nutzung war |
| `userEmail` | E‑Mail des Users, der die Anfrage gestellt hat |
| `period` | Datumsbereich der abgefragten Daten |
**Alle Nutzungsereignisse mit Standard-Paginierung abrufen:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Nach Datumsbereich und bestimmtem Nutzer filtern:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
```
**Nutzungsereignisse für einen bestimmten User mit individueller Pagination abrufen:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": 12345,
"page": 2,
"pageSize": 50
}'
```
### Ausgabenlimit pro Nutzer festlegen
Lege Ausgabenlimits für einzelne Teammitglieder fest. So kannst du steuern, wie viel jede Person für die KI-Nutzung in deinem Team ausgeben darf.
```
POST /teams/user-spend-limit
```
**Rate-Limit:** 60 Anfragen pro Minute pro Team
#### Request-Body
| Parameter | Type | Required | Description |
| :------------------ | :----- | :------- | :------------------------------------------------------------------- |
| `userEmail` | string | Yes | E-Mail-Adresse des Teammitglieds |
| `spendLimitDollars` | number | Yes | Ausgabenlimit in US-Dollar (nur ganze Zahlen, keine Dezimalstellen). |
* Der Nutzer muss bereits Mitglied deines Teams sein
* Es werden nur ganze Zahlen akzeptiert (keine Dezimalbeträge)
* Wenn `spendLimitDollars` auf 0 gesetzt wird, ist das Limit \$0
#### Response
Gibt eine standardisierte Antwort zurück, die Erfolg oder Fehler anzeigt:
```typescript theme={null}
{
outcome: 'success' | 'error';
message: string;
}
```
#### Beispielantworten
**Limit erfolgreich gesetzt:**
```json theme={null}
{
"outcome": "success",
"message": "Ausgabenlimit von $100 für den User developer@company.com festgelegt"
}
```
**Fehlermeldung:**
```json theme={null}
{
"outcome": "error",
"message": "Ungültiges E‑Mail-Format"
}
```
Füge Repos hinzu und nutze Muster, um zu verhindern, dass Dateien oder Verzeichnisse für dein Team indexiert oder als Kontext verwendet werden.
#### Team-Repo-Blocklists abrufen
Alle für dein Team konfigurierten Repository-Blocklists abrufen.
```
GET /settings/repo-blocklists/repos
```
##### Antwort
Gibt ein Array von Blocklist-Objekten für Repositories zurück:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
##### Beispielantwort
```json theme={null}
{
"repos": [
{
"id": "repo_123",
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"id": "repo_456",
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}
```
##### Beispielanfrage
```bash theme={null}
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u DEIN_API_KEY:
```
#### Repo-Blocklisten updaten/erstellen
Ersetze bestehende Repository-Blocklisten für die angegebenen Repos.
*Hinweis: Dieser Endpunkt überschreibt nur die Muster für die angegebenen Repositories. Alle anderen Repos bleiben unverändert.*
```
POST /settings/repo-blocklists/repos/upsert
```
##### Request Body
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ----- | ------------ | --------------------------------------------- |
| repos | array | Ja | Array von Blocklist-Objekten für Repositories |
Jedes Repository-Objekt muss Folgendes enthalten:
| Feld | Typ | Erforderlich | Beschreibung |
| -------- | --------- | ------------ | ------------------------------------------------------------------------ |
| url | string | Ja | Repository-URL, die blocklistet werden soll |
| patterns | string\[] | Ja | Array von zu blockierenden Dateimustern (Glob-Muster werden unterstützt) |
##### Response
Gibt die aktualisierte Liste der Repository-Blocklists zurück:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
Entferne ein bestimmtes Repository aus der Blocklist.
```
DELETE /settings/repo-blocklists/repos/:repoId
```
##### Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ------ | ------------ | ----------------------------------------------- |
| repoId | string | Ja | ID der zu löschenden Blocklist des Repositories |
##### Antwort
Gibt bei erfolgreichem Löschen 204 No Content zurück.
Häufige Muster für die Blockliste:
* `*` - gesamtes Repository blocken
* `*.env` - alle .env-Dateien blocken
* `config/*` - alle Dateien im Verzeichnis config blocken
* `**/*.secret` - alle .secret-Dateien in beliebigen Unterverzeichnissen blocken
* `src/api/keys.ts` - eine bestimmte Datei blocken
# AI-Code-Tracking-API
Source: https://docs.cursor.com/de/account/teams/ai-code-tracking-api
Greife auf KI-generierte Code-Analysen für die Repositories deines Teams zu
Greife auf KI-generierte Code-Analysen für die Repositories deines Teams zu. Dazu zählen die KI-Nutzung pro Commit sowie detaillierte, akzeptierte KI-Änderungen.
Die API befindet sich in der ersten Version. Wir erweitern die Funktionen basierend auf Feedback – sag uns, welche Endpunkte du brauchst!
* **Verfügbarkeit**: Nur für Enterprise-Teams
* **Status**: Alpha (Response-Formate und Felder können sich ändern)
## Authentifizierung
Alle API-Anfragen erfordern eine Authentifizierung mit einem API-Schlüssel. Diese API verwendet dieselbe Admin-API-Authentifizierung wie andere Endpunkte.
Ausführliche Hinweise zur Authentifizierung findest du unter [Admin-API-Authentifizierung](/de/account/teams/admin-api#authentication).
## Basis-URL
Alle API-Endpunkte verwenden:
```
https://api.cursor.com
```
## Ratenlimits
* 5 Anfragen pro Minute pro Team, pro Endpoint
## Abfrageparameter
Alle folgenden Endpunkte akzeptieren dieselben Abfrageparameter über den Query-String:
| Parameter | Typ | Erforderlich | Beschreibung | |
| :---------- | :----- | :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| `startDate` | string | date | Nein | ISO-Datums-String, das Literal "now" oder relative Tage wie "7d" (entspricht now - 7 days). Standard: now - 7 days |
| `endDate` | string | date | Nein | ISO-Datums-String, das Literal "now" oder relative Tage wie "0d". Standard: now |
| `page` | number | Nein | Seitennummer (1-basiert). Standard: 1 | |
| `pageSize` | number | Nein | Ergebnisse pro Seite. Standard: 100, max.: 1000 | |
| `user` | string | Nein | Optionaler Filter auf einen einzelnen User. Akzeptiert E-Mail (z. B. [developer@company.com](mailto:developer@company.com)), kodierte ID (z. B. user\_abc123...) oder numerische ID (z. B. 42) | |
Responses geben userId als kodierte externe ID mit dem Präfix user\_ zurück. Das ist für die API-Nutzung stabil.
## Semantik und Berechnung der Metriken
* **Quellen**: „TAB“ steht für akzeptierte Inline-Completions; „COMPOSER“ steht für akzeptierte Diffs aus Composer
* **Zeilenmetriken**: tabLinesAdded/Deleted und composerLinesAdded/Deleted werden separat gezählt; nonAiLinesAdded/Deleted werden als max(0, totalLines - AI lines) abgeleitet
* **Privacy-Mode**: Wenn im Client aktiviert, können einige Metadaten (wie fileName) ausgelassen werden
* **Branch-Info**: isPrimaryBranch ist true, wenn der aktuelle Branch dem Standard-Branch des Repos entspricht; kann undefined sein, wenn Repo-Infos nicht verfügbar sind
Du kannst diese Datei scannen, um nachzuvollziehen, wie Commits und Änderungen erkannt und gemeldet werden.
## Endpunkte
### AI-Commit-Metriken abrufen (JSON, paginiert)
Abrufe aggregierter Metriken pro Commit, die Zeilen TAB, COMPOSER und Nicht-AI zuordnen.
```
GET /analytics/ai-code/commits
```
Ruf detaillierte, akzeptierte AI-Änderungen ab, gruppiert nach deterministischer changeId. Nützlich, um akzeptierte AI-Events unabhängig von Commits zu analysieren.
```
GET /analytics/ai-code/changes
```
Lad Änderungsmetriken als CSV für umfangreiche Datenextraktionen herunter.
```
GET /analytics/ai-code/changes.csv
```
#### Antwort
Headers:
* Content-Type: text/csv; charset=utf-8
#### CSV-Spalten
| Spalte | Typ | Beschreibung |
| :-------------------- | :----- | :------------------------------------------------ |
| `change_id` | string | Deterministische ID der Änderung |
| `user_id` | string | Kodierte Benutzer-ID |
| `user_email` | string | E‑Mail-Adresse des Users |
| `source` | string | Quelle der KI-Änderung (TAB oder COMPOSER) |
| `model` | string | Verwendetes KI-Modell |
| `total_lines_added` | number | Gesamtzahl hinzugefügter Zeilen |
| `total_lines_deleted` | number | Gesamtzahl gelöschter Zeilen |
| `created_at` | string | Ingestions-Timestamp (ISO-Format) |
| `metadata_json` | string | JSON-serialisiertes Array von Metadaten-Einträgen |
#### Hinweise
* metadata\_json ist ein JSON-serialisiertes Array von Metadaten-Einträgen (im Datenschutzmodus kann fileName entfallen)
* Beim Verarbeiten von CSV unbedingt gequotete Felder korrekt parsen
* Verwende den Parameter `user`, um schnell einen einzelnen User über alle Endpunkte zu filtern
* Für große Datenextraktionen nutze lieber die CSV-Endpunkte — sie streamen serverseitig in Seiten mit 10.000 Einträgen
* `isPrimaryBranch` kann undefined sein, wenn der Client den Default-Branch nicht auflösen konnte
* `commitTs` ist der Commit-Zeitstempel; `createdAt` ist die Zeit, zu der die Daten auf unseren Servern ingestiert wurden
* Einige Felder können fehlen, wenn der Privacy-Mode im Client aktiviert ist
## Changelog
* **Alpha-Release**: Erste Endpunkte für Commits und Änderungen. Response-Formate können sich anhand von Feedback weiterentwickeln
# Analytics
Source: https://docs.cursor.com/de/account/teams/analytics
Teamnutzung und Aktivitätsmetriken nachverfolgen
Team-Admins können Metriken im [Dashboard](/de/account/teams/dashboard) nachverfolgen.
### Gesamtnutzung
Sieh dir aggregierte Kennzahlen für dein Team an, inklusive Gesamtzahl der Tabs und Premium-Anfragen. Für Teams, die jünger als 30 Tage sind, zeigen die Kennzahlen die Nutzung seit der Erstellung, einschließlich der Aktivität von Teammitgliedern vor ihrem Beitritt.
### Pro aktiver Nutzer
Sieh dir durchschnittliche Kennzahlen pro aktivem Nutzer an: akzeptierte Tabs, Codezeilen und Premium-Anfragen.
### Nutzeraktivität
Verfolge wöchentlich und monatlich aktive Nutzer.
## Kopfzeilen des Analytics-Berichts
Wenn du Analysedaten aus dem Dashboard exportierst, enthält der Bericht detaillierte Metriken zum Nutzerverhalten und zur Funktionsnutzung. Das bedeuten die einzelnen Kopfzeilen:
### Nutzerinformationen
Das Datum, an dem die Analysedaten aufgezeichnet wurden (z. B. 2024-01-15T04:30:00.000Z)
Eindeutiger Bezeichner für jeden Nutzer im System
E-Mail-Adresse des Nutzers, die mit seinem Konto verknüpft ist
Gibt an, ob der Nutzer an diesem Datum aktiv war
### KI-generierte Code-Metriken
Gesamtzahl der vom KI-Chat vorgeschlagenen hinzugefügten Codezeilen
Gesamtzahl der vom KI-Chat vorgeschlagenen zu löschenden Codezeilen
KI-vorgeschlagene Zeilen, die der Nutzer akzeptiert und seinem Code hinzugefügt hat
Vom Nutzer akzeptierte KI-vorgeschlagene Löschungen
### Metriken zur Funktionsnutzung
Anzahl der Male, die ein Nutzer KI-generierte Änderungen aus dem Chat angewendet hat
Anzahl der Male, die ein Nutzer KI-Vorschläge akzeptiert hat
Anzahl der Male, die ein Nutzer KI-Vorschläge abgelehnt hat
Anzahl der Male, die KI-Vorschlags-Tabs dem Nutzer angezeigt wurden
Vom Nutzer akzeptierte KI-Vorschlags-Tabs
### Metriken nach Anfragetyp
Anfragen über die Composer/Edit-Funktion (Cmd+K Inline-Edits)
Chat-Anfragen, bei denen Nutzer der KI Fragen gestellt haben
Anfragen an KI-Agents (spezialisierte KI-Assistenten)
Anzahl der Nutzungen der Cmd+K- (oder Ctrl+K-) Befehlspalette
### Abonnement- und API-Metriken
KI-Anfragen, die durch den Abonnementplan des Nutzers abgedeckt sind
Anfragen, die mit API-Schlüsseln für programmatischen Zugriff gestellt wurden
Anfragen, die zur nutzungsbasierten Abrechnung zählen
### Zusätzliche Features
Anzahl der Nutzungen der KI-Funktion zur Fehlererkennung/-behebung
### Konfigurationsinformationen
Das KI-Modell, das der Nutzer am häufigsten verwendet hat (z. B. GPT-4, Claude)
Am häufigsten verwendete Dateierweiterung beim Anwenden von KI-Vorschlägen (z. B. .ts,
.py, .java)
Am häufigsten verwendete Dateierweiterung bei Tab-Completion-Features
Verwendete Version des Cursor-Editors
### Berechnete Metriken
Der Bericht enthält außerdem aufbereitete Daten, die helfen, den KI-Codebeitrag zu verstehen:
* Total Lines Added/Deleted: Rohanzahl aller Codeänderungen
* Accepted Lines Added/Deleted: Zeilen, die aus KI-Vorschlägen stammen und akzeptiert wurden
* Composer Requests: Anfragen über die Inline-Composer-Funktion
* Chat Requests: Anfragen über die Chat-Oberfläche
Alle numerischen Werte sind standardmäßig 0, wenn nicht vorhanden, boolesche Werte sind standardmäßig
false und Zeichenfolgenwerte sind standardmäßig leere Strings. Metriken werden pro Nutzer
auf Tagesebene aggregiert.
# Analytics V2
Source: https://docs.cursor.com/de/account/teams/analyticsV2
Erweiterte Nachverfolgung von Teamnutzung und Aktivitätsmetriken
Wir arbeiten an einem V2-Release unserer Analytics-Infrastruktur. Dazu gehört ein Refactor der Art und Weise, wie wir verschiedene Metriken erfassen.
Ab dem **1. September 2025** und für Nutzer auf **Cursor Version 1.5** verwenden die Analytics unsere V2-Infrastruktur. Frühere Versionen haben verschiedene Metriken zu niedrig erfasst, darunter:
* Gesamtzahl akzeptierter Codezeilen
* Gesamtzahl vorgeschlagener Codezeilen
* Gesamtzahl akzeptierter Tabs
Bleib dran, während wir weiter in Analytics investieren und neue Features in diesem Bereich veröffentlichen.
# Dashboard
Source: https://docs.cursor.com/de/account/teams/dashboard
Verwalte Abrechnung, Nutzung und Teameinstellungen über dein Dashboard
Über das Dashboard kannst du die Abrechnung verwalten, nutzungsbasierte Preisgestaltung einrichten und dein Team managen.
## Übersicht
Hol dir eine schnelle Zusammenfassung der Teamaktivität, Nutzungsstatistiken und jüngsten Änderungen. Die Übersichtsseite bietet dir auf einen Blick Einblicke in deinen Workspace.
## Einstellungen
Konfigurier teamweite Einstellungen und Sicherheitsoptionen. Die Seite „Einstellungen“ beinhaltet:
## Teams- & Enterprise-Einstellungen
Steuer die Datenfreigabe-Einstellungen für dein Team. Konfigurier Zero-Data-Retention-Richtlinien mit KI-Providern (OpenAI, Anthropic, Google Vertex AI, xAI Grok) und verwalt die teamweite Datenschutzdurchsetzung.
{" "}
Aktivier nutzungsbasierte Abrechnung und setz Ausgabenlimits. Konfigurier monatliche Team-Ausgabenlimits und optionale Limits pro Nutzer. Steuer, ob nur Admins diese Einstellungen ändern dürfen.
{" "}
Konfigurier AWS-Bedrock-IAM-Rollen für eine sichere Cloud-Integration.
{" "}
Richt SSO-Authentifizierung für Enterprise-Teams ein, um den Zugriff zu vereinfachen und die Sicherheit zu verbessern.
{" "}
Erstell und verwalt API-Schlüssel für den programmatischen Zugriff auf die Admin-Funktionen von Cursor.
{" "}
Überwach und verwalt aktive Sitzungen in deinem Team.
Erstell und verwalt Einladungscodes, um neue Teammitglieder hinzuzufügen.
Greif auf die REST-API-Endpunkte von Cursor für die programmatische Integration zu. Alle API-Endpunkte sind in den Team- und Enterprise-Plänen verfügbar, außer der [AI Code Tracking API](/de/docs/account/teams/ai-code-tracking-api), die eine Enterprise-Mitgliedschaft erfordert.
## Exklusive Enterprise-Einstellungen
{" "}
Steuere, welche KI-Modelle für Teammitglieder verfügbar sind. Setze Einschränkungen für
bestimmte Modelle oder Modellstufen, um Kosten zu kontrollieren und eine angemessene Nutzung in
deiner Organisation sicherzustellen.
{" "}
Konfiguriere die automatische Befehlsausführung für Cursor Version 0.49 und
höher. Lege fest, welche Befehle automatisch ausgeführt werden dürfen, und setze
Sicherheitsrichtlinien für die Codeausführung.
Verhindere den Zugriff auf bestimmte Repositories aus Sicherheits- oder Compliance-Gründen.
{" "}
Konfiguriere die Model Context Protocol-Einstellungen für Cursor Version 0.51 und höher.
Steuere, wie Modelle auf Kontext aus deiner Entwicklungsumgebung zugreifen und ihn verarbeiten.
{" "}
Richte Ignore-Muster für Dateien und Verzeichnisse in Cursor Version 0.50 und höher ein.
Steuere, welche Dateien und Verzeichnisse von der KI-Analyse und -Vorschlägen ausgeschlossen werden.
Schütze das .cursor-Verzeichnis vor unbefugtem Zugriff in Version 0.51 und höher. Stelle sicher, dass sensible Konfigurations- und Cache-Dateien geschützt bleiben.
Greife auf detaillierte Analysen zu KI-generiertem Code für die Repositories deines Teams zu. Rufe pro Commit KI-Nutzungsmetriken und granulare übernommene KI-Änderungen über REST-API-Endpunkte ab. Erfordert einen Enterprise-Plan. Mehr Infos findest du [hier](/de/account/teams/ai-code-tracking-api).
**SCIM** (System for Cross-domain Identity Management)-Provisioning ist auch
für Enterprise-Pläne verfügbar. Sieh dir unsere [SCIM-
Dokumentation](/de/account/teams/scim) für Setup-Anleitungen an.
## Mitglieder
Verwalte deine Teammitglieder, lade neue Nutzer ein und steuere die Zugriffsrechte. Lege rollenbasierte Berechtigungen fest und behalte die Aktivitäten deiner Mitglieder im Blick.
## Integrationen
{" "}
Verbinde Cursor mit deinen Lieblings-Tools und -Diensten. Richte Integrationen mit Versionskontrollsystemen, Projektmanagement-Tools und anderen Entwickler-Services ein.
## Hintergrund-Agents
{" "}
Überwache und verwalte Hintergrund-Agents, die in deinem Workspace laufen. Schau dir den Agent-Status, Logs und die Ressourcennutzung an.
## Bugbot
Nutze automatisierte Funktionen zur Fehlererkennung und -behebung. Bugbot hilft dir, häufige Probleme in deiner Codebasis automatisch zu identifizieren und zu lösen.
## Active-Directory-Verwaltung
Für Enterprise-Teams: Verwalte Benutzeranmeldung und Zugriffsrechte über die Active-Directory-Integration. Konfiguriere SSO und die automatische Benutzerbereitstellung (User Provisioning).
## Nutzung
Verfolge detaillierte Nutzungsmetriken, inklusive AI-Anfragen, Modellnutzung und Ressourcenverbrauch. Behalte die Nutzung teamweit und projektübergreifend im Blick.
## Abrechnung & Rechnungen
Verwalte dein Abo, aktualisiere Zahlungsmethoden und greif auf deinen Abrechnungsverlauf zu. Lade Rechnungen herunter und verwalte Einstellungen für nutzungsbasierte Abrechnung.
# Enterprise-Einstellungen
Source: https://docs.cursor.com/de/account/teams/enterprise-settings
Cursor-Einstellungen zentral für deine Organisation verwalten
# Enterprise-Einstellungen
Du kannst bestimmte Funktionen von Cursor zentral über Gerätemanagementlösungen verwalten, damit sie den Anforderungen deiner Organisation entsprechen. Wenn du eine Cursor-Richtlinie festlegst, überschreibt deren Wert die entsprechende Cursor-Einstellung auf den Geräten der Nutzer.
Einstellungseditor, der zeigt, dass die Einstellung „Extensions: Allowed“ von der Organisation verwaltet wird.
Cursor stellt derzeit Richtlinien zur Steuerung der folgenden administratorgesteuerten Funktionen bereit:
| Policy | Description | Cursor setting | Available since |
| ----------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------ | --------------- |
| AllowedExtensions | Steuert, welche Erweiterungen installiert werden können. | extensions.allowed | 1.2 |
| AllowedTeamId | Steuert, welche Team-IDs sich anmelden dürfen. Nutzer mit nicht autorisierten Team-IDs werden zwangsweise abgemeldet. | cursorAuth.allowedTeamId | 1.3 |
## Zugelassene Erweiterungen konfigurieren
Die Cursor-Einstellung `extensions.allowed` legt fest, welche Erweiterungen installiert werden können. Diese Einstellung erwartet ein JSON-Objekt, in dem die Schlüssel Publisher-Namen sind und die Werte Booleans, die angeben, ob Erweiterungen dieses Publishers erlaubt sind.
Wenn du zum Beispiel `extensions.allowed` auf `{"anysphere": true, "github": true}` setzt, sind Erweiterungen der Publisher Anysphere und GitHub erlaubt, während `{"anysphere": false}` Anysphere-Erweiterungen blockiert.
Um zugelassene Erweiterungen zentral für deine Organisation zu verwalten, konfiguriere die Richtlinie `AllowedExtensions` über deine Device-Management-Lösung. Diese Richtlinie überschreibt die Einstellung `extensions.allowed` auf den Geräten der Nutzer. Der Wert dieser Richtlinie ist ein JSON-String, der die erlaubten Publisher definiert.
Wenn du mehr über Erweiterungen in Cursor erfahren willst, schau dir die Extensions-Dokumentation an.
## Zulässige Team-IDs konfigurieren
Die Cursor-Einstellung `cursorAuth.allowedTeamId` legt fest, welche Team-IDs sich bei Cursor anmelden dürfen. Diese Einstellung akzeptiert eine kommagetrennte Liste von Team-IDs, die für den Zugriff autorisiert sind.
Wenn du `cursorAuth.allowedTeamId` zum Beispiel auf `"1,3,7"` setzt, können sich Nutzerinnen und Nutzer mit genau diesen Team-IDs anmelden.
Wenn jemand versucht, sich mit einer nicht zugelassenen Team-ID anzumelden:
* Die Person wird sofort abgemeldet
* Eine Fehlermeldung wird angezeigt
* Die Anwendung blockiert weitere Authentifizierungsversuche, bis eine gültige Team-ID verwendet wird
Um zulässige Team-IDs zentral für deine Organisation zu verwalten, konfiguriere die Richtlinie `AllowedTeamId` über deine Geräteverwaltung. Diese Richtlinie überschreibt die Einstellung `cursorAuth.allowedTeamId` auf den Geräten der Nutzerinnen und Nutzer. Der Wert dieser Richtlinie ist ein String mit der kommagetrennten Liste der autorisierten Team-IDs.
## Gruppenrichtlinie unter Windows
Cursor unterstützt Windows-Registry-basierte Gruppenrichtlinien. Wenn Richtliniendefinitionen installiert sind, kannst du den Local Group Policy Editor verwenden, um die Richtlinienwerte zu verwalten.
So fügst du eine Richtlinie hinzu:
1. Kopiere die ADMX- und ADML-Dateien für Policies aus `AppData\Local\Programs\cursor\policies`.
2. Füge die ADMX-Datei in das Verzeichnis `C:\Windows\PolicyDefinitions` ein und die ADML-Datei in das Verzeichnis `C:\Windows\PolicyDefinitions\\`.
3. Starte den Local Group Policy Editor neu.
4. Setze die entsprechenden Richtlinienwerte (z. B. `{"anysphere": true, "github": true}` für die Richtlinie `AllowedExtensions`) im Local Group Policy Editor.
Richtlinien können sowohl auf Computer- als auch auf Benutzerebene gesetzt werden. Wenn beide gesetzt sind, hat die Computerebene Vorrang. Wenn ein Richtlinienwert gesetzt ist, überschreibt er die in Cursor konfigurierte Einstellung auf jeder Ebene (Standard, Benutzer, Workspace usw.).
## Konfigurationsprofile unter macOS
Konfigurationsprofile verwalten Einstellungen auf macOS‑Geräten. Ein Profil ist eine XML-Datei mit Schlüssel/Wert-Paaren, die den verfügbaren Richtlinien entsprechen. Diese Profile können über Mobile-Device-Management-(MDM)-Lösungen bereitgestellt oder manuell installiert werden.
Ein Beispiel für eine `.mobileconfig`-Datei für macOS ist unten dargestellt:
```
PayloadContentPayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92.J6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadTypecom.todesktop.230313mzl4w4u92PayloadUUIDJ6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadVersion1AllowedExtensions{"anysphere":true}AllowedTeamId1,2PayloadDescriptionThis profile manages Cursor.PayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92PayloadOrganizationAnyspherePayloadTypeConfigurationPayloadUUIDF2C1A7B3-9D4E-4B2C-8E1F-7A6C5D4B3E2FPayloadVersion1TargetDeviceType5
```
### String-Richtlinien
Das folgende Beispiel zeigt die Konfiguration der Richtlinie `AllowedExtensions`. Der Richtlinienwert ist in der Beispieldatei zunächst leer (es sind keine Erweiterungen erlaubt).
```
ErlaubteErweiterungen
```
Füg die passende JSON-Zeichenfolge, die deine Policy definiert, zwischen die ``-Tags ein.
```
ZugelasseneErweiterungen{"anysphere": true, "github": true}
```
Für die Richtlinie `AllowedTeamId` die durch Kommas getrennte Liste der Team-IDs hinzufügen:
```
ZulässigeTeamId1,3,7
```
**Wichtig:** Die bereitgestellte `.mobileconfig`-Datei setzt **alle** in dieser Cursor-Version verfügbaren Richtlinien. Lösch alle Richtlinien, die du nicht brauchst.
Wenn du eine Richtlinie in der Beispiel-`.mobileconfig` nicht bearbeitest oder entfernst, wird sie mit ihrem standardmäßigen (restriktiven) Wert erzwungen.
Installier ein Konfigurationsprofil manuell, indem du im Finder doppelt auf das `.mobileconfig`-Profil klickst und es anschließend in den Systemeinstellungen unter **Allgemein** > **Geräteverwaltung** aktivierst. Wenn du das Profil aus den Systemeinstellungen entfernst, werden die Richtlinien in Cursor ebenfalls entfernt.
Mehr Infos zu Konfigurationsprofilen findest du in der Apple-Dokumentation.
## Zusätzliche Richtlinien
Ziel ist es, die aktuellen Cursor-Einstellungen als Richtlinien zu übernehmen und sich eng an die bestehenden Einstellungen zu halten, damit Benennung und Verhalten konsistent bleiben. Wenn es Anfragen gibt, weitere Richtlinien einzuführen, eröffne bitte ein Issue im Cursor-GitHub-Repository. Das Team entscheidet dann, ob es bereits eine entsprechende Einstellung für das gewünschte Verhalten gibt oder ob eine neue Einstellung erstellt werden sollte, um dieses Verhalten zu steuern.
## Häufig gestellte Fragen
### Unterstützt Cursor Konfigurationsprofile unter Linux?
Linux-Unterstützung steht derzeit nicht auf der Roadmap. Wenn du Konfigurationsprofile unter Linux möchtest, eröffne ein Issue im Cursor-GitHub-Repository und beschreibe deinen Anwendungsfall.
# Mitglieder & Rollen
Source: https://docs.cursor.com/de/account/teams/members
Teammitglieder und Rollen verwalten
Cursor-Teams haben drei Rollen:
## Rollen
**Mitglieder** sind die Standardrolle mit Zugriff auf die Pro-Funktionen von Cursor.
* Voller Zugriff auf die Pro-Funktionen von Cursor
* Kein Zugriff auf Abrechnungseinstellungen oder das Admin-Dashboard
* Können die eigene Nutzung und das verbleibende nutzungsbasierte Budget sehen
**Admins** steuern die Teamverwaltung und Sicherheitseinstellungen.
* Voller Zugriff auf Pro-Funktionen
* Mitglieder hinzufügen/entfernen, Rollen ändern, SSO einrichten
* Nutzungsbasierte Preise und Ausgabelimits konfigurieren
* Zugriff auf Team-Analytics
**Unbezahlte Admins** verwalten Teams, ohne einen bezahlten Seat zu verwenden – ideal für IT- oder Finance-Mitarbeitende, die keinen Cursor-Zugriff brauchen.
* Nicht abrechenbar, keine Pro-Funktionen
* Gleiche administrativen Möglichkeiten wie Admins
Unbezahlte Admins erfordern mindestens einen bezahlten User im Team.
Alle Teammitglieder können andere einladen. Einladungen werden aktuell nicht eingeschränkt.
### Mitglied hinzufügen
Füge Mitglieder auf drei Arten hinzu:
1. **E-Mail-Einladung**
* Klicke auf `Invite Members`
* Gib E-Mail-Adressen ein
* Nutzer erhalten E-Mail-Einladungen
2. **Einladungslink**
* Klicke auf `Invite Members`
* Kopiere `Invite Link`
* Teile ihn mit Teammitgliedern
3. **SSO**
* Konfiguriere SSO im [Admin-Dashboard](/de/account/teams/sso)
* Nutzer treten automatisch bei, wenn sie sich mit ihrer SSO-E-Mail anmelden
Einladungslinks haben eine lange Gültigkeitsdauer – jeder mit dem Link kann beitreten.
Widerrufe sie oder nutze [SSO](/de/account/teams/sso)
### Mitglied entfernen
Admins können Mitglieder jederzeit über das Kontextmenü → „Remove“ entfernen. Wenn ein Mitglied bereits Credits genutzt hat, bleibt sein Platz bis zum Ende des Abrechnungszeitraums belegt.
### Rolle ändern
Admins können Rollen für andere Mitglieder ändern, indem sie das Kontextmenü öffnen und anschließend die Option „Change role“ verwenden.
Es muss jederzeit mindestens ein Admin und ein zahlendes Mitglied im Team sein.
## Sicherheit & SSO
SAML 2.0 Single Sign-On (SSO) ist in Team-Plänen verfügbar. Zu den wichtigsten Funktionen gehören:
* SSO-Verbindungen konfigurieren ([mehr erfahren](/de/account/teams/sso))
* Domainverifizierung einrichten
* Automatische Benutzerbereitstellung
* Optionen zur Erzwingung von SSO
* Integration von Identitätsanbietern (Okta usw.)
Für die Aktivierung von SSO ist eine Domainverifizierung erforderlich.
## Nutzungssteuerung
Greif auf die Nutzungseinstellungen zu, um:
* nutzungsbasierte Abrechnung zu aktivieren
* Premium-Modelle zu aktivieren
* Änderungen nur für Admins zuzulassen
* monatliche Ausgabenlimits festzulegen
* die teamweite Nutzung zu überwachen
## Abrechnung
Wenn du Teammitglieder hinzufügst:
* Jedes Mitglied oder jeder Admin belegt einen kostenpflichtigen Sitzplatz (siehe [Preise](https://cursor.com/pricing))
* Neue Mitglieder werden anteilig für die verbleibende Zeit im Abrechnungszeitraum berechnet
* Unbezahlte Admin-Sitzplätze werden nicht mitgezählt
Bei Ergänzungen mitten im Monat zahlst du nur für die genutzten Tage. Wenn du Mitglieder entfernst, die Credits genutzt haben, bleibt ihr Sitzplatz bis zum Ende des Abrechnungszyklus belegt – anteilige Rückerstattungen gibt es nicht.
Rollenänderungen (z. B. Admin zu Unpaid Admin) wirken sich ab dem Änderungsdatum auf die Abrechnung aus. Wähle monatliche oder jährliche Abrechnung.
Die monatliche/jährliche Verlängerung erfolgt an deinem ursprünglichen Anmeldedatum – unabhängig von Änderungen bei den Mitgliedern.
### Zur jährlichen Abrechnung wechseln
Spare **20 %**, indem du von monatlich auf jährlich wechselst:
1. Geh zum [Dashboard](https://cursor.com/dashboard)
2. Klick im Kontobereich auf „Advanced“ und dann auf „Upgrade to yearly billing“
Du kannst nur über das Dashboard von monatlich auf jährlich wechseln. Um von
jährlich auf monatlich zu wechseln, schreib an [hi@cursor.com](mailto:hi@cursor.com).
# SCIM
Source: https://docs.cursor.com/de/account/teams/scim
Richte SCIM-Provisioning für die automatisierte Verwaltung von Benutzer:innen und Gruppen ein
## Überblick
Die SCIM‑2.0‑Provisionierung verwaltet automatisch deine Teammitglieder und Verzeichnisgruppen über deinen Identity Provider. Verfügbar in Enterprise‑Plänen mit aktiviertem SSO.
SCIM‑Einstellungen‑Dashboard mit Konfiguration für Active Directory Management
## Voraussetzungen
* Cursor Enterprise-Plan
* SSO muss zuerst eingerichtet sein – **SCIM setzt eine aktive SSO-Verbindung voraus**
* Admin-Zugriff auf deinen Identity-Provider (Okta, Azure AD, etc.)
* Admin-Zugriff auf deine Cursor-Organisation
## So funktioniert's
### Benutzerbereitstellung
Nutzer werden automatisch zu Cursor hinzugefügt, wenn sie in deinem Identity-Provider der SCIM-Anwendung zugewiesen werden. Wenn die Zuweisung entfernt wird, werden sie gelöscht. Änderungen werden in Echtzeit synchronisiert.
### Verzeichnisgruppen
Verzeichnisgruppen und deren Mitgliedschaften werden aus deinem Identity-Provider synchronisiert. Gruppen- und Nutzerverwaltung müssen über deinen Identity-Provider erfolgen – Cursor zeigt diese Informationen nur schreibgeschützt an.
### Ausgabenverwaltung
Lege unterschiedliche Ausgabenlimits pro Nutzer für jede Verzeichnisgruppe fest. Limits auf Verzeichnisgruppenebene haben Vorrang vor Team-Limits. Nutzer in mehreren Gruppen erhalten das jeweils höchste anwendbare Ausgabenlimit.
## Setup
SCIM setzt voraus, dass SSO zuerst eingerichtet ist. Wenn du SSO noch nicht konfiguriert hast,
folge der [SSO-Einrichtungsanleitung](/de/account/teams/sso), bevor du fortfährst.
Navigiere zu
[cursor.com/dashboard?tab=active-directory](https://www.cursor.com/dashboard?tab=active-directory)
mit einem Admin-Account, oder geh in deine Dashboard-Einstellungen und wähle den
Tab „Active Directory Management“.
Sobald SSO verifiziert ist, siehst du einen Link für die schrittweise SCIM-Einrichtung. Klick
darauf, um den Konfigurationsassistenten zu starten.
In deinem Identity-Provider: - Erstelle oder konfiguriere deine SCIM-App - Verwende
den von Cursor bereitgestellten SCIM-Endpoint und das Token - Aktiviere User- und Gruppen-
Provisioning (Push) - Teste die Verbindung
Zurück in der Active-Directory-Verwaltung von Cursor: - Sieh dir deine synchronisierten
Verzeichnisgruppen an - Setze nutzerbezogene Ausgabenlimits für bestimmte Gruppen nach Bedarf -
Prüfe, welche Limits für User in mehreren Gruppen gelten
### Identity-Provider-Setup
Für providerspezifische Setup-Anleitungen:
Setup-Anleitungen für Okta, Azure AD, Google Workspace und mehr.
## Benutzer und Gruppen verwalten
Die gesamte Benutzer- und Gruppenverwaltung muss über deinen Identity-Provider erfolgen.
Änderungen in deinem Identity-Provider werden automatisch mit Cursor synchronisiert,
aber du kannst Benutzer oder Gruppen nicht direkt in Cursor ändern.
### Benutzerverwaltung
* Füge Benutzer hinzu, indem du sie in deinem Identity-Provider deiner SCIM-Anwendung zuweist
* Entferne Benutzer, indem du die Zuweisung zur SCIM-Anwendung aufhebst
* Änderungen am Benutzerprofil (Name, E-Mail) werden automatisch aus deinem Identity-Provider übernommen
### Gruppenverwaltung
* Verzeichnisgruppen werden automatisch aus deinem Identity-Provider synchronisiert
* Änderungen an der Gruppenmitgliedschaft werden in Echtzeit übernommen
* Nutze Gruppen, um Benutzer zu organisieren und unterschiedliche Ausgabenlimits festzulegen
### Ausgabenlimits
* Lege unterschiedliche Pro-Benutzer-Limits für jede Verzeichnisgruppe fest
* Benutzer erben das höchste Ausgabenlimit aus ihren Gruppen
* Gruppenlimits überschreiben das standardmäßige, teamweite Pro-Benutzer-Limit
## FAQ
### Warum wird die SCIM-Verwaltung in meinem Dashboard nicht angezeigt?
Stell sicher, dass SSO korrekt konfiguriert ist und funktioniert, bevor du SCIM einrichtest. SCIM erfordert eine aktive SSO-Verbindung.
### Warum werden Nutzer nicht synchronisiert?
Überprüf, ob Nutzer in deinem Identity Provider der SCIM-App zugewiesen sind. Nutzer müssen explizit zugewiesen werden, um in Cursor zu erscheinen.
### Warum werden Gruppen nicht angezeigt?
Prüf, ob die Bereitstellung für Gruppen-Push in den SCIM-Einstellungen deines Identity Providers aktiviert ist. Die Gruppensynchronisierung muss getrennt von der Nutzersynchronisierung konfiguriert werden.
### Warum werden Ausgabenlimits nicht angewendet?
Stell sicher, dass Nutzer in deinem Identity Provider den erwarteten Gruppen korrekt zugeordnet sind. Die Gruppenmitgliedschaft bestimmt, welche Ausgabenlimits gelten.
### Kann ich SCIM-Nutzer und -Gruppen direkt in Cursor verwalten?
Nein. Die gesamte Nutzer- und Gruppenverwaltung muss über deinen Identity Provider erfolgen. Cursor zeigt diese Informationen nur lesend an.
### Wie schnell werden Änderungen synchronisiert?
Änderungen in deinem Identity Provider werden in Echtzeit mit Cursor synchronisiert. Bei großen Bulk-Operationen kann es zu einer kurzen Verzögerung kommen.
# Leg los
Source: https://docs.cursor.com/de/account/teams/setup
Erstelle und richte ein Cursor-Team ein
## Cursor für Teams
Cursor ist für Einzelpersonen und Teams. Der Teams-Plan bietet Tools für Organisationen: SSO, Teamverwaltung, Zugriffskontrollen und Nutzungsanalysen.
## Ein Team erstellen
Erstell ein Team, indem du diese Schritte befolgst:
Um ein Team zu erstellen, folg diesen Schritten:
1. **Für neue Nutzer**: Besuch [cursor.com/team/new-team](https://cursor.com/team/new-team), um ein neues Konto und Team zu erstellen
2. **Für bestehende Nutzer**: Geh zu deinem [Dashboard](/de/account/dashboard) und klick auf „Upgrade to Teams“
Wähl einen Teamnamen und einen Abrechnungszeitraum aus
Lad Teammitglieder ein. Die Nutzeranzahl wird anteilig berechnet – du zahlst nur für die Zeit, in der Nutzer Mitglieder sind.
Aktivier [SSO](/de/account/teams/sso) für mehr Sicherheit und automatisiertes Onboarding.
## FAQ
Cursor verwendet standardmäßig HTTP/2. Manche Proxys und VPNs blockieren das.
Aktiviere in den Einstellungen das HTTP/1.1-Fallback, um stattdessen HTTP/1.1 zu nutzen.
Cursor rechnet pro aktivem Nutzer ab, nicht pro Sitzplatz. Du kannst jederzeit Nutzer hinzufügen oder entfernen – neue Mitglieder werden anteilig für die verbleibende Zeit berechnet. Wenn ein entfernter Nutzer Credits genutzt hat, bleibt sein Sitz bis zum Ende des Abrechnungszeitraums belegt.
Dein Verlängerungsdatum bleibt gleich.
Setz dich als [Unpaid Admin](/de/account/teams/members), um ohne Lizenz verwalten zu können.
Teams benötigen mindestens ein zahlendes Mitglied. Du kannst alles einrichten, ein Mitglied einladen und dann deine Rolle vor der Abrechnung ändern.
Download-Links für alle Plattformen findest du unter [cursor.com/downloads](https://cursor.com/downloads).
MDM-Anleitungen:
* [Omnissa Workspace ONE](https://docs.omnissa.com/bundle/MobileApplicationManagementVSaaS/page/DeployInternalApplications.html) (ehemals VMware)
* [Microsoft Intune (Windows)](https://learn.microsoft.com/en-us/mem/intune-service/apps/apps-win32-app-management)
* [Microsoft Intune (Mac)](https://learn.microsoft.com/en-us/mem/intune-service/apps/lob-apps-macos-dmg)
* [Kandji MDM](https://support.kandji.io/kb/custom-apps-overview)
# SSO
Source: https://docs.cursor.com/de/account/teams/sso
Richte Single Sign-on für dein Team ein
## Überblick
SAML 2.0 SSO ist ohne zusätzliche Kosten in Business-Plänen verfügbar. Verwende deinen bestehenden Identity-Provider (IdP), um Teammitglieder zu authentifizieren, ohne separate Cursor-Konten zu benötigen.
## Voraussetzungen
* Cursor Team-Plan
* Admin-Zugriff auf deinen Identity-Provider (z. B. Okta)
* Admin-Zugriff auf deine Cursor-Organisation
## Konfigurationsschritte
Navigiere mit einem Admin-Konto zu [cursor.com/dashboard?tab=settings](https://www.cursor.com/dashboard?tab=settings).
Suche den Abschnitt „Single Sign-On (SSO)“ und klappe ihn aus.
Klicke auf die Schaltfläche „SSO Provider Connection settings“, um die SSO-Einrichtung zu starten, und folge dem Assistenten.
In deinem Identity Provider (z. B. Okta):
* Neue SAML-Anwendung erstellen
* SAML-Einstellungen mit den Informationen von Cursor konfigurieren
* Just-in-Time-(JIT)-Bereitstellung einrichten
Verifiziere die Domain deiner Nutzer in Cursor, indem du auf die Schaltfläche „Domain verification settings“ klickst.
### Anleitungen zur Einrichtung von Identity Providern
Für anbieterbezogene Einrichtungsanleitungen:
Einrichtungsanleitungen für Okta, Azure AD, Google Workspace und mehr.
## Zusätzliche Einstellungen
* SSO-Erzwingung im Admin-Dashboard verwalten
* Neue Nutzer werden bei der Anmeldung über SSO automatisch aufgenommen
* Nutzerverwaltung über deinen Identity Provider steuern
## Fehlerbehebung
Wenn Probleme auftreten:
* Prüf, ob die Domain in Cursor verifiziert ist
* Stell sicher, dass SAML-Attribute korrekt zugeordnet sind
* Prüf, ob SSO im Admin-Dashboard aktiviert ist
* Gleiche Vor- und Nachnamen zwischen Identity Provider und Cursor ab
* Schau dir die anbieterspezifischen Anleitungen oben an
* Schreib an [hi@cursor.com](mailto:hi@cursor.com), wenn die Probleme weiter bestehen
# Update-Zugriff
Source: https://docs.cursor.com/de/account/update-access
Wähle, wie oft du Updates bekommst
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor hat zwei Update-Kanäle.
Der Standard-Update-Kanal mit getesteten Releases.
* Stabile Releases
* Bugfixes aus dem Pre-Release-Testing
* Standard für alle Nutzer
* Einzige Option für Team-Nutzer
Team- und Business-Accounts verwenden den Default-Modus.
Vorabversionen mit neuen Features.
Early-Access-Builds können Bugs oder Stabilitätsprobleme haben.
* Zugriff auf Features in Entwicklung
* Kann Bugs enthalten
* Nicht verfügbar für Team-Accounts
## Update-Kanal ändern
1. **Einstellungen öffnen**: Drück Cmd+Shift+J
2. **Zu Beta gehen**: Wähl Beta in der Seitenleiste
3. **Kanal auswählen**: Wähl Default oder Early Access
Meld Early-Access-Probleme im [Forum](https://forum.cursor.com).
# Apply
Source: https://docs.cursor.com/de/agent/apply
Lerne, wie du Codevorschläge aus dem Chat mit Apply übernehmen, akzeptieren oder ablehnen kannst
## Wie Apply funktioniert
Apply ist ein spezialisiertes Cursor-Modell, das von Chat generierten Code übernimmt und in deine Dateien integriert. Es verarbeitet die Codeblöcke aus Chat-Unterhaltungen und wendet die Änderungen auf deine Codebase an.
Apply generiert selbst keinen Code. Das Chat-Modell erzeugt den Code, und Apply übernimmt die Integration in bestehende Dateien. Es kann Änderungen über mehrere Dateien und große Codebases hinweg verarbeiten.
## Codeblöcke anwenden
Um einen Codeblock-Vorschlag anzuwenden, klick auf den Play-Button oben rechts im Codeblock.
# Checkpoints
Source: https://docs.cursor.com/de/agent/chat/checkpoints
Frühere Zustände nach Agent-Änderungen speichern und wiederherstellen
Checkpoints sind automatische Snapshots der Änderungen des Agents an deinem Codebase. Damit kannst du Agent-Änderungen bei Bedarf rückgängig machen.
## Checkpoints wiederherstellen
Zwei Möglichkeiten zur Wiederherstellung:
1. **Über das Eingabefeld**: Klicke bei vorherigen Anfragen auf den Button „Restore Checkpoint“
2. **Über die Nachricht**: Klicke auf den „+“-Button, wenn du mit der Maus über eine Nachricht fährst
Checkpoints sind keine Versionsverwaltung. Nutze Git für dauerhafte Historie.
## So funktionieren sie
* Lokal gespeichert, getrennt von Git
* Es werden nur Agent-Änderungen nachverfolgt (keine manuellen Änderungen)
* Wird automatisch bereinigt
Manuelle Änderungen werden nicht nachverfolgt. Verwende Checkpoints nur für Agent-Änderungen.
## FAQ
Nein. Sie sind getrennt vom Git-Verlauf.
{" "}
Für die aktuelle Sitzung und die jüngste Historie. Wird automatisch bereinigt.
Nein. Sie werden automatisch von Cursor erstellt.
{" "}
# Commands
Source: https://docs.cursor.com/de/agent/chat/commands
Definiere Befehle für wiederverwendbare Workflows
Benutzerdefinierte Commands ermöglichen dir, wiederverwendbare Workflows zu erstellen, die mit einem einfachen `/`-Prefix im Chat-Eingabefeld ausgelöst werden können. Diese Commands helfen, Prozesse in deinem Team zu standardisieren und machen häufige Aufgaben effizienter.
Commands befinden sich derzeit in der Beta. Die Funktion und die Syntax können sich ändern, während wir sie weiter verbessern.
## Wie Befehle funktionieren
Befehle sind als einfache Markdown-Dateien definiert und können an zwei Orten gespeichert werden:
1. **Projektbefehle**: Gespeichert im Verzeichnis `.cursor/commands` deines Projekts
2. **Globale Befehle**: Gespeichert im Verzeichnis `~/.cursor/commands` in deinem Home-Verzeichnis
Wenn du im Chat-Eingabefeld `/` tippst, erkennt Cursor automatisch verfügbare Befehle aus beiden Verzeichnissen und zeigt sie an – so sind sie in deinem Workflow sofort verfügbar.
## Befehle erstellen
1. Lege im Projekt-Root ein Verzeichnis `.cursor/commands` an
2. Füge `.md`-Dateien mit aussagekräftigen Namen hinzu (z. B. `review-code.md`, `write-tests.md`)
3. Schreib einfachen Markdown-Text, der beschreibt, was der Befehl tun soll
4. Befehle erscheinen automatisch im Chat, wenn du `/` eingibst
So könnte die Struktur deines `commands`-Verzeichnisses aussehen:
```
.cursor/
└── commands/
├── github-pr-kommentare-beantworten.md
├── code-review-checkliste.md
├── pr-erstellen.md
├── bestehende-diffs-kurz-prüfen.md
├── neuen-entwickler-onboarden.md
├── alle-tests-ausführen-und-fixen.md
├── sicherheitsaudit.md
└── neue-funktion-einrichten.md
```
## Beispiele
Probier diese Befehle in deinen Projekten aus, um ein Gefühl dafür zu bekommen, wie sie funktionieren.
```markdown theme={null}
# Code-Review-Checkliste
## Überblick
Umfassende Checkliste für gründliche Code-Reviews, um Qualität, Sicherheit und Wartbarkeit sicherzustellen.
## Review-Kategorien
### Funktionalität
- [ ] Code macht, was er soll
- [ ] Edge Cases werden abgedeckt
- [ ] Fehlerbehandlung ist angemessen
- [ ] Keine offensichtlichen Bugs oder Logikfehler
### Codequalität
- [ ] Code ist gut lesbar und strukturiert
- [ ] Funktionen sind klein und fokussiert
- [ ] Variablennamen sind aussagekräftig
- [ ] Kein doppelter Code
- [ ] Hält Projektkonventionen ein
### Sicherheit
- [ ] Keine offensichtlichen Sicherheitslücken
- [ ] Eingabevalidierung vorhanden
- [ ] Sensible Daten werden korrekt gehandhabt
- [ ] Keine hardcodierten Secrets
```
```markdown theme={null}
# Security Audit
## Überblick
Umfassende Sicherheitsüberprüfung zur Identifizierung und Behebung von Schwachstellen im Codebase.
## Schritte
1. **Dependency-Audit**
- Auf bekannte Schwachstellen prüfen
- Veraltete Pakete aktualisieren
- Third-Party-Dependencies überprüfen
2. **Code Security Review**
- Auf gängige Schwachstellen prüfen
- Authentifizierung/Autorisierung überprüfen
- Datenverarbeitungspraktiken prüfen
3. **Infrastructure Security**
- Umgebungsvariablen überprüfen
- Zugriffssteuerungen prüfen
- Netzwerksicherheit prüfen
## Security Checklist
- [ ] Dependencies aktualisiert und sicher
- [ ] Keine hardcodierten Secrets
- [ ] Eingabevalidierung implementiert
- [ ] Authentifizierung sicher
- [ ] Autorisierung korrekt konfiguriert
```
```markdown theme={null}
# Neue Funktion einrichten
## Überblick
Eine neue Funktion systematisch vom initialen Plan bis zur Implementierungsstruktur aufsetzen.
## Schritte
1. **Anforderungen definieren**
- Funktionsumfang und Ziele klären
- User Stories und Akzeptanzkriterien festlegen
- Technischen Ansatz planen
2. **Feature-Branch erstellen**
- Von main/develop abzweigen
- Lokale Entwicklungsumgebung aufsetzen
- Neue Abhängigkeiten konfigurieren
3. **Architektur planen**
- Datenmodelle und APIs entwerfen
- UI-Komponenten und Flows planen
- Teststrategie definieren
## Checkliste für das Feature-Setup
- [ ] Anforderungen dokumentiert
- [ ] User Stories geschrieben
- [ ] Technischer Ansatz geplant
- [ ] Feature-Branch erstellt
- [ ] Entwicklungsumgebung bereit
```
```markdown theme={null}
# PR erstellen
## Überblick
Erstelle einen gut strukturierten Pull Request mit klarer Beschreibung, passenden Labels und Reviewern.
## Schritte
1. **Branch vorbereiten**
- Sicherstellen, dass alle Änderungen committed sind
- Branch zum Remote pushen
- Prüfen, dass der Branch mit main auf dem neuesten Stand ist
2. **PR-Beschreibung schreiben**
- Änderungen klar zusammenfassen
- Kontext und Motivation angeben
- Breaking Changes auflisten
- Screenshots hinzufügen, wenn es UI-Änderungen gibt
3. **PR einrichten**
- PR mit aussagekräftigem Titel erstellen
- Passende Labels hinzufügen
- Reviewer zuweisen
- Zugehörige Issues verlinken
## PR-Vorlage
- [ ] Feature A
- [ ] Bugfix B
- [ ] Unit-Tests bestehen
- [ ] Manuelles Testen abgeschlossen
```
```markdown theme={null}
# Alle Tests ausführen und Fehler beheben
## Übersicht
Führe die vollständige Testsuite aus und behebe systematisch alle Fehlerschläge, um Codequalität und Funktionalität sicherzustellen.
## Schritte
1. **Testsuite ausführen**
- Alle Tests im Projekt ausführen
- Ausgabe erfassen und fehlgeschlagene Tests identifizieren
- Sowohl Unit- als auch Integrationstests prüfen
2. **Fehler analysieren**
- Nach Typ kategorisieren: flaky, defekt, neu
- Fixes nach Impact priorisieren
- Prüfen, ob Fehler mit jüngsten Änderungen zusammenhängen
3. **Probleme systematisch beheben**
- Mit den kritischsten Fehlern beginnen
- Ein Problem nach dem anderen beheben
- Tests nach jedem Fix erneut ausführen
```
```markdown theme={null}
# Neue·n Developer onboarden
## Übersicht
Umfassender Onboarding‑Prozess, um einen neuen Developer schnell startklar zu machen.
## Schritte
1. **Environment‑Setup**
- Erforderliche Tools installieren
- Entwicklungsumgebung einrichten
- IDE und Extensions konfigurieren
- Git und SSH‑Keys einrichten
2. **Projekteinstieg**
- Projektstruktur durchgehen
- Architektur verstehen
- Wichtige Doku lesen
- Lokale Datenbank einrichten
## Onboarding‑Checkliste
- [ ] Entwicklungsumgebung bereit
- [ ] Alle Tests grün
- [ ] Anwendung lokal startbar
- [ ] Datenbank eingerichtet und funktionsfähig
- [ ] Erste·r PR erstellt
```
# Kompakt
Source: https://docs.cursor.com/de/agent/chat/compact
Spare Platz im Chat mit der Oberfläche im Kompaktmodus
Der Kompaktmodus bietet eine schlanke Chat-Oberfläche, indem er visuelles Clutter reduziert und den verfügbaren Platz für Unterhaltungen maximiert.
## Übersicht
Wenn aktiviert, optimiert der Kompaktmodus die Chat-Oberfläche durch:
* **Ausblenden von Symbolen** für ein cleaneres, minimalistisches Erscheinungsbild
* **Automatisches Einklappen von Diffs**, um visuelles Rauschen zu reduzieren
* **Automatisches Einklappen des Eingabefelds**, um mehr Platz für die Unterhaltung zu schaffen
Diese Einstellung ist besonders nützlich, wenn du auf kleineren Bildschirmen arbeitest oder eine fokussierte, ablenkungsfreie Chat-Erfahrung bevorzugst.
## Vorher und nachher
### Standardmodus
### Kompaktmodus
## Kompaktmodus aktivieren
So aktivierst du den Kompaktmodus:
1. Öffne die Cursor-Einstellungen
2. Navigiere zu den **Chat**-Einstellungen
3. Aktiviere den **Kompaktmodus**
Die Oberfläche wechselt sofort zur schlankeren Ansicht und gibt dir mehr Platz, dich auf deine Unterhaltungen zu konzentrieren.
# Duplizieren
Source: https://docs.cursor.com/de/agent/chat/duplicate
Erstelle Branches von beliebigen Punkten in einer Unterhaltung
Dupliziere bzw. forke Chats, um alternative Lösungen zu erkunden, ohne deine aktuelle Unterhaltung zu verlieren.
## So duplizierst du
1. Finde die Stelle, an der du abzweigen willst
2. Klicke auf die drei Punkte der Nachricht
3. Wähle „Duplicate Chat“ aus
## Was passiert
* Der bisherige Kontext bleibt erhalten
* Die ursprüngliche Unterhaltung bleibt unverändert
* Beide Chats behalten ihre eigene, separate Historie
# Export
Source: https://docs.cursor.com/de/agent/chat/export
Chats ins Markdown-Format exportieren
Agent-Chats als Markdown-Dateien für das Teilen oder die Dokumentation exportieren.
## Was exportiert wird
* Alle Nachrichten und Antworten
* Codeblöcke mit Syntaxhervorhebung
* Dateiverweise und Kontext
* Chronologischer Gesprächsverlauf
* Klick auf das Verlaufssymbol in der Agent-Seitenleiste
* Drück Opt Cmd '
## Chats verwalten
* **Titel bearbeiten**: Klicken zum Umbenennen
* **Löschen**: Nicht benötigte Chats entfernen
* **Öffnen**: Klicken, um die gesamte Unterhaltung anzusehen
Der Chatverlauf wird lokal in einer SQLite-Datenbank auf deinem Rechner gespeichert.
Um Chats zu behalten, [exportier sie](/de/agent/chats/export) als Markdown.
## Hintergrund-Agents
Chats mit Hintergrund-Agents erscheinen nicht in der normalen Historie, sondern werden in einer Remote-Datenbank gespeichert. Verwende Cmd E, um sie anzusehen.
## Auf frühere Chats verweisen
Verwende [@Past Chats](/de/context/@-symbols/@-past-chats), um Kontext aus vorherigen Gesprächen in deinem aktuellen Chat einzubeziehen.
# Zusammenfassung
Source: https://docs.cursor.com/de/agent/chat/summarization
Kontextmanagement für lange Chats
## Zusammenfassung von Nachrichten
Wenn Unterhaltungen länger werden, fasst Cursor automatisch zusammen und verwaltet den Kontext, damit deine Chats effizient bleiben. Lern, wie du das Kontextmenü nutzt, und versteh, wie Dateien verdichtet werden, damit sie in die Kontextfenster des Modells passen.
### Verwendung des Befehls /summarize
Du kannst die Zusammenfassung manuell mit dem Befehl `/summarize` im Chat auslösen. Dieser Befehl hilft dabei, den Kontext zu verwalten, wenn Unterhaltungen zu lang werden, sodass du effizient weiterarbeiten kannst, ohne wichtige Informationen zu verlieren.
Für einen tieferen Einblick, wie Kontext in Cursor funktioniert, schau dir unseren Guide [Mit
Kontext arbeiten](/de/guides/working-with-context) an.
### So funktioniert die Zusammenfassung
Wenn Unterhaltungen länger werden, überschreiten sie das Kontextfensterlimit des Modells:
User
Cursor
User
Kontextfensterlimit
Cursor
User
Cursor
Um das zu lösen, fasst Cursor ältere Nachrichten zusammen, damit Platz für neue Unterhaltungsteile entsteht.
Kontextfensterlimit
Zusammengefasste Nachrichten
Cursor
User
Cursor
## Komprimierung von Dateien & Ordnern
Während die Chatszusammenfassung lange Unterhaltungen abdeckt, nutzt Cursor für große Dateien und Ordner eine andere Strategie: **smarte Komprimierung**. Wenn du Dateien in deine Unterhaltung einbindest, ermittelt Cursor anhand ihrer Größe und des verfügbaren Kontextbereichs die beste Darstellung.
Das sind die verschiedenen Zustände, in denen sich eine Datei/ein Ordner befinden kann:
### Kompaktansicht
Wenn Dateien oder Ordner zu groß für das Kontextfenster sind, komprimiert Cursor sie automatisch. In der Kompaktansicht sieht das Modell zentrale Strukturelemente wie Funktionssignaturen, Klassen und Methoden. Aus dieser kompakten Darstellung kann das Modell bei Bedarf einzelne Dateien aufklappen. So wird das verfügbare Kontextfenster optimal genutzt.
### Stark gekürzt
Wenn ein Dateiname mit der Kennzeichnung „Stark gekürzt“ erscheint, war die Datei zu groß, um selbst in gekürzter Form vollständig aufgenommen zu werden. Dem Modell wird nur der Dateiname angezeigt.
### Nicht enthalten
Wenn neben einer Datei oder einem Ordner ein Warnsymbol angezeigt wird, ist das Element zu groß, um in das Kontextfenster aufgenommen zu werden – selbst in komprimierter Form. So siehst du, welche Teile deiner Codebase für das Modell zugänglich sind.
# Tabs
Source: https://docs.cursor.com/de/agent/chat/tabs
Mehrere Agent-Chats gleichzeitig führen
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Überblick
Drück Cmd+T, um neue Tabs zu öffnen. Jeder Tab hat eine eigene Gesprächshistorie, seinen eigenen Kontext und die ausgewählte Modellkonfiguration.
Für parallele Workflows, probier mal die [Background Agents](/de/background-agents) aus
## Tabs verwalten
* Erstelle neue Tabs mit Cmd+T. Jeder Tab startet mit einer neuen Unterhaltung und behält seinen eigenen Kontext.
* Wechsle zwischen Tabs, indem du auf ihre Titel klickst, oder nutze Ctrl+Tab, um durch sie zu blättern.
* Tab-Titel werden nach der ersten Nachricht automatisch erstellt, aber du kannst sie umbenennen, indem du mit der rechten Maustaste auf den Tab-Titel klickst.
Nutze pro Tab nur eine Aufgabe, gib eine klare Anfangsbeschreibung und schließe
erledigte Tabs, um deinen Arbeitsbereich aufgeräumt zu halten.
### Konflikte
Cursor verhindert, dass mehrere Tabs dieselben Dateien bearbeiten. Du wirst aufgefordert, Konflikte zu lösen.
| Modus | Für | Fähigkeiten | Tools |
| :-------------------- | :----------------------------- | :----------------------------------------------------- | :------------------- |
| **[Agent](#agent)** | Komplexe Features, Refactoring | Autonome Exploration, Bearbeitung über mehrere Dateien | Alle Tools aktiviert |
| **[Ask](#ask)** | Lernen, Planung, Fragen | Nur Lesezugriff, keine automatischen Änderungen | Nur Such-Tools |
| **[Custom](#custom)** | Spezialisierte Workflows | Benutzerdefinierte Fähigkeiten | Konfigurierbar |
## Agent
Der Standardmodus für komplexe Coding-Aufgaben. Agent erkundet eigenständig deinen Code, bearbeitet mehrere Dateien, führt Befehle aus und behebt Fehler, um deine Requests zu erfüllen.
## Ask
Schreibgeschützter Modus zum Lernen und Erkunden. Ask durchsucht deine Codebasis und liefert Antworten, ohne Änderungen vorzunehmen – perfekt, um Code zu verstehen, bevor du ihn änderst.
## Benutzerdefiniert
Erstelle eigene Modi mit spezifischen Tool-Kombinationen und Anweisungen. Kombiniere und variiere Fähigkeiten, um deinen Workflow optimal zu unterstützen.
Benutzerdefinierte Modi sind in der Beta. Aktiviere sie in `Cursor Settings` → `Chat` → `Custom
Modes`
### Beispiele
**Tools:** All Search\
**Instructions:** Erkläre Konzepte gründlich und stell gezielte Rückfragen zur Klärung
{" "}
**Tools:** Edit & Reapply **Instructions:** Verbessere die Codestruktur, ohne neue Funktionalität hinzuzufügen
{" "}
**Tools:** Codebase, Read file, Terminal **Instructions:** Erstelle detaillierte Implementierungspläne in `plan.md`
**Tools:** All Search, Terminal, Edit & Reapply\
**Instructions:** Untersuche Probleme gründlich, bevor du Fixes vorschlägst
## Modi wechseln
* Nutze den Moduswähler in Agent
* Drück Cmd+., um schnell zu wechseln
* Leg Tastenkürzel in den [Einstellungen](#settings) fest
## Einstellungen
Alle Modi teilen sich gemeinsame Konfigurationsoptionen:
| Einstellung | Beschreibung |
| :----------- | :------------------------------------------------ |
| Modell | Wähle, welches KI‑Modell verwendet wird |
| Tastenkürzel | Lege Shortcuts fest, um zwischen Modi zu wechseln |
Agent nutzt Tools, um zu suchen, zu bearbeiten und Befehle auszuführen. Von semantischer Codebase-Suche bis zur Terminalausführung ermöglichen diese Tools eine autonome Aufgabenerledigung.
Schau dir Änderungen an, bevor du sie annimmst. Die Review-Oberfläche zeigt Hinzufügungen
und Löschungen mit farbcodierten Zeilen, damit du Modifikationen im Griff hast.
Automatische Snapshots protokollieren die Änderungen des Agents. Stell frühere Zustände wieder her, wenn
Änderungen nicht wie erwartet funktionieren oder um verschiedene Ansätze auszuprobieren.
Agent führt Terminalbefehle aus, überwacht die Ausgabe und steuert mehrstufige
Prozesse. Konfigurier Auto-Run für vertrauenswürdige Workflows oder fordere
zur Sicherheit eine Bestätigung an.
Unterhaltungen als Markdown exportieren. Lösungen mit Teammitgliedern teilen,
Entscheidungen dokumentieren oder Wissensbasen aus Coding-Sessions erstellen.
Definiere eigene Anweisungen für das Verhalten von Agent. Regeln helfen, Coding-Standards einzuhalten, Muster durchzusetzen und zu personalisieren, wie Agent dich bei deinem Projekt unterstützt.
Agent kann längere Aufgaben in überschaubare Schritte mit Abhängigkeiten aufteilen und so einen strukturierten Plan erstellen, der sich während der Arbeit laufend aktualisiert.
### So funktioniert’s
* Agent erstellt automatisch To-do-Listen für komplexe Aufgaben
* Jeder Eintrag kann Abhängigkeiten zu anderen Aufgaben haben
* Die Liste aktualisiert sich in Echtzeit, während die Arbeit voranschreitet
* Abgeschlossene Aufgaben werden automatisch abgehakt
### Sichtbarkeit
* To-dos erscheinen in der Chat-Oberfläche
* Wenn die [Slack-Integration](/de/slack) eingerichtet ist, sind To-dos auch dort sichtbar
* Du kannst die vollständige Aufgabenübersicht jederzeit ansehen
Für bessere Planung: Beschreibe dein Endziel klar. Agent erstellt
genauere Aufgabenaufteilungen, wenn der gesamte Umfang klar ist.
Planung und To-dos werden derzeit im Auto-Modus nicht unterstützt.
## Nachrichten in der Warteschlange
Stell Folgenachrichten in die Warteschlange, während Agent an der aktuellen Aufgabe arbeitet. Deine Anweisungen warten der Reihe nach und werden automatisch ausgeführt, sobald sie dran sind.
### Warteschlange verwenden
1. Während Agent arbeitet, tipp deine nächste Anweisung
2. Drück Ctrl+Enter, um sie zur Warteschlange hinzuzufügen
3. Nachrichten erscheinen der Reihe nach unter der aktiven Aufgabe
4. Ändere die Reihenfolge der wartenden Nachrichten, indem du auf den Pfeil klickst
5. Agent verarbeitet sie der Reihe nach, sobald er fertig ist
### Warteschlange überschreiben
Um deine Nachricht in die Warteschlange zu stellen statt die Standardübermittlung zu verwenden, nutz Ctrl+Enter. Um eine Nachricht sofort ohne Warteschlange zu senden, nutz Cmd+Enter. Das „force-pusht“ deine Nachricht, umgeht die Warteschlange und führt sie sofort aus.
## Standardnachrichten
Nachrichten werden standardmäßig so schnell wie möglich gesendet und erscheinen in der Regel direkt, nachdem Agent einen Toolaufruf abgeschlossen hat. Das sorgt für die schnellstmögliche Reaktion.
### So funktionieren Standardnachrichten
* Deine Nachricht wird an die zuletzt gesendete Nutzer-Nachricht im Chat angehängt
* Nachrichten werden normalerweise an Tool-Ergebnisse angehängt und sofort gesendet, sobald sie vorliegen
* Das sorgt für einen natürlicheren Gesprächsfluss, ohne die aktuelle Arbeit von Agent zu unterbrechen
* Standardmäßig passiert das, wenn du Enter drückst, während Agent arbeitet
# Diffs & Review
Source: https://docs.cursor.com/de/agent/review
Vom Agent generierte Codeänderungen überprüfen und verwalten
Wenn der Agent Codeänderungen erzeugt, werden sie in einer Review-Oberfläche angezeigt, die Hinzufügungen und Löschungen mit farbcodierten Zeilen darstellt. So kannst du prüfen und steuern, welche Änderungen in deiner Codebasis übernommen werden.
Die Review-Oberfläche zeigt Codeänderungen in einem vertrauten Diff-Format an:
Nachdem die Generierung abgeschlossen ist, siehst du eine Aufforderung, alle Änderungen zu überprüfen, bevor es weitergeht. So bekommst du einen Überblick darüber, was geändert wird.
### Datei für Datei
Unten auf deinem Bildschirm erscheint eine schwebende Review-Leiste, mit der du:
* Änderungen für die aktuelle Datei **annehmen** oder **ablehnen** kannst
* Zur **nächsten Datei** mit ausstehenden Änderungen springen kannst
### Selektive Annahme
Für fein abgestimmte Kontrolle:
* Um die meisten Änderungen anzunehmen: unerwünschte Zeilen ablehnen, dann auf **Alle annehmen** klicken
* Um die meisten Änderungen abzulehnen: gewünschte Zeilen annehmen, dann auf **Alle ablehnen** klicken
## Änderungen überprüfen
Klick am Ende der Agent-Antwort auf **Änderungen überprüfen**, um das vollständige Diff der Änderungen zu sehen.
# Terminal
Source: https://docs.cursor.com/de/agent/terminal
Terminalbefehle automatisch als Teil von Agent-Aktionen ausführen
Der Agent führt Befehle im nativen Terminal von Cursor aus, die History bleibt erhalten. Klick auf Skip, um Strg+C zu senden und Befehle abzubrechen.
## Fehlerbehebung
Einige Shell-Themes (zum Beispiel Powerlevel9k/Powerlevel10k) können die
Inline-Terminalausgabe stören. Wenn deine Befehlsausgabe abgeschnitten
oder falsch formatiert wirkt, deaktiviere das Theme oder wechsle zu einer
einfacheren Eingabeaufforderung, solange Agent läuft.
### Aufwendige Prompts für Agent-Sessions deaktivieren
Verwende die Umgebungsvariable `CURSOR_AGENT` in deiner Shell-Konfiguration, um zu erkennen,
wann Agent läuft, und überspring die Initialisierung von aufwendigen Prompts/Themes.
```zsh theme={null}
# ~/.zshrc — Powerlevel10k deaktivieren, wenn der Cursor Agent läuft
if [[ -n "$CURSOR_AGENT" ]]; then
# Theme-Initialisierung auslassen für bessere Kompatibilität
else
[[ -r ~/.p10k.zsh ]] && source ~/.p10k.zsh
fi
```
```bash theme={null}
# ~/.bashrc — in Agent-Sitzungen auf eine einfache Eingabeaufforderung zurückgreifen
if [[ -n "$CURSOR_AGENT" ]]; then
PS1='\u@\h \W \$ '
fi
```
# Tools
Source: https://docs.cursor.com/de/agent/tools
Tools, die Agenten zum Suchen, Bearbeiten und Ausführen von Code zur Verfügung stehen
Eine Liste aller Tools, die den Modi innerhalb des [Agent](/de/agent/overview) zur Verfügung stehen und die du beim Erstellen deiner eigenen [Custom Modes](/de/agent/modes#custom) aktivieren oder deaktivieren kannst.
Es gibt kein Limit für die Anzahl der Tool-Aufrufe, die Agent während einer Aufgabe durchführen kann. Agent verwendet die Tools nach Bedarf weiter, bis deine Anfrage erfüllt ist.
## Suche
Tools, mit denen du deine Codebase und das Web durchsuchen kannst, um relevante Informationen zu finden.
Liest bis zu 250 Zeilen (750 im Max-Modus) einer Datei.
Liest die Struktur eines Verzeichnisses, ohne Dateiinhalte zu öffnen.
Führe semantische Suchen in deiner [indizierten
Codebase](/de/context/codebase-indexing) durch.
Suche nach exakten Schlüsselwörtern oder Mustern in Dateien.
Finde Dateien anhand des Namens mit Fuzzy-Matching.
Generiere Suchanfragen und führe Websuchen durch.
Rufe bestimmte [Regeln](/de/context/rules) basierend auf Typ und Beschreibung ab.
## Edit
Tools, mit denen du gezielt Änderungen an deinen Dateien und in deinem Codebase vornimmst.
Schlage Änderungen an Dateien vor und [wende](/de/agent/apply) sie automatisch an.
Lösche Dateien autonom (kann in den Einstellungen deaktiviert werden).
## Ausführen
Chat kann mit deinem Terminal interagieren.
Terminalbefehle ausführen und Ausgaben überwachen.
Standardmäßig verwendet Cursor das erste verfügbare Terminalprofil.
So legst du dein bevorzugtes Terminalprofil fest:
1. Öffne die Befehlspalette (`Cmd/Ctrl+Shift+P`)
2. Suche nach „Terminal: Select Default Profile“
3. Wähle das gewünschte Profil aus
## MCP
Chat kann konfigurierte MCP-Server nutzen, um mit externen Diensten wie Datenbanken oder Drittanbieter-APIs zu interagieren.
Verfügbare MCP-Server umschalten. Berücksichtigt die Auto-Run-Konfiguration.
Erfahre mehr über das [Model Context Protocol](/de/context/model-context-protocol) und entdecke verfügbare Server im [MCP-Verzeichnis](/de/tools).
Du kannst auf Background Agents auf zwei Arten zugreifen:
1. **Background-Agenten-Seitenleiste**: Nutze den Tab für Background Agents in der nativen Cursor-Seitenleiste, um alle mit deinem Account verknüpften Background Agents anzuzeigen, bestehende Agents zu durchsuchen und neue zu starten.
2. **Background-Agent-Mode**: Drück Cmd E, um den Background-Agent-Mode in der UI zu aktivieren.
Nachdem du eine Eingabe abgeschickt hast, wähl deinen Agent aus der Liste, um den Status anzusehen und in die Machine einzusteigen.
Background Agents benötigen eine Datenaufbewahrung über einige Tage.
## Setup
Background-Agents laufen standardmäßig auf einer isolierten, Ubuntu-basierten Maschine. Die Agents haben Internetzugang und können Pakete installieren.
#### GitHub-Verbindung
Background Agents klonen dein Repo von GitHub und arbeiten auf einem eigenen Branch; sie pushen ihre Änderungen in dein Repo, damit die Übergabe leicht fällt.
Gewähre Lese- und Schreibrechte für dein Repo (sowie alle abhängigen Repos oder Submodule). In Zukunft werden wir weitere Anbieter (GitLab, Bitbucket usw.) unterstützen.
##### Konfiguration der IP-Allowlist
Wenn deine Organisation die IP-Allowlist-Funktion von GitHub verwendet, musst du den Zugriff für Hintergrund-Agents konfigurieren. Sieh dir die [GitHub-Integrationsdokumentation](/de/integrations/github#ip-allow-list-configuration) für vollständige Setup-Anweisungen inklusive Kontaktinformationen und IP-Adressen an.
#### Basis-Setup der Umgebung
Für fortgeschrittene Fälle richtest du die Umgebung selbst ein. Hol dir eine IDE-Instanz, die mit der Remote-Maschine verbunden ist. Richte deine Maschine ein, installiere Tools und Pakete und erstelle dann einen Snapshot. Konfiguriere die Runtime-Einstellungen:
* Der Install-Befehl läuft, bevor ein Agent startet, und installiert Runtime-Abhängigkeiten. Das kann bedeuten, `npm install` oder `bazel build` auszuführen.
* Terminals starten Hintergrundprozesse, während der Agent arbeitet – etwa einen Webserver oder das Kompilieren von Protobuf-Dateien.
Für die anspruchsvollsten Fälle nutze eine Dockerfile für das Maschinen-Setup. Die Dockerfile erlaubt dir, Systemabhängigkeiten einzurichten: bestimmte Compiler-Versionen installieren, Debugger hinzufügen oder das Basis-OS-Image wechseln. Kopiere nicht das gesamte Projekt mit `COPY` – wir verwalten den Workspace und checken den korrekten Commit aus. Die Installation von Abhängigkeiten gehört weiterhin ins Install-Skript.
Gib alle benötigten Secrets für deine Dev-Umgebung ein – sie werden verschlüsselt im Ruhezustand (mit KMS) in unserer Datenbank gespeichert und dem Agent im Hintergrund bereitgestellt.
Das Maschinen-Setup liegt in `.cursor/environment.json`, was in deinem Repo committed werden kann (empfohlen) oder privat gespeichert wird. Der Setup-Flow führt dich durch das Erstellen von `environment.json`.
#### Wartungsbefehle
Beim Einrichten einer neuen Maschine starten wir mit der Basisumgebung und führen dann den `install`-Befehl aus deiner `environment.json` aus. Das ist der Befehl, den ein Developer beim Wechseln von Branches ausführen würde – um neue Dependencies zu installieren.
Für die meisten ist der `install`-Befehl `npm install` oder `bazel build`.
Damit die Maschine schnell startet, cachen wir den Disk-Status, nachdem der `install`-Befehl gelaufen ist. Gestalte ihn so, dass er mehrfach ausgeführt werden kann. Es bleibt nur der Disk-Status aus dem `install`-Befehl bestehen – Prozesse, die hier gestartet werden, laufen nicht mehr, wenn der Agent startet.
#### Startup-Befehle
Nachdem `install` ausgeführt wurde, startet die Maschine und wir führen den Befehl `start` aus, gefolgt vom Starten aller `terminals`. Dadurch werden Prozesse gestartet, die laufen sollten, wenn der Agent aktiv ist.
Den Befehl `start` kannst du oft überspringen. Nutz ihn, wenn deine Dev-Umgebung auf Docker setzt – pack `sudo service docker start` in den `start`-Befehl.
`terminals` sind für App-Code. Diese Terminals laufen in einer `tmux`-Session, die dir und dem Agent zur Verfügung steht. Viele Website-Repos hinterlegen zum Beispiel `npm run watch` als Terminal.
#### Die Spezifikation von `environment.json`
Die Datei `environment.json` kann so aussehen:
```json theme={null}
{
"snapshot": "POPULATED_FROM_SETTINGS",
"install": "npm install",
"terminals": [
{
"name": "Next.js ausführen",
"command": "npm run dev"
}
]
}
```
Formal ist die Spezifikation [hier definiert](https://www.cursor.com/schemas/environment.schema.json).
## Modelle
Für Hintergrund-Agents sind nur Modelle verfügbar, die mit [Max Mode](/de/context/max-mode) kompatibel sind.
## Preise
Erfahre mehr über die [Preise des Background Agents](/de/account/pricing#background-agent).
## Sicherheit
Background Agents sind im Privacy Mode verfügbar. Wir trainieren niemals auf deinem Code und behalten Code nur so lange, wie der Agent läuft. [Erfahre mehr über den Privacy Mode](https://www.cursor.com/privacy-overview).
Was du wissen solltest:
1. Gewähre unserer GitHub-App Lese- und Schreibrechte für die Repos, die du bearbeiten willst. Wir nutzen das, um das Repo zu klonen und Änderungen vorzunehmen.
2. Dein Code läuft in unserer AWS-Infrastruktur in isolierten VMs und wird auf VM-Datenträgern gespeichert, solange der Agent aktiv ist.
3. Der Agent hat Internetzugang.
4. Der Agent führt alle Terminalbefehle automatisch aus, sodass er Tests iterativ ausführen kann. Das unterscheidet sich vom Foreground Agent, der für jeden Befehl deine Zustimmung benötigt. Automatisches Ausführen birgt ein Risiko der Datenexfiltration: Angreifer könnten Prompt-Injection-Angriffe durchführen und den Agenten dazu bringen, Code auf bösartige Websites hochzuladen. Siehe [OpenAIs Erklärung zu Risiken von Prompt Injection für Background Agents](https://platform.openai.com/docs/codex/agent-network#risks-of-agent-internet-access).
5. Wenn der Privacy Mode deaktiviert ist, sammeln wir Prompts und Entwicklungsumgebungen, um das Produkt zu verbessern.
6. Wenn du den Privacy Mode beim Start eines Background Agents deaktivierst und ihn dann während der Laufzeit wieder aktivierst, läuft der Agent weiter mit deaktiviertem Privacy Mode, bis er fertig ist.
## Dashboard-Einstellungen
Workspace-Admins können zusätzliche Einstellungen auf dem Dashboard im Tab „Background Agents“ konfigurieren.
### Standard-Einstellungen
* **Standardmodell** – das Modell, das verwendet wird, wenn ein Run keins angibt. Wähle ein beliebiges Modell, das den Max Mode unterstützt.
* **Standard-Repository** – wenn leer, bitten die Agents dich, ein Repo auszuwählen. Wenn du hier ein Repo angibst, kannst du diesen Schritt überspringen.
* **Basis-Branch** – der Branch, von dem die Agents beim Erstellen von Pull Requests forken. Leer lassen, um den Standard-Branch des Repositories zu verwenden.
### Sicherheitseinstellungen
Alle Sicherheitsoptionen erfordern Admin-Rechte.
* **Nutzungsbeschränkungen** – wähle *Keine* (alle Mitglieder können Hintergrund-Agents starten) oder *Allow List*. Wenn *Allow List* aktiv ist, legst du genau fest, welche Teammitglieder Agents erstellen dürfen.
* **Team-Follow-ups** – wenn aktiviert, kann jede Person im Workspace Folgenachrichten zu einem Agent hinzufügen, den jemand anderes gestartet hat. Deaktiviere das, um Follow-ups auf den Agent-Owner und Admins zu beschränken.
* **Agent-Zusammenfassung anzeigen** – steuert, ob Cursor die File-Diff-Bilder und Code-Snippets des Agents anzeigt. Deaktiviere das, wenn du keine Dateipfade oder Code in der Seitenleiste anzeigen lassen willst.
* **Agent-Zusammenfassung in externen Kanälen anzeigen** – erweitert den vorherigen Schalter auf Slack oder jeden verbundenen externen Kanal.
Änderungen werden sofort gespeichert und gelten sofort für neue Agents.
# Nachverfolgung hinzufügen
Source: https://docs.cursor.com/de/background-agent/api/add-followup
en/background-agent/api/openapi.yaml post /v0/agents/{id}/followup
Sende eine zusätzliche Anweisung an einen laufenden Hintergrundagenten.
# Agentengespräch
Source: https://docs.cursor.com/de/background-agent/api/agent-conversation
en/background-agent/api/openapi.yaml get /v0/agents/{id}/conversation
Den Gesprächsverlauf eines Hintergrund-Agents abrufen.
Wenn der Hintergrund-Agent gelöscht wurde, kannst du nicht auf das Gespräch zugreifen.
# Agentstatus
Source: https://docs.cursor.com/de/background-agent/api/agent-status
en/background-agent/api/openapi.yaml get /v0/agents/{id}
Hol dir den aktuellen Status und die Ergebnisse eines bestimmten Hintergrundagents.
# API-Schlüsselinformationen
Source: https://docs.cursor.com/de/background-agent/api/api-key-info
en/background-agent/api/openapi.yaml get /v0/me
Ruft Metadaten zum für die Authentifizierung verwendeten API-Schlüssel ab.
# Einen Agenten löschen
Source: https://docs.cursor.com/de/background-agent/api/delete-agent
en/background-agent/api/openapi.yaml delete /v0/agents/{id}
Einen Hintergrundagenten und die zugehörigen Ressourcen dauerhaft löschen.
# Agent starten
Source: https://docs.cursor.com/de/background-agent/api/launch-an-agent
en/background-agent/api/openapi.yaml post /v0/agents
Einen neuen Hintergrundagenten starten, der an deinem Repository arbeitet.
# Agents auflisten
Source: https://docs.cursor.com/de/background-agent/api/list-agents
en/background-agent/api/openapi.yaml get /v0/agents
Abfrage einer paginierten Liste aller Hintergrund-Agents für den authentifizierten User.
# Modelle auflisten
Source: https://docs.cursor.com/de/background-agent/api/list-models
en/background-agent/api/openapi.yaml get /v0/models
Eine Liste empfohlener Modelle für Background-Agents abrufen.
Wenn du beim Erstellen das Modell des Background-Agents angeben willst, kannst du diesen Endpoint nutzen, um eine Liste empfohlener Modelle zu sehen.
In dem Fall empfehlen wir auch eine Option „Auto“, bei der du dem Create-Endpoint keinen Modellnamen übergibst und wir das passendste Modell auswählen.
# GitHub-Repositories auflisten
Source: https://docs.cursor.com/de/background-agent/api/list-repositories
en/background-agent/api/openapi.yaml get /v0/repositories
Eine Liste von GitHub-Repositories abrufen, auf die der authentifizierte Nutzer Zugriff hat.
**Dieser Endpoint hat sehr strenge Rate Limits.**
Begrenze Anfragen auf **1/Nutzer/Minute** und **30/Nutzer/Stunde.**
Bei Nutzern mit Zugriff auf viele Repositories kann die Antwort mehrere Dutzend Sekunden dauern.
Stell sicher, dass du sauber damit umgehst, wenn diese Informationen nicht verfügbar sind.
# Überblick
Source: https://docs.cursor.com/de/background-agent/api/overview
Hintergrund-Agents, die in deinen Repositories arbeiten, programmatisch erstellen und verwalten
# Background Agents API
Beta
Die Background Agents API ermöglicht dir, programmgesteuert KI-gestützte Coding-Agents zu erstellen und zu verwalten, die autonom in deinen Repositories arbeiten.
Du kannst die API nutzen, um automatisch auf Nutzerfeedback zu reagieren, Bugs zu beheben, Dokus zu aktualisieren und vieles mehr!
Die Background Agents API ist derzeit in der Beta – wir freuen uns über dein Feedback!
## Wichtige Features
* **Autonome Codegenerierung** - Erstell Agenten, die deinen Prompt verstehen und Änderungen an deiner Codebasis vornehmen können
* **Repository-Integration** - Arbeite direkt mit GitHub-Repositories
* Folge-Prompts - Füge laufenden Agenten zusätzliche Anweisungen hinzu
* **Nutzungsbasierte Abrechnung** - Zahl nur für die Tokens, die du verwendest
* **Skalierbar** - Support für bis zu 256 aktive Agenten pro API-Schlüssel
## Schnellstart
### 1. Hol dir deinen API‑Schlüssel
**Geh** zu [Cursor Dashboard → Integrations](https://cursor.com/dashboard?tab=integrations), um deinen API‑Schlüssel zu erstellen.
### 2. Starte mit der API
Alle API‑Endpunkte sind relativ zu:
```
https://api.cursor.com
```
Sieh dir die [API-Referenz](/de/background-agent/api/launch-an-agent) für eine detaillierte Liste der Endpoints an.
## Authentifizierung
Alle API-Requests erfordern eine Authentifizierung mit einem Bearer-Token:
```
Authorization: Bearer DEIN_API_KEY
```
API-Schlüssel werden im [Cursor Dashboard](https://cursor.com/dashboard?tab=integrations) erstellt. Schlüssel sind an dein Konto gebunden und berechtigen dich, Agents zu erstellen und zu verwalten (abhängig von deinen Planlimits und deinem Repository-Zugriff).
## Preise
Die API ist derzeit in der Beta und hat dieselben Preise wie Background Agents. Die Preise können sich ändern, während wir den Service skalieren. Schau dir die [Preise für Background Agents](/de/account/pricing#background-agent) an.
## Nächste Schritte
* Lies dir die Hauptseite zur [Übersicht über Background Agents](/de/background-agent) durch, um Umgebungen, Berechtigungen und Workflows zu verstehen.
* Probier Background Agents im [Web und auf dem Handy](/de/background-agent/web-and-mobile) aus.
* Mach bei der Diskussion auf [Discord #background-agent](https://discord.gg/jfgpZtYpmb) mit oder schreib an [background-agent-feedback@cursor.com](mailto:background-agent-feedback@cursor.com).
# Webhooks
Source: https://docs.cursor.com/de/background-agent/api/webhooks
Erhalte Echtzeit-Benachrichtigungen über Statusänderungen von Background Agents
# Webhooks
Wenn du einen Agent mit einer Webhook-URL erstellst, sendet Cursor HTTP-POST-Anfragen, um dich über Statusänderungen zu informieren. Derzeit werden nur `statusChange`-Events unterstützt – konkret, wenn ein Agent den Zustand `ERROR` oder `FINISHED` erreicht.
## Webhook-Verifizierung
Um sicherzugehen, dass die Webhook-Anfragen wirklich von Cursor stammen, überprüf die Signatur, die jeder Anfrage beigefügt ist:
### Header
Jede Webhook-Anfrage enthält die folgenden Header:
* **`X-Webhook-Signature`** – Enthält die HMAC-SHA256-Signatur im Format `sha256=`
* **`X-Webhook-ID`** – Eine eindeutige Kennung für diese Zustellung (nützlich fürs Logging)
* **`X-Webhook-Event`** – Der Ereignistyp (aktuell nur `statusChange`)
* **`User-Agent`** – Immer gesetzt auf `Cursor-Agent-Webhook/1.0`
### Signaturüberprüfung
Um die Webhook-Signatur zu verifizieren, berechne die erwartete Signatur und vergleiche sie mit der empfangenen:
```javascript theme={null}
const crypto = require('crypto');
function verifyWebhook(secret, rawBody, signature) {
const expectedSignature = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return signature === expectedSignature;
}
```
```python theme={null}
import hmac
import hashlib
def verify_webhook(secret, raw_body, signature):
expected_signature = 'sha256=' + hmac.new(
secret.encode(),
raw_body,
hashlib.sha256
).hexdigest()
return signature == expected_signature
```
Verwende zum Berechnen der Signatur immer den unveränderten Request-Body (vor jeglicher Parsing-Logik).
## Payload-Format
Die Webhook-Payload wird als JSON mit folgender Struktur gesendet:
```json theme={null}
{
"event": "statusChange",
"timestamp": "2024-01-15T10:30:00Z",
"id": "bc_abc123",
"status": "FINISHED",
"source": {
"repository": "https://github.com/your-org/your-repo",
"ref": "main"
},
"target": {
"url": "https://cursor.com/agents?id=bc_abc123",
"branchName": "cursor/add-readme-1234",
"prUrl": "https://github.com/your-org/your-repo/pull/1234"
},
"summary": "README.md mit Installationsanleitung hinzugefügt"
}
```
Beachte, dass einige Felder optional sind und nur angezeigt werden, wenn sie verfügbar sind.
## Best Practices
* **Signaturen prüfen** – überprüf die Webhook-Signatur, um sicherzustellen, dass die Anfrage von Cursor kommt
* **Retries behandeln** – Webhooks können erneut zugestellt werden, wenn dein Endpoint einen Fehlerstatuscode zurückgibt
* **Schnell antworten** – gib so schnell wie möglich einen 2xx-Statuscode zurück
* **HTTPS verwenden** – nutz in Produktion immer HTTPS-URLs für Webhook-Endpoints
* **Rohpayloads speichern** – speichere die rohe Webhook-Payload fürs Debugging und für spätere Verifizierung
# Web & Mobile
Source: https://docs.cursor.com/de/background-agent/web-and-mobile
Führe Coding-Agents auf jedem Gerät aus – mit nahtlosem Handover auf den Desktop
## Übersicht
Der Web-Agent von Cursor bringt einen leistungsstarken Coding-Assistenten auf jedes Gerät. Ob du auf deinem Handy beim Spazierengehen bist oder im Browser arbeitest – du kannst jetzt starke Coding-Agents starten, die im Hintergrund laufen.
Wenn sie fertig sind, hol ihre Arbeit in Cursor ab, prüf und mergen die Änderungen oder teil Links mit deinem Team, um zusammenzuarbeiten.
Leg los unter [cursor.com/agents](https://cursor.com/agents).
## Erste Schritte
### Schnelle Einrichtung
1. **Web-App aufrufen**: Öffne [cursor.com/agents](https://cursor.com/agents) auf einem beliebigen Gerät
2. **Anmelden**: Melde dich mit deinem Cursor-Account an
3. **GitHub verbinden**: Verknüpfe deinen GitHub-Account, um auf Repositories zuzugreifen
4. **Ersten Agenten starten**: Gib eine Aufgabe ein und schau zu, wie der Agent loslegt
### Mobile Installation
Für die beste mobile Nutzung installiere Cursor als Progressive Web App (PWA):
* **iOS**: Öffne [cursor.com/agents](https://cursor.com/agents) in Safari, tippe auf den Teilen-Button und dann auf „Zum Home-Bildschirm hinzufügen“
* **Android**: Öffne die URL in Chrome, tippe auf das Menü und dann auf „Zum Startbildschirm hinzufügen“ oder „App installieren“
Die Installation als PWA bietet ein natives Nutzungserlebnis mit: - Vollbildoberfläche - Schnelleren Startzeiten - App-Icon auf deinem Home-Bildschirm
## Geräteübergreifend arbeiten
Der Web- und Mobile-Agent ist dafür gemacht, nahtlos mit deinem Desktop-Workflow zu funktionieren; klick auf „Open in Cursor“, um die Arbeit des Agents in deiner IDE fortzusetzen.
### Teamzusammenarbeit
* **Gemeinsamer Zugriff**: Teile Links mit Teammitgliedern, um bei Agent-Runs zusammenzuarbeiten.
* **Review-Prozess**: Mitarbeitende können Diffs prüfen und Feedback geben.
* **Pull-Request-Management**: Erstelle, reviewe und merge Pull Requests direkt in der Weboberfläche.
### Slack-Integration
Starte Agents direkt aus Slack, indem du `@Cursor` erwähnst, und wenn du Agents aus dem Web oder von Mobile startest, kannst du dich nach Abschluss per Slack benachrichtigen lassen.
Erfahre mehr über Einrichtung und Nutzung der Slack-Integration, einschließlich
dem Auslösen von Agents und dem Empfangen von Benachrichtigungen.
## Preise
Web- und Mobile-Agents verwenden dasselbe Preismodell wie Background Agents.
Erfahre mehr über die [Preise für Background Agents](/de/account/pricing#background-agent).
## Fehlerbehebung
* Stell sicher, dass du eingeloggt bist und dein GitHub-Konto verbunden ist. - Prüfe,
ob du die nötigen Repository-Berechtigungen hast. - Du musst außerdem eine Pro-Testphase
oder einen kostenpflichtigen Plan mit aktivierter nutzungsbasierter Abrechnung haben. Um die
nutzungsbasierte Abrechnung zu aktivieren, geh im
[Dashboard](https://www.cursor.com/dashboard?tab=settings) zum Tab „Settings“.
Versuch, die Seite zu aktualisieren oder den Browser-Cache zu leeren. Stell sicher, dass du
auf allen Geräten dasselbe Konto verwendest.
Check, ob dein Workspace-Admin die Cursor-Slack-App installiert hat und ob
du die passenden Berechtigungen hast.
# Bugbot
Source: https://docs.cursor.com/de/bugbot
KI-Code-Review für Pull Requests
Bugbot prüft Pull Requests und findet Bugs, Sicherheitslücken und Probleme bei der Codequalität.
Bugbot hat eine kostenlose Stufe: Du bekommst jeden Monat eine begrenzte Anzahl kostenloser PR-Reviews. Sobald du das Limit erreichst, pausieren die Reviews bis zu deinem nächsten Abrechnungszeitraum. Du kannst jederzeit auf eine 14‑tägige kostenlose Pro-Testversion upgraden und unbegrenzt reviewen (vorbehaltlich der üblichen Abuse-Schutzmechanismen).
## So funktioniert’s
Bugbot analysiert PR-Diffs und hinterlässt Kommentare mit Erklärungen und Vorschlägen zur Behebung. Es läuft automatisch bei jedem PR-Update oder manuell, wenn es ausgelöst wird.
* Führt bei jedem PR-Update **automatische Reviews** aus
* **Manueller Trigger** durch einen Kommentar mit `cursor review` oder `bugbot run` in einem beliebigen PR
* **In Cursor beheben**-Links öffnen Issues direkt in Cursor
* **Im Web beheben**-Links öffnen Issues direkt unter [cursor.com/agents](https://cursor.com/agents)
## Einrichtung
Erfordert Cursor-Adminrechte und Adminrechte für die GitHub-Organisation.
1. Geh zu [cursor.com/dashboard](https://cursor.com/dashboard?tab=bugbot)
2. Wechsel zum Tab „Bugbot“
3. Klick auf „Connect GitHub“ (oder „Manage Connections“, wenn schon verbunden)
4. Folge dem GitHub-Installationsprozess
5. Geh zurück zum Dashboard und aktiviere Bugbot für bestimmte Repositories
## Konfiguration
### Repository-Einstellungen
Aktiviere oder deaktiviere Bugbot pro Repository über deine Installationsliste. Bugbot läuft nur auf PRs, die du erstellt hast.
### Persönliche Einstellungen
* **Nur bei Erwähnung** ausführen, indem du `cursor review` oder `bugbot run` kommentierst
* **Nur einmal** pro PR ausführen und nachfolgende Commits überspringen
### Repository-Einstellungen
Team-Admins können Bugbot pro Repository aktivieren, Allow-/Deny-Listen für Reviewer konfigurieren und festlegen:
* **Nur einmal** pro PR und Installation ausführen und nachfolgende Commits überspringen
* **Inline-Reviews deaktivieren**, damit Bugbot keine Kommentare direkt an Codezeilen hinterlässt
Bugbot läuft für alle Beitragenden in aktivierten Repositories, unabhängig von der Teamzugehörigkeit.
### Persönliche Einstellungen
Teammitglieder können Einstellungen für ihre eigenen PRs überschreiben:
* **Nur bei Erwähnung** ausführen, indem du `cursor review` oder `bugbot run` kommentierst
* **Nur einmal** pro PR ausführen und nachfolgende Commits überspringen
* **Reviews für Draft-PRs aktivieren**, um Entwurfs-Pull-Requests in automatische Reviews einzubeziehen
### Analytics
## Regeln
Leg `.cursor/BUGBOT.md`-Dateien an, um projektspezifischen Kontext für Reviews bereitzustellen. Bugbot berücksichtigt immer die `.cursor/BUGBOT.md`-Datei im Projektstamm sowie alle zusätzlichen Dateien, die beim Aufwärtsgehen von geänderten Dateien aus gefunden werden.
```
project/
.cursor/BUGBOT.md # Immer enthalten (projektweite Regeln)
backend/
.cursor/BUGBOT.md # Wird beim Review von Backend-Dateien einbezogen
api/
.cursor/BUGBOT.md # Wird beim Review von API-Dateien einbezogen
frontend/
.cursor/BUGBOT.md # Wird beim Review von Frontend-Dateien einbezogen
```
```markdown theme={null}
# Richtlinien zur Projektüberprüfung
## Sicherheitsschwerpunkte
- Eingaben in API-Endpunkten validieren
- Auf SQL-Injection-Schwachstellen in Datenbankabfragen prüfen
- Korrekte Authentifizierung auf geschützten Routen sicherstellen
## Architekturpatterns
- Dependency Injection für Services verwenden
- Repository-Pattern für den Datenzugriff einsetzen
- Robuste Fehlerbehandlung mit eigenen Fehlerklassen implementieren
## Häufige Probleme
- Memory-Leaks in React-Komponenten (useEffect-Cleanup prüfen)
- Fehlende Error Boundaries in UI-Komponenten
- Inkonsistente Namenskonventionen (camelCase für Funktionen verwenden)
```
## Preise
Bugbot bietet zwei Pläne: **Free** und **Pro**.
### Free-Tarif
Jede:r Nutzer:in bekommt jeden Monat eine begrenzte Anzahl kostenloser PR-Reviews. In Teams erhält jedes Teammitglied seine eigenen kostenlosen Reviews. Wenn du das Limit erreichst, werden Reviews bis zu deinem nächsten Abrechnungszeitraum ausgesetzt. Du kannst jederzeit auf die 14‑tägige kostenlose Pro-Testversion mit unbegrenzten Reviews upgraden.
### Pro-Tarif
### Pauschalpreis
40 \$ pro Monat für unbegrenzte Bugbot-Reviews bei bis zu 200 PRs pro Monat über alle Repositories hinweg.
### Erste Schritte
Abonniere über deine Kontoeinstellungen.
### Abrechnung pro Nutzer
Teams zahlen 40 \$ pro Nutzer und Monat für unbegrenzte Reviews.
Als Nutzer zählt jede Person, die in einem Monat PRs verfasst hat, die von Bugbot reviewed wurden.
Alle Lizenzen werden zu Beginn jedes Abrechnungszyklus freigegeben und anschließend nach dem Prinzip „First come, first served“ vergeben. Wenn ein Nutzer in einem Monat keine PRs verfasst, die von Bugbot reviewed wurden, kann der Platz von einem anderen Nutzer verwendet werden.
### Sitzplatzlimits
Team-Admins können maximale Bugbot-Sitzplätze pro Monat festlegen, um die Kosten zu kontrollieren.
### Erste Schritte
Abonniert über euer Team-Dashboard, um die Abrechnung zu aktivieren.
### Schutzmaßnahmen gegen Missbrauch
Um Missbrauch zu verhindern, gibt es ein gepooltes Limit von 200 Pull Requests pro Monat pro Bugbot-Lizenz. Wenn du mehr als 200 Pull Requests pro Monat brauchst, schreib uns an [hi@cursor.com](mailto:hi@cursor.com) und wir helfen dir gern weiter.
Wenn dein Team zum Beispiel 100 Nutzer hat, kann deine Organisation zunächst 20.000 Pull Requests pro Monat reviewen. Wenn ihr dieses Limit regulär erreicht, meldet euch bei uns und wir erhöhen es gern.
## Fehlerbehebung
Wenn Bugbot nicht funktioniert:
1. **Aktiviere den Verbose-Modus**, indem du `cursor review verbose=true` oder `bugbot run verbose=true` hinzufügst, um detaillierte Logs und die Request-ID zu erhalten
2. **Prüfe die Berechtigungen**, um sicherzustellen, dass Bugbot Zugriff auf das Repository hat
3. **Überprüfe die Installation**, um zu bestätigen, dass die GitHub-App installiert und aktiviert ist
Füge beim Melden von Problemen die Request-ID aus dem Verbose-Modus bei.
## FAQ
Ja, Bugbot erfüllt dieselben Datenschutzanforderungen wie Cursor und verarbeitet Daten genauso wie andere Cursor‑Anfragen.
Wenn du dein monatliches Free‑Tier‑Limit erreichst, werden Bugbot‑Reviews bis zu deinem nächsten Abrechnungszeitraum pausiert. Du kannst auf die 14‑tägige kostenlose Pro‑Testversion upgraden und unbegrenzt Reviews erhalten (vorbehaltlich der üblichen Schutzmaßnahmen gegen Missbrauch).
```
```
# Code Review
Source: https://docs.cursor.com/de/cli/cookbook/code-review
Erstell einen GitHub-Actions-Workflow, der die Cursor-CLI verwendet, um Pull Requests automatisch zu prüfen und Feedback zu geben
Dieses Tutorial zeigt dir, wie du Code Reviews mit der Cursor-CLI in GitHub Actions einrichtest. Der Workflow analysiert Pull Requests, identifiziert Probleme und postet Feedback als Kommentare.
Für die meisten Nutzer empfehlen wir stattdessen [Bugbot](/de/bugbot). Bugbot bietet ein verwaltetes, automatisiertes Code Review ohne Setup. Dieser CLI-Ansatz ist hilfreich, um die Möglichkeiten zu erkunden und für fortgeschrittene Anpassungen.
```yaml cursor-code-review.yml theme={null}
name: Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
pull-requests: write
contents: read
issues: write
jobs:
code-review:
runs-on: ubuntu-latest
# Automatisierte Code-Reviews für Entwurfs-PRs überspringen
if: github.event.pull_request.draft == false
steps:
- name: Repository auschecken
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Cursor-CLI installieren
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Git-Identität konfigurieren
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Automatisiertes Code-Review durchführen
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BLOCKING_REVIEW: ${{ vars.BLOCKING_REVIEW || 'false' }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print 'Du arbeitest in einem GitHub-Actions-Runner und führst ein automatisiertes Code-Review durch. Die gh-CLI ist verfügbar und über GH_TOKEN authentifiziert. Du darfst Pull Requests kommentieren.
Kontext:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
- Blockierendes Review: ${{ env.BLOCKING_REVIEW }}
Ziele:
1) Bestehende Review-Kommentare erneut prüfen und mit resolved antworten, wenn erledigt.
2) Den aktuellen PR-Diff prüfen und nur eindeutige, schwerwiegende Probleme markieren.
3) Sehr kurze Inline-Kommentare (1–2 Sätze) ausschließlich auf geänderten Zeilen hinterlassen und am Ende eine kurze Zusammenfassung.
Vorgehen:
- Bestehende Kommentare abrufen: gh pr view --json comments
- Diff abrufen: gh pr diff
- Geänderte Dateien mit Patches abrufen, um Inline-Positionen zu berechnen: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --paginate --jq '.[] | {filename,patch}'
- Exakte Inline-Anker für jedes Problem berechnen (Dateipfad + Diff-Position). Kommentare MÜSSEN inline auf der geänderten Zeile im Diff platziert werden, nicht als Top-Level-Kommentare.
- Frühere Top-Level-Kommentare im Stil „keine Probleme“ erkennen, die von diesem Bot verfasst wurden (Texte wie: "✅ no issues", "No issues found", "LGTM").
- Wenn beim aktuellen Lauf Probleme gefunden werden und frühere „keine Probleme“-Kommentare existieren:
- Diese nach Möglichkeit entfernen, um Verwirrung zu vermeiden:
- Versuchen, Top-Level-Kommentare zu löschen via: gh api -X DELETE repos/${{ github.repository }}/issues/comments/
- Falls Löschen nicht möglich ist, via GraphQL minimieren (minimizeComment) oder so bearbeiten, dass "[Superseded by new findings]" vorangestellt wird.
- Falls weder Löschen noch Minimieren möglich ist, auf diesen Kommentar antworten: "⚠️ Superseded: issues were found in newer commits".
- Wenn ein zuvor gemeldetes Problem durch nahe Änderungen behoben erscheint, antworte: ✅ This issue appears to be resolved by the recent changes
- NUR analysieren auf:
- Null/undefined-Dereferenzierungen
- Ressourcenlecks (nicht geschlossene Dateien oder Verbindungen)
- Injection (SQL/XSS)
- Nebenläufigkeit/Race Conditions
- Fehlende Fehlerbehandlung bei kritischen Operationen
- Offensichtliche Logikfehler mit fehlerhaftem Verhalten
- Klare Performance-Anti-Patterns mit messbarem Einfluss
- Eindeutige Sicherheitslücken
- Duplikate vermeiden: überspringen, wenn ähnliches Feedback bereits auf oder nahe derselben Zeile existiert.
Kommentarregeln:
- Maximal 10 Inline-Kommentare insgesamt; priorisiere die kritischsten Probleme
- Ein Problem pro Kommentar; exakt auf der geänderten Zeile platzieren
- Alle Problemkommentare MÜSSEN inline sein (an Datei und Zeile/Position im PR-Diff verankert)
- Natürlicher Ton, spezifisch und umsetzbar; nicht erwähnen, dass es automatisiert ist oder auf hoher Sicherheit beruht
- Emojis verwenden: 🚨 Kritisch 🔒 Sicherheit ⚡ Performance ⚠️ Logik ✅ Behoben ✨ Verbesserung
Einreichung:
- Wenn es KEINE Probleme zu melden gibt und bereits ein bestehender Top-Level-Kommentar vorhanden ist, der „keine Probleme“ angibt (z. B. "✅ no issues", "No issues found", "LGTM"), KEINEN weiteren Kommentar einreichen. Einreichung überspringen, um Redundanz zu vermeiden.
- Wenn es KEINE Probleme zu melden gibt und KEIN vorheriger „keine Probleme“-Kommentar existiert, einen kurzen Zusammenfassungskommentar einreichen, der keine Probleme vermerkt.
- Wenn es Probleme zu melden gibt und ein vorheriger „keine Probleme“-Kommentar existiert, sicherstellen, dass der vorherige Kommentar vor Einreichung des neuen Reviews gelöscht/minimiert/als überholt markiert wird.
- Wenn es Probleme zu melden gibt, EIN Review einreichen, das NUR Inline-Kommentare plus einen optionalen knappen Zusammenfassungstext enthält. Die GitHub-Reviews-API verwenden, um sicherzustellen, dass Kommentare inline sind:
- Ein JSON-Array von Kommentaren erstellen wie: [{ "path": "", "position": , "body": "..." }]
- Einreichen via: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews -f event=COMMENT -f body="$SUMMARY" -f comments='[$COMMENTS_JSON]'
- NICHT verwenden: gh pr review --approve oder --request-changes
Blockierendes Verhalten:
- Wenn BLOCKING_REVIEW true ist und irgendein 🚨- oder 🔒-Problem gepostet wurde: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Andernfalls: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- CRITICAL_ISSUES_FOUND immer am Ende setzen
'
- name: Ergebnisse des blockierenden Reviews prüfen
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Prüfe auf kritische Probleme..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Kritische Probleme gefunden und blockierendes Review ist aktiviert. Workflow wird fehlgeschlagen."
exit 1
else
echo "✅ Keine blockierenden Probleme gefunden."
fi
```
## Authentifizierung konfigurieren
[Richte deinen API-Schlüssel und die Repository-Secrets ein](/de/cli/github-actions#authentication), um die Cursor-CLI in GitHub Actions zu authentifizieren.
## Agent-Berechtigungen einrichten
Erstell eine Konfigurationsdatei, um festzulegen, welche Aktionen der Agent ausführen darf. So verhinderst du unbeabsichtigte Aktionen wie das Pushen von Code oder das Erstellen von Pull Requests.
Erstell `.cursor/cli.json` im Root-Verzeichnis deines Repos:
```json theme={null}
{
"permissions": {
"deny": [
"Shell(git push)",
"Shell(gh pr create)",
"Write(**)"
]
}
}
```
Diese Konfiguration erlaubt dem Agenten, Dateien zu lesen und die GitHub-CLI für Kommentare zu verwenden, verhindert aber, dass er Änderungen an deinem Repository vornimmt. Sieh dir die [Berechtigungsreferenz](/de/cli/reference/permissions) für weitere Konfigurationsoptionen an.
## Baue den GitHub-Actions-Workflow
Lass uns den Workflow jetzt Schritt für Schritt aufsetzen.
### Richte den Workflow-Trigger ein
Erstelle `.github/workflows/cursor-code-review.yml` und konfiguriere ihn so, dass er bei Pull Requests ausgeführt wird:
```yaml theme={null}
name: Cursor-Code-Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
```
### Repository auschecken
Füg den Checkout-Schritt hinzu, um auf den Pull-Request-Code zuzugreifen:
```yaml theme={null}
- name: Repository auschecken
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
```
Bevor wir den vollständigen Review-Schritt implementieren, lass uns die Struktur unseres Review-Prompts verstehen. Dieser Abschnitt beschreibt, wie sich der Agent verhalten soll:
**Ziel**:
Wir wollen, dass der Agent den aktuellen PR-Diff prüft und nur eindeutige, schwerwiegende Probleme markiert, dann sehr kurze Inline-Kommentare (1–2 Sätze) ausschließlich zu geänderten Zeilen hinterlässt, mit einer kurzen Zusammenfassung am Ende. Das hält das Signal-Rausch-Verhältnis ausgewogen.
**Format**:
Wir wollen Kommentare, die kurz und auf den Punkt sind. Wir verwenden Emojis, um das Durchscannen der Kommentare zu erleichtern, und möchten am Ende eine High-Level-Zusammenfassung des gesamten Reviews.
**Abgabe**:
Wenn das Review abgeschlossen ist, soll der Agent einen kurzen Kommentar basierend auf den während des Reviews gefundenen Punkten hinzufügen. Der Agent sollte ein einziges Review einreichen, das Inline-Kommentare plus eine prägnante Zusammenfassung enthält.
**Edge Cases**:
Wir müssen Folgendes handhaben:
* Bereits vorhandene, aufgelöste Kommentare: Der Agent sollte sie als erledigt markieren, wenn sie adressiert wurden
* Duplikate vermeiden: Der Agent sollte das Kommentieren überspringen, wenn ähnliches Feedback bereits auf oder nahe derselben Zeile existiert
**Finaler Prompt**:
Der vollständige Prompt kombiniert all diese Verhaltensanforderungen, um fokussiertes, umsetzbares Feedback zu liefern
Jetzt lass uns den Review-Agent-Schritt implementieren:
```yaml theme={null}
- name: Code-Review durchführen
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ github.token }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print "Du arbeitest in einem GitHub-Actions-Runner und führst eine automatisierte Code-Review durch. Die gh-CLI ist verfügbar und über GH_TOKEN authentifiziert. Du darfst Pull Requests kommentieren.
Kontext:
- Repo: ${{ github.repository }}
- PR-Nummer: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
Ziele:
1) Bestehende Review-Kommentare erneut prüfen und bei Erledigung mit „resolved“ antworten
2) Den aktuellen PR-Diff prüfen und nur eindeutige, schwerwiegende Probleme markieren
3) Sehr kurze Inline-Kommentare (1–2 Sätze) nur auf geänderten Zeilen hinterlassen und am Ende eine kurze Zusammenfassung
Vorgehen:
- Vorhandene Kommentare abrufen: gh pr view --json comments
- Diff abrufen: gh pr diff
- Wenn ein zuvor gemeldetes Problem durch nahe Änderungen behoben wirkt, antworten: ✅ Dieses Problem scheint durch die jüngsten Änderungen behoben zu sein
- Duplikate vermeiden: überspringen, wenn ähnliches Feedback bereits auf oder nahe denselben Zeilen existiert
Kommentierregeln:
- Maximal 10 Inline-Kommentare insgesamt; die kritischsten Probleme priorisieren
- Ein Problem pro Kommentar; exakt auf der geänderten Zeile platzieren
- Natürlicher Ton, konkret und umsetzbar; keine Erwähnung von Automatisierung oder hoher Sicherheit
- Emojis verwenden: 🚨 Kritisch 🔒 Sicherheit ⚡ Performance ⚠️ Logik ✅ Erledigt ✨ Verbesserung
Einreichung:
- Eine Review einreichen, die Inline-Kommentare plus eine prägnante Zusammenfassung enthält
- Nur verwenden: gh pr review --comment
- Nicht verwenden: gh pr review --approve oder --request-changes"
```
```text theme={null}
.
├── .cursor/
│ └── cli.json
├── .github/
│ └── workflows/
│ └── cursor-code-review.yml
```
## Teste deinen Reviewer
Erstell einen Test-Pull-Request, um zu prüfen, dass der Workflow funktioniert und der Agent Review-Kommentare mit Emoji-Feedback postet.
## Nächste Schritte
Du hast jetzt ein funktionierendes, automatisiertes Code-Review-System. Überleg dir diese Erweiterungen:
* Richte zusätzliche Workflows zum [Beheben von CI-Fehlern](/de/cli/cookbook/fix-ci) ein
* Konfiguriere unterschiedliche Review-Stufen für verschiedene Branches
* Integriere den Workflow in den bestehenden Code-Review-Prozess deines Teams
* Passe das Verhalten des Agents für verschiedene Dateitypen oder Verzeichnisse an
Du kannst den Workflow so konfigurieren, dass er fehlschlägt, wenn kritische Probleme gefunden werden. So wird der Pull Request so lange nicht gemerged, bis sie behoben sind.
**Blockierendes Verhalten zum Prompt hinzufügen**
Aktualisiere zuerst deinen Review-Agent-Schritt, um die Umgebungsvariable `BLOCKING_REVIEW` einzuschließen, und füge dieses blockierende Verhalten zum Prompt hinzu:
```
Blocking behavior:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
```
**Blockierenden Prüfschritt hinzufügen**
Füg anschließend diesen neuen Schritt nach deinem Code-Review-Schritt hinzu:
```yaml theme={null}
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
# CI-Fehler beheben
Source: https://docs.cursor.com/de/cli/cookbook/fix-ci
CI-Probleme in einem Repository mit der Cursor CLI in GitHub Actions beheben
Behebe CI-Fehlschläge mit der Cursor CLI in GitHub Actions. Dieser Workflow analysiert Fehler, nimmt gezielte Fixes vor und erstellt einen Fix-Branch mit einem Quick-Create-PR-Link.
Dieser Workflow überwacht einen bestimmten Workflow anhand seines Namens. Aktualisiere die Liste `workflows`, damit sie dem tatsächlichen Namen deines CI-Workflows entspricht.
```yaml auto-fix-ci.yml theme={null}
name: Fix CI Failures
on:
workflow_run:
workflows: [Test]
types: [completed]
permissions:
contents: write
pull-requests: write
actions: read
jobs:
attempt-fix:
if: >-
${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.name != 'Fix CI Failures' }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Fix CI failure
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: ci-fix
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- Workflow Run ID: ${{ github.event.workflow_run.id }}
- Workflow Run URL: ${{ github.event.workflow_run.html_url }}
- Fix Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end CI fix flow driven by the failing PR, creating a separate persistent fix branch and proposing a quick-create PR back into the original PR's branch.
# Requirements:
1) Identify the PR associated with the failed workflow run and determine its base and head branches. Let HEAD_REF be the PR's head branch (the contributor/origin branch).
2) Maintain a persistent fix branch for this PR head using the Fix Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
3) Attempt to resolve the CI failure by making minimal, targeted edits consistent with the repo's style. Keep changes scoped and safe.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the CI fix and includes an inline compare link to quick-create a PR.
# Inputs and conventions:
- Use `gh api`, `gh run view`, `gh pr view`, `gh pr diff`, `gh pr list`, `gh run download`, and git commands as needed to discover the failing PR and branches.
- Avoid duplicate comments; if a previous bot comment exists, update it instead of posting a new one.
- If no actionable fix is possible, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent fix branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above.
" --force --model "$MODEL" --output-format=text
```
# Secret Audit
Source: https://docs.cursor.com/de/cli/cookbook/secret-audit
Secrets in einem Repository mit der Cursor CLI in GitHub Actions prüfen
Prüf dein Repository mit der Cursor CLI auf Sicherheitslücken und mögliche Secret-Leaks. Dieser Workflow scannt nach potenziellen Secrets, erkennt riskante Workflow-Muster und schlägt Sicherheitsfixes vor.
```yaml auto-secret-audit.yml theme={null}
name: Secrets Audit
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
actions: read
jobs:
secrets-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Scan and propose hardening
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: audit
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Hardening Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Perform a repository secrets exposure and workflow hardening audit on a schedule, and propose minimal safe fixes.
# Requirements:
1) Scan for potential secrets in tracked files and recent history; support allowlist patterns if present (e.g., .gitleaks.toml).
2) Detect risky workflow patterns: unpinned actions, overbroad permissions, unsafe pull_request_target usage, secrets in forked PR contexts, deprecated insecure commands, missing permissions blocks.
3) Maintain a persistent branch for this run using the Hardening Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) Propose minimal edits: redact literals where safe, add ignore rules, pin actions to SHA, reduce permissions, add guardrails to workflows, and add a SECURITY_LOG.md summarizing changes and remediation guidance.
5) Push to origin.
6) If there is at least one open PR in the repo, post or update a single natural-language comment (1–2 sentences) on the most recently updated open PR that briefly explains the hardening changes and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update an existing bot comment if present. If no changes or no open PRs, post nothing.
# Inputs and conventions:
- Use `gh` to list PRs and to post comments. Avoid duplicate comments.
# Deliverables when updates occur:
- Pushed commits to the persistent hardening branch for this run.
- A single natural-language PR comment with the compare link above (only if an open PR exists).
" --force --model "$MODEL" --output-format=text
```
# Schlüssel übersetzen
Source: https://docs.cursor.com/de/cli/cookbook/translate-keys
Übersetzungs-Schlüssel für ein Repository mit der Cursor-CLI in GitHub Actions übersetzen
Verwalte Übersetzungs-Schlüssel für die Internationalisierung mit der Cursor-CLI. Dieser Workflow erkennt neue oder geänderte i18n-Schlüssel in Pull Requests und ergänzt fehlende Übersetzungen, ohne bestehende zu überschreiben.
```yaml auto-translate-keys.yml theme={null}
name: Translate Keys
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
i18n:
if: ${{ !startsWith(github.head_ref, 'translate/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Propose i18n updates
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: translate
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- Head Ref: ${{ github.head_ref }}
- Translate Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Detect i18n keys added or changed in the PR and fill only missing locales in message files. Never overwrite existing translations.
# Requirements:
1) Determine changed keys by inspecting the PR diff (source files and messages files).
2) Compute missing keys per locale using the source/canonical locale as truth.
3) Add entries only for missing keys. Preserve all existing values untouched.
4) Validate JSON formatting and schemas.
5) Maintain a persistent translate branch for this PR head using the Translate Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
6) Post or update a single PR comment on the original PR written in natural language (1–2 sentences) that briefly explains what was updated and why, and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update a previous bot comment if present.
8) If no changes are necessary, make no commits and post no comment.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes.
# Deliverables when updates occur:
- Pushed commits to the persistent translate branch for this PR head.
- A single natural-language PR comment on the original PR with the compare link above.
" --force --model "$MODEL" --output-format=text
```
# Docs aktualisieren
Source: https://docs.cursor.com/de/cli/cookbook/update-docs
Aktualisiere die Doku für ein Repository mit der Cursor-CLI in GitHub Actions
Aktualisiere die Doku mit der Cursor-CLI in GitHub Actions. Zwei Ansätze: vollständige Agent-Autonomie oder deterministischer Workflow, bei dem nur der Agent Dateien ändert.
```yaml auto-update-docs.yml theme={null}
name: Dokumentation aktualisieren
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Repository auschecken
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cursor-CLI installieren
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Git konfigurieren
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Docs aktualisieren
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Du arbeitest in einem GitHub-Actions-Runner.
Die GitHub-CLI ist als `gh` verfügbar und über `GH_TOKEN` authentifiziert. Git ist verfügbar. Du hast Schreibzugriff auf die Repository-Inhalte und kannst Pull Requests kommentieren, darfst aber keine PRs erstellen oder bearbeiten.
# Kontext:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
- Docs Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Ziel:
- Implementiere einen End-to-End-Flow zur Aktualisierung der Docs, gesteuert durch inkrementelle Änderungen am ursprünglichen PR.
# Anforderungen:
1) Ermittle, was sich im ursprünglichen PR geändert hat, und falls es mehrere Pushes gab, berechne die inkrementellen Diffs seit der letzten erfolgreichen Docs-Aktualisierung.
2) Aktualisiere nur die relevanten Docs basierend auf diesen inkrementellen Änderungen.
3) Pflege den persistenten Docs-Branch für diesen PR-Head mithilfe des Docs-Branch-Präfixes aus dem Kontext. Erstelle ihn, wenn er fehlt, aktualisiere ihn andernfalls und pushe Änderungen nach origin.
4) Du hast KEINE Berechtigung, PRs zu erstellen. Verfasse stattdessen einen einzelnen, natürlichsprachlichen PR-Kommentar (1–2 Sätze), der die Docs-Updates kurz erklärt und einen Inline-Compare-Link enthält, um schnell einen PR zu erstellen
# Eingaben und Konventionen:
- Verwende `gh pr diff` und die Git-Historie, um Änderungen zu erkennen und inkrementelle Bereiche seit der letzten Docs-Aktualisierung abzuleiten.
- Versuche nicht, PRs direkt zu erstellen oder zu bearbeiten. Verwende das oben genannte Compare-Link-Format.
- Halte Änderungen minimal und konsistent mit dem Repo-Stil. Wenn keine Docs-Updates notwendig sind, nimm keine Änderungen vor und poste keinen Kommentar.
# Ergebnisse bei Updates:
- Gepushte Commits in den persistenten Docs-Branch für diesen PR-Head.
- Ein einzelner natürlichsprachlicher PR-Kommentar im ursprünglichen PR, der den oben genannten Inline-Compare-Link enthält. Vermeide Duplikate; aktualisiere einen vorherigen Bot-Kommentar, falls vorhanden.
" --force --model "$MODEL" --output-format=text
```
```yaml auto-update-docs-deterministic.yml theme={null}
name: Docs aktualisieren
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Repository auschecken
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cursor-CLI installieren
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Git konfigurieren
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Doku-Updates generieren (kein Commit/Push/Kommentar)
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Du arbeitest in einem GitHub-Actions-Runner.
Die GitHub-CLI ist als `gh` verfügbar und über `GH_TOKEN` authentifiziert. Git ist verfügbar.
WICHTIG: Erstelle keine Branches, nicht committen, nicht pushen und keine PR-Kommentare posten. Änder nur Dateien im Arbeitsverzeichnis, wenn nötig. Ein späterer Workflow-Schritt veröffentlicht die Änderungen und kommentiert die PR.
# Kontext:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
# Ziel:
- Aktualisiere die Repository-Dokumentation basierend auf den inkrementellen Änderungen dieses PR.
# Anforderungen:
1) Ermittle, was sich im ursprünglichen PR geändert hat (verwende `gh pr diff` und die Git-Historie nach Bedarf). Falls ein bestehender persistenter Doku-Branch `${{ env.BRANCH_PREFIX }}/${{ github.head_ref }}` existiert, darfst du ihn als schreibgeschützte Referenz nutzen, um frühere Updates nachzuvollziehen.
2) Aktualisiere nur die relevanten Dokus basierend auf diesen Änderungen. Halte Anpassungen minimal und zum Repo-Stil passend.
3) Nicht committen, nicht pushen, keine Branches erstellen und keine PR-Kommentare posten. Lass den Working Tree nur mit aktualisierten Dateien zurück; ein späterer Schritt übernimmt das Veröffentlichen.
# Eingaben und Konventionen:
- Verwende `gh pr diff` und die Git-Historie, um Änderungen zu erkennen und Doku-Anpassungen gezielt vorzunehmen.
- Wenn keine Doku-Updates nötig sind, nimm keine Änderungen vor und gib nichts aus.
# Ergebnisse, wenn Updates erfolgen:
- Geänderte Dokumentationsdateien nur im Arbeitsverzeichnis (keine Commits/Pushes/Kommentare).
" --force --model "$MODEL" --output-format=text
- name: Doku-Branch veröffentlichen
id: publish_docs
env:
BRANCH_PREFIX: docs
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
echo "changes_published=false" >> "$GITHUB_OUTPUT"
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
# Sicherstellen, dass wir auf einem lokalen Branch sind, den wir pushen können
git fetch origin --prune
# Persistenten Doku-Branch erstellen/wechseln, aktuelle Working-Tree-Änderungen beibehalten
git checkout -B "$DOCS_BRANCH"
# Änderungen stagen und erkennen
git add -A
if git diff --staged --quiet; then
echo "Keine Doku-Änderungen zu veröffentlichen. Commit/Push wird übersprungen."
exit 0
fi
COMMIT_MSG="docs: update for PR #${PR_NUMBER} (${HEAD_REF} @ $(git rev-parse --short HEAD))"
git commit -m "$COMMIT_MSG"
git push --set-upstream origin "$DOCS_BRANCH"
echo "changes_published=true" >> "$GITHUB_OUTPUT"
- name: PR-Kommentar posten oder aktualisieren
if: steps.publish_docs.outputs.changes_published == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
COMPARE_URL="https://github.com/${REPO}/compare/${BASE_REF}...${DOCS_BRANCH}?quick_pull=1&title=docs%3A+updates+for+PR+%23${PR_NUMBER}"
COMMENT_FILE="${RUNNER_TEMP}/auto-docs-comment.md"
{
echo "Cursor hat den Doku-Branch aktualisiert: \`${DOCS_BRANCH}\`"
echo "Du kannst jetzt [den Diff ansehen und schnell eine PR erstellen, um diese Doku-Updates zu mergen](${COMPARE_URL})."
echo
echo "_Dieser Kommentar wird bei nachfolgenden Läufen aktualisiert, wenn sich der PR ändert._"
echo
echo ""
} > "$COMMENT_FILE"
# Falls das Bearbeiten des letzten Bot-Kommentars fehlschlägt (älteres gh), als Fallback einen neuen Kommentar erstellen
if gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE" --edit-last; then
echo "Bestehenden PR-Kommentar aktualisiert."
else
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "Neuen PR-Kommentar veröffentlicht."
```
# GitHub Actions
Source: https://docs.cursor.com/de/cli/github-actions
Erfahre, wie du die Cursor-CLI in GitHub Actions und anderen Continuous-Integration-Systemen nutzt
Nutze die Cursor-CLI in GitHub Actions und anderen CI/CD-Systemen, um Entwicklungsaufgaben zu automatisieren.
Schau dir unsere Cookbook-Beispiele für praktische Workflows an: [Dokumentation aktualisieren](/de/cli/cookbook/update-docs) und [CI-Issues beheben](/de/cli/cookbook/fix-ci).
## Andere CI-Systeme
Verwende die Cursor-CLI in jedem CI/CD-System mit:
* **Ausführung von Shell-Skripten** (bash, zsh usw.)
* **Umgebungsvariablen** zur Konfiguration des API-Keys
* **Internetverbindung**, um die Cursor-API zu erreichen
## Autonomie‑Stufen
Wähle die Autonomie‑Stufe deines Agents:
### Vollautonomer Ansatz
Gib dem Agenten die vollständige Kontrolle über Git‑Operationen, API‑Aufrufe und externe Interaktionen. Einfacheres Setup, erfordert mehr Vertrauen.
**Beispiel:** In unserem [Update Documentation](/de/cli/cookbook/update-docs)‑Cookbook ermöglicht der erste Workflow dem Agenten:
* PR‑Änderungen analysieren
* Git‑Branches erstellen und verwalten
* Änderungen committen und pushen
* Kommentare zu Pull Requests posten
* Alle Fehlerszenarien behandeln
```yaml theme={null}
- name: Doku aktualisieren (volle Autonomie)
run: |
cursor-agent -p "Du hast vollen Zugriff auf Git, die GitHub-CLI und PR-Operationen.
Übernimm den gesamten Doku-Update-Workflow, einschließlich Commits, Pushes und PR-Kommentaren."
```
### Ansatz mit eingeschränkter Autonomie
Wir empfehlen, diesen Ansatz mit **berechtigungsbasierten Einschränkungen** für produktive CI-Workflows zu verwenden. So bekommst du das Beste aus beiden Welten: Der Agent kann komplexe Analysen und Dateänderungen intelligent ausführen, während kritische Operationen deterministisch und nachvollziehbar bleiben.
Beschränke die Aktionen des Agents und führe kritische Schritte in separaten Workflow-Schritten aus. So erreichst du bessere Kontrolle und Vorhersehbarkeit.
**Beispiel:** Der zweite Workflow im selben Cookbook beschränkt den Agent auf reine Dateänderungen:
```yaml theme={null}
- name: Docs-Updates generieren (eingeschränkt)
run: |
cursor-agent -p "WICHTIG: Keine Branches erstellen, keine Commits, keine Pushes und keine PR-Kommentare posten.
Nur Dateien im Arbeitsverzeichnis ändern. Ein späterer Workflow-Schritt übernimmt das Veröffentlichen."
- name: Docs-Branch veröffentlichen (deterministisch)
run: |
# Deterministische Git-Operationen werden von CI ausgeführt
git checkout -B "docs/${{ github.head_ref }}"
git add -A
git commit -m "docs: Update für PR"
git push origin "docs/${{ github.head_ref }}"
- name: PR-Kommentar posten (deterministisch)
run: |
# Deterministisches Posten von PR-Kommentaren wird von CI ausgeführt
gh pr comment ${{ github.event.pull_request.number }} --body "Docs aktualisiert"
```
### Berechtigungsbasierte Einschränkungen
Verwende [Berechtigungskonfigurationen](/de/cli/reference/permissions), um Einschränkungen auf CLI-Ebene zu erzwingen:
```json theme={null}
{
"permissions": {
"allow": [
"Read(**/*.md)",
"Write(docs/**/*)",
"Shell(grep)",
"Shell(find)"
],
"deny": [
"Shell(git)",
"Shell(gh)",
"Write(.env*)",
"Write(package.json)"
]
}
}
```
## Authentifizierung
### API-Schlüssel generieren
Zuerst [einen API-Schlüssel generieren](/de/cli/reference/authentication#api-key-authentication) im Cursor-Dashboard.
### Repository-Secrets konfigurieren
Speichere deinen Cursor-API-Schlüssel sicher in deinem Repository:
1. Geh zu deinem GitHub-Repository
2. Klick auf **Settings** → **Secrets and variables** → **Actions**
3. Klick auf **New repository secret**
4. Nenn ihn `CURSOR_API_KEY`
5. Füg deinen API-Schlüssel als Wert ein
6. Klick auf **Add secret**
### In Workflows verwenden
Setz deine Umgebungsvariable `CURSOR_API_KEY`:
```yaml theme={null}
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
```
# Verwendung der Headless-CLI
Source: https://docs.cursor.com/de/cli/headless
Lerne, wie du mit der Cursor-CLI Skripte für automatisierte Codeanalyse, -generierung und -änderung schreibst
Verwende die Cursor-CLI in Skripten und Automatisierungs-Workflows für Codeanalyse, -generierung und Refactoring.
## So funktioniert's
Verwende den [Print-Modus](/de/cli/using#non-interactive-mode) (`-p, --print`) für nicht-interaktives Scripting und Automatisierung.
### Dateiänderungen in Skripten
Kombiniere `--print` mit `--force`, um Dateien in Skripten zu ändern:
```bash theme={null}
# Dateiänderungen im Print-Modus aktivieren
cursor-agent -p --force "Refactor this code to use modern ES6+ syntax"
# Ohne --force werden Änderungen nur vorgeschlagen, nicht übernommen
cursor-agent -p "Füge JSDoc-Kommentare zu dieser Datei hinzu" # Dateien werden nicht geändert
# Stapelverarbeitung mit tatsächlichen Dateiänderungen
find src/ -name "*.js" | while read file; do
cursor-agent -p --force "Füge ausführliche JSDoc-Kommentare zu $file hinzu"
done
```
Das Flag `--force` erlaubt dem Agenten, direkte Dateiänderungen ohne Bestätigung vorzunehmen
## Einrichtung
Sieh dir [Installation](/de/cli/installation) und [Authentifizierung](/de/cli/reference/authentication) für alle Details zur Einrichtung an.
```bash theme={null}
# Cursor-CLI installieren
curl https://cursor.com/install -fsS | bash
# API-Schlüssel für Skripte festlegen
export CURSOR_API_KEY=your_api_key_here
cursor-agent -p "Diesen Code analysieren"
```
## Beispielskripte
Verwende je nach Bedarf unterschiedliche Ausgabeformate. Sieh dir [Ausgabeformat](/de/cli/reference/output-format) für Details an.
### Codebase durchsuchen
Verwende `--output-format text` für gut lesbare Antworten:
```bash theme={null}
#!/bin/bash
# Einfache Frage zur Codebase
cursor-agent -p --output-format text "Wozu dient diese Codebase?"
```
### Automatisiertes Code-Review
Verwende `--output-format json` für eine strukturierte Analyse:
```bash theme={null}
#!/bin/bash
# simple-code-review.sh - Einfaches Code-Review-Skript
echo "Code-Review wird gestartet..."
# Kürzlich vorgenommene Änderungen prüfen
cursor-agent -p --force --output-format text \
"Prüfe die jüngsten Code-Änderungen und gib Feedback zu:
- Codequalität und Lesbarkeit
- möglichen Bugs oder Problemen
- Sicherheitsaspekten
- Einhaltung von Best Practices
Mach konkrete Verbesserungsvorschläge und schreibe sie in review.txt"
if [ $? -eq 0 ]; then
echo "✅ Code-Review erfolgreich abgeschlossen"
else
echo "❌ Code-Review fehlgeschlagen"
exit 1
fi
```
### Fortschritt in Echtzeit verfolgen
Verwende `--output-format stream-json`, um den Fortschritt in Echtzeit zu verfolgen:
```bash theme={null}
#!/bin/bash
# stream-progress.sh - Fortschritt in Echtzeit verfolgen
echo "🚀 Starte Stream-Verarbeitung ..."
# Fortschritt in Echtzeit verfolgen
accumulated_text=""
tool_count=0
start_time=$(date +%s)
cursor-agent -p --force --output-format stream-json \
"Analysiere diese Projektstruktur und erstelle eine Zusammenfassung in analysis.txt" | \
while IFS= read -r line; do
type=$(echo "$line" | jq -r '.type // empty')
subtype=$(echo "$line" | jq -r '.subtype // empty')
case "$type" in
"system")
if [ "$subtype" = "init" ]; then
model=$(echo "$line" | jq -r '.model // "unknown"')
echo "🤖 Verwendetes Modell: $model"
fi
;;
"assistant")
# Streaming-Text-Deltas sammeln
content=$(echo "$line" | jq -r '.message.content[0].text // empty')
accumulated_text="$accumulated_text$content"
# Live-Fortschritt anzeigen
printf "\r📝 Generiere: %d Zeichen" ${#accumulated_text}
;;
"tool_call")
if [ "$subtype" = "started" ]; then
tool_count=$((tool_count + 1))
# Tool-Informationen erfassen
if echo "$line" | jq -e '.tool_call.writeToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.writeToolCall.args.path // "unknown"')
echo -e "\n🔧 Tool #$tool_count: Erstelle $path"
elif echo "$line" | jq -e '.tool_call.readToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.readToolCall.args.path // "unknown"')
echo -e "\n📖 Tool #$tool_count: Lese $path"
fi
elif [ "$subtype" = "completed" ]; then
# Tool-Ergebnisse extrahieren und anzeigen
if echo "$line" | jq -e '.tool_call.writeToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.linesCreated // 0')
size=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.fileSize // 0')
echo " ✅ Erstellt: $lines Zeilen ($size Byte)"
elif echo "$line" | jq -e '.tool_call.readToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.readToolCall.result.success.totalLines // 0')
echo " ✅ Gelesen: $lines Zeilen"
fi
fi
;;
"result")
duration=$(echo "$line" | jq -r '.duration_ms // 0')
end_time=$(date +%s)
total_time=$((end_time - start_time))
echo -e "\n\n🎯 Abgeschlossen in ${duration} ms (${total_time} s insgesamt)"
echo "📊 Endstatistik: $tool_count Tools, ${#accumulated_text} Zeichen generiert"
;;
esac
done
```
# Installation
Source: https://docs.cursor.com/de/cli/installation
Cursor CLI installieren und updaten
## Installation
### macOS, Linux und Windows (WSL)
Installier die Cursor-CLI mit einem einzigen Befehl:
```bash theme={null}
curl https://cursor.com/install -fsS | bash
```
### Überprüfung
Nach der Installation überprüf, ob die Cursor-CLI korrekt funktioniert:
```bash theme={null}
cursor-agent --version
```
Die Cursor-CLI unterstützt [Model Context Protocol (MCP)](/de/context/mcp)-Server und ermöglicht dir, externe Tools und Datenquellen mit `cursor-agent` zu verbinden. **MCP in der CLI verwendet dieselbe Konfiguration wie der Editor** – alle von dir eingerichteten MCP-Server funktionieren nahtlos in beiden.
Neu bei MCP? Lies den vollständigen Leitfaden zu Konfiguration, Authentifizierung und verfügbaren Servern
## CLI-Befehle
Verwende den Befehl `cursor-agent mcp`, um MCP-Server zu verwalten:
### Konfigurierte Server auflisten
Zeige alle konfigurierten MCP-Server und ihren aktuellen Status an:
```bash theme={null}
cursor-agent mcp list
```
Das zeigt:
* Servernamen und Bezeichner
* Verbindungsstatus (verbunden/getrennt)
* Konfigurationsquelle (Projekt oder global)
* Transportmethode (stdio, HTTP, SSE)
### Verfügbare Tools auflisten
Tools anzeigen, die von einem bestimmten MCP-Server bereitgestellt werden:
```bash theme={null}
cursor-agent mcp list-tools
```
Dies zeigt:
* Toolnamen und -beschreibungen
* Erforderliche und optionale Parameter
* Parametertypen und -beschränkungen
### Beim MCP-Server anmelden
Authentifiziere dich bei einem in deiner `mcp.json` konfigurierten MCP-Server:
```bash theme={null}
cursor-agent mcp login
```
### MCP-Server deaktivieren
Entferne einen MCP-Server aus der lokal freigegebenen Liste:
```bash theme={null}
cursor-agent mcp disable
```
## MCP mit Agent verwenden
Sobald du MCP-Server eingerichtet hast (siehe die [MCP-Hauptanleitung](/de/context/mcp) zur Einrichtung), erkennt und nutzt `cursor-agent` automatisch verfügbare Tools, wenn sie für deine Anfragen relevant sind.
```bash theme={null}
# Prüfen, welche MCP-Server verfügbar sind
cursor-agent mcp list
# Anzeigen, welche Tools ein bestimmter Server bereitstellt
cursor-agent mcp list-tools playwright
# cursor-agent verwenden – nutzt automatisch MCP-Tools, wenn das sinnvoll ist
cursor-agent --prompt "Navigiere zu google.com und erstelle einen Screenshot der Suchseite"
```
Die CLI verwendet die gleiche Konfigurationsreihenfolge wie der Editor (Projekt → global → verschachtelt) und erkennt Konfigurationen automatisch in übergeordneten Verzeichnissen.
## Verwandt
Umfassende MCP-Anleitung: Einrichtung, Konfiguration und Authentifizierung
Stöbere in vorkonfigurierten MCP-Servern, die du nutzen kannst
# Cursor CLI
Source: https://docs.cursor.com/de/cli/overview
Starte mit der Cursor CLI, um in deinem Terminal zu coden
Die Cursor CLI lässt dich direkt aus dem Terminal mit KI-Agents interagieren, um Code zu schreiben, zu reviewen und zu ändern. Egal, ob du ein interaktives Terminal-Interface bevorzugst oder Ausgabe-Automatisierung für Skripte und CI-Pipelines nutzt – die CLI liefert leistungsstarke Coding-Unterstützung genau dort, wo du arbeitest.
```bash theme={null}
# Installation
curl https://cursor.com/install -fsS | bash
# Interaktive Sitzung starten
cursor-agent
```
Die Cursor-CLI ist derzeit in der Beta – wir freuen uns mega über dein Feedback!
### Interaktiver Modus
Starte eine Unterhaltungssession mit dem Agent, um deine Ziele zu beschreiben, vorgeschlagene Änderungen zu prüfen und Befehle zu bestätigen:
```bash theme={null}
# Interaktive Sitzung starten
cursor-agent
# Mit einer anfänglichen Eingabe starten
cursor-agent "das Auth-Modul auf JWT-Tokens umstellen"
```
### Nicht-interaktiver Modus
Verwende den Print-Modus für nicht-interaktive Szenarien wie Skripte, CI-Pipelines oder Automatisierung:
```bash theme={null}
# Mit einem bestimmten Prompt und Modell ausführen
cursor-agent -p "Leistungsprobleme finden und beheben" --model "gpt-5"
# Mit Git-Änderungen zur Überprüfung verwenden
cursor-agent -p "Diese Änderungen auf Sicherheitsprobleme prüfen" --output-format text
```
### Sessions
Frühere Unterhaltungen wiederaufnehmen, um den Kontext über mehrere Interaktionen hinweg beizubehalten:
```bash theme={null}
# Alle bisherigen Chats auflisten
cursor-agent ls
# Neueste Unterhaltung fortsetzen
cursor-agent resume
# Bestimmte Unterhaltung fortsetzen
cursor-agent --resume="chat-id-here"
```
# Authentifizierung
Source: https://docs.cursor.com/de/cli/reference/authentication
Cursor-CLI per Browser-Login oder API-Schlüssel authentifizieren
Die Cursor-CLI unterstützt zwei Authentifizierungsmethoden: Browser-Login (empfohlen) und API-Schlüssel.
## Browser-Authentifizierung (empfohlen)
Verwende den Browser-Flow für die einfachste Anmeldung:
```bash theme={null}
# Über den Browser-Flow anmelden
cursor-agent login
# Authentifizierungsstatus prüfen
cursor-agent status
# Abmelden und gespeicherte Authentifizierung löschen
cursor-agent logout
```
Der Login-Befehl öffnet deinen Standardbrowser und fordert dich auf, dich bei deinem Cursor-Konto anzumelden. Anschließend werden deine Anmeldedaten sicher lokal gespeichert.
## API-Schlüssel-Authentifizierung
Für Automatisierung, Skripte oder CI/CD-Umgebungen verwende die API-Schlüssel-Authentifizierung:
### Schritt 1: API-Schlüssel generieren
Generiere einen API-Schlüssel in deinem Cursor-Dashboard unter Integrations > User API Keys.
### Schritt 2: API-Schlüssel festlegen
Du kannst den API-Schlüssel auf zwei Arten angeben:
**Option 1: Umgebungsvariable (empfohlen)**
```bash theme={null}
export CURSOR_API_KEY=your_api_key_here
cursor-agent "Benutzerauthentifizierung implementieren"
```
**Option 2: Kommandozeilen-Flag**
```bash theme={null}
cursor-agent --api-key your_api_key_here "Benutzerauthentifizierung implementieren"
```
## Authentifizierungsstatus
Prüf deinen aktuellen Authentifizierungsstatus:
```bash theme={null}
cursor-agent status
```
Dieser Befehl zeigt Folgendes an:
* Ob du angemeldet bist
* Deine Kontodaten
* Aktuelle Endpoint-Konfiguration
## Fehlerbehebung
* **„Not authenticated“-Fehler:** Führ `cursor-agent login` aus oder stell sicher, dass dein API-Schlüssel korrekt gesetzt ist
* **SSL-Zertifikatfehler:** Verwende das Flag `--insecure` für Entwicklungsumgebungen
* **Endpoint-Probleme:** Verwende das Flag `--endpoint`, um einen eigenen API-Endpoint anzugeben
# Konfiguration
Source: https://docs.cursor.com/de/cli/reference/configuration
Konfigurationsreferenz der Agent-CLI für cli-config.json
Konfigurier die Agent-CLI mit der Datei `cli-config.json`.
## Speicherort der Datei
| Typ | Plattform | Pfad |
| :------ | :---------- | :----------------------------------------- |
| Global | macOS/Linux | `~/.cursor/cli-config.json` |
| Global | Windows | `$env:USERPROFILE\.cursor\cli-config.json` |
| Projekt | Alle | `/.cursor/cli.json` |
Auf Projektebene lassen sich nur Berechtigungen konfigurieren. Alle anderen CLI-Einstellungen müssen global gesetzt werden.
Per Umgebungsvariablen überschreiben:
* **`CURSOR_CONFIG_DIR`**: benutzerdefinierter Verzeichnispfad
* **`XDG_CONFIG_HOME`** (Linux/BSD): verwendet `$XDG_CONFIG_HOME/cursor/cli-config.json`
```json theme={null}
{
"version": 1,
"editor": { "vimMode": false },
"permissions": {
"allow": ["Shell(ls)", "Shell(echo)"],
"deny": ["Shell(rm)"]
}
}
```
Sieh dir die [Permissions](/de/cli/reference/permissions) für verfügbare Berechtigungstypen und Beispiele an.
## Fehlerbehebung
**Konfigurationsfehler**: Leg die Datei zur Seite und starte neu:
```bash theme={null}
mv ~/.cursor/cli-config.json ~/.cursor/cli-config.json.bad
```
**Änderungen werden nicht beibehalten**: Achte auf gültiges JSON und ausreichende Schreibrechte. Manche Felder werden vom CLI verwaltet und können überschrieben werden.
## Hinweise
* Reines JSON-Format (keine Kommentare)
* Die CLI repariert fehlende Felder automatisch
* Beschädigte Dateien werden als `.bad` gesichert und neu erstellt
* Berechtigungseinträge sind exakte Zeichenketten (siehe [Permissions](/de/cli/reference/permissions) für Details)
# Ausgabeformat
Source: https://docs.cursor.com/de/cli/reference/output-format
Ausgabeschema für Text-, JSON- und Stream-JSON-Formate
Die Cursor Agent CLI bietet mit der Option `--output-format` in Kombination mit `--print` mehrere Ausgabeformate. Dazu zählen strukturierte Formate für die programmgesteuerte Nutzung (`json`, `stream-json`) sowie ein vereinfachtes Textformat für eine gut lesbare Fortschrittsanzeige.
Das Standard-`--output-format` ist `stream-json`. Diese Option ist nur gültig beim Ausgeben (`--print`) oder wenn der Ausgabemodus inferred wird (nicht-TTY-stdout oder per Pipe übergebenes stdin).
## JSON-Format
Das `json`-Ausgabeformat gibt bei erfolgreichem Abschluss genau ein JSON-Objekt aus (gefolgt von einem Zeilenumbruch). Deltas und Tool-Ereignisse werden nicht ausgegeben; Text wird zum Endergebnis zusammengefasst.
Im Fehlerfall beendet sich der Prozess mit einem ungleich null gesetzten Rückgabecode und schreibt eine Fehlermeldung nach stderr. In Fehlerfällen wird kein wohlgeformtes JSON-Objekt ausgegeben.
### Erfolgs-Response
Bei Erfolg gibt die CLI ein JSON-Objekt mit der folgenden Struktur aus:
```json theme={null}
{
"type": "result",
"subtype": "success",
"is_error": false,
"duration_ms": 1234,
"duration_api_ms": 1234,
"result": "",
"session_id": "",
"request_id": ""
}
```
| Feld | Beschreibung |
| ----------------- | ------------------------------------------------------------------------ |
| `type` | Immer `"result"` für Terminal-Ergebnisse |
| `subtype` | Immer `"success"` bei erfolgreichen Abschlüssen |
| `is_error` | Immer `false` bei erfolgreichen Antworten |
| `duration_ms` | Gesamtausführungszeit in Millisekunden |
| `duration_api_ms` | API-Anfragezeit in Millisekunden (aktuell identisch mit `duration_ms`) |
| `result` | Vollständiger Antworttext des Assistenten (Verkettung aller Text-Deltas) |
| `session_id` | Eindeutige Sitzungskennung |
| `request_id` | Optionale Anfragekennung (kann entfallen) |
## Stream-JSON-Format
Das `stream-json`-Ausgabeformat gibt zeilenweise JSON (NDJSON) aus. Jede Zeile enthält ein einzelnes JSON-Objekt, das ein Echtzeit-Ereignis während der Ausführung darstellt.
Der Stream endet bei Erfolg mit einem abschließenden `result`-Event. Bei einem Fehler beendet sich der Prozess mit einem von null verschiedenen Code, und der Stream kann ohne abschließendes Event vorzeitig enden; eine Fehlermeldung wird auf stderr geschrieben.
### Ereignistypen
#### Systeminitialisierung
Zu Beginn jeder Session einmalig ausgegeben:
```json theme={null}
{
"type": "system",
"subtype": "init",
"apiKeySource": "env|flag|login",
"cwd": "/absoluter/pfad",
"session_id": "",
"model": "",
"permissionMode": "default"
}
```
In Zukunft könnten Felder wie `tools` und `mcp_servers` zu diesem Event hinzukommen.
Wird mehrfach ausgegeben, während der Assistant seine Antwort generiert. Diese Ereignisse enthalten fortlaufende Textabschnitte:
```json theme={null}
{
"type": "assistant",
"message": {
"role": "assistant",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
Verkette alle `message.content[].text`-Werte in der richtigen Reihenfolge, um die vollständige Antwort des Assistenten zu rekonstruieren.
Das letzte Event, das bei erfolgreichem Abschluss emittiert wird:
```json theme={null}
{
"type": "result",
"subtype": "success",
"duration_ms": 1234,
"duration_api_ms": 1234,
"is_error": false,
"result": "",
"session_id": "",
"request_id": ""
}
```
### Beispielsequenz
Hier ist eine typische NDJSON-Sequenz, die den üblichen Ablauf der Ereignisse zeigt:
```json theme={null}
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Lies die README.md und erstelle eine Zusammenfassung"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Ich werde "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"die README.md lesen"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Projekt\n\nDies ist ein Beispielprojekt...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":" und eine Zusammenfassung erstellen"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README-Zusammenfassung\n\nDieses Projekt enthält...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README-Zusammenfassung\n\nDieses Projekt enthält...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"Ich werde die README.md lesen und eine Zusammenfassung erstellen","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}
```
## Textformat
Das Ausgabeformat `text` liefert einen vereinfachten, gut lesbaren Stream von Agent-Aktionen. Statt detaillierter JSON-Events gibt es prägnante Textbeschreibungen dessen aus, was der Agent in Echtzeit tut.
Dieses Format ist hilfreich, um den Fortschritt des Agents zu überwachen, ohne den Overhead beim Parsen strukturierter Daten – ideal für Logging, Debugging oder einfaches Fortschritts-Tracking.
### Beispielausgabe
```
Datei gelesen
Datei bearbeitet
Terminal-Befehl ausgeführt
Neue Datei erstellt
```
Jede Aktion erscheint in einer neuen Zeile, sobald der Agent sie ausführt, und liefert sofortiges Feedback zu seinem Fortschritt bei der Aufgabe.
## Hinweise zur Implementierung
* Jedes Event wird als einzelne Zeile mit `\n` beendet
* `thinking`-Events werden im Print-Modus unterdrückt und erscheinen in keinem der Ausgabeformate
* Feld-Erweiterungen können im Laufe der Zeit rückwärtskompatibel erfolgen (Consumers sollten unbekannte Felder ignorieren)
* Das Stream-Format liefert Echtzeit-Updates, während das JSON-Format bis zum Abschluss wartet und erst dann Ergebnisse ausgibt
* Alle `assistant`-Nachrichten-Deltas zusammenfügen, um die vollständige Antwort zu rekonstruieren
* Tool-Call-IDs können verwendet werden, um Start- und Abschluss-Events zu korrelieren
* Session-IDs bleiben während einer einzelnen Agent-Ausführung konsistent
# Parameter
Source: https://docs.cursor.com/de/cli/reference/parameters
Vollständige Befehlsreferenz für die Cursor-Agent-CLI
## Globale Optionen
Globale Optionen können mit jedem Befehl verwendet werden:
| Option | Beschreibung |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `-v, --version` | Versionsnummer ausgeben |
| `-a, --api-key ` | API-Schlüssel für die Authentifizierung (du kannst auch die Umgebungsvariable `CURSOR_API_KEY` verwenden) |
| `-p, --print` | Antworten in der Konsole ausgeben (für Skripte oder nicht-interaktive Nutzung). Hat Zugriff auf alle Tools, einschließlich write und bash. |
| `--output-format ` | Ausgabeformat (funktioniert nur mit `--print`): `text`, `json` oder `stream-json` (Standard: `stream-json`) |
| `-b, --background` | Im Hintergrundmodus starten (Composer-Auswahl beim Start öffnen) |
| `--fullscreen` | Vollbildmodus aktivieren |
| `--resume [chatId]` | Eine Chatsitzung fortsetzen |
| `-m, --model ` | Zu verwendetes Modell |
| `-f, --force` | Befehle erzwingen, außer sie wurden ausdrücklich verweigert |
| `-h, --help` | Hilfe für den Befehl anzeigen |
## Befehle
| Befehl | Beschreibung | Verwendung |
| ----------------- | -------------------------------------------------- | ------------------------------------------------- |
| `login` | Bei Cursor anmelden | `cursor-agent login` |
| `logout` | Abmelden und gespeicherte Anmeldedaten löschen | `cursor-agent logout` |
| `status` | Anmeldestatus prüfen | `cursor-agent status` |
| `mcp` | MCP-Server verwalten | `cursor-agent mcp` |
| `update\|upgrade` | Cursor Agent auf die neueste Version aktualisieren | `cursor-agent update` oder `cursor-agent upgrade` |
| `ls` | Eine Chat-Sitzung fortsetzen | `cursor-agent ls` |
| `resume` | Die letzte Chat-Sitzung fortsetzen | `cursor-agent resume` |
| `help [command]` | Hilfe zu einem Befehl anzeigen | `cursor-agent help [command]` |
Wenn du keinen Befehl angibst, startet Cursor Agent standardmäßig im interaktiven Chat-Modus.
## MCP
Verwalte MCP-Server, die für den Cursor Agent konfiguriert sind.
| Subcommand | Beschreibung | Verwendung |
| ------------------------- | ------------------------------------------------------------------------- | ------------------------------------------ |
| `login ` | Bei einem in `.cursor/mcp.json` konfigurierten MCP-Server anmelden | `cursor-agent mcp login ` |
| `list` | Konfigurierte MCP-Server und ihren Status anzeigen | `cursor-agent mcp list` |
| `list-tools ` | Verfügbare Tools und ihre Argumentnamen für einen bestimmten MCP anzeigen | `cursor-agent mcp list-tools ` |
Alle MCP-Befehle unterstützen `-h, --help` für befehlsbezogene Hilfe.
## Argumente
Wenn du im Chat-Modus startest (Standardverhalten), kannst du eine anfängliche Eingabe angeben:
**Argumente:**
* `prompt` — anfänglicher Prompt für den Agent
## Hilfe erhalten
Alle Befehle unterstützen die globale Option `-h, --help`, um befehlspezifische Hilfe anzuzeigen.
# Berechtigungen
Source: https://docs.cursor.com/de/cli/reference/permissions
Berechtigungstypen zur Steuerung des Agentenzugriffs auf Dateien und Befehle
Konfigurier, was der Agent darf, indem du Berechtigungstokens in deiner CLI-Konfiguration verwendest. Berechtigungen werden in `~/.cursor/cli-config.json` (global) oder `/.cursor/cli.json` (projektspezifisch) festgelegt.
## Berechtigungstypen
### Shell-Befehle
**Format:** `Shell(commandBase)`
Steuert den Zugriff auf Shell-Befehle. `commandBase` ist das erste Token in der Befehlszeile.
| Beispiel | Beschreibung |
| ------------ | -------------------------------------------------------------- |
| `Shell(ls)` | Erlaubt das Ausführen von `ls`-Befehlen |
| `Shell(git)` | Erlaubt beliebige `git`-Unterbefehle |
| `Shell(npm)` | Erlaubt Befehle des npm-Paketmanagers |
| `Shell(rm)` | Verweigert destruktives Löschen von Dateien (häufig in `deny`) |
### Dateilesen
**Format:** `Read(pathOrGlob)`
Steuert Lesezugriff auf Dateien und Verzeichnisse. Unterstützt Glob-Muster.
| Beispiel | Beschreibung |
| ------------------- | ------------------------------------------------- |
| `Read(src/**/*.ts)` | Erlaubt das Lesen von TypeScript-Dateien in `src` |
| `Read(**/*.md)` | Erlaubt das Lesen von Markdown-Dateien überall |
| `Read(.env*)` | Verweigert das Lesen von Umgebungsdateien |
| `Read(/etc/passwd)` | Verweigert das Lesen von Systemdateien |
### Dateischreiben
**Format:** `Write(pathOrGlob)`
Steuert Schreibzugriff auf Dateien und Verzeichnisse. Unterstützt Glob-Muster. Im Print-Modus ist `--force` erforderlich, um Dateien zu schreiben.
| Beispiel | Beschreibung |
| --------------------- | ------------------------------------------------------ |
| `Write(src/**)` | Erlaubt das Schreiben in beliebige Dateien unter `src` |
| `Write(package.json)` | Erlaubt das Ändern von package.json |
| `Write(**/*.key)` | Verweigert das Schreiben privater Schlüsseldateien |
| `Write(**/.env*)` | Verweigert das Schreiben von Umgebungsdateien |
* Glob-Muster verwenden die Platzhalter `**`, `*` und `?`
* Relative Pfade sind auf den aktuellen Workspace begrenzt
* Absolute Pfade können auf Dateien außerhalb des Projekts zeigen
* Deny-Regeln haben Vorrang vor Allow-Regeln
# Slash-Befehle
Source: https://docs.cursor.com/de/cli/reference/slash-commands
Schnelle Aktionen in Cursor-CLI-Sessions
| Command | Description |
| --------------------- | ------------------------------------------------------------- |
| `/model ` | Modelle festlegen oder auflisten |
| `/auto-run [state]` | Auto-Run umschalten (Standard) oder \[on\|off\|status] setzen |
| `/new-chat` | Neue Chat-Session starten |
| `/vim` | Vim-Keys umschalten |
| `/help [command]` | Hilfe anzeigen (/help \[cmd]) |
| `/feedback ` | Feedback ans Team teilen |
| `/resume ` | Vorherigen Chat nach Ordnernamen fortsetzen |
| `/copy-req-id` | Letzte Request-ID kopieren |
| `/logout` | Bei Cursor abmelden |
| `/quit` | Beenden |
Befehle laufen in deiner Login-Shell (`$SHELL`) mit dem Arbeitsverzeichnis und der Umgebung der CLI. Verkette Befehle, um sie in anderen Verzeichnissen auszuführen:
```bash theme={null}
cd subdir && npm test
```
## Ausgabe
Befehlsausgabe mit Kopfzeile samt Exit-Code, Anzeige von stdout/stderr und Steuerelementen zum Kürzen
Lange Ausgaben werden automatisch gekürzt, und lang laufende Prozesse werden zur Wahrung der Performance nach einer Zeitüberschreitung beendet.
## Einschränkungen
* Befehle laufen nach 30 Sekunden in ein Timeout
* Lang laufende Prozesse, Server und interaktive Eingabeaufforderungen werden nicht unterstützt
* Verwende kurze, nicht interaktive Befehle für die besten Ergebnisse
## Berechtigungen
Bevor Befehle ausgeführt werden, werden sie gegen deine Berechtigungen und Teameinstellungen geprüft. Weitere Details findest du unter [Berechtigungen](/de/cli/reference/permissions).
Decision banner showing approval options: Run, Reject/Propose, Add to allowlist, and Auto-run
Adminrichtlinien können bestimmte Befehle blockieren, und Befehle mit Umleitungen können nicht direkt zur Allowlist hinzugefügt werden.
## Nutzungsrichtlinien
Shell Mode eignet sich für Statuschecks, schnelle Builds, Dateioperationen und das Überprüfen der Umgebung.
Vermeide lang laufende Server, interaktive Anwendungen und Befehle, die Eingaben erfordern.
Jeder Befehl läuft unabhängig – nutz `cd && ...`, um Befehle in anderen Verzeichnissen auszuführen.
## Fehlerbehebung
* Wenn ein Befehl hängen bleibt, mit Ctrl+C abbrechen und nicht-interaktive Flags hinzufügen
* Wenn nach Berechtigungen gefragt wird, einmal bestätigen oder mit Tab zur Allowlist hinzufügen
* Bei abgeschnittener Ausgabe mit Ctrl+O erweitern
* Um in verschiedenen Verzeichnissen auszuführen, `cd && ...` verwenden, da Änderungen nicht bestehen bleiben
* Shell Mode unterstützt zsh und bash basierend auf deiner `$SHELL`-Variable
## FAQ
Nee. Jeder Befehl läuft für sich. Verwende `cd && ...`, um Befehle in verschiedenen Verzeichnissen auszuführen.
Nein. Befehle sind auf 30 Sekunden begrenzt und das ist nicht konfigurierbar.
Berechtigungen werden über die CLI und die Teamkonfiguration verwaltet. Verwende das Decision-Banner, um Befehle zu Allowlists hinzuzufügen.
Drück Escape, wenn das Eingabefeld leer ist, Backspace/Delete bei leerer Eingabe oder Strg+C, um zu leeren und zu beenden.
# Agent in der CLI nutzen
Source: https://docs.cursor.com/de/cli/using
Mit der Cursor-CLI effektiv prompten, reviewen und iterieren
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Prompting
Formuliere deine Absicht klar, um die besten Ergebnisse zu bekommen. Du kannst zum Beispiel den Prompt „do not write any code“ verwenden, um sicherzustellen, dass der Agent keine Dateien verändert. Das ist besonders hilfreich, wenn du Aufgaben planst, bevor du sie umsetzt.
Der Agent hat derzeit Tools für Dateioperationen, Suche und das Ausführen von Shell-Befehlen. Weitere Tools werden hinzugefügt, ähnlich wie beim IDE-Agenten.
## MCP
Agent unterstützt [MCP (Model Context Protocol)](/de/tools/mcp) für erweiterte Funktionalität und Integrationen. Die CLI erkennt deine `mcp.json`-Konfigurationsdatei automatisch und berücksichtigt sie, sodass dieselben MCP-Server und -Tools genutzt werden, die du für die IDE konfiguriert hast.
## Regeln
Der CLI-Agent unterstützt dasselbe [Regelsystem](/de/context/rules) wie die IDE. Du kannst im Verzeichnis `.cursor/rules` Regeln erstellen, um dem Agenten Kontext und Guidance zu geben. Diese Regeln werden basierend auf ihrer Konfiguration automatisch geladen und angewendet, sodass du das Verhalten des Agenten für verschiedene Teile deines Projekts oder bestimmte Dateitypen anpassen kannst.
Die CLI liest außerdem `AGENTS.md` und `CLAUDE.md` im Projektstammverzeichnis (falls vorhanden) und wendet sie zusammen mit `.cursor/rules` als Regeln an.
## Arbeiten mit Agent
### Navigation
Vorherige Nachrichten kannst du mit Pfeil nach oben (ArrowUp) aufrufen und durch sie navigieren.
### Review
Überprüf Änderungen mit Cmd+R. Drück i, um Folgeanweisungen hinzuzufügen. Verwende ArrowUp/ArrowDown zum Scrollen und ArrowLeft/ArrowRight zum Dateiwechsel.
### Kontext auswählen
Wähle Dateien und Ordner mit @ aus, um sie in den Kontext aufzunehmen. Mach Platz im Kontextfenster, indem du `/compress` ausführst. Details findest du unter [Summarization](/de/agent/chat/summarization).
## Verlauf
Mach mit einem bestehenden Thread weiter mit `--resume [thread id]`, um den vorherigen Kontext zu laden.
Um die neueste Unterhaltung fortzusetzen, nutz `cursor-agent resume`.
Du kannst auch `cursor-agent ls` ausführen, um eine Liste früherer Unterhaltungen anzuzeigen.
## Befehlsfreigabe
Bevor Terminalbefehle ausgeführt werden, fragt dich die CLI, ob du die Ausführung erlauben (y) oder ablehnen (n) willst.
## Nicht-interaktiver Modus
Verwende `-p` oder `--print`, um Agent im nicht-interaktiven Modus auszuführen. Dadurch wird die Antwort in der Konsole ausgegeben.
Im nicht-interaktiven Modus kannst du Agent nicht-interaktiv aufrufen. So kannst du ihn in Skripte, CI-Pipelines usw. integrieren.
Du kannst das mit `--output-format` kombinieren, um zu steuern, wie die Ausgabe formatiert wird. Verwende zum Beispiel `--output-format json` für strukturierte Ausgaben, die sich in Skripten leichter verarbeiten lassen, oder `--output-format text` für reine Textausgaben.
Cursor hat im nicht-interaktiven Modus vollen Schreibzugriff.
# Tastenkürzel
Source: https://docs.cursor.com/de/configuration/kbd
Tastenkürzel und Keybindings in Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Übersicht der Tastenkürzel in Cursor. Sieh dir alle Tastenkürzel an, indem du Cmd R und dann Cmd S drückst oder die Befehlspalette mit Cmd Shift P öffnest und nach `Keyboard Shortcuts` suchst.
Erfahre mehr über Tastenkürzel in Cursor, wobei [Key Bindings for VS Code](https://code.visualstudio.com/docs/getstarted/keybindings) als Grundlage für Cursors Keybindings dient.
Alle Cursor-Keybindings, einschließlich Cursor-spezifischer Features, kannst du in den Einstellungen für Tastenkürzel neu zuweisen.
## Allgemein
| Shortcut | Aktion |
| ---------------------- | ------------------------------------------------------- |
| Cmd I | Seitenleiste umschalten (falls nicht an Modus gebunden) |
| Cmd L | Seitenleiste umschalten (falls nicht an Modus gebunden) |
| Cmd E | Steuerzentrale für Background Agent |
| Cmd . | Modusmenü |
| Cmd / | Zwischen AI-Modellen wechseln |
| Cmd Shift J | Cursor-Einstellungen |
| Cmd , | Allgemeine Einstellungen |
| Cmd Shift P | Befehlspalette |
## Chat
Shortcuts für das Chat-Eingabefeld.
| Shortcut | Action |
| ---------------------------------------------------- | ---------------------------------------- |
| Return | Nudge (Standard) |
| Ctrl Return | Nachricht in die Warteschlange |
| Cmd Return when typing | Senden erzwingen |
| Cmd Shift Backspace | Generierung abbrechen |
| Cmd Shift L with code selected | Ausgewählten Code als Kontext hinzufügen |
| Cmd V with code or log in clipboard | Zwischenablage als Kontext hinzufügen |
| Cmd Shift V with code or log in clipboard | Zwischenablage ins Eingabefeld einfügen |
| Cmd Return with suggested changes | Alle Änderungen übernehmen |
| Cmd Backspace | Alle Änderungen verwerfen |
| Tab | Zum nächsten Beitrag wechseln |
| Shift Tab | Zum vorherigen Beitrag wechseln |
| Cmd Opt / | Modell umschalten |
| Cmd N / Cmd R | Neuer Chat |
| Cmd T | Neuer Chat-Tab |
| Cmd \[ | Vorheriger Chat |
| Cmd ] | Nächster Chat |
| Cmd W | Chat schließen |
| Escape | Fokus vom Feld entfernen |
# Shell-Befehle
Source: https://docs.cursor.com/de/configuration/shell
Cursor-Shell-Befehle installieren und verwenden
Cursor stellt Befehlszeilentools bereit, mit denen du Dateien und Ordner direkt aus deinem Terminal öffnen kannst. Installier sowohl die Befehle `cursor` als auch `code`, um Cursor nahtlos in deinen Entwicklungs-Workflow zu integrieren.
## CLI-Befehle installieren
Installier die CLI-Befehle über die Command Palette:
1. Öffne die Command Palette (Cmd/Ctrl + P)
2. Tipp „Install“ ein, um Installationsbefehle zu filtern
3. Wähl und führ `Install 'cursor' to shell` aus
4. Wiederhol das und wähl `Install 'code' to shell` aus
Command Palette mit CLI-Installationsoptionen
## CLI-Befehle verwenden
Nach der Installation kannst du mit einem der folgenden Befehle Dateien oder Ordner in Cursor öffnen:
```bash theme={null}
# Verwendung des cursor-Befehls
cursor pfad/zu/datei.js
cursor pfad/zu/ordner/
# Verwendung des code-Befehls (VS Code-kompatibel)
code pfad/zu/datei.js
code pfad/zu/ordner/
```
## Befehlsoptionen
Beide Befehle unterstützen diese Optionen:
* Datei öffnen: `cursor file.js`
* Ordner öffnen: `cursor ./my-project`
* Mehrere Elemente öffnen: `cursor file1.js file2.js folder1/`
* In neuem Fenster öffnen: `cursor -n` oder `cursor --new-window`
* Auf das Schließen des Fensters warten: `cursor -w` oder `cursor --wait`
## FAQ
Sie sind identisch. Der Befehl `code` ist für die Kompatibilität mit VS Code vorgesehen.
Nein, installiere je nach Vorliebe einen der beiden oder beide.
Die Befehle werden in der Standard-Shell-Konfigurationsdatei deines Systems installiert (z. B. `.bashrc`, `.zshrc` oder `.config/fish/config.fish`).
# Themes
Source: https://docs.cursor.com/de/configuration/themes
Erscheinungsbild von Cursor anpassen
Cursor unterstützt sowohl helle als auch dunkle Themes für deine Coding-Umgebung. Cursor übernimmt die Theme-Funktionen von VS Code – nutze jedes VS-Code-Theme, erstelle eigene Themes und installiere Theme-Erweiterungen aus dem Marketplace.
## Theme ändern
1. Öffne die Command Palette (Cmd/Ctrl + P)
2. Tippe „theme“, um Befehle zu filtern
3. Wähle „Preferences: Color Theme“
4. Such dir ein Theme aus
## FAQ
Ja! Cursor ist mit VS Code-Themes kompatibel. Installier jedes Theme aus dem VS Code Marketplace oder kopier eigene Theme-Dateien.
Erstell eigene Themes wie in VS Code. Nutz „Developer: Generate Color Theme From Current Settings“, um von den aktuellen Einstellungen zu starten, oder folg dem VS Code Theme Authoring Guide.
# @Code
Source: https://docs.cursor.com/de/context/@-symbols/@-code
Verweise auf bestimmte Codeausschnitte in Cursor mit @Code
Verweise auf bestimmte Codestellen mit dem Symbol `@Code`. Das gibt dir feinere Kontrolle als [`@Files & Folders`](/de/context/@-symbols/@-files-and-folders), sodass du präzise Codeausschnitte statt ganzer Dateien auswählen kannst.
# @Cursor Rules
Source: https://docs.cursor.com/de/context/@-symbols/@-cursor-rules
Projektspezifische Regeln und Richtlinien anwenden
Das Symbol `@Cursor Rules` bietet dir Zugriff auf die von dir eingerichteten [Projektregeln](/de/context/rules) und Richtlinien, damit du sie gezielt in deinem Kontext anwenden kannst.
# @Files & Folders
Source: https://docs.cursor.com/de/context/@-symbols/@-files-and-folders
Dateien und Ordner als Kontext in Chat und Inline Edit referenzieren
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Dateien
Verweise in Chat und Inline Edit auf ganze Dateien, indem du `@Files & Folders` auswählst und anschließend nach dem Dateinamen suchst. Du kannst Dateien auch direkt aus der Seitenleiste in Agent ziehen, um sie als Kontext hinzuzufügen.
## Ordner
Wenn du Ordner mit `@Folders` referenzierst, stellt Cursor den Ordnerpfad und eine Übersicht über die Inhalte bereit, damit die KI versteht, was verfügbar ist.
Nachdem du einen Ordner ausgewählt hast, tippe „/“, um tiefer zu navigieren und alle Unterordner zu sehen.
### Vollständiger Ordnerinhalt
Aktiviere **Vollständiger Ordnerinhalt** in den Einstellungen. Wenn aktiviert, versucht Cursor, alle Dateien aus dem Ordner in den Kontext einzubeziehen.
Bei großen Ordnern, die das Kontextfenster überschreiten, erscheint eine Gliederungsansicht mit einem Tooltip, der anzeigt, wie viele Dateien einbezogen wurden, während Cursor den verfügbaren Kontext verwaltet.
Die Verwendung des vollständigen Ordnerinhalts mit [aktiviertem Max-Modus](/de/context/max-mode)
erhöht die Anfragkosten deutlich, da mehr Eingabetokens verbraucht werden.
## Kontextverwaltung
Große Dateien und Ordner werden automatisch verdichtet, damit sie in die Kontextgrenzen passen. Details findest du unter [Datei- & Ordnerverdichtung](/de/agent/chats/summarization#file--folder-condensation).
# @Git
Source: https://docs.cursor.com/de/context/@-symbols/@-git
Git-Änderungen und Branch-Unterschiede referenzieren
* `@Commit`: Referenziert Änderungen deines aktuellen Arbeitszustands im Vergleich zum letzten Commit. Zeigt alle geänderten, hinzugefügten und gelöschten Dateien, die noch nicht committed sind.
* `@Branch`: Vergleicht die Änderungen deines aktuellen Branches mit dem main-Branch. Zeigt alle Commits und Änderungen in deinem Branch, die nicht in main sind.
# @Link
Source: https://docs.cursor.com/de/context/@-symbols/@-link
Webinhalte einbinden, indem du URLs einfügst
Wenn du eine URL im Chat einfügst, markiert Cursor sie automatisch als `@Link` und ruft die Inhalte als Kontext ab. Dazu gehört auch Support für PDF-Dokumente – Cursor extrahiert und parst den Text aus jeder öffentlich zugänglichen PDF-URL.
## Verknüpfung aufheben
So verwendest du eine URL als normalen Text, ohne ihren Inhalt abzurufen:
* Klicke auf den markierten Link und wähle `Unlink`
* Oder füge mit gedrückter `Shift`-Taste ein, um das automatische Taggen zu verhindern
# @Linter Errors
Source: https://docs.cursor.com/de/context/@-symbols/@-linter-errors
Greif auf Linting-Fehler in deiner Codebase zu und verweise darauf
Das Symbol `@Linter Errors` erfasst automatisch Linting-Fehler und -Warnungen aus deiner aktuell aktiven Datei und stellt Kontext dazu bereit. [Agent](/de/agent/overview) sieht Lint-Fehler standardmäßig.
Damit Linter-Fehler sichtbar sind, brauchst du den passenden Language Server,
installiert und für deine Programmiersprache konfiguriert. Cursor erkennt
installierte Language Server automatisch und verwendet sie, aber für bestimmte
Sprachen musst du ggf. zusätzliche Erweiterungen oder Tools installieren.
# @Past Chats
Source: https://docs.cursor.com/de/context/@-symbols/@-past-chats
Zusammengefasste Chats aus dem Verlauf einbeziehen
Wenn du an komplexen Aufgaben in [Chat](/de/chat) arbeitest, musst du eventuell auf Kontext oder Entscheidungen aus früheren Unterhaltungen zurückgreifen. Das `@Past Chats`-Symbol fügt zusammengefasste Versionen früherer Chats als Kontext ein.
Besonders nützlich, wenn:
* du eine lange Chat-Session mit wichtigem Kontext hast, auf den du dich beziehen willst
* du eine neue, verwandte Aufgabe startest und Kontinuität möchtest
* du Überlegungen oder Entscheidungen aus einer früheren Session teilen willst
# @Recent Changes
Source: https://docs.cursor.com/de/context/@-symbols/@-recent-changes
Kürzlich geänderten Code als Kontext einbeziehen
Das Symbol `@Recent Changes` nimmt kürzlich geänderten Code als Kontext in KI-Konversationen auf.
* Änderungen sind chronologisch angeordnet
* Die letzten 10 Änderungen werden priorisiert
* Respektiert `.cursorignore`-Einstellungen
# @Web
Source: https://docs.cursor.com/de/context/@-symbols/@-web
Im Web nach aktuellen Informationen suchen
Mit `@Web` durchsucht Cursor das Web mit [exa.ai](https://exa.ai), um aktuelle Informationen zu finden und sie als Kontext hinzuzufügen. Dazu gehört auch die Möglichkeit, PDF-Dateien aus direkten Links zu extrahieren.
Die Websuche ist standardmäßig deaktiviert. Aktiviere sie unter Settings → Features → Web Search.
# Überblick
Source: https://docs.cursor.com/de/context/@-symbols/overview
Verweis mit @-Symbolen auf Code, Dateien und Doku
Navigier durch Vorschläge mit den Pfeiltasten. Drück `Enter`, um auszuwählen. Wenn der Vorschlag eine Kategorie wie `Files` ist, werden die Vorschläge gefiltert und zeigen die relevantesten Einträge innerhalb dieser Kategorie.
Hier ist die Liste aller verfügbaren @-Symbole:
* [@Files](/de/context/@-symbols/@-files) - Auf bestimmte Dateien in deinem Projekt verweisen
* [@Folders](/de/context/@-symbols/@-folders) - Auf ganze Ordner für mehr Kontext verweisen
* [@Code](/de/context/@-symbols/@-code) - Auf bestimmte Codeausschnitte oder Symbole aus deiner Codebase verweisen
* [@Docs](/de/context/@-symbols/@-docs) - Auf Dokumentation und Guides zugreifen
* [@Git](/de/context/@-symbols/@-git) - Auf Git-Historie und Änderungen zugreifen
* [@Past Chats](/de/context/@-symbols/@-past-chats) - Mit zusammengefassten Composer-Sessions arbeiten
* [@Cursor Rules](/de/context/@-symbols/@-cursor-rules) - Mit Cursor-Regeln arbeiten
* [@Web](/de/context/@-symbols/@-web) - Auf externe Webressourcen und Doku verweisen
* [@Link (paste)](/de/context/@-symbols/@-link) - Links zu spezifischem Code oder Doku erstellen
* [@Recent Changes](/de/context/@-symbols/@-recent-changes) - Letzte Änderungen referenzieren
* [@Lint Errors](/de/context/@-symbols/@-lint-errors) - Lint-Fehler referenzieren (nur [Chat](/de/chat/overview))
* [@Definitions](/de/context/@-symbols/@-definitions) - Symboldefinitionen nachschlagen (nur [Inline Edit](/de/inline-edit/overview))
* [# Files](/de/context/@-symbols/pill-files) - Dateien zum Kontext hinzufügen, ohne zu referenzieren
* [/ Commands](/de/context/@-symbols/slash-commands) - Geöffnete und aktive Dateien zum Kontext hinzufügen
# #Dateien
Source: https://docs.cursor.com/de/context/@-symbols/pill-files
Spezifische Dateien mit dem Präfix # auswählen
Verwende `#` gefolgt von einem Dateinamen, um dich auf bestimmte Dateien zu konzentrieren. Kombiniere das mit `@`-Symbolen für präzise Kontextsteuerung.
# /command
Source: https://docs.cursor.com/de/context/@-symbols/slash-commands
Schnelle Befehle zum Hinzufügen von Dateien und zum Steuern des Kontexts
Der `/`-Befehl bietet schnellen Zugriff auf deine offenen Editor-Tabs, sodass du mehrere Dateien als Kontext hinzufügen kannst.
## Befehle
* **`/Reset Context`**: Setzt den Kontext auf den Standardzustand zurück
* **`/Generate Cursor Rules`**: Generiert Regeln, denen Cursor folgen soll
* **`/Disable Iterate on Lints`**: Versucht nicht, Linter-Fehler und -Warnungen zu beheben
* **`/Add Open Files to Context`**: Bezieht sich auf alle aktuell geöffneten Editor-Tabs
* **`/Add Active Files to Context`**: Bezieht sich auf alle Editor-Tabs, die gerade im Blick sind (praktisch bei geteilten Layouts)
# Codebase-Indexierung
Source: https://docs.cursor.com/de/context/codebase-indexing
Wie Cursor deine Codebase indexiert, um sie besser zu verstehen
Cursor indexiert deine Codebase, indem es für jede Datei Embeddings berechnet. Das verbessert KI-generierte Antworten zu deinem Code. Wenn du ein Projekt öffnest, startet Cursor automatisch mit der Indexierung. Neue Dateien werden fortlaufend indexiert.
Check den Indexierungsstatus unter: `Cursor Settings` > `Indexing & Docs`
## Konfiguration
Cursor indexiert alle Dateien außer denen in [Ignore-Dateien](/de/context/ignore-files) (z. B. `.gitignore`, `.cursorignore`).
Klick auf `Show Settings`, um:
* automatisches Indexieren für neue Repositories zu aktivieren
* festzulegen, welche Dateien ignoriert werden
[Große Inhaltsdateien zu ignorieren](/de/context/ignore-files) verbessert die Antwortgenauigkeit.
### Indizierte Dateien anzeigen
So siehst du indizierte Dateipfade: `Cursor Settings` > `Indexing & Docs` > `View included files`
Dadurch wird eine `.txt`-Datei geöffnet, in der alle indizierten Dateien aufgelistet sind.
## Multi-Root-Workspaces
Cursor unterstützt [Multi-Root-Workspaces](https://code.visualstudio.com/docs/editor/workspaces#_multiroot-workspaces), sodass du mit mehreren Codebases arbeiten kannst:
* Alle Codebases werden automatisch indexiert
* Der Kontext jeder Codebase steht der KI zur Verfügung
* `.cursor/rules` gelten in allen Ordnern
## PR-Suche
Die PR-Suche hilft dir, die Entwicklung deiner Codebase nachzuvollziehen, indem historische Änderungen durchsuchbar und per KI zugänglich werden.
### So funktioniert’s
Cursor **indiziert automatisch alle gemergten PRs** aus der Repository-Historie. Zusammenfassungen erscheinen in semantischen Suchergebnissen, mit smarten Filtern zur Priorisierung aktueller Änderungen.
Agent kann **PRs, Commits, Issues oder Branches** per `@[PR number]`, `@[commit hash]` oder `@[branch name]` in den Kontext holen. Bezieht GitHub-Kommentare und Bugbot-Reviews ein, wenn verbunden.
**Plattformunterstützung** umfasst GitHub, GitHub Enterprise und Bitbucket. GitLab wird derzeit nicht unterstützt.
GitHub-Enterprise-User: Das Fetch-Tool greift aufgrund von
VSCode-Auth-Einschränkungen auf git-Befehle zurück.
### PR-Suche verwenden
Stell Fragen wie „Wie sind Services in anderen PRs implementiert?“ und Agent holt automatisch relevante PRs in den Kontext, um umfassende Antworten basierend auf der Historie deines Repos zu liefern.
## FAQ
Es gibt noch keine globale Liste. Schau dir jedes Projekt einzeln an, indem du es in
Cursor öffnest und die Einstellungen für Codebase Indexing prüfst.
Lösch deinen Cursor-Account in den Einstellungen, um alle indizierten Codebases zu entfernen.
Alternativ lösch einzelne Codebases in den Codebase-Indexing-
Einstellungen des jeweiligen Projekts.
Indizierte Codebases werden nach 6 Wochen Inaktivität gelöscht. Das erneute Öffnen des
Projekts löst eine erneute Indizierung aus.
Nein. Cursor erstellt Embeddings, ohne Dateinamen oder Quellcode zu speichern. Dateinamen werden verschleiert und Code-Segmente werden verschlüsselt.
Wenn der Agent die Codebase durchsucht, ruft Cursor die Embeddings vom Server ab und entschlüsselt die Segmente.
# Dateien ignorieren
Source: https://docs.cursor.com/de/context/ignore-files
Dateizugriff mit .cursorignore und .cursorindexingignore steuern
## Überblick
Cursor liest und indexiert den Code deines Projekts, um seine Funktionen bereitzustellen. Steuere, auf welche Verzeichnisse und Dateien Cursor zugreifen kann, indem du eine `.cursorignore`-Datei im Root-Verzeichnis verwendest.
Cursor blockiert den Zugriff auf in `.cursorignore` aufgeführte Dateien für:
* Codebase-Indexierung
* Code, auf den [Tab](/de/tab/overview), [Agent](/de/agent/overview) und [Inline Edit](/de/inline-edit/overview) zugreifen können
* Code, der über [@-Symbol-Referenzen](/de/context/@-symbols/overview) zugänglich ist
Vom Agent initiierte Tool-Aufrufe, z. B. Terminal und MCP-Server, können
den Zugriff auf Code, der durch `.cursorignore` gesteuert wird, nicht blockieren
## Warum Dateien ignorieren?
**Sicherheit**: Den Zugriff auf API-Schlüssel, Zugangsdaten und Secrets einschränken. Cursor blockiert ignorierte Dateien, aber vollständiger Schutz ist wegen der Unvorhersehbarkeit von LLMs nicht garantiert.
**Performance**: In großen Codebases oder Monorepos irrelevante Bereiche ausschließen, um schneller zu indexieren und Dateien genauer zu finden.
## Globale Ignore-Dateien
Leg in den Benutzereinstellungen Ignore-Muster für alle Projekte fest, um sensible Dateien ohne projektweise Konfiguration auszuschließen.
Standardmuster sind:
* Umgebungsdateien: `**/.env`, `**/.env.*`
* Zugangsdaten: `**/credentials.json`, `**/secrets.json`
* Schlüssel: `**/*.key`, `**/*.pem`, `**/id_rsa`
## Konfigurieren von `.cursorignore`
Erstell in deinem Root-Verzeichnis eine `.cursorignore`-Datei mit der `.gitignore`-Syntax.
Aktiviere `Cursor Settings` > `Features` > `Editor` > `Hierarchical Cursor Ignore`, um in übergeordneten Verzeichnissen nach `.cursorignore`-Dateien zu suchen.
**Hinweise**: Kommentare beginnen mit `#`. Spätere Muster überschreiben frühere. Muster sind relativ zum Speicherort der Datei.
## Indizierung mit `.cursorindexingignore` begrenzen
Verwende `.cursorindexingignore`, um Dateien ausschließlich von der Indizierung auszunehmen. Diese Dateien bleiben für AI‑Features zugänglich, werden aber nicht in Codebase‑Suchen angezeigt.
## Standardmäßig ignorierte Dateien
Cursor ignoriert automatisch Dateien in `.gitignore` sowie in der unten aufgeführten Standard-Ignorierliste. Du kannst das mit dem Präfix `!` in `.cursorignore` überschreiben.
Nur für das Indexing werden diese Dateien zusätzlich zu den Dateien in deiner `.gitignore`, `.cursorignore` und `.cursorindexingignore` ignoriert:
```sh theme={null}
package-lock.json
pnpm-lock.yaml
yarn.lock
composer.lock
Gemfile.lock
bun.lockb
.env*
.git/
.svn/
.hg/
*.lock
*.bak
*.tmp
*.bin
*.exe
*.dll
*.so
*.lockb
*.qwoff
*.isl
*.csv
*.pdf
*.doc
*.doc
*.xls
*.xlsx
*.ppt
*.pptx
*.odt
*.ods
*.odp
*.odg
*.odf
*.sxw
*.sxc
*.sxi
*.sxd
*.sdc
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tif
*.mp3
*.wav
*.wma
*.ogg
*.flac
*.aac
*.mp4
*.mov
*.wmv
*.flv
*.avi
*.zip
*.tar
*.gz
*.7z
*.rar
*.tgz
*.dmg
*.iso
*.cue
*.mdf
*.mds
*.vcd
*.toast
*.img
*.apk
*.msi
*.cab
*.tar.gz
*.tar.xz
*.tar.bz2
*.tar.lzma
*.tar.Z
*.tar.sz
*.lzma
*.ttf
*.otf
*.pak
*.woff
*.woff2
*.eot
*.webp
*.vsix
*.rmeta
*.rlib
*.parquet
*.svg
.egg-info/
.venv/
node_modules/
__pycache__/
.next/
.nuxt/
.cache/
.sass-cache/
.gradle/
.DS_Store/
.ipynb_checkpoints/
.pytest_cache/
.mypy_cache/
.tox/
.git/
.hg/
.svn/
.bzr/
.lock-wscript/
.Python/
.jupyter/
.history/
.yarn/
.yarn-cache/
.eslintcache/
.parcel-cache/
.cache-loader/
.nyc_output/
.node_repl_history/
.pnp.js/
.pnp/
```
### Einschränkungen von Negationsmustern
Wenn du Negationsmuster verwendest (mit `!` vorangestellt), kannst du eine Datei nicht erneut einbeziehen, wenn ein übergeordnetes Verzeichnis per \* ausgeschlossen wurde.
```sh theme={null}
# Alle Dateien im Ordner public ignorieren
public/*
# ✅ Das funktioniert, da sich die Datei auf der obersten Ebene befindet
!public/index.html
# ❌ Das funktioniert nicht – Dateien aus verschachtelten Verzeichnissen können nicht erneut eingeschlossen werden
!public/assets/style.css
```
**Workaround**: Verschachtelte Verzeichnisse ausdrücklich ausschließen:
```sh theme={null}
public/assets/*
!public/assets/style.css # Diese Datei ist jetzt zugänglich
```
Ausgeschlossene Verzeichnisse werden aus Performancegründen nicht durchsucht, daher haben Muster für darin enthaltene Dateien keine Wirkung.
Das entspricht der .gitignore-Implementierung für Negationsmuster in verschachtelten Verzeichnissen. Weitere Details findest du in der [offiziellen Git-Dokumentation zu gitignore-Mustern](https://git-scm.com/docs/gitignore).
Das [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) ermöglicht Cursor die Verbindung zu externen Tools und Datenquellen.
### Warum MCP verwenden?
MCP verbindet Cursor mit externen Systemen und Daten. Anstatt deine Projektstruktur immer wieder zu erklären, integrier dich direkt mit deinen Tools.
Schreib MCP-Server in jeder Sprache, die auf `stdout` ausgeben oder einen HTTP-Endpoint bereitstellen kann – Python, JavaScript, Go, etc.
### So funktioniert's
MCP-Server stellen Fähigkeiten über das Protokoll bereit und verbinden Cursor mit externen Tools oder Datenquellen.
Cursor unterstützt drei Transportmethoden:
| Transport | Ausführungsumgebung | Bereitstellung | Nutzer | Eingabe | Auth |
| :--------------------------------------------------------------- | :------------------ | :----------------------- | :--------------- | :------------------------- | :------ |
| **`stdio`** | Lokal | Von Cursor verwaltet | Einzelner Nutzer | Shell-Befehl | Manuell |
| **`SSE`** | Lokal/Remote | Als Server bereitstellen | Mehrere Nutzer | URL zu einem SSE-Endpunkt | OAuth |
| **`Streamable HTTP`** | Lokal/Remote | Als Server bereitstellen | Mehrere Nutzer | URL zu einem HTTP-Endpunkt | OAuth |
### Protokollunterstützung
Cursor unterstützt diese MCP-Protokollfunktionen:
| Feature | Support | Description |
| :-------------- | :-------- | :----------------------------------------------------------------------------------------------------- |
| **Tools** | Supported | Funktionen, die das KI-Modell ausführen kann |
| **Prompts** | Supported | Vorlagenbasierte Nachrichten und Workflows für Nutzer |
| **Resources** | Supported | Strukturierte Datenquellen, die gelesen und referenziert werden können |
| **Roots** | Supported | Vom Server initiierte Abfragen zu URI- oder Dateisystemgrenzen, innerhalb derer gearbeitet werden kann |
| **Elicitation** | Supported | Vom Server initiierte Anforderungen nach zusätzlichen Informationen von Nutzern |
## MCP-Server installieren
### Installation mit einem Klick
Installier MCP-Server aus unserer Sammlung und authentifizier dich per OAuth.
Verfügbare MCP-Server durchsuchen
Einen „Zu Cursor hinzufügen“-Button erstellen
### Verwendung von `mcp.json`
Konfigurier benutzerdefinierte MCP-Server mit einer JSON-Datei:
```json CLI Server - Node.js theme={null}
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "mcp-server"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json CLI Server - Python theme={null}
{
"mcpServers": {
"server-name": {
"command": "python",
"args": ["mcp-server.py"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json Remote Server theme={null}
// MCP-Server über HTTP oder SSE – läuft auf einem Server
{
"mcpServers": {
"server-name": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}
```
### STDIO-Serverkonfiguration
Für STDIO-Server (lokale Kommandozeilenserver) konfigurier diese Felder in deiner `mcp.json`:
| Feld | Erforderlich | Beschreibung | Beispiele |
| :---------- | :----------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- |
| **type** | Ja | Verbindungstyp des Servers | `"stdio"` |
| **command** | Ja | Befehl zum Starten der Server-Binary. Muss in deinem Systempfad verfügbar sein oder den vollständigen Pfad enthalten. | `"npx"`, `"node"`, `"python"`, `"docker"` |
| **args** | Nein | Array von Argumenten, die an den Befehl übergeben werden | `["server.py", "--port", "3000"]` |
| **env** | Nein | Umgebungsvariablen für den Server | `{"API_KEY": "${input:api-key}"}` |
| **envFile** | Nein | Pfad zu einer Umgebungsdatei, um weitere Variablen zu laden | `".env"`, `"${workspaceFolder}/.env"` |
### Verwendung der Extension-API
Für die programmgesteuerte Registrierung von MCP-Servern stellt Cursor eine Extension-API bereit, die eine dynamische Konfiguration ermöglicht, ohne `mcp.json`-Dateien anzupassen. Das ist besonders nützlich für Enterprise-Umgebungen und automatisierte Setup-Workflows.
Erfahre, wie du MCP-Server programmgesteuert mit `vscode.cursor.mcp.registerServer()` registrierst
### Speicherorte für Konfiguration
Erstell in deinem Projekt die Datei `.cursor/mcp.json` für projektspezifische Tools.
Erstell in deinem Home-Verzeichnis die Datei `~/.cursor/mcp.json` für Tools, die überall verfügbar sind.
### Konfigurationsinterpolation
Verwende Variablen in `mcp.json`-Werten. Cursor ersetzt Variablen in diesen Feldern: `command`, `args`, `env`, `url` und `headers`.
Unterstützte Syntax:
* `${env:NAME}` Umgebungsvariablen
* `${userHome}` Pfad zu deinem Home-Verzeichnis
* `${workspaceFolder}` Projektstamm (der Ordner, der `.cursor/mcp.json` enthält)
* `${workspaceFolderBasename}` Name des Projektstamms
* `${pathSeparator}` und `${/}` Betriebssystem-Pfadtrennzeichen
Beispiele
```json theme={null}
{
"mcpServers": {
"local-server": {
"command": "python",
"args": ["${workspaceFolder}/tools/mcp_server.py"],
"env": {
"API_KEY": "${env:API_KEY}"
}
}
}
}
```
```json theme={null}
{
"mcpServers": {
"remote-server": {
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${env:MY_SERVICE_TOKEN}"
}
}
}
}
```
### Authentifizierung
MCP-Server verwenden Umgebungsvariablen für die Authentifizierung. Übergib API-Schlüssel und Tokens über die Konfiguration.
Cursor unterstützt OAuth für Server, die es erfordern.
## MCP im Chat verwenden
Der Composer-Agent nutzt automatisch relevante MCP-Tools, die unter `Available Tools` aufgeführt sind. Frag nach einem bestimmten Tool beim Namen oder beschreib, was du brauchst. Aktiviere oder deaktiviere Tools in den Einstellungen.
### Tools umschalten
Aktiviere oder deaktiviere MCP-Tools direkt in der Chatoberfläche. Klick in der Toolliste auf einen Toolnamen, um ihn umzuschalten. Deaktivierte Tools werden nicht in den Kontext geladen und sind für den Agent nicht verfügbar.
### Toolfreigabe
Der Agent fragt standardmäßig nach deiner Freigabe, bevor er MCP-Tools verwendet. Klick auf den Pfeil neben dem Toolnamen, um die Argumente anzuzeigen.
#### Auto-Run
Aktiviere Auto-Run, damit der Agent MCP-Tools ohne Rückfrage nutzen kann. Funktioniert wie Terminal-Befehle. Mehr über die Auto-Run-Einstellungen findest du [hier](/de/agent/tools#auto-run).
### Tool-Antwort
Cursor zeigt die Antwort im Chat mit aufklappbaren Ansichten von Argumenten und Ergebnissen:
### Bilder als Kontext
MCP-Server können Bilder zurückgeben – Screenshots, Diagramme usw. Gib sie als Base64-codierte Strings zurück:
```js theme={null}
const RED_CIRCLE_BASE64 = "/9j/4AAQSkZJRgABAgEASABIAAD/2w...";
// ^ vollständiger Base64-String aus Gründen der Lesbarkeit gekürzt
server.tool("generate_image", async (params) => {
return {
content: [
{
type: "image",
data: RED_CIRCLE_BASE64,
mimeType: "image/jpeg",
},
],
};
});
```
Sieh dir diesen [Beispielserver](https://github.com/msfeldstein/mcp-test-servers/blob/main/src/image-server.js) für Implementierungsdetails an. Cursor hängt zurückgegebene Bilder im Chat an. Wenn das Modell Bilder unterstützt, analysiert es sie.
## Sicherheitshinweise
Wenn du MCP-Server installierst, beachte diese Sicherheitspraktiken:
* **Quelle überprüfen**: Installiere MCP-Server nur von vertrauenswürdigen Entwickler\*innen und Repositories
* **Berechtigungen prüfen**: Schau nach, auf welche Daten und APIs der Server zugreift
* **API-Schlüssel einschränken**: Verwende eingeschränkte API-Schlüssel mit minimal notwendigen Berechtigungen
* **Code prüfen**: Für kritische Integrationen den Quellcode des Servers überprüfen
Denk daran, dass MCP-Server auf externe Dienste zugreifen und in deinem Namen Code ausführen können. Versteh immer genau, was ein Server macht, bevor du ihn installierst.
## Praxisnahe Beispiele
Für praktische Beispiele von MCP in Aktion schau dir unseren [Web-Development-Guide](/de/guides/tutorials/web-development) an. Er zeigt, wie du Linear, Figma und Browser-Tools in deinen Entwicklungsworkflow integrierst.
## FAQ
MCP-Server verbinden Cursor mit externen Tools wie Google Drive, Notion und
anderen Diensten, um Dokus und Anforderungen direkt in deinen Coding-Workflow zu holen.
{" "}
So checkst du MCP-Logs: 1. Öffne das Output-Panel in Cursor (Cmd+Shift+U)
2\. Wähle „MCP Logs“ aus dem Dropdown 3. Prüfe auf Verbindungsfehler,
Authentifizierungsprobleme oder Serverabstürze. Die Logs zeigen Serverinitialisierung,
Tool-Aufrufe und Fehlermeldungen.
{" "}
Ja! Du kannst Server an- oder ausschalten, ohne sie zu entfernen: 1. Öffne die Settings (
Cmd+Shift+J) 2. Geh zu Features → Model Context Protocol 3. Klick
den Toggle neben einem Server, um ihn zu aktivieren/deaktivieren. Deaktivierte Server werden nicht geladen und
erscheinen nicht im Chat. Das ist hilfreich fürs Troubleshooting oder um Tool-Clutter zu reduzieren.
{" "}
Wenn ein MCP-Server fehlschlägt: - Cursor zeigt eine Fehlermeldung im Chat - Der Tool-
Aufruf wird als fehlgeschlagen markiert - Du kannst die Aktion erneut ausführen oder die Logs für
Details checken - Andere MCP-Server laufen normal weiter. Cursor isoliert Server-
Ausfälle, damit ein Server die anderen nicht beeinflusst.
{" "}
Für npm-basierte Server: 1. Entferne den Server aus den Settings 2. Leere den npm-Cache:
`npm cache clean --force` 3. Füge den Server erneut hinzu, um die neueste Version zu erhalten. Für
Custom-Server aktualisiere deine lokalen Dateien und starte Cursor neu.
Ja, aber befolge Security-Best Practices: - Verwende Environment-Variablen für
Secrets, niemals hardcoden - Führe sensible Server lokal mit `stdio`-
Transport aus - Beschränke API-Key-Berechtigungen auf das Nötigste - Reviewe den Server-
Code, bevor du ihn mit sensiblen Systemen verbindest - Zieh in Betracht, Server in
isolierten Umgebungen laufen zu lassen
# Memories
Source: https://docs.cursor.com/de/context/memories
Memories sind automatisch erzeugte Regeln, die aus deinen Unterhaltungen im Chat abgeleitet werden. Sie sind projektspezifisch und halten Kontext über Sitzungen hinweg aufrecht.
## Wie Erinnerungen entstehen
1. **Sidecar-Beobachtung**: Cursor nutzt einen Sidecar-Ansatz, bei dem ein weiteres Modell deine Unterhaltungen beobachtet und automatisch relevante Erinnerungen extrahiert. Das passiert passiv im Hintergrund, während du arbeitest. Im Hintergrund generierte Erinnerungen erfordern deine Zustimmung, bevor sie gespeichert werden – so behältst du Vertrauen und Kontrolle darüber, was gespeichert wird.
2. **Tool-Aufrufe**: Der Agent kann Erinnerungen direkt über Tool-Aufrufe erstellen, wenn du ihn ausdrücklich bittest, sich etwas zu merken, oder wenn er wichtige Informationen erkennt, die für zukünftige Sessions erhalten bleiben sollten.
## Erinnerungen verwalten
Du kannst Erinnerungen in den Cursor-Einstellungen → Rules verwalten.
# Regeln
Source: https://docs.cursor.com/de/context/rules
Steuer, wie sich das Agent-Modell mit wiederverwendbaren, eingegrenzten Anweisungen verhält.
Regeln liefern systemweite Anweisungen für Agent und Inline Edit. Denk daran als persistierenden Kontext, Voreinstellungen oder Workflows für deine Projekte.
Cursor unterstützt vier Arten von Regeln:
Gespeichert in `.cursor/rules`, versionsverwaltet und auf deinen Codebase-Kontext begrenzt.
Global in deiner Cursor-Umgebung. In den Einstellungen definiert und immer angewendet.
Agent-Anweisungen im Markdown-Format. Eine einfache Alternative zu `.cursor/rules`.
Weiterhin unterstützt, aber veraltet. Verwende stattdessen Project Rules.
## Wie Regeln funktionieren
Große Sprachmodelle behalten zwischen Antworten kein Gedächtnis. Regeln liefern beständigen, wiederverwendbaren Kontext auf Prompt-Ebene.
Wenn sie aktiviert sind, werden die Inhalte von Regeln am Anfang des Modellkontexts eingefügt. So bekommt die KI durchgehend konsistente Vorgaben zum Generieren von Code, Interpretieren von Edits oder Unterstützen von Workflows.
Regeln gelten für [Chat](/de/chat/overview) und [Inline
Edit](/de/inline-edit/overview). Aktive Regeln werden in der Agent-Seitenleiste angezeigt.
## Projektregeln
Projektregeln liegen in `.cursor/rules`. Jede Regel ist eine Datei und steht unter Versionskontrolle. Sie können über Pfad-Muster eingegrenzt, manuell ausgeführt oder basierend auf Relevanz einbezogen werden. Unterverzeichnisse können ihr eigenes `.cursor/rules`-Verzeichnis enthalten, das auf diesen Ordner beschränkt ist.
Verwende Projektregeln, um:
* domänenspezifisches Wissen über deine Codebasis zu erfassen
* projektspezifische Workflows oder Vorlagen zu automatisieren
* Stil- oder Architekturentscheidungen zu standardisieren
### Anatomie einer Rule
Jede Rule-Datei wird in **MDC** (`.mdc`) geschrieben, einem Format, das Metadaten und Inhalt unterstützt. Steuere über das Typ-Dropdown, wie Rules angewendet werden; es ändert die Properties `description`, `globs`, `alwaysApply`.
| Rule-Typ | Beschreibung |
| :--------------------------------------------- | :------------------------------------------------------------------------------------- |
| `Always` | Immer im Model-Kontext enthalten |
| `Auto Attached` | Wird einbezogen, wenn referenzierte Dateien einem Glob-Pattern entsprechen |
| `Agent Requested` | Für die AI verfügbar, die entscheidet, ob sie es einbezieht. Beschreibung erforderlich |
| `Manual` | Nur enthalten, wenn explizit mit `@ruleName` erwähnt |
```
---
description: RPC-Service-Boilerplate
globs:
alwaysApply: false
---
- Verwende unser internes RPC-Pattern, wenn du Services definierst
- Verwende für Servicenamen immer snake_case.
@service-template.ts
```
### Verschachtelte Regeln
Organisier Regeln, indem du sie in `.cursor/rules`-Verzeichnissen überall im Projekt ablegst. Verschachtelte Regeln werden automatisch verknüpft, wenn auf Dateien in ihrem Verzeichnis verwiesen wird.
```
project/
.cursor/rules/ # Projektweite Regeln
backend/
server/
.cursor/rules/ # Backend-spezifische Regeln
frontend/
.cursor/rules/ # Frontend-spezifische Regeln
```
### Eine Regel erstellen
Erstell Regeln mit dem Befehl `New Cursor Rule` oder über `Cursor Settings > Rules`. Dadurch wird eine neue Regeldatei in `.cursor/rules` erstellt. In den Einstellungen kannst du alle Regeln und ihren Status sehen.
### Regeln generieren
Generiere Regeln direkt in Unterhaltungen mit dem Befehl `/Generate Cursor Rules`. Praktisch, wenn du Entscheidungen zum Agentenverhalten getroffen hast und sie wiederverwenden willst.
## Best Practices
Gute Regeln sind fokussiert, umsetzbar und klar abgegrenzt.
* Halt Regeln unter 500 Zeilen
* Teil große Regeln in mehrere, kombinierbare Regeln auf
* Gib konkrete Beispiele oder verlinkte Dateien an
* Vermeide vage Anleitungen. Schreib Regeln wie klare interne Doku
* Nutze Regeln wieder, wenn Prompts im Chat wiederholt werden
## Beispiele
Diese Regel legt Standards für Frontend-Komponenten fest:
Im components-Verzeichnis:
* Immer Tailwind für Styles verwenden
* Framer Motion für Animationen nutzen
* Namenskonventionen für Komponenten einhalten
Diese Regel erzwingt die Validierung für API-Endpunkte:
Im API-Verzeichnis:
* zod für alle Validierungen verwenden
* Rückgabetypen mit zod-Schemas definieren
* Aus den Schemas generierte Typen exportieren
Diese Regel stellt eine Vorlage für Express-Services bereit:
Verwende diese Vorlage beim Erstellen eines Express-Services:
* RESTful-Prinzipien einhalten
* Error-Handling-Middleware einbinden
* Sinnvolles Logging einrichten
@express-service-template.ts
Diese Regel definiert die Struktur von React-Komponenten:
React-Komponenten sollten diesem Layout folgen:
* Props-Interface oben
* Komponente als benannter Export
* Styles unten
@component-template.tsx
Diese Regel automatisiert die App-Analyse:
Wenn du die App analysieren sollst:
1. Dev-Server mit `npm run dev` starten
2. Logs aus der Konsole holen
3. Performance-Verbesserungen vorschlagen
Diese Regel unterstützt die Dokumentationsgenerierung:
Hilf beim Erstellen der Doku durch:
* Extrahieren von Code-Kommentaren
* Analysieren der README.md
* Generieren von Markdown-Dokumentation
Zuerst eine Property zum Umschalten in `@reactiveStorageTypes.ts` anlegen.
Standardwert in `INIT_APPLICATION_USER_PERSISTENT_STORAGE` in `@reactiveStorageService.tsx` hinzufügen.
Für Beta-Features den Toggle in `@settingsBetaTab.tsx` hinzufügen, sonst in `@settingsGeneralTab.tsx`. Toggles können als `` für allgemeine Checkboxen hinzugefügt werden. Sieh dir den Rest der Datei für Beispiele an.
```
{
vsContext.reactiveStorageService.setApplicationUserPersistentStorage(
'myNewProperty',
newVal
);
}}
/>
```
Um es in der App zu verwenden, `reactiveStorageService` importieren und die Property nutzen:
```
const flagIsEnabled = vsContext.reactiveStorageService.applicationUserPersistentStorage.myNewProperty
```
Viele Beispiele sind von Providern und Frameworks verfügbar. Community-beigetragene Regeln finden sich in diversen Crowdsourcing-Sammlungen und Repositories online.
## AGENTS.md
`AGENTS.md` ist eine einfache Markdown-Datei, in der du Anweisungen für Agents definierst. Leg sie im Projekt-Root ab – als Alternative zu `.cursor/rules` für unkomplizierte Use Cases.
Im Gegensatz zu den Project Rules ist `AGENTS.md` eine reine Markdown-Datei ohne Metadaten oder komplexe Konfigurationen. Perfekt für Projekte, die einfache, gut lesbare Anweisungen brauchen, ohne den Overhead strukturierter Regeln.
```markdown theme={null}
# Projektanweisungen
## Codestil
- Für alle neuen Dateien TypeScript verwenden
- In React funktionale Komponenten bevorzugen
- snake_case für Datenbankspalten verwenden
## Architektur
- Dem Repository-Pattern folgen
- Geschäftslogik in Service-Schichten belassen
```
## Benutzerregeln
Benutzerregeln sind globale Einstellungen, die in **Cursor Settings → Rules** festgelegt werden und für alle Projekte gelten. Sie sind reiner Text und ideal, um deinen bevorzugten Kommunikationsstil oder Coding-Konventionen festzulegen:
```
Antworte bitte knapp. Vermeide unnötige Wiederholungen oder Füllwörter.
```
## `.cursorrules` (Legacy)
Die Datei `.cursorrules` im Projekt-Root wird weiterhin unterstützt, ist aber veraltet. Wir empfehlen, auf Project Rules zu migrieren, um mehr Kontrolle, Flexibilität und Transparenz zu bekommen.
Code-Vervollständigung, die mehrzeilige Änderungen vorschlägt. Drück Tab, um
Vorschläge basierend auf deinem aktuellen Code und den letzten Änderungen zu übernehmen.
Führt Aufgaben asynchron im Hintergrund aus, während du weiterarbeitest. Du kannst ihn über den Editor oder über externe Integrationen wie Slack nutzen.
Verschiedene KI-Modelle für die Codegenerierung. Jedes Modell bietet
unterschiedliche Eigenschaften in Bezug auf Geschwindigkeit und Leistungsfähigkeit.
Der Einstieg ist ganz einfach:
1. Geh auf [cursor.com](https://cursor.com) und klick auf „Download“
2. Führ den Installer aus, sobald der Download abgeschlossen ist
3. Öffne Cursor, sobald die Installation fertig ist
Du brauchst eine bestimmte Version? Alle Plattformen und Installationsmethoden findest du auf
[cursor.com/downloads](https://cursor.com/downloads)
## Ersteinrichtung
Wenn du Cursor zum ersten Mal öffnest, führen wir dich durch eine kurze Einrichtung:
* Wähle Tastenkürzel, die sich vertraut anfühlen
* Such dir ein Theme aus, das dir gefällt
* Richte deine Terminaleinstellungen ein
Du kannst den Einrichtungsassistenten jederzeit wieder öffnen, indem du Cmd Shift P{" "}
drückst und nach `Cursor: Start Onboarding` suchst.
Lies mehr über [Tastenkürzel](/de/kbd), [Themes](/de/settings/themes) und [Shell-Befehle](/de/settings/shell)
Tastenkürzel anzeigen
Ein Theme in Cursor auswählen
Shell-Befehle installieren
## Wechselst du von einem anderen Editor?
Wenn du bereits einen anderen Code-Editor nutzt, machen wir dir den Umstieg leicht:
VS-Code-Einstellungen direkt importieren
Migrationsguides für JetBrains, Eclipse, Neovim und Sublime
Weitere Migrationsguides folgen in Kürze.
## Sprachunterstützung
Cursor funktioniert mit allen gängigen Programmiersprachen. Hier sind einige beliebte Sprachen mit erweiterter KI-Unterstützung:
}
arrow
/>
}
arrow
/>
}
arrow
/>
}
arrow
/>
Du kannst Unterstützung für weitere Sprachen über Erweiterungen hinzufügen – genau wie in VS Code.
## Dein Konto erstellen
Cursor funktioniert zwar auch ohne Konto, aber mit einer Registrierung schaltest du alle AI‑Features frei:
1. Während der Einrichtung wirst du zur Registrierung aufgefordert – oder du erledigst das später in den Einstellungen (Cmd Shift J)
2. Sobald du registriert bist, verwalte dein Konto auf [cursor.com/dashboard](https://cursor.com/dashboard)
## Codebase-Indexierung verstehen
Wenn du ein Projekt öffnest, beginnt Cursor, deinen Code kennenzulernen. Das nennt man „Indexierung“ und sie sorgt dafür, dass die KI-Vorschläge präzise sind.
* Die Indexierung startet automatisch, sobald du ein Projekt öffnest
* Je nach Projektgröße dauert sie etwa 1–15 Minuten
* Je mehr Cursor über deinen Code lernt, desto besser werden die Vorschläge
* Teams können Indizes miteinander teilen, um Zeit zu sparen
* Du kannst den Indexierungsfortschritt in den Einstellungen (Cmd Shift J) → Indexing & Docs prüfen
Willst du mehr erfahren? Schau dir an, [wie die Indexierung funktioniert](/de/context/codebase-indexing)
## Nächste Schritte
Jetzt, wo Cursor installiert ist, bist du bereit für KI-gestütztes Coden:
* Folge unserer [Schnellstartanleitung](/de/get-started/quickstart), um die Grundlagen in 5 Minuten zu lernen
* Lies die [Kernkonzepte](/de/get-started/concepts), um zu verstehen, wie Cursor funktioniert
* [Stöbere in den Anleitungen](/de/guides), um zu entdecken, was du mit Cursor bauen kannst
* Wenn du auf Probleme stößt, [hol dir Hilfe](/de/troubleshooting/common-issues) in unserem Troubleshooting-Leitfaden
* [Tritt unserer Community bei](https://cursor.com/community), um dich mit anderen Cursor-Nutzer\*innen zu vernetzen
# Schnellstart
Source: https://docs.cursor.com/de/get-started/quickstart
Starte mit Cursor in 5 Minuten
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Dieses Quickstart führt dich durch ein Projekt mit den Kernfunktionen von Cursor. Am Ende bist du mit Tab, Inline Edit und Agent vertraut.
## Öffne ein Projekt in Cursor
Verwende ein bestehendes Projekt oder klone unser Beispiel:
1. Stell sicher, dass Git installiert ist
2. Klone das Beispielprojekt:
```bash theme={null}
git clone git@github.com:voxelize/voxelize.git && \
cd voxelize && \
cursor .
```
1. Öffne Cursor
2. Öffne einen Projektordner mit Cmd O oder `cursor `
Wir zeigen das Ganze am Beispielprojekt, aber du kannst jedes beliebige lokale Projekt verwenden.
## Autocomplete mit [Tab](/de/kbd#tab)
Tab ist das Autocomplete-Modell, das wir intern trainiert haben. Es ist ein guter Weg, um entspannt in KI-unterstütztes Coden reinzukommen, wenn du noch nicht dran gewöhnt bist. Mit Tab kannst du:
* **Mehrere Zeilen und Blöcke** Code automatisch vervollständigen
* **In** Dateien und **über** Dateien hinweg zur nächsten Autocomplete-Eingabe springen
1. Fang an, den Anfang einer Funktion zu tippen:
```javascript theme={null}
function calculate
```
2. Tab-Vorschläge erscheinen automatisch
3. Drück Tab, um den Vorschlag zu übernehmen
4. Cursor schlägt Parameter und Funktionskörper vor
## [Inline Edit](/de/inline-edit) für eine Auswahl
1. Wähl die Funktion aus, die du gerade erstellt hast
2. Drück Cmd K
3. Tipp „make this function calculate fibonacci numbers“
4. Drück Return, um die Änderungen anzuwenden
5. Cursor fügt Importe und Dokumentation hinzu
## Chat mit [Agent](/de/agent)
1. Öffne das Chat-Panel (Cmd I)
2. Sag: „Füg dieser Funktion Tests hinzu und führ sie aus“
3. Der Agent erstellt eine Testdatei, schreibt Testfälle und führt sie für dich aus
## Bonus
Erweiterte Funktionen:
1. Öffne das Background-Agent-Control-Panel (Cmd E)
2. Frag: „Find and fix a bug in this project“
3. Der [Background Agent](/de/background-agent) wird:
* Eine Remote-VM (Virtual Machine) erstellen
* Dein Projekt erkunden
* Bugs erkennen
* Fixes vorschlagen
Änderungen prüfen und anwenden.
{" "}
1. Öffne die Command Palette (Cmd Shift P) 2. Such: „New Cursor
Rule“ 3. Benenn sie (z. B. `style-guide`) 4. Wähl als Rule Type „Always“ 5. Definiere
deinen Stil: `Prefer using camelCase for variable names`
1. Besuch unser [MCP-Verzeichnis](https://docs.cursor.com/tools)
2. Wähl ein Tool
3. Klick auf „Install“
Server können auch manuell installiert werden:
1. Öffne die Cursor Settings (Cmd Shift J)
2. Geh zu „Tools & Integrations“
3. Klick auf „New MCP Server“
Für vollständige Notebook-Unterstützung lade die Jupyter-Erweiterung (ID: ms-toolsai.jupyter) von ms-toolsai herunter.
Cursor unterstützt sowohl `.ipynb`- als auch `.py`-Dateien mit integrierter Zellausführung. Tab, Inline Edit und Agents
funktionieren in Notebooks genauso wie in anderen Code-Dateien.
Wichtige Funktionen:
* **Inline-Zellausführung** führt Code direkt in der Editoroberfläche aus
* **Tab, Inline Edit und Agent** verstehen Data-Science-Bibliotheken, einschließlich pandas, NumPy, scikit-learn und SQL-Magic-Befehlen
## Datenbankintegration
Datenbanken lassen sich auf zwei Hauptwegen mit Cursor verbinden: über MCP-Server und Extensions.
* **MCP-Server** ermöglichen deinen Agents, eine Verbindung zu deinen Datenbanken herzustellen
* **Extensions** integrieren deine gesamte IDE mit deinen Datenbanken
### Über MCP
MCP-Server erlauben deinem Agent, Abfragen direkt gegen deine Datenbank auszuführen. So kann dein Agent entscheiden, deine Datenbank zu queryen, die passende Abfrage zu schreiben, den Befehl auszuführen und die Ergebnisse zu analysieren – alles als Teil einer laufenden Aufgabe.
Zum Beispiel kannst du eine Postgres-Datenbank mit deiner Cursor-Instanz verbinden, indem du die folgende [MCP-Konfiguration](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) zu Cursor hinzufügst:
```json theme={null}
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
}
```
Mehr zu MCP findest du in unserer [MCP-Dokumentation](/de/tools/mcp).
### Über Extensions
Installiere datenbankspezifische Extensions (PostgreSQL, BigQuery, SQLite, Snowflake), um Queries direkt im Editor auszuführen. Das spart Kontextwechsel zwischen Tools und ermöglicht KI-Unterstützung bei der Query-Optimierung.
```sql theme={null}
-- Cursor schlägt Indizes, Window-Funktionen und Query-Optimierungen vor
SELECT
user_id,
event_type,
COUNT(*) as event_count,
RANK() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) as frequency_rank
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id, event_type;
```
Nutze Agents, um langsame Abfragen zu analysieren, Leistungsverbesserungen vorzuschlagen oder Visualisierungscode für Abfrageergebnisse zu erzeugen. Cursor versteht den SQL-Kontext und kann basierend auf deiner Datenstruktur passende Diagrammtypen empfehlen.
## Datenvisualisierung
Cursors KI-Unterstützung umfasst Datenvisualisierungsbibliotheken wie Matplotlib, Plotly und Seaborn. Der Agent kann Code für Datenvisualisierung generieren, sodass du Daten schnell und einfach erkunden kannst – und dabei ein reproduzierbares, leicht teilbares Artefakt entsteht.
```python theme={null}
import plotly.express as px
import pandas as pd
# Die KI schlägt auf Basis der Datenspalten passende Diagrammtypen vor
df = pd.read_csv('sales_data.csv')
fig = px.scatter(df, x='advertising_spend', y='revenue',
color='region', size='customer_count',
title='Umsatz vs. Werbeausgaben nach Region')
fig.show()
```
## Häufig gestellte Fragen
**Kann ich vorhandene Jupyter-Notebooks verwenden?**
Ja, Cursor öffnet `.ipynb`-Dateien mit vollständiger Zellausführung und KI-gestützter Autovervollständigung.
**Wie gehe ich mit großen Datensätzen um, die nicht in den Speicher passen?**
Verwende verteilte Computing-Bibliotheken wie Dask oder verbinde dich per Remote-SSH mit größeren Maschinen und Spark-Clustern.
**Unterstützt Cursor R- und SQL-Dateien?**
Ja, Cursor bietet KI-Unterstützung und Syntaxhervorhebung für R-Skripte (`.R`) und SQL-Dateien (`.sql`).
**Was ist der empfohlene Weg, Entwicklungsumgebungen zu teilen?**
Committe den Ordner `.devcontainer` in die Versionsverwaltung. Teammitglieder können die Umgebung beim Öffnen des Projekts automatisch neu aufsetzen.
**Wie debugge ich Datenverarbeitungspipelines?**
Verwende den integrierten Debugger von Cursor mit Breakpoints in Python-Skripten, oder nutze Agent, um komplexe Datentransformationen Schritt für Schritt zu analysieren und zu erklären.
## Reproduzierbarkeit der Umgebung
### Entwicklungscontainer
Entwicklungscontainer helfen dir, einheitliche Runtimes und Abhängigkeiten über Teammitglieder und Deploy-Umgebungen hinweg sicherzustellen. Sie können umgebungsspezifische Bugs eliminieren und die Einarbeitungszeit für neue Teammitglieder verkürzen.
Um einen Entwicklungscontainer zu verwenden, leg zuerst einen Ordner `.devcontainer` im Root deines Repos an. Erstelle anschließend eine `devcontainer.json`, ein `Dockerfile` und eine `requirements.txt`.
```json theme={null}
// .devcontainer/devcontainer.json
{
"name": "ds-env",
"build": { "dockerfile": "Dockerfile" },
"features": {
"ghcr.io/devcontainers/features/python:1": { "version": "3.11" }
},
"postCreateCommand": "pip install -r requirements.txt"
}
```
```dockerfile theme={null}
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/python:3.11
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install -r requirements.txt
```
```txt theme={null}
# requirements.txt
pandas==2.3.0
numpy
# füge weitere Abhängigkeiten hinzu, die du für dein Projekt brauchst
```
Cursor erkennt den Dev Container automatisch und fordert dich auf, dein Projekt in einem Container neu zu öffnen. Alternativ kannst du die Command Palette (Cmd+Shift+P) nutzen und nach `Reopen in Container` suchen, um das Projekt manuell in einem Container neu zu öffnen.
Entwicklungscontainer bieten mehrere Vorteile:
* **Isolierte Abhängigkeiten** verhindern Konflikte zwischen Projekten
* **Reprodizierbare Builds** sorgen für konsistentes Verhalten in Entwicklungs- und Produktionsumgebungen
* **Vereinfachtes Onboarding** ermöglicht neuen Teammitgliedern, ohne manuelle Einrichtung sofort loszulegen
### Remote-Entwicklung mit SSH
Wenn deine Arbeit zusätzliche Rechenressourcen, GPUs oder Zugriff auf private Datensätze erfordert, verbinde dich mit Remote-Maschinen, während du deine lokale Entwicklungsumgebung beibehältst.
1. Bereitstelle eine Cloud-Instanz oder greife auf einen On-Premises-Server mit den benötigten Ressourcen zu
2. Klone dein Repository auf die Remote-Maschine, einschließlich der `.devcontainer`-Konfiguration
3. Verbinde dich über Cursor: Cmd+Shift+P → „Remote-SSH: Connect to Host“
Dieser Ansatz erhält ein konsistentes Tooling, während die Rechenressourcen bei Bedarf skaliert werden. Die gleiche Entwicklungscontainer-Konfiguration funktioniert sowohl in lokalen als auch in Remote-Umgebungen.
# Große Codebasen
Source: https://docs.cursor.com/de/guides/advanced/large-codebases
So arbeitest du mit großen Codebasen in Cursor
Die Arbeit mit großen Codebasen bringt andere Herausforderungen mit sich als kleinere Projekte. Aus unserer Erfahrung beim Skalieren der eigenen Cursor-Codebase und aus Insights von Kund:innen, die riesige Codebasen managen, haben wir hilfreiche Patterns entdeckt, um die gestiegene Komplexität zu bewältigen.
In diesem Guide gehen wir ein paar Techniken durch, die sich für große Codebasen bewährt haben.
```mermaid theme={null}
flowchart LR
A[Codebase-Verständnis aufbauen] --> B[Ergebnis/Diff festlegen]
B --> C[Änderungen planen]
C --> D[Änderungen umsetzen]
D --> A
```
# Mit Chat schnell bei unbekanntem Code auf den neuesten Stand kommen
Eine große Codebase zu durchdringen – besonders wenn sie neu für dich ist – kann knifflig sein. Oft greppst du, suchst und klickst dich durch die Dateien, um die konkreten Stellen zu finden, die du brauchst. Mit [Chat](/de/chat/overview) kannst du direkt Fragen stellen, gezielt finden, wonach du suchst, und bekommst eine detaillierte Erklärung, wie es funktioniert.
Hier lassen wir uns helfen, die Implementierungsdetails der Codebase-Indizierung in Cursor zu finden, und bitten sogar um Beispiele, damit das Ganze leichter zu verstehen ist.
# Schreib Regeln für domänenspezifisches Wissen
Wenn du eine neue Kollegin oder einen neuen Kollegen in deiner Codebase onboardest, welchen Kontext würdest du geben, damit sie direkt sinnvoll beitragen können?
Deine Antwort auf diese Frage ist vermutlich auch für Cursor wertvoll. In jeder Organisation oder in jedem Projekt gibt es latentes Wissen, das nicht vollständig in deiner Doku festgehalten ist. Regeln gezielt einzusetzen ist der beste Weg, um sicherzustellen, dass Cursor das volle Bild bekommt.
Wenn du zum Beispiel Anweisungen schreibst, wie ein neues Feature oder ein neuer Service implementiert wird, überleg dir, eine kurze Regel zu verfassen, um das dauerhaft festzuhalten.
```mdc Boilerplate theme={null}
---
description: Einen neuen VSCode-Frontend-Service hinzufügen
---
1. **Schnittstellendefinition:**
- Definiere eine neue Service-Schnittstelle mit `createDecorator` und stell sicher, dass `_serviceBrand` enthalten ist, um Fehler zu vermeiden.
2. **Service-Implementierung:**
- Implementiere den Service in einer neuen TypeScript-Datei, erweitere `Disposable` und registriere ihn als Singleton mit `registerSingleton`.
3. **Service-Contribution:**
- Erstelle eine Contribution-Datei, um den Service zu importieren und zu laden, und registriere ihn im Haupteinstiegspunkt.
4. **Kontextintegration:**
- Aktualisiere den Kontext, um den neuen Service einzubinden, sodass er in der gesamten Anwendung verfügbar ist.
```
Wenn es gängige Formatierungsmuster gibt, an die sich Cursor halten soll, solltest du in Erwägung ziehen, Regeln basierend auf Glob-Mustern automatisch anzuhängen.
```mdc Formatierung theme={null}
---
globs: *.ts
---
- Verwende bun als Paketmanager. Siehe [package.json](mdc:backend/reddit-eval-tool/package.json) für Skripte
- Verwende kebab-case für Dateinamen
- Verwende camelCase für Funktions- und Variablennamen
- Verwende UPPERCASE_SNAKE_CASE für hardcodierte Konstanten
- Bevorzuge `function foo()` gegenüber `const foo = () =>`
- Verwende `Array` statt `T[]`
- Verwende benannte Exports statt Default-Exports, z. B. (`export const variable ...`, `export function `)
```
# Bleib nah am Planerstellungsprozess
Für größere Änderungen kann es Cursor's Output deutlich verbessern, wenn du überdurchschnittlich viel Zeit investierst, um einen präzisen, klar abgegrenzten Plan zu erstellen.
Wenn du nach ein paar unterschiedlichen Variationen desselben Prompts nicht das Ergebnis bekommst, das du willst, zoom raus und erstell von Grund auf einen detaillierteren Plan – so, als würdest du ein PRD für eine:n Kolleg:in schreiben. Oft ist **der schwierige Teil, herauszufinden, welche** Änderung überhaupt gemacht werden sollte – eine Aufgabe, die besonders gut für Menschen geeignet ist. Mit den richtigen Anweisungen können wir Teile der Implementierung an Cursor delegieren.
Eine Möglichkeit, KI zur Unterstützung der Planerstellung zu nutzen, ist der Ask-Modus. Um einen Plan zu erstellen, schalt in Cursor den Ask-Modus ein und kipp sämtlichen Kontext rein, den du aus deinen Projektmanagement-Systemen, internen Docs oder losen Notizen hast. Überleg dir, welche Dateien und Abhängigkeiten es in der Codebase gibt, die du unbedingt einbeziehen willst. Das kann eine Datei sein, die Codeabschnitte enthält, mit denen du integrieren willst, oder auch ein kompletter Ordner.
Hier ist ein Beispiel-Prompt:
```mdc Planungs-Prompt theme={null}
- erstelle einen Plan, wie wir ein neues Feature bauen sollten (genau wie @existingfeature.ts)
- stell mir Fragen (max. 3), wenn etwas unklar ist
- stell sicher, dass du den Code durchsucht
@Vergangene Chats (meine früheren Erkundungs-Prompts)
hier ist noch mehr Kontext aus dem [Projektmanagement-Tool]:
[eingefügte Ticketbeschreibung]
```
Wir lassen das Modell einen Plan erstellen und Kontext sammeln, indem es dir Fragen stellt und sich auf frühere Explorations‑Prompts sowie die Ticketbeschreibungen bezieht. Ein Thinking‑Modell wie `claude-3.7-sonnet`, `gemini-2.5-pro` oder `o3` wird empfohlen, da es die Absicht der Änderung versteht und einen Plan besser synthetisieren kann.
Darauf aufbauend kannst du den Plan iterativ mit Hilfe von Cursor ausarbeiten, bevor du mit der Implementierung startest.
```mermaid theme={null}
flowchart LR
A[Kontext] -- Frage --> B[Plan]
B -- Agent --> C[Implementierung]
```
# Wähl das richtige Tool für die Aufgabe
Eine der wichtigsten Fähigkeiten, um Cursor effektiv zu nutzen, ist, das richtige Tool für die jeweilige Aufgabe zu wählen. Überleg dir, was du erreichen willst, und nimm den Ansatz, der dich im Flow hält.
| **Tool** | **Use Case** | **Stärke** | **Einschränkung** |
| :------------------------------------------ | :-------------------------------------------- | :-------------------------------------------------- | :----------------------- |
| **[Tab](/de/tab/overview)** | Schnelle, manuelle Änderungen | Volle Kontrolle, schnell | Einzeldatei |
| **[Inline Edit](/de/inline-edit/overview)** | Gezielt abgegrenzte Änderungen in einer Datei | Fokussierte Änderungen | Einzeldatei |
| **[Chat](/de/chat/overview)** | Größere, mehrdateiige Änderungen | Sammelt Kontext automatisch, tiefgehende Änderungen | Langsamer, kontextlastig |
Jedes Tool hat seinen Sweet Spot:
* Tab ist dein Go-to für schnelle Änderungen, bei denen du am Steuer sitzen willst
* Inline Edit glänzt, wenn du fokussierte Änderungen an einem bestimmten Codeabschnitt machen musst
* Chat ist perfekt für größere Änderungen, bei denen Cursor den breiteren Kontext verstehen soll
Wenn du den Chat-Modus nutzt (der sich etwas langsamer anfühlen kann, aber unglaublich mächtig ist), hilf ihm, dir zu helfen, indem du guten Kontext lieferst. Verwende [@files](/de/context/@-symbols/@-files), um auf ähnlichen Code zu verweisen, den du nachahmen willst, oder [@folder](/de/context/@-symbols/@-folders), um ein besseres Verständnis deiner Projektstruktur zu geben. Und hab keine Angst, größere Änderungen in kleinere Schritte zu zerlegen – neue Chats zu starten hilft, Dinge fokussiert und effizient zu halten.
# Wichtigste Erkenntnisse
* Änderungen klein halten und nicht zu viel auf einmal machen
* Relevanten Kontext angeben, wenn möglich
* Chat, Inline Edit & Tab jeweils für das nutzen, worin sie am besten sind
* Oft neue Chats erstellen
* Mit [Ask mode](/de/chat/ask) planen, mit [Agent mode](/de/chat/agent) umsetzen
# Arbeiten mit Dokumentation
Source: https://docs.cursor.com/de/guides/advanced/working-with-documentation
Wie du Dokumentation in Cursor effektiv nutzt – mit Prompts, externen Quellen und internem Kontext
export const ChatInput = ({content = []}) => {
const renderContent = () => {
return content.map((item, index) => {
if (item.type === 'mention') {
return
{item.text}
;
}
return item.text;
});
};
return <>
Dokumentation liefert aktuellen, verlässlichen Kontext. Ohne sie greifen Modelle auf veraltete oder unvollständige Trainingsdaten zurück. Dokumentation hilft Modellen, Dinge wie Folgendes zu verstehen:
* Aktuelle APIs und Parameter
* Best Practices
* Organisationskonventionen
* Fachterminologie
Und vieles mehr. Lies weiter, um zu erfahren, wie du Dokumentation direkt in Cursor nutzt, ohne den Fokus wechseln zu müssen.
## Wissensstichtag des Modells
Große Sprachmodelle werden auf Daten bis zu einem bestimmten Zeitpunkt trainiert, dem sogenannten „Wissensstichtag“. Das bedeutet:
* Kürzliche Updates von Libraries sind eventuell nicht berücksichtigt
* Neue Frameworks oder Tools könnten unbekannt sein
* API-Änderungen nach dem Stichtag fehlen
* Best Practices haben sich seit dem Training möglicherweise weiterentwickelt
Wenn zum Beispiel der Wissensstichtag eines Modells Anfang 2024 liegt, kennt es keine Features, die Ende 2024 veröffentlicht wurden – selbst bei beliebten Frameworks.
# Welches Tool sollte ich verwenden?
Benutze diesen Entscheidungsbaum, um schnell den besten Ansatz für deine Dokumentationsbedürfnisse zu finden:
```mermaid theme={null}
flowchart TD
A[Welche Informationen brauchst du?] --> B[Öffentliche Frameworks/Bibliotheken]
A --> C[Aktuelles Community‑Wissen/Troubleshooting]
A --> D[Interne Unternehmensinformationen]
B --> E[Offizielle Doku nötig?]
E -->|Ja| F[Nutze @Docs API‑Referenzen, Leitfäden, Best Practices]
E -->|Nein| G[Nutze @Web Community‑Tutorials, Vergleiche]
C --> H[Nutze @Web Aktuelle Posts, GitHub‑Issues]
D --> I[Gibt es vorhandene MCP‑Integrationen?]
I -->|Ja| J[Vorhandenes MCP nutzen Confluence, Google Drive, etc.]
I -->|Nein| K[Eigenes MCP bauen Interne APIs, proprietäre Systeme]
style F fill:#e1f5fe
style G fill:#e8f5e8
style H fill:#e8f5e8
style J fill:#fff3e0
style K fill:#fce4ec
```
## Mentales Modell
| Tool | Mentales Modell |
| ----------- | ------------------------------------------------ |
| **`@Docs`** | Wie das Durchstöbern und Lesen offizieller Dokus |
| **`@Web`** | Wie nach Lösungen im Internet suchen |
| **MCP** | Wie auf deine interne Doku zugreifen |
# Öffentliche Dokumentation
Externe Dokumentation umfasst öffentlich verfügbare Informationen, zu denen Modelle womöglich nur begrenztes oder veraltetes Wissen haben. Cursor bietet zwei Hauptwege, auf diese Informationen zuzugreifen.
## Verwendung von @Docs
`@Docs` verbindet Cursor mit der offiziellen Dokumentation beliebter Tools und Frameworks. Nutz es, wenn du aktuelle, verlässliche Informationen brauchst zu:
* **API-Referenzen**: Funktionssignaturen, Parameter, Rückgabetypen
* **Einstiegshilfen**: Setup, Konfiguration, grundlegende Nutzung
* **Best Practices**: Empfohlene Patterns aus der Quelle
* **Framework-spezifischem Debugging**: Offizielle Troubleshooting-Guides
## Verwendung von @Web
`@Web` durchsucht das Live-Internet nach aktuellen Infos, Blogposts und Community-Diskussionen. Nutz es, wenn du Folgendes brauchst:
* **Aktuelle Tutorials**: Community-erstellte Inhalte und Beispiele
* **Vergleiche**: Artikel, die unterschiedliche Ansätze gegenüberstellen
* **Neueste Updates**: Brandaktuelle Updates oder Ankündigungen
* **Mehrere Perspektiven**: Verschiedene Herangehensweisen an Probleme
# Interne Dokumentation
Interne Dokumentation umfasst Informationen, die spezifisch für deine Organisation sind und denen KI-Modelle während des Trainings nie begegnet sind. Das kann Folgendes sein:
* **Interne APIs**: maßgeschneiderte Services und Microservices
* **Unternehmensstandards**: Coding Conventions, Architekturpatterns
* **Proprietäre Systeme**: eigene Tools, Datenbanken, Workflows
* **Domänenwissen**: Business-Logik, Compliance-Anforderungen
## Zugriff auf interne Doks mit MCP
Das Model Context Protocol (MCP) bietet eine standardisierte Möglichkeit, deine private Doku und Systeme in Cursor einzubinden. MCP fungiert als dünne Schicht zwischen Cursor und deinen internen Ressourcen.
**Warum MCP wichtig ist:**
* Modelle kennen deine internen Konventionen nicht
* API-Dokumentationen für eigene Services sind nicht öffentlich verfügbar
* Business-Logik und Domänenwissen sind organisationsspezifisch
* Compliance- und Sicherheitsanforderungen unterscheiden sich je nach Unternehmen
### Häufige MCP-Integrationen
| Integration | Zugriff | Beispiele |
| ---------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| **Confluence** | Unternehmens-Confluence-Spaces | Architekturdokumentation, API-Spezifikationen für interne Services, Coding-Standards und Guidelines, Prozessdokumentation |
| **Google Drive** | Geteilte Dokumente und Ordner | Spezifikationsdokumente, Meeting-Notizen und Entscheidungsprotokolle, Designdokumente und Requirements, Team-Wissensbasen |
| **Notion** | Workspace-Datenbanken und -Seiten | Projektdokumentation, Team-Wikis, Wissensbasen, Produktanforderungen, technische Spezifikationen |
| **Custom** | Interne Systeme und Datenbanken | Proprietäre APIs, Legacy-Dokumentationssysteme, eigene Wissensbasen, spezialisierte Tools und Workflows |
#### Custom-Lösungen
Für besondere Anforderungen kannst du eigene MCP-Server bauen, die:
* interne Websites oder Portale scrapen
* sich mit proprietären Datenbanken verbinden
* auf eigene Dokumentationssysteme zugreifen
* aus internen Wikis oder Wissensbasen ziehen
Wenn du einen eigenen MCP-Server baust, kannst du auch Tools bereitstellen, damit Cursor die Dokumentation aktualisieren kann
Beispiel für einen eigenen MCP-Server zum Scrapen interner Doks:
```javascript TypeScript theme={null}
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import TurndownService from "turndown";
// Create an MCP server for scraping internal docs
const server = new McpServer({
name: "internal-docs",
version: "1.0.0"
});
const turndownService = new TurndownService();
// Add tool to scrape internal documentation
server.tool("get_doc",
{ url: z.string() },
async ({ url }) => {
try {
const response = await fetch(url);
const html = await response.text();
// Convert HTML to markdown
const markdown = turndownService.turndown(html);
return {
content: [{ type: "text", text: markdown }]
};
} catch (error) {
return {
content: [{ type: "text", text: `Error scraping ${url}: ${error.message}` }]
};
}
}
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);
```
```python Python theme={null}
# server.py
import os
import asyncio
from mcp.server.fastmcp import FastMCP
import aiohttp
from markdownify import markdownify as md
# Create an MCP server for scraping internal docs
mcp = FastMCP("internal-docs")
@mcp.tool()
async def get_doc(url: str) -> dict:
"""Scrape internal documentation from a URL"""
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
html = await response.text()
# Convert HTML to markdown
markdown = md(html)
return {
"content": [{"type": "text", "text": markdown}]
}
except Exception as error:
return {
"content": [{"type": "text", "text": f"Error scraping {url}: {str(error)}"}]
}
```
# Docs aktuell halten
Dokumentation veraltet schnell. Cursor hilft dir, deine Doku aktuell und nützlich zu halten, indem es sie auf Basis deines tatsächlichen Codes und eurer Gespräche zur Entwicklung erzeugt und aktualisiert.
## Aus bestehendem Code
Nutze Cursor, um Dokumentation direkt aus deiner Codebasis zu erstellen:
## Aus Chat-Sessions
Deine Unterhaltungen mit Cursor enthalten wertvolle Absichten, die in Dokumentation verwandelt werden können.
**Nach der Lösung eines komplexen Problems:**
**Nach Architekturentscheidungen:**
**Nach Debugging-Sessions:**
## Takeaways
* Dokumentation als Kontext macht Cursor präziser und aktueller
* Nutze `@Docs` für offizielle Dokumentation und `@Web` für Community-Wissen
* MCP schlägt die Brücke zwischen Cursor und deinen internen Systemen
* Generiere Dokumentation aus Code und Unterhaltungen, um Wissen aktuell zu halten
* Kombiniere externe und interne Dokumentationsquellen für ein umfassendes Verständnis
# Java
Source: https://docs.cursor.com/de/guides/languages/java
Java-Entwicklung mit JDK, Erweiterungen und Build-Tools einrichten
Dieser Guide hilft dir, Cursor für die Java-Entwicklung zu konfigurieren – inklusive Einrichtung des JDK, Installation der benötigten Erweiterungen, Debugging, Ausführen von Java-Anwendungen und Integration von Build-Tools wie Maven und Gradle. Außerdem behandelt er Workflow-Features, die IntelliJ oder VS Code ähneln.
Bevor du startest, stell sicher, dass du Cursor installiert und auf die
neueste Version aktualisiert hast.
## Java für Cursor einrichten
### Java-Installation
Bevor du Cursor einrichtest, muss Java auf deinem Rechner installiert sein.
Cursor enthält keinen Java-Compiler, daher musst du ein JDK installieren, falls du das noch nicht getan hast.
Lade ein JDK herunter und installiere es (z. B. OpenJDK, Oracle JDK, Microsoft Build of OpenJDK).
Setz JAVA\_HOME und füge JAVA\_HOME\bin zu deinem PATH hinzu.
Installiere über Homebrew (`brew install openjdk`) oder lade einen Installer herunter.
Stell sicher, dass JAVA\_HOME auf das installierte JDK zeigt.
Verwende deinen Paketmanager (`sudo apt install openjdk-17-jdk` oder Äquivalent) oder installiere über SDKMAN.
Um die Installation zu prüfen, führe Folgendes aus:
```bash theme={null}
java -version
javac -version
```
Wenn Cursor dein JDK nicht erkennt, konfigurier es manuell in der settings.json:
```json theme={null}
{
"java.jdt.ls.java.home": "/path/to/jdk",
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/path/to/jdk-17",
"default": true
}
]
}
```
Starte Cursor neu, damit die Änderungen wirksam werden.
### Cursor-Setup
Cursor unterstützt VS Code-Erweiterungen. Installiere die folgenden manuell:
Enthält Java-Sprachunterstützung, Debugger, Test-Runner, Maven-Support und
Projektverwaltung
Unverzichtbar für die Arbeit mit dem Gradle-Build-System
Erforderlich für die Entwicklung mit Spring Boot
Notwendig für die Entwicklung von Kotlin-Anwendungen
### Build-Tools konfigurieren
#### Maven
Stell sicher, dass Maven installiert ist (`mvn -version`). Bei Bedarf von [maven.apache.org](https://maven.apache.org/download.cgi) installieren:
1. Binärarchiv herunterladen
2. An den gewünschten Ort entpacken
3. Umgebungsvariable MAVEN\_HOME auf den entpackten Ordner setzen
4. %MAVEN\_HOME%\bin (Windows) oder \$MAVEN\_HOME/bin (Unix) zur PATH-Variable hinzufügen
#### Gradle
Stell sicher, dass Gradle installiert ist (`gradle -version`). Bei Bedarf von [gradle.org](https://gradle.org/install/) installieren:
1. Binärdistribution herunterladen
2. An den gewünschten Ort entpacken
3. Umgebungsvariable GRADLE\_HOME auf den entpackten Ordner setzen
4. %GRADLE\_HOME%\bin (Windows) oder \$GRADLE\_HOME/bin (Unix) zur PATH-Variable hinzufügen
Alternativ kannst du den Gradle Wrapper verwenden, der automatisch die passende Gradle-Version herunterlädt und nutzt:
## Ausführen und Debuggen
Alles ist eingerichtet – Zeit, deinen Java-Code auszuführen und zu debuggen.
Je nach Bedarf kannst du folgende Methoden verwenden:
Klick auf den „Run“-Link, der oberhalb jeder main-Methode erscheint, um dein
Programm schnell auszuführen
Öffne das Seitenleisten-Panel „Run and Debug“ und nutz den „Run“-Button, um
deine Anwendung zu starten
Ausführen über die Kommandozeile mit Maven- oder Gradle-Befehlen
Starte Spring-Boot-Anwendungen direkt über die „Spring Boot Dashboard“-
Erweiterung
## Java x Cursor-Workflow
Die KI-Features von Cursor können deinen Java-Workflow deutlich verbessern. So nutzt du Cursors Fähigkeiten speziell für Java:
Smarte Vervollständigungen für Methoden, Signaturen und Java-Boilerplate wie
Getter/Setter.
Design-Patterns umsetzen, Code refaktorisieren oder Klassen mit korrekter
Vererbung generieren.
Schnelle Inline-Änderungen an Methoden vornehmen, Fehler beheben oder Unit-Tests generieren –
ohne deinen Flow zu unterbrechen.
Hilfe zu Java-Konzepten bekommen, Exceptions debuggen oder Framework-
Features verstehen.
### Beispiel-Workflows
1. **Java-Boilerplate generieren**\
Verwende die [Tab completion](/de/tab/overview), um schnell Konstruktoren, Getter/Setter, equals-/hashCode-Methoden und andere repetitive Java-Muster zu erstellen.
2. **Komplexe Java-Exceptions debuggen**\
Wenn du auf einen kryptischen Java-Stacktrace stößt, markier ihn und nutze [Ask](/de/chat/overview), um die Ursache zu erklären und mögliche Fixes vorzuschlagen.
3. **Legacy-Java-Code refaktorisieren**\
Nutze den [Agent mode](/de/chat/agent), um älteren Java-Code zu modernisieren – anonyme Klassen in Lambdas umwandeln, auf neuere Java-Sprachfeatures upgraden oder Design-Patterns implementieren.
4. **Framework-Entwicklung**\
Füg deine Doku mit @docs zum Cursor-Kontext hinzu und generier framework-spezifischen Code überall in Cursor.
# JavaScript & TypeScript
Source: https://docs.cursor.com/de/guides/languages/javascript
JavaScript- und TypeScript-Entwicklung mit Framework-Unterstützung
Willkommen bei der JavaScript- und TypeScript-Entwicklung in Cursor! Der Editor bietet über sein Erweiterungs-Ökosystem hervorragende Unterstützung für JS/TS. Hier ist, was du wissen musst, um das Beste aus Cursor herauszuholen.
## Wichtige Erweiterungen
Cursor funktioniert zwar gut mit allen Erweiterungen, die du magst, aber für den Einstieg empfehlen wir diese:
* **ESLint** – erforderlich für Cursors KI-gestützte Lint-Fix-Funktionen
* **JavaScript and TypeScript Language Features** – erweiterte Sprachunterstützung und IntelliSense
* **Path Intellisense** – intelligente Pfadvervollständigung für Dateipfade
## Cursor-Funktionen
Cursor erweitert deinen bestehenden JavaScript/TypeScript-Workflow um:
* **Tab-Vervollständigungen**: Kontextbewusste Code-Vervollständigungen, die deine Projektstruktur verstehen
* **Automatische Importe**: Tab kann Bibliotheken automatisch importieren, sobald du sie verwendest
* **Inline-Editing**: Nutze `CMD+K` in jeder Zeile, um mit perfekter Syntax zu bearbeiten
* **Composer-Guidance**: Plane und bearbeite deinen Code über mehrere Dateien hinweg mit dem Composer
### Framework-Intelligence mit @Docs
Das @Docs-Feature von Cursor lässt dich deine JavaScript-Entwicklung auf ein neues Level heben, indem du benutzerdefinierte Dokumentationsquellen hinzufügst, auf die die KI zugreifen kann. Füge Dokumentation von MDN, Node.js oder deinem Lieblings-Framework hinzu, um präzisere und kontextbezogene Codevorschläge zu erhalten.
Entdecke, wie du benutzerdefinierte Dokumentationsquellen in Cursor hinzufügen und verwalten kannst.
### Automatische Linting-Behebung
Eines der herausragenden Features von Cursor ist die nahtlose Integration mit Linter-Erweiterungen.
Stell sicher, dass du einen Linter wie ESLint eingerichtet hast und aktiviere die Einstellung „Iterate on Lints“.
Wenn du dann den Agent-Modus im Composer verwendest, liest die KI, nachdem sie deine Anfrage beantwortet und Codeänderungen vorgenommen hat, automatisch die Ausgabe des Linters und versucht, alle Lint-Fehler zu beheben, die ihr möglicherweise zuvor nicht bekannt waren.
## Framework-Unterstützung
Cursor funktioniert nahtlos mit allen gängigen JavaScript-Frameworks und -Bibliotheken, zum Beispiel:
### React & Next.js
* Vollständige JSX/TSX-Unterstützung mit intelligenten Komponenten-Vorschlägen
* Intelligenz für Server Components und API-Routen in Next.js
* Empfohlen: [**React Developer Tools**](cursor:extension/msjsdiag.vscode-react-native) Erweiterung
### Vue.js
* Unterstützung der Template-Syntax mit Volar-Integration
* Autovervollständigung für Komponenten und Typprüfung
* Empfohlen: [**Vue Language Features**](cursor:extension/vue.volar)
### Angular
* Template-Validierung und Unterstützung für TypeScript-Decorators
* Generierung von Komponenten und Services
* Empfohlen: [**Angular Language Service**](cursor:extension/Angular.ng-template)
### Svelte
* Syntaxhervorhebung für Komponenten und intelligente Vervollständigungen
* Vorschläge für reaktive Statements und Stores
* Empfohlen: [**Svelte for VS Code**](cursor:extension/svelte.svelte-vscode)
### Backend-Frameworks (Express/NestJS)
* Intelligenz für Routen und Middleware
* Unterstützung für TypeScript-Decorators in NestJS
* Integration von API-Testtools
Denk dran: Die KI-Features von Cursor funktionieren mit all diesen Frameworks richtig gut, verstehen ihre Patterns und Best Practices und liefern passende Vorschläge. Die KI kann bei allem helfen – von der Komponentenerstellung bis hin zu komplexen Refactorings – und respektiert dabei die bestehenden Patterns in deinem Projekt.
# Python
Source: https://docs.cursor.com/de/guides/languages/python
Python-Entwicklung mit Erweiterungen und Linting-Tools einrichten
Dieser Guide wurde maßgeblich von [Jack Fields](https://x.com/OrdinaryInds)
und seinem
[Artikel](https://medium.com/ordinaryindustries/the-ultimate-vs-code-setup-for-python-538026b34d94)
zum Einrichten von VS Code für Python-Entwicklung inspiriert. Schau dir für
weitere Details seinen Artikel an.
## Voraussetzungen
Bevor wir starten, stell sicher, dass du Folgendes eingerichtet hast:
* [Python](https://python.org) installiert (empfohlen: 3.8 oder höher)
* [Git](https://git-scm.com/) für Versionskontrolle
* Cursor installiert und auf die neueste Version aktualisiert
## Unverzichtbare Erweiterungen
Die folgenden Erweiterungen statten Cursor vollständig für die Python-Entwicklung aus. Sie bieten dir Syntaxhervorhebung, Linting, Debugging und Unit-Tests.
Zentrale Sprachunterstützung von Microsoft
Schneller Python-Sprachserver
Erweiterte Debugging-Funktionen
Python-Linter und -Formatter
### Erweiterte Python-Tools
Während die oben genannten Erweiterungen bisher zu den beliebtesten für die Python-Entwicklung in Cursor gehörten, haben wir außerdem zusätzliche Erweiterungen hinzugefügt, die dir helfen können, das Beste aus deiner Python-Entwicklung herauszuholen.
#### `uv` – Python-Umgebungsmanager
[uv](https://github.com/astral-sh/uv) ist ein moderner Python-Paketmanager, mit dem du virtuelle Umgebungen erstellen und verwalten kannst und der pip als Standard-Paketmanager ersetzen kann.
Um uv zu installieren, führe den folgenden Befehl in deinem Terminal aus:
```bash theme={null}
pip install uv
```
#### `ruff` - Python-Linter und -Formatter
[Ruff](https://docs.astral.sh/ruff/) ist ein moderner Python-Linter und -Formatter, der Programmierfehler aufspürt, die Einhaltung von Code-Standards unterstützt und Refactorings vorschlägt. Er kann zusammen mit Black für die Codeformatierung verwendet werden.
Um Ruff zu installieren, führ den folgenden Befehl in deinem Terminal aus:
```bash theme={null}
pip install ruff
```
## Cursor-Konfiguration
### 1. Python-Interpreter
Konfigurier deinen Python-Interpreter in Cursor:
1. Öffne die Befehlspalette (Cmd/Ctrl + Shift + P)
2. Such nach „Python: Select Interpreter“
3. Wähl deinen Python-Interpreter aus (oder eine virtuelle Umgebung, wenn du eine verwendest)
### 2. Codeformatierung
Richte automatische Codeformatierung mit Black ein:
Black ist ein Code-Formatter, der deinen Code automatisch in einen
konsistenten Stil bringt. Er benötigt keine Konfiguration und ist in der
Python-Community weit verbreitet.
Um Black zu installieren, führ den folgenden Befehl in deinem Terminal aus:
```bash theme={null}
pip install black
```
Konfigurier danach Cursor so, dass Black fürs Code-Formatieren verwendet wird, indem du Folgendes zu deiner Datei `settings.json` hinzufügst:
```json theme={null}
{
"python.formatting.provider": "black",
"editor.formatOnSave": true,
"python.formatting.blackArgs": ["--line-length", "88"]
}
```
### 3. Linting
Mit PyLint kannst du Programmierfehler erkennen, die Einhaltung von Coding-Standards sicherstellen und Vorschläge zur Refaktorisierung erhalten.
Um PyLint zu installieren, führe den folgenden Befehl in deinem Terminal aus:
```bash theme={null}
pip install pylint
```
```json theme={null}
{
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.lintOnSave": true
}
```
### 4. Typprüfung
Zusätzlich zum Linting können wir MyPy verwenden, um nach Typfehlern zu suchen.
Um MyPy zu installieren, führ in deinem Terminal den folgenden Befehl aus:
```bash theme={null}
pip install mypy
```
```json theme={null}
{
"python.linting.mypyEnabled": true
}
```
## Debugging
Cursor bietet leistungsstarke Debugging-Funktionen für Python:
1. Setz Breakpoints, indem du in die Gutter klickst
2. Nutz das Debug-Panel (Cmd/Ctrl + Shift + D)
3. Konfigurier `launch.json` für benutzerdefinierte Debug-Konfigurationen
## Empfohlene Features
Intelligente Code-Vervollständigungen, die deine Aktionen verstehen
Erkunde und versteh Code durch natürliche Unterhaltungen
Bewältige komplexe Entwicklungsaufgaben mit KI-Unterstützung
Zieh Kontext aus Drittanbieter-Systemen heran
Importiere Module automatisch, während du codest
Cursor prüft deinen Code kontinuierlich mit KI
## Framework-Unterstützung
Cursor arbeitet nahtlos mit gängigen Python-Frameworks:
* **Web-Frameworks**: Django, Flask, FastAPI
* **Data Science**: Jupyter, NumPy, Pandas
* **Machine Learning**: TensorFlow, PyTorch, scikit-learn
* **Testing**: pytest, unittest
* **APIs**: requests, aiohttp
* **Datenbanken**: SQLAlchemy, psycopg2
# iOS & macOS (Swift)
Source: https://docs.cursor.com/de/guides/languages/swift
Integriere Cursor mit Xcode für Swift-Entwicklung
Willkommen bei der Swift-Entwicklung in Cursor! Egal, ob du iOS-Apps, macOS-Anwendungen oder serverseitige Swift-Projekte entwickelst – wir haben dich abgedeckt. Dieser Leitfaden hilft dir, deine Swift-Umgebung in Cursor einzurichten – startend mit den Grundlagen und anschließend mit fortgeschrittenen Features.
## Basis-Workflow
Der einfachste Weg, Cursor mit Swift zu nutzen, ist, ihn als deinen primären Code-Editor zu verwenden und Xcode weiterhin zum Builden und Ausführen deiner Apps zu verwenden. Du bekommst starke Features wie:
* Smarte Code-Vervollständigung
* KI-gestützte Coding-Unterstützung (probier [CMD+K](/de/inline-edit/overview) in jeder Zeile)
* Schnellzugriff auf Doku mit [@Docs](/de/context/@-symbols/@-docs)
* Syntax-Highlighting
* Grundlegende Code-Navigation
Wenn du deine App builden oder ausführen willst, wechsel einfach zu Xcode. Dieser Workflow ist perfekt für Devs, die Cursors KI nutzen wollen und für Debugging und Deployment bei den gewohnten Xcode-Tools bleiben.
### Hot Reloading
Wenn du Xcode-Workspaces oder -Projekte verwendest (statt einen Ordner direkt in Xcode zu öffnen), kann es passieren, dass Xcode Änderungen an deinen Dateien ignoriert, die in Cursor oder generell außerhalb von Xcode vorgenommen wurden.
Zwar kannst du den Ordner in Xcode öffnen, um das zu beheben, aber je nach Swift-Workflow brauchst du eventuell ein Projekt.
Eine starke Lösung dafür ist [Inject](https://github.com/krzysztofzablocki/Inject), eine Hot-Reloading-Bibliothek für Swift, die deiner App echtes Hot Reloading ermöglicht und sie sofort aktualisiert, sobald du Änderungen machst. Das ist nicht von den Nebenwirkungen des Xcode-Workspace/-Projekt-Themas betroffen und erlaubt dir, Änderungen in Cursor vorzunehmen und sie unmittelbar in deiner App zu sehen.
Erfahre mehr über Inject und wie du es in deinen Swift-Projekten einsetzt.
## Fortgeschrittene Swift-Entwicklung
Dieser Abschnitt des Guides wurde stark von [Thomas
Ricouard](https://x.com/Dimillian) und seinem
[Artikel](https://dimillian.medium.com/how-to-use-cursor-for-ios-development-54b912c23941)
über die Verwendung von Cursor für iOS-Entwicklung inspiriert. Schau dir seinen Artikel für mehr
Details an und lass ihm gern ein Follow da für mehr Swift-Content.
Wenn du nur einen Editor gleichzeitig geöffnet haben willst und vermeiden möchtest, zwischen Xcode und Cursor zu wechseln, kannst du eine Erweiterung wie [Sweetpad](https://sweetpad.hyzyla.dev/) verwenden, um Cursor direkt in das zugrunde liegende Buildsysteem von Xcode zu integrieren.
Sweetpad ist eine leistungsstarke Erweiterung, mit der du deine Swift-Projekte direkt in Cursor bauen, ausführen und debuggen kannst, ohne auf Xcodes Funktionen zu verzichten.
Um mit Sweetpad loszulegen, musst du Xcode weiterhin auf deinem Mac installiert haben – es ist die Grundlage der Swift-Entwicklung. Du kannst Xcode aus dem [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835) herunterladen. Sobald Xcode eingerichtet ist, lass uns deine Entwicklungsumgebung in Cursor mit ein paar essenziellen Tools verbessern.
Öffne dein Terminal und führe Folgendes aus:
```bash theme={null}
# Baut deine Projekte, ohne dass Xcode geöffnet sein muss
brew install xcode-build-server
# Gibt die Ausgabe von `xcodebuild` hübsch formatiert im Cursor-Terminal aus
brew install xcbeautify
# Bietet fortgeschrittene Formatierung und Sprachfeatures
brew install swiftformat
```
Als Nächstes installier die Erweiterung [Swift Language Support](cursor:extension/chrisatwindsurf.swift-vscode) in Cursor. Damit bekommst du sofort Syntax-Highlighting und grundlegende Sprachfunktionen out of the box.
Dann können wir die Erweiterung [Sweetpad](https://sweetpad.hyzyla.dev/) installieren, um Cursor mit Xcode zu integrieren. Sweetpad legt eine Menge Shortcuts rund um das `xcodebuild`-CLI (und mehr) obendrauf und erlaubt dir, deine Targets zu scannen, das Ziel auszuwählen, zu bauen und deine App wie in Xcode auszuführen. Außerdem richtet es dein Projekt für den Xcode Build Server ein, damit du alle oben erwähnten Features bekommst.
### Sweetpad verwenden
Sobald Sweetpad installiert ist und du ein Swift-Projekt in Cursor geöffnet hast, solltest du zuerst den Befehl `Sweetpad: Generate Build Server Config` ausführen. Dadurch wird im Root deines Projekts eine `buildServer.json`-Datei erzeugt, die dem Xcode Build Server ermöglicht, mit deinem Projekt zu arbeiten.
Anschließend kannst du entweder über die Command Palette oder die Sweetpad-Seitenleiste das Target auswählen, das du bauen und ausführen willst.
{" "}
Du musst dein Projekt einmal bauen, um Auto-Completion, Jump to Definition
und andere Sprachfunktionen zu aktivieren.{" "}
Du kannst jetzt auch F5 drücken, um dein Projekt mit einem Debugger zu bauen und auszuführen – eventuell musst du zuerst eine Launch-Konfiguration erstellen; wähl dann einfach Sweetpad aus der Liste, wenn du dazu aufgefordert wirst!
Wie bei vielen Erweiterungen in Cursor kannst du viele der Sweetpad-Befehle Tastenkürzeln zuweisen, um deinen Workflow noch effizienter zu machen.
Wenn du mehr über Sweetpad erfahren willst, schau dir diese Ressourcen an:
Offizielle Sweetpad-Website mit Features und Installationsanleitung
Umfassender Guide zu Konfiguration, Nutzung und erweiterten Features
# JetBrains
Source: https://docs.cursor.com/de/guides/migration/jetbrains
Mit vertrauten Tools von JetBrains-IDEs zu Cursor wechseln
Cursor bietet ein modernes, KI-gestütztes Coding-Erlebnis, das deine JetBrains-IDEs ersetzen kann. Auch wenn sich der Umstieg anfangs ungewohnt anfühlt, bietet Cursors auf VS Code basierende Grundlage leistungsstarke Features und umfangreiche Anpassungsmöglichkeiten.
## Editor Components
### Extensions
JetBrains-IDEs sind großartige Tools, da sie bereits für die vorgesehenen Sprachen und Frameworks vorkonfiguriert sind.
Cursor ist anders – als leere Leinwand out of the box kannst du es nach deinen Vorlieben anpassen, ohne durch die Sprachen und Frameworks eingeschränkt zu sein, für die die IDE gedacht war.
Cursor hat Zugriff auf ein riesiges Ökosystem an Erweiterungen, und fast die gesamte Funktionalität (und mehr!), die JetBrains-IDEs bieten, lässt sich über diese Erweiterungen nachbilden.
Schau dir unten einige dieser beliebten Erweiterungen an:
SSH-Erweiterung
Mehrere Projekte verwalten
Erweiterte Git-Integration
Lokale Dateiversionshistorie nachverfolgen
Inline-Fehlerhervorhebung
Code-Linting
Code-Formatierung
TODOs und FIXMEs nachverfolgen
### Keyboard Shortcuts
Cursor hat einen integrierten Shortcut-Manager, mit dem du deine Lieblingskürzel Aktionen zuordnen kannst.
Mit dieser Erweiterung kannst du fast alle Shortcuts der JetBrains-IDEs direkt in Cursor verwenden!
Lies unbedingt die Dokumentation der Erweiterung, um zu erfahren, wie du sie nach deinen Wünschen konfigurierst:
Installiere diese Erweiterung, um JetBrains-IDE-Shortcuts in Cursor zu nutzen.
Häufig abweichende Shortcuts:
* Aktion finden: ⌘/Ctrl+Shift+P (vs. ⌘/Ctrl+Shift+A)
* Quick Fix: ⌘/Ctrl+. (vs. Alt+Enter)
* Datei öffnen: ⌘/Ctrl+P (vs. ⌘/Ctrl+Shift+N)
### Themes
Repliziere das Look-and-Feel deiner Lieblings-JetBrains-IDEs in Cursor mit diesen Community-Themes.
Wähle das Standard-Darcula-Theme oder ein Theme, das zum Syntax-Highlighting deiner JetBrains-Tools passt.
Erlebe das klassische JetBrains-Darcula-Dark-Theme
Hol dir die vertrauten JetBrains-Datei- und Ordnersymbole
### Font
Um dein JetBrains-ähnliches Setup abzurunden, kannst du die offizielle Schriftart JetBrains Mono verwenden:
1. Lade die Schriftart JetBrains Mono herunter und installiere sie auf deinem System:
2. Starte Cursor nach der Installation der Schriftart neu
3. Öffne die Einstellungen in Cursor (⌘/Ctrl + ,)
4. Suche nach "Font Family"
5. Setze die Schriftfamilie auf 'JetBrains Mono'
Für das beste Erlebnis kannst du außerdem Schriftligaturen aktivieren, indem du in deinen Einstellungen `"editor.fontLigatures": true` festlegst.
## IDE-spezifische Migration
Viele Nutzer lieben die JetBrains-IDEs wegen ihrer Out-of-the-box-Unterstützung für die Sprachen und Frameworks, für die sie gedacht sind. Cursor ist anders – als leere Leinwand out of the box kannst du ihn nach deinem Geschmack anpassen, ohne durch die Sprachen und Frameworks eingeschränkt zu sein, für die die IDE ursprünglich vorgesehen war.
Cursor hat bereits Zugriff auf das Erweiterungs-Ökosystem von VS Code, und fast die gesamte Funktionalität (und mehr!), die JetBrains-IDEs bieten, lässt sich durch diese Erweiterungen nachbilden.
Schau dir die folgenden empfohlenen Erweiterungen für jede JetBrains-IDE an.
### IntelliJ IDEA (Java)
Zentrale Java-Sprachfunktionen
Java-Debugging
Java-Tests ausführen und debuggen
Maven-Unterstützung
Projektmanagement-Tools
Wesentliche Unterschiede:
* Build-/Run-Konfigurationen werden über launch.json verwaltet
* Spring-Boot-Tools über die Erweiterung ["Spring Boot Extension Pack"](cursor:extension/vmware.vscode-boot-dev-pack) verfügbar
* Gradle-Unterstützung über die Erweiterung ["Gradle for Java"](cursor:extension/vscjava.vscode-gradle)
### PyCharm (Python)
Zentrale Python-Unterstützung
Schnelles Type-Checking
Notebook-Unterstützung
Python-Formatter und Linter
Wesentliche Unterschiede:
* Virtuelle Umgebungen über die Befehlspalette verwaltet
* Debug-Konfigurationen in launch.json
* Requirements-Management über requirements.txt oder Poetry
### WebStorm (JavaScript/TypeScript)
Neueste Sprachfeatures
React-Entwicklung
Vue.js-Unterstützung
Angular-Entwicklung
Die meisten WebStorm-Features sind in Cursor/VS Code integriert, darunter:
* npm-Skripte-Ansicht
* Debugging
* Git-Integration
* TypeScript-Unterstützung
### PhpStorm (PHP)
PHP Language Server
Xdebug-Integration
Code-Intelligenz
Dokumentations-Tools
Wesentliche Unterschiede:
* Xdebug-Konfiguration über launch.json
* Composer-Integration über das Terminal
* Datenbank-Tools über die Erweiterung ["SQLTools"](cursor:extension/mtxr.sqltools)
### Rider (.NET)
Kernsupport für C#
Open-Source-C#-Entwicklungsumgebung
JetBrains-C#-Plugin
.NET-SDK-Management
Wesentliche Unterschiede:
* Projektmappen-Explorer über Dateiexplorer
* NuGet-Paketmanagement über CLI oder Erweiterungen
* Testrunner-Integration über Test-Explorer
### GoLand (Go)
Offizielle Go-Erweiterung
Wesentliche Unterschiede:
* Installation der Go-Tools wird automatisch angestoßen
* Debugging über launch.json
* Paketmanagement integriert mit go.mod
## Tipps für einen reibungslosen Umstieg
Drück ⌘/Ctrl + Shift + P, um Befehle zu finden
Nutz die KI-Funktionen von Cursor für Codevervollständigung und Refactoring
Feine deine settings.json für einen optimalen Workflow ab
Nutz das integrierte Terminal für Befehlszeilen-Operationen
Stöber im VS Code Marketplace nach zusätzlichen Tools
Denk dran: Auch wenn einige Workflows anders sind, bietet Cursor leistungsstarke KI-unterstützte Coding-Funktionen, die deine Produktivität über die Möglichkeiten traditioneller IDEs hinaus steigern können.
# VS Code
Source: https://docs.cursor.com/de/guides/migration/vscode
VS-Code-Einstellungen und -Erweiterungen mit einem Klick importieren
Cursor basiert auf dem VS-Code-Codebasis, sodass wir uns darauf konzentrieren können, die beste KI-gestützte Coding-Erfahrung zu bieten – bei gleichzeitig vertrauter Bearbeitungsumgebung. So kannst du deine vorhandenen VS-Code-Einstellungen ganz einfach zu Cursor migrieren.
## Profilmigration
### Import mit einem Klick
So holst du dir dein komplettes VS Code-Setup mit einem Klick:
1. Öffne die Cursor-Einstellungen (⌘/Ctrl + Shift + J)
2. Navigiere zu General > Account
3. Klicke unter „VS Code Import“ auf die Schaltfläche „Import“
Damit werden folgende Elemente übernommen:
* Extensions
* Themes
* Settings
* Keybindings
### Manuelle Profilmigration
Wenn du zwischen Rechnern wechselst oder mehr Kontrolle über deine Einstellungen willst, kannst du dein Profil manuell migrieren.
#### Profil exportieren
1. Öffne in deiner VS Code-Instanz die Command Palette (⌘/Ctrl + Shift + P)
2. Suche nach „Preferences: Open Profiles (UI)“
3. Finde in der linken Sidebar das Profil, das du exportieren möchtest
4. Klicke auf das 3-Punkte-Menü und wähle „Export Profile“
5. Wähle, ob du es auf deinen lokalen Rechner exportieren oder in einem GitHub Gist speichern möchtest
#### Profil importieren
1. Öffne in deiner Cursor-Instanz die Command Palette (⌘/Ctrl + Shift + P)
2. Suche nach „Preferences: Open Profiles (UI)“
3. Klicke auf das Dropdown-Menü neben „New Profile“ und dann auf „Import Profile“
4. Füge entweder die URL des GitHub Gists ein oder wähle „Select File“, um eine lokale Datei hochzuladen
5. Klicke unten im Dialog auf „Import“, um das Profil zu speichern
6. Wähle schließlich in der Sidebar das neue Profil und klicke auf das Häkchen, um es zu aktivieren
## Einstellungen und Oberfläche
### Einstellungsmenüs
Zugriff über die Befehlspalette (⌘/Ctrl + Shift{" "}
* P), dann „Cursor Settings“ eingeben
Zugriff über die Befehlspalette (⌘/Ctrl + Shift{" "}
* P), dann „Preferences: Open Settings (UI)“ eingeben
### Versionsupdates
Wir rebasen Cursor regelmäßig auf die neueste VS-Code-Version, um bei
Features und Fixes auf dem neuesten Stand zu bleiben. Für mehr Stabilität
verwendet Cursor oft leicht ältere VS-Code-Versionen.
### Ausrichtung der Aktivitätsleiste
Wir haben sie horizontal gestaltet, um Platz für die AI-Chat-Oberfläche zu optimieren. Wenn dir die vertikale Ausrichtung lieber ist:
1. Öffne die Befehlspalette (⌘/Ctrl + Shift + P)
2. Suche nach „Preferences: Open Settings (UI)“
3. Suche nach `workbench.activityBar.orientation`
4. Setze den Wert auf `vertical`
5. Starte Cursor neu
# Architekturschaubilder
Source: https://docs.cursor.com/de/guides/tutorials/architectural-diagrams
Lerne, mit Mermaid Architekturschaubilder zu erstellen, um Systemstruktur und Datenfluss zu visualisieren
Architekturschaubilder helfen dir, zu verstehen, wie dein System funktioniert. Du kannst sie nutzen, um Logik zu erkunden, Datenflüsse nachzuvollziehen und Strukturen zu kommunizieren. Cursor unterstützt das Generieren dieser Diagramme direkt mit Tools wie Mermaid, sodass du in nur wenigen Prompts vom Code zur Visualisierung kommst.
## Warum Diagramme wichtig sind
Diagramme zeigen klar, wie Daten fließen und wie Komponenten miteinander interagieren. Sie sind nützlich, wenn du:
* den Kontrollfluss in deiner Codebase verstehen willst
* die Datenherkunft vom Input bis zum Output nachverfolgen musst
* andere onboardest oder dein System dokumentierst
Sie sind auch super fürs Debuggen und um smartere Fragen zu stellen. Visuals helfen dir (und dem Modell), das große Ganze zu sehen.
## Zwei Dimensionen, die du berücksichtigen solltest
Es gibt ein paar verschiedene Perspektiven, über die du nachdenken kannst:
* **Zweck**: Kartierst du Logik, Datenfluss, Infrastruktur oder etwas anderes?
* **Format**: Willst du etwas Schnelles (wie ein Mermaid-Diagramm) oder etwas Formelles (wie UML)?
## So promptest du richtig
Starte mit einem klaren Ziel. Hier sind ein paar gängige Arten zu fragen:
* **Ablauf**: „Zeig mir, wie Requests vom Controller bis zur Datenbank laufen.“
* **Datenlinie**: „Verfolge diese Variable vom Eintrittspunkt bis zu ihrem Ziel.“
* **Struktur**: „Gib mir eine komponentenbasierte Ansicht dieses Services.“
Du kannst Start- und Endpunkte angeben oder Cursor bitten, den gesamten Pfad zu finden.
## Arbeiten mit Mermaid
Mermaid ist leicht zu lernen und rendert direkt in Markdown (mit der richtigen Erweiterung). Cursor kann Diagramme generieren wie:
* `flowchart` für Logik und Abläufe
* `sequenceDiagram` für Interaktionen
* `classDiagram` für Objektstrukturen
* `graph TD` für einfache gerichtete Diagramme
```mermaid theme={null}
sequenceDiagram
participant User
participant Server
participant Database
User->>Server: Formular senden
Server->>Database: Eintrag speichern
Database-->>Server: Erfolgreich
Server-->>User: Bestätigung
```
Du kannst die [Mermaid-Erweiterung](https://marketplace.cursorapi.com/items?itemName=bierner.markdown-mermaid) installieren, um Diagramme in der Vorschau anzuzeigen.
1. Geh zum Reiter Extensions
2. Such nach Mermaid
3. Installieren
## Diagrammstrategie
Fang klein an. Versuch nicht, alles auf einmal zu erfassen.
* Such dir eine einzelne Funktion, Route oder einen Prozess aus
* Bitte Cursor, diesen Teil mit Mermaid zu visualisieren
* Wenn du ein paar hast, bitte es, sie zu kombinieren
Das entspricht dem **C4‑Modell** – du startest auf einer niedrigen Ebene (Code oder Komponenten) und arbeitest dich zu höherstufigen Übersichten nach oben.
### Empfohlener Ablauf
1. Starte mit einem detaillierten, niedrigstufigen Diagramm
2. Fasse es zu einer mittleren Ansicht zusammen
3. Wiederhole das, bis du die gewünschte Abstraktionsebene erreichst
4. Bitte Cursor, sie zu einem einzigen Diagramm oder einer Systemübersicht zusammenzuführen
```mermaid theme={null}
graph TD
subgraph Ebene 1: Low-Level-Komponenten
A1[AuthService] --> A2[TokenValidator]
A1 --> A3[UserDB]
B1[PaymentService] --> B2[BillingEngine]
B1 --> B3[InvoiceDB]
end
subgraph Ebene 2: Mid-Level-Systeme
A[Benutzersystem] --> A1
B[Abrechnungssystem] --> B1
end
subgraph Ebene 3: High-Level-Anwendung
App[Haupt-App] --> A
App --> B
end
```
## Takeaways
* Nutze Diagramme, um Fluss, Logik und Daten zu verstehen
* Starte mit kleinen Prompts und erweitere dein Diagramm von dort aus
* Mermaid ist das beste Format, um in Cursor zu arbeiten
* Starte auf niedriger Ebene und abstrahiere nach oben – wie im C4-Modell
* Cursor hilft dir, Diagramme mühelos zu generieren, zu verfeinern und zu kombinieren
# Einen MCP-Server erstellen
Source: https://docs.cursor.com/de/guides/tutorials/building-mcp-server
Lerne, wie du einen Model Context Protocol (MCP)-Server mit PostgreSQL-Integration für Cursor erstellst
## Einführung
MCP-Server lassen dich eigene Datenquellen anbinden und in Cursor verfügbar machen. Das ist besonders nützlich, wenn du Kontext aus Quellen wie Browsern, Datenbanken oder Fehler- und System-Logs brauchst. Das Einrichten eines MCP-Servers ist unkompliziert und mit Cursor schnell erledigt.
In diesem Guide zeigen wir, wie du einen MCP-Server für Postgres baust. Unser Ziel ist, Cursor zu ermöglichen, SQL-Abfragen direkt gegen eine Postgres-Datenbank auszuführen und Tabellenschemata strukturiert bereitzustellen.
Dieses Tutorial soll dir die Grundlagen zum Erstellen von MCP-Servern vermitteln.
```mermaid theme={null}
graph LR
A[Nutzer in Cursor] --> B[Cursor]
B <--> C["MCP-Server (stdio)"]
C <--> D[(Postgres-Datenbank)]
subgraph Lokaler Rechner
B
C
end
class B cursor
class C mcp
class D db
```
## Was ist ein MCP-Server?
Ein [MCP-Server](/de/context/mcp) ist ein Prozess, der mit Cursor kommuniziert und Zugriff auf externe Daten oder Aktionen bereitstellt. Er kann auf mehrere Arten implementiert werden, aber hier nutzen wir die einfachste Methode: einen Server, der lokal auf deinem Computer über [stdio](https://en.wikipedia.org/wiki/Standard_streams) (Standard-Ein-/Ausgabeströme) läuft. Das vermeidet komplizierte Sicherheitsüberlegungen und lässt uns auf die MCP-Logik selbst fokussieren.
Einer der häufigsten Anwendungsfälle für MCP ist der Datenbankzugriff. Beim Erstellen von Dashboards, dem Ausführen von Analysen oder dem Erstellen von Migrationen ist es oft notwendig, eine Datenbank zu abzufragen und zu inspizieren. Unser Postgres-MCP-Server wird zwei Kernfunktionen unterstützen: das Ausführen beliebiger Abfragen und das Auflisten von Tabellenschemata.
Obwohl beide Aufgaben auch mit reinem SQL erledigt werden könnten, bietet MCP Funktionen, die sie mächtiger und allgemein nützlicher machen. Tools bieten eine Möglichkeit, Aktionen wie das Ausführen von Abfragen bereitzustellen, während Ressourcen es ermöglichen, standardisierten Kontext wie Schemainformationen zu teilen. Später in diesem Guide schauen wir uns auch Prompts an, die fortgeschrittenere Workflows ermöglichen.
Unter der Haube verlassen wir uns auf das npm-Paket postgres, um SQL-Anweisungen gegen die Datenbank auszuführen. Das MCP-SDK dient als Wrapper um diese Aufrufe und ermöglicht es uns, Postgres-Funktionalität nahtlos in Cursor zu integrieren.
## So baust du den MCP-Server
Der erste Schritt beim Erstellen des Servers ist, ein neues Projekt aufzusetzen. Wir fangen damit an, einen neuen Ordner zu erstellen und ein Bun-Projekt zu initialisieren.
```bash theme={null}
> mkdir postgres-mcp-server
> Bun init
```
Von hier aus wählen wir das `Blank`-Projekt. Sobald unser Boilerplate eingerichtet ist, müssen wir die benötigten Abhängigkeiten installieren. `zod` wird benötigt, um Schemas für I/O im MCP-SDK zu definieren
```bash theme={null}
bun add postgres @modelcontextprotocol/sdk zod
```
Von hier aus gehen wir zu den Repos der jeweiligen Libraries und holen uns den Link zu den Rohinhalten der jeweiligen README-Dateien. Die nutzen wir als Kontext, wenn wir den Server bauen.
* `postgres`
* Repo: [https://github.com/porsager/postgres](https://github.com/porsager/postgres),
* README: [https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md](https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md)
* `@modelcontextprotocol/sdk`:
* Repo: [https://github.com/modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)
* README: [https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md](https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md)
Jetzt definieren wir, wie sich der Server verhalten soll. Dafür erstellen wir eine `spec.md` und schreiben die übergeordneten Ziele auf.
```markdown theme={null}
# Spezifikation
- Definieren von DATABASE_URL über MCP-Umgebungskonfiguration erlauben
- Postgres-Daten über ein Tool abfragen
- Standardmäßig schreibgeschützt
- Schreiboperationen erlauben, indem ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1` gesetzt wird
- Auf Tabellen als `resources` zugreifen
- Zod für Schema-Definitionen verwenden
```
Wie du siehst, ist das eine ziemlich schlanke Spezifikation. Fühl dich frei, bei Bedarf weitere Details hinzuzufügen. Zusammen mit den README-Links erstellen wir den finalen Prompt.
```markdown theme={null}
Lies das Folgende und halte dich an @spec.md, um zu verstehen, was wir wollen. Alle erforderlichen Abhängigkeiten sind installiert
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
```
Mit diesen drei Komponenten (der Spezifikation, der MCP-SDK-Dokumentation und der Postgres-Bibliotheksdokumentation) können wir Cursor nutzen, um die Serverimplementierung zu scaffolden. Cursor hilft uns, die Bausteine zusammenzuführen und den Code zu generieren, der das MCP-SDK mit Postgres verbindet.
Nach einigem Hin und Her beim Prompting haben wir jetzt eine erste Version des MCP-Servers am Start. Um sie auszuprobieren, können wir den [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector) verwenden
```bash theme={null}
npx @modelcontextprotocol/inspector bun run index.ts
```
## Testen des MCP-Servers
Sobald die erste Implementierung steht, können wir sie mit dem MCP Inspector testen. Der Inspector zeigt, was der Server bereitstellt, und hilft zu prüfen, ob Tools und Ressourcen wie erwartet funktionieren. Wir sollten sicherstellen, dass Abfragen ausgeführt werden können und Schema-Informationen korrekt zurückgegeben werden.
Wenn alles passt, können wir den Server mit Cursor verbinden und ihn in einer realen Umgebung testen. Ab diesem Zeitpunkt kann Cursor den Postgres-MCP-Server wie eine integrierte Funktion nutzen, sodass wir die Datenbank direkt abfragen und inspizieren können.
## Nächste Schritte
Den MCP-Server lokal über stdio auszuführen, ist ein super Einstieg, aber Teams brauchen oft gemeinsamen Zugriff auf dieselbe Datenbank über ihren MCP-Server. In solchen Fällen ist es nötig, den MCP-Server als zentralisierten HTTP-Dienst zu deployen.
Ein bereitgestellter MCP-Server bietet mehrere Vorteile gegenüber einzelnen stdio-Instanzen:
* **Gemeinsamer Datenbankzugriff:** Mehrere Teammitglieder können über Cursor dieselbe Datenbankinstanz abfragen
* **Zentralisierte Konfiguration:** Schema-Updates und Berechtigungsänderungen werden an einem Ort verwaltet
* **Erhöhte Sicherheit:** Saubere Authentifizierung, Rate-Limiting und Zugriffskontrollen können implementiert werden
* **Observability:** Nutzungsmuster und Performance-Metriken können teamweit überwacht werden
Dafür würdest du die Transportmethode von stdio auf HTTP umstellen.
Wir decken nicht das komplette Setup ab, aber hier ist ein guter Start-Prompt, den du Cursor geben kannst
```
Auf Basis des bestehenden MCP-Servers eine neue Datei erstellen, die das HTTP-Protokoll implementiert.
Gemeinsame Logik nach mcp-core auslagern und jede Transport-Implementierung eindeutig benennen (mcp-server-stdio, mcp-server-http)
@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
```
Die finalen Ergebnisse findest du hier: [pg-mcp-server](https://github.com/ericzakariasson/pg-mcp-server)
```mermaid theme={null}
graph LR
subgraph Team_Network_or_Cloud["VPC"]
SVC["MCP-Server (HTTP-Transport)"] <--> DB[(Postgres-DB)]
end
Dev1["Entwickler 1 in Cursor"] -->|HTTP| SVC
Dev2["Entwickler 2 in Cursor"] -->|HTTP| SVC
Dev3["Entwickler 3 in Cursor"] -->|HTTP| SVC
subgraph SVC_Internals["Internals"]
direction TB
T1["Auth und ACLs"]
T2["Rate-Limiting und Logging"]
T3["Tool: query"]
T4["Resource: table_schemas"]
T5["Prompts"]
T1 --> T2 --> T3
T3 --> T4
T3 --> T5
end
SVC --> SVC_Internals
class SVC svc
class DB db
class T1,T2,T3,T4,T5 internals
class Dev1,Dev2,Dev3 dev
```
# Webentwicklung
Source: https://docs.cursor.com/de/guides/tutorials/web-development
So richtest du Cursor für die Webentwicklung ein
export const McpInstallButtonPrimary = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
Webentwicklung lebt von schnellen Iterationen und einem engen Feedback-Loop zwischen Cursor und externen Tools wie Figma oder dem Browser. Bei Cursor haben wir Workflows entwickelt, die diesen Loop weiter verkürzen. Klare Aufgabenabgrenzung, Wiederverwendung von Komponenten und der Einsatz von Designsystemen halten alles schnell und konsistent.
Dieser Guide zeigt dir, wie du Cursor für die Webentwicklung einrichtest und den Feedback-Loop weiter verkürzt.
```mermaid theme={null}
graph LR
A[Projekt] --> B[Design]
B --> C[Code]
C -- Test --> D[Verifizieren]
D -- Feedback --> C
```
# Orchestrierung in Cursor starten
**Chat** ist super, um Änderungen zu starten. Sobald die großen Teile stehen, helfen **Inline Edit** und **Tab** dabei, in deinem Flow zu bleiben.
Nachdem du Cursor eingerichtet hast, kannst du Workflows über verschiedene Tools hinweg orchestrieren. Unten siehst du eine Demo dessen, was möglich ist: ein Snake-Game, erstellt durch die Kombination von Linear, Figma und Browser-Tools. Reale Projekte sind in der Regel komplexer, aber dieses Beispiel zeigt das Potenzial dieser integrierten Workflows.
# Verbinde Cursor mit deinen Projektmanagement-Tools
Du kannst Cursor über verschiedene Tools in deine bestehende Projektmanagement-Software integrieren. In diesem Guide schauen wir uns die Integration von Linear mit dessen MCP-Server an.
### Installation
Oder füge den Linear-MCP-Server manuell zu `mcp.json` hinzu:
```jsx theme={null}
{
"mcpServers": {
"Linear": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.linear.app/sse"
]
}
}
}
```
Dann:
1. Stell sicher, dass du Linear in den MCP-Einstellungen aktivierst
2. Ein Webbrowser öffnet sich und du wirst aufgefordert, dich bei Linear zu authentifizieren
Aufgrund des aktuellen Stands von MCP kann die Einrichtung mehrere Versuche erfordern.
Wenn die Integration nicht funktioniert, versuch in den Cursor-Einstellungen den Server zu „reloaden“.
### Linear in Cursor verwenden
Linear-MCP-Server stellen verschiedene Tools bereit, die Cursor zum Lesen und Verwalten von Issues nutzen kann. Geh zu den MCP-Einstellungen und such den Linear-Server, um eine Liste aller Tools zu sehen. Zum Überprüfen, probier diesen Prompt im Chat:
```jsx theme={null}
alle Issues zu diesem Projekt auflisten
```
Wenn die Integration korrekt eingerichtet ist, sollte eine Liste von Issues zurückgegeben werden.
# Hol dir deine Figma-Designs ins Projekt
Designs und Mockups sind zentral für die Webentwicklung. Mit dem offiziellen MCP-Server für Figma kannst du in Cursor direkt auf Design-Dateien zugreifen und damit arbeiten. Um loszulegen, folg der Einrichtung unter [Figma Dev Mode MCP Server](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
### Installation
Du kannst unten auf den Button klicken, um den MCP-Server zu installieren.
Oder manuell zu deiner `mcp.json` hinzufügen:
```jsx theme={null}
{
"mcpServers": {
"Figma": {
"url": "http://127.0.0.1:3845/sse"
}
}
}
```
### Verwendung
Der Server stellt mehrere Tools bereit, die du in deinen Prompts nutzen kannst. Probier zum Beispiel, dir die Designs der aktuellen Auswahl in Figma ausgeben zu lassen. Mehr dazu in der [Dokumentation](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
# Halte dein Code-Scaffolding konsistent
Du hast wahrscheinlich bestehenden Code, ein Designsystem oder etablierte Konventionen, die du wiederverwenden willst. Beim Arbeiten mit Modellen ist es hilfreich, auf Muster zu verweisen, die bereits in deiner Codebase existieren, zum Beispiel Dropdown-Menüs oder andere gängige Komponenten.
Wir arbeiten selbst in einer großen webbasierten Codebase und haben festgestellt, dass deklarativer Code besonders gut funktioniert – vor allem mit React und JSX.
Wenn du ein Designsystem hast, kannst du dem Agent helfen, es zu erkennen, indem du eine entsprechende Regel vorgibst. Hier ist eine `ui-components.mdc`-Datei, mit der wir nach Möglichkeit die Wiederverwendung von Komponenten erzwingen:
```mdc components.mdc theme={null}
---
description: Designs umsetzen und UI erstellen
---
- vorhandene UI-Komponenten aus `/src/components/ui` wiederverwenden. Das sind die Bausteine, mit denen wir arbeiten
- neue Komponenten erstellen, indem du UI-Komponenten orchestrierst, wenn es keine vorhandene gibt, die das Problem löst
- den Menschen fragen, wie er weiter vorgehen will, wenn Komponenten und Designs fehlen
```
Wenn deine Komponentenbibliothek wächst, füge entsprechend neue Regeln hinzu. Wenn es zu viele Regeln werden, überleg dir, sie in spezifischere Kategorien aufzuteilen, zum Beispiel „nur anwenden, wenn mit Benutzereingaben gearbeitet wird“.
# Cursor Zugriff auf den Browser geben
Um Cursors Fähigkeiten zu erweitern, kannst du den Browser-Tools-MCP-Server einrichten, der Zugriff auf Konsolenlogs und Netzwerkrequests bereitstellt. Sobald er konfiguriert ist, kannst du deine Änderungen überprüfen, indem du die Konsolenausgabe und die Netzwerkaktivität beobachtest. Dieses Setup hilft sicherzustellen, dass deine Implementierung deiner Absicht entspricht. Folge den Anweisungen hier, um den MCP-Server einzurichten: [https://browsertools.agentdesk.ai/installation](https://browsertools.agentdesk.ai/installation)
Wir arbeiten daran, die native Integration in Cursor zu vereinfachen.
# Erkenntnisse
* Enge Feedback-Schleifen sind in der Webentwicklung entscheidend. Nutze Cursor zusammen mit Tools wie Figma, Linear und dem Browser, um schnell voranzukommen und im Flow zu bleiben.
* MCP-Server ermöglichen dir, externe Systeme direkt in Cursor zu integrieren, was Kontextwechsel reduziert und die Aufgabenausführung verbessert.
* Das Wiederverwenden von Komponenten und Designsystemen hilft dem Modell, saubereren, konsistenteren Code und Ergebnisse zu erzeugen.
* Klar formulierte, klar abgegrenzte Aufgaben führen zu besseren Ergebnissen. Sei bewusst darin, wie du promptest und worum du bittest.
* Wenn du keine guten Ergebnisse bekommst, versuch Folgendes anzupassen:
* **Instructions:** Nutze Regeln, Prompts und gib Zugriff auf mehr Kontext, z. B. mit MCP-Servern.
* **Systems:** Muster, Abstraktionen und Klarheit machen es dem Modell leichter, zu verstehen, zu helfen und autonomer zu arbeiten.
* Du kannst den Kontext des Modells erweitern, indem du Laufzeitinfos wie Console-Logs, Network-Requests und UI-Element-Daten einbeziehst.
* Nicht alles muss automatisiert werden. Wenn dein System zu komplex wird, greif auf gezielte Änderungen mit Tab und Inline Edit zurück.
* Cursor ist am stärksten, wenn es ein Co-Pilot ist, kein Autopilot. Nutze es, um deine eigene Entscheidungsfindung zu verbessern, nicht zu ersetzen.
# Arbeiten mit Kontext
Source: https://docs.cursor.com/de/guides/working-with-context
Wie du in Cursor mit Kontext arbeitest
Erstmal: Was ist ein Kontextfenster? Und wie hängt das damit zusammen, effektiv mit Cursor zu coden?
Um kurz rauszuzoomen: Ein Large Language Model (LLM) ist ein KI‑Modell, das darauf trainiert ist, Text vorherzusagen und zu generieren, indem es Muster aus riesigen Datensätzen lernt. Es treibt Tools wie Cursor an, indem es deine Eingaben versteht und basierend auf früheren Beispielen Code oder Text vorschlägt.
Tokens sind die Ein- und Ausgaben dieser Modelle. Es sind Textstücke, oft Fragmente eines Wortes, die ein LLM nacheinander verarbeitet. Modelle lesen nicht ganze Sätze auf einmal; sie sagen das nächste Token auf Basis der vorherigen voraus.
Um zu sehen, wie Text tokenisiert wird, kannst du einen Tokenizer wie [diesen hier](https://tiktokenizer.vercel.app/) verwenden.
# Was ist Kontext?
Wenn wir in Cursor einen Codevorschlag generieren, bezieht sich „Kontext“ auf die Informationen, die dem Modell bereitgestellt werden (in Form von „Input-Tokens“), die das Modell dann verwendet, um die nachfolgenden Informationen zu erzeugen (in Form von „Output-Tokens“).
Es gibt zwei Arten von Kontext:
1. **Intent-Kontext** definiert, was der User vom Modell will. Zum Beispiel dienen Systemprompts normalerweise als High-Level-Anweisungen dafür, wie sich das Modell verhalten soll. Das meiste „Prompting“ in Cursor ist Intent-Kontext. „Mach den Button von blau zu grün“ ist ein Beispiel für geäußerte Intention; das ist präskriptiv.
2. **State-Kontext** beschreibt den aktuellen Zustand. Cursor mit Fehlermeldungen, Konsolen-Logs, Bildern und Codeausschnitten zu versorgen, sind Beispiele für zustandsbezogenen Kontext. Er ist deskriptiv, nicht präskriptiv.
Zusammen arbeiten diese beiden Arten von Kontext harmonisch, indem sie den aktuellen und den gewünschten zukünftigen Zustand beschreiben und Cursor so ermöglichen, hilfreiche Coding-Vorschläge zu machen.
```mermaid theme={null}
flowchart LR
A["Absicht (was du willst)"] --> C[Modell]
B["Zustand (was wahr ist)"] --> C
C -- Prognose --> D["Aktion (was es tut)"]
```
# Kontext in Cursor bereitstellen
Je mehr relevanten Kontext du einem Modell gibst, desto nützlicher wird es. Wenn in Cursor nicht genug Kontext vorhanden ist, versucht das Modell, die Aufgabe ohne die nötigen Informationen zu lösen. Das führt typischerweise zu:
1. Halluzinationen, bei denen das Modell versucht, Muster zu erkennen (obwohl es keine gibt), was zu unerwarteten Ergebnissen führt. Das kann bei Modellen wie `claude-3.5-sonnet` häufig passieren, wenn sie nicht genug Kontext bekommen.
2. Der Agent versucht, sich den Kontext selbst zu beschaffen, indem er die Codebase durchsucht, Dateien liest und Tools aufruft. Ein starkes Thinking-Modell (wie `claude-3.7-sonnet`) kann mit dieser Strategie ziemlich weit kommen, und der richtige initiale Kontext setzt die Richtung.
Die gute Nachricht ist: Cursor ist von Grund auf mit Kontextbewusstsein gebaut und so konzipiert, dass du so wenig wie möglich eingreifen musst. Cursor zieht automatisch die Teile deiner Codebase heran, die das Modell als relevant einschätzt, etwa die aktuelle Datei, semantisch ähnliche Stellen in anderen Dateien und weitere Informationen aus deiner Session.
Trotzdem gibt es sehr viel Kontext, aus dem gezogen werden kann. Daher ist es hilfreich, den Kontext, von dem du weißt, dass er für die Aufgabe relevant ist, manuell anzugeben, um die Modelle in die richtige Richtung zu lenken.
## @-symbol
Der einfachste Weg, expliziten Kontext bereitzustellen, ist das @-Symbol. Das ist super, wenn du genau weißt, welche Datei, welcher Ordner, welche Website oder welches andere Stück Kontext einbezogen werden soll. Je spezifischer du sein kannst, desto besser. Hier ist eine Übersicht, wie du noch gezielter mit Kontext arbeiten kannst:
| Symbol | Example | Use case | Drawback |
| --------- | -------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `@code` | `@LRUCachedFunction` | Du weißt, welche Funktion, Konstante oder welches Symbol für den Output relevant ist | Erfordert viel Wissen über die Codebasis |
| `@file` | `cache.ts` | Du weißt, welche Datei gelesen oder bearbeitet werden soll, aber nicht genau, wo darin | Könnte je nach Dateigröße viel irrelevanten Kontext für die aktuelle Aufgabe enthalten |
| `@folder` | `utils/` | Alles oder der Großteil der Dateien in einem Ordner ist relevant | Könnte viel irrelevanten Kontext für die aktuelle Aufgabe enthalten |
## Regeln
Denk an Regeln wie an ein Langzeitgedächtnis, auf das du oder andere aus deinem Team zugreifen können. Domänenspezifischen Kontext festzuhalten – inklusive Workflows, Formatierung und anderer Konventionen – ist ein super Ausgangspunkt, um Regeln zu schreiben.
Regeln lassen sich auch aus bestehenden Unterhaltungen mit `/Generate Cursor Rules` erstellen. Wenn du eine längere Unterhaltung mit viel Prompting geführt hast, gibt es wahrscheinlich nützliche Vorgaben oder allgemeine Regeln, die du später wiederverwenden willst.
## MCP
[Model Context Protocol](https://modelcontextprotocol.io/introduction) ist eine Erweiterungsebene, mit der du Cursor die Möglichkeit gibst, Aktionen auszuführen und externen Kontext einzubinden.
Je nach deinem Development-Setup willst du vielleicht verschiedene Arten von Servern nutzen; zwei Kategorien, die sich als besonders nützlich erwiesen haben, sind:
* **Interne Dokumentation**: z. B. Notion, Confluence, Google Docs
* **Projektmanagement**: z. B. Linear, Jira
Wenn du bereits Tools hast, um über eine API auf Kontext zuzugreifen und Aktionen auszuführen, kannst du dafür einen MCP-Server bauen. Hier ist eine kurze Anleitung zum Erstellen von [MCP-Servern](https://modelcontextprotocol.io/tutorials/building-mcp-with-llms).
## Selbstständig Kontext sammeln
Ein leistungsfähiges Muster, das viele nutzen, ist, den Agenten kurzfristige Tools schreiben zu lassen, die er dann ausführt, um mehr Kontext zu sammeln. Das ist besonders effektiv in Human-in-the-Loop-Workflows, bei denen du den Code überprüfst, bevor er ausgeführt wird.
Wenn du zum Beispiel Debug-Ausgaben in deinen Code einbaust, ihn ausführst und das Modell die Ausgabe inspizieren lässt, erhält es Zugriff auf dynamischen Kontext, den es statisch nicht ableiten könnte.
In Python kannst du das erreichen, indem du den Agenten dazu aufforderst:
1. Füge print("debugging: ...")-Ausgaben an relevanten Stellen im Code ein
2. Führe den Code oder die Tests im Terminal aus
Der Agent liest die Terminalausgabe und entscheidet, was als Nächstes zu tun ist. Die Kernidee ist, dem Agenten Zugriff auf das tatsächliche Laufzeitverhalten zu geben – nicht nur auf den statischen Code.
# Wichtigste Erkenntnisse
* Kontext ist die Grundlage effektiven AI-Codings und besteht aus Absicht (was du willst) und Zustand (was bereits existiert). Wenn du beides lieferst, kann Cursor präzise Vorhersagen treffen.
* Nutze gezielten Kontext mit @-Symbolen (@code, @file, @folder), um Cursor präzise zu steuern, statt dich nur auf automatische Kontextsammlung zu verlassen.
* Halte wiederverwendbares Wissen in Regeln fest, um es teamweit zu teilen, und erweitere Cursors Fähigkeiten mit dem Model Context Protocol, um externe Systeme anzubinden.
* Zu wenig Kontext führt zu Halluzinationen oder Ineffizienz, während zu viel irrelevanter Kontext das Signal verwässert. Finde das richtige Gleichgewicht für optimale Ergebnisse.
# Inline Edit
Source: https://docs.cursor.com/de/inline-edit/overview
Bearbeite Code und stelle Fragen mit Inline Edit (Cmd/Ctrl+K) in Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Inline Edit lässt dich mit Cmd+K direkt im Editor Code bearbeiten oder Fragen stellen. Dadurch öffnet sich ein Eingabefeld, in dem dein ausgewählter Code zusammen mit deinen Anweisungen deine Anfrage bildet.
## Modi
### Auswahl bearbeiten
Mit ausgewähltem Code bearbeitet Cmd+K genau diesen Code nach deinen Anweisungen.
Ohne Auswahl generiert Cursor neuen Code an der Cursor-Position. Die KI bezieht relevanten umgebenden Code als Kontext ein. Wenn du z. B. eine Funktion auslöst, wird die gesamte Funktion einbezogen.
### Kurze Frage
Drück Opt+Return im Inline-Editor, um Fragen zum ausgewählten Code zu stellen.
Nachdem du eine Antwort bekommen hast, tipp „do it“ oder eine ähnliche Formulierung, um den Vorschlag in Code zu übernehmen. So kannst du Ideen erkunden, bevor du sie umsetzt.
### Gesamte Datei bearbeiten
Für Änderungen an der gesamten Datei drück Cmd+Shift+Return. Dieser Modus ermöglicht umfassende Änderungen bei voller Kontrolle.
### An Chat senden
Für mehrdateiliche Edits oder fortgeschrittene Features drück Cmd+L, um ausgewählten Code an [Chat](/de/agent/modes#agent) zu senden. Das bietet Bearbeitung über mehrere Dateien, detaillierte Erklärungen und erweiterte KI-Funktionen.
## Folgeanweisungen
Nach jeder Bearbeitung kannst du die Ergebnisse weiter verfeinern, indem du zusätzliche Anweisungen hinzufügst und Return drückst. Die KI aktualisiert die Änderungen basierend auf deinem Feedback.
Cursor generiert Commit-Nachrichten aus gestagten Änderungen.
1. Dateien für den Commit stagen
2. Den Git-Tab in der Seitenleiste öffnen
3. Auf das Funkel-Icon (✨) neben dem Commit-Nachrichtenfeld klicken
Die generierten Nachrichten berücksichtigen die gestagten Änderungen und die Git-Historie des Repos. Wenn du Konventionen wie [Conventional Commits](https://www.conventionalcommits.org/) nutzt, folgen die Nachrichten demselben Muster.
### Shortcut hinzufügen
An eine Tastenkombination binden:
1. Zu Keyboard Shortcuts gehen (Cmd+R Cmd+S oder Cmd+Shift+P und nach "Open Keyboard Shortcuts (JSON)" suchen)
2. Dieses Binding für Cmd+M hinzufügen:
```json theme={null}
{
"key": "cmd+m",
"command": "cursor.generateGitCommitMessage"
}
```
3. Speichern
Du kannst die Generierung von Commit-Nachrichten nicht anpassen. Cursor passt sich deinem bestehenden Commit-Stil an.
## Konflikte mit KI lösen
Wenn Merge-Konflikte auftreten, kann der Cursor-Agent helfen, sie zu lösen, indem er beide Seiten des Konflikts versteht und eine Lösung vorschlägt.
### So verwendest du’s
1. Wenn ein Merge-Konflikt auftritt, siehst du die Konfliktmarkierungen in deiner Datei
2. Klick auf den **Resolve in Chat**-Button, der in der Merge-Konflikt-UI erscheint
3. Der Agent analysiert beide Versionen und schlägt eine Lösung vor
4. Schau dir die vorgeschlagenen Änderungen an und übernimm sie
# GitHub
Source: https://docs.cursor.com/de/integrations/github
Offizielle Cursor-GitHub-App für Background Agents
[Background Agents](/de/background-agent) und [Bugbot](/de/bugbot) benötigen die Cursor-GitHub-App, um Repositories zu klonen und Änderungen zu pushen.
## Installation
1. Geh zu [Integrations im Dashboard](https://cursor.com/dashboard?tab=integrations)
2. Klick auf **Connect** neben GitHub
3. Wähl das Repository: entweder **All repositories** oder **Selected repositories**
Um dein GitHub-Konto zu trennen, geh zurück zum Integrations-Dashboard und klick auf **Disconnect Account**.
## Agent in GitHub verwenden
Die GitHub-Integration ermöglicht Hintergrund-Workflows mit dem Agent direkt aus Pull Requests und Issues. Du kannst einen Agent starten, der Kontext liest, Fixes umsetzt und Commits pusht, indem du `@cursor [prompt]` in einem beliebigen PR oder Issue kommentierst.
Wenn du [Bugbot](/de/bugbot) aktiviert hast, kannst du `@cursor fix` kommentieren, damit der Agent den von Bugbot vorgeschlagenen Fix übernimmt und das Problem im Hintergrund angeht.
## Berechtigungen
Die GitHub-App benötigt bestimmte Berechtigungen, um mit Hintergrundagenten zu arbeiten:
| Berechtigung | Zweck |
| ------------------------- | -------------------------------------------------------------- |
| **Repository-Zugriff** | Deinen Code klonen und Arbeitsbranches erstellen |
| **Pull Requests** | PRs mit Änderungen der Agenten zu deiner Überprüfung erstellen |
| **Issues** | Bugs und Tasks verfolgen, die Agenten entdecken oder beheben |
| **Checks und Status** | Über Codequalität und Testergebnisse berichten |
| **Actions und Workflows** | CI/CD-Pipelines und Deployments überwachen |
Alle Berechtigungen folgen dem Prinzip der geringsten erforderlichen Rechte, die für die Funktionalität von Hintergrundagenten nötig sind.
## Konfiguration der IP-Allowlist
Wenn deine Organisation die IP-Allowlist-Funktion von GitHub nutzt, um den Zugriff auf deine Repositories zu beschränken, musst du zuerst den Support kontaktieren, damit die Allowlist-Funktion für dein Team aktiviert wird.
### Support kontaktieren
Bevor du IP-Allowlists konfigurierst, schreib an [hi@cursor.com](mailto:hi@cursor.com), damit dieses Feature für dein Team aktiviert wird. Das ist für beide Konfigurationsmethoden unten erforderlich.
### IP-Allowlist-Konfiguration für installierte GitHub-Apps aktivieren (empfohlen)
Die Cursor-GitHub-App hat die IP-Liste bereits vorkonfiguriert. Du kannst die Allowlist für installierte Apps aktivieren, damit sie diese Liste automatisch übernehmen. Das ist der **empfohlene Ansatz**, weil wir die Liste aktualisieren können und deine Organisation Updates automatisch erhält.
So aktivierst du das:
1. Geh zu den Sicherheitseinstellungen deiner Organisation
2. Navigiere zu den Einstellungen der IP-Allowlist
3. Aktiviere „Allow access by GitHub Apps“
Ausführliche Anweisungen findest du in [GitHubs Dokumentation](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#allowing-access-by-github-apps).
### IPs direkt zu deiner Allowlist hinzufügen
Wenn deine Organisation IdP-definierte Allowlists in GitHub verwendet oder die vorkonfigurierte Allowlist nicht nutzen kann, kannst du die IP-Adressen manuell hinzufügen:
```
184.73.225.134
3.209.66.12
52.44.113.131
```
Die Liste der IP-Adressen kann sich gelegentlich ändern. Teams, die IP-Allowlists verwenden, werden im Voraus benachrichtigt, bevor IP-Adressen hinzugefügt oder entfernt werden.
## Fehlerbehebung
* Installier die GitHub-App mit Repository-Zugriff
* Check die Repository-Berechtigungen für private Repos
* Prüf die Berechtigungen deines GitHub-Kontos
* Gewähr der App Schreibzugriff auf Pull Requests
* Prüf die Branch-Schutzregeln
* Installier neu, wenn die App-Installation abgelaufen ist
* Prüf, ob sie auf Organisationsebene installiert ist
* Installier neu über [github.com/apps/cursor](https://github.com/apps/cursor)
* Kontaktiere den Support, wenn die Installation beschädigt ist
# Linear
Source: https://docs.cursor.com/de/integrations/linear
Mit Background Agents in Linear arbeiten
Nutze [Background Agents](/de/background-agent) direkt in Linear, indem du Issues an Cursor delegierst oder `@Cursor` in Kommentaren erwähnst.
## Leg direkt los
### Installation
Du musst Cursor-Admin sein, um die Linear-Integration zu verbinden. Andere Team-Einstellungen sind auch für Nicht-Admins verfügbar.
1. Geh zu [Cursor-Integrationen](https://www.cursor.com/en/dashboard?tab=integrations)
2. Klick auf *Connect* neben Linear
3. Verbinde deinen Linear-Workspace und wähle ein Team aus
4. Klick auf *Authorize*
5. Schließ die restliche Einrichtung des Background Agents in Cursor ab:
* Verbinde GitHub und wähle das Standard-Repository
* Aktivier nutzungsbasierte Abrechnung
* Bestätige die Datenschutzeinstellungen
### Kontoverknüpfung
Beim ersten Verwenden wird die Kontoverknüpfung zwischen Cursor und Linear angestoßen. Für das Erstellen von PRs ist eine GitHub-Verbindung erforderlich.
## So geht's
Delegier Issues an Cursor oder erwähn `@Cursor` in Kommentaren. Cursor analysiert Issues und filtert automatisch Nicht-Development-Aufgaben heraus.
### Issues delegieren
1. Linear-Issue öffnen
2. Auf das Assignee-Feld klicken
3. „Cursor“ auswählen
### Cursor erwähnen
Erwähn `@Cursor` in einem Kommentar, um einen neuen Agenten zuzuweisen oder zusätzliche Anweisungen zu geben, zum Beispiel: `@Cursor fix the authentication bug described above`.
## Workflow
Background Agents zeigen in Linear den Status in Echtzeit an und erstellen nach Abschluss automatisch PRs. Verfolge den Fortschritt im [Cursor-Dashboard](https://www.cursor.com/dashboard?tab=background-agents).
### Follow-up-Anweisungen
Du kannst in der Agent-Session antworten, dann wird deine Nachricht als Follow-up an den Agent gesendet. Erwähne einfach `@Cursor` in einem Linear-Kommentar, um einem laufenden Background Agent zusätzliche Hinweise zu geben.
## Konfiguration
Konfigurier die Background-Agent-Einstellungen über [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
| Einstellung | Ort | Beschreibung |
| :---------------------- | :--------------- | :------------------------------------------------------------------------- |
| **Standard-Repository** | Cursor-Dashboard | Primäres Repository, wenn kein Projekt-Repository konfiguriert ist |
| **Standardmodell** | Cursor-Dashboard | KI-Modell für Background Agents |
| **Basis-Branch** | Cursor-Dashboard | Branch, von dem PRs erstellt werden (typischerweise `main` oder `develop`) |
### Konfigurationsoptionen
Du kannst das Verhalten des Background Agents auf mehrere Arten konfigurieren:
**Issue-Beschreibung oder Kommentare**: Verwende die `[key=value]`-Syntax, zum Beispiel:
* `@cursor please fix [repo=anysphere/everysphere]`
* `@cursor implement feature [model=claude-3.5-sonnet] [branch=feature-branch]`
**Issue-Labels**: Verwende eine Parent-Child-Label-Struktur, bei der das Parent-Label der Konfigurationsschlüssel und das Child-Label der Wert ist.
**Projekt-Labels**: Gleiche Parent-Child-Struktur wie bei Issue-Labels, angewendet auf Projektebene.
Unterstützte Konfigurationsschlüssel:
* `repo`: Ziel-Repository angeben (z. B. `owner/repository`)
* `branch`: Basis-Branch für die PR-Erstellung angeben
* `model`: Zu verwendetes KI-Modell angeben
### Repository-Auswahl
Cursor legt anhand dieser Priorität fest, in welchem Repository gearbeitet wird:
1. **Issue-Beschreibung/Kommentare**: `[repo=owner/repository]`-Syntax im Issue-Text oder in Kommentaren
2. **Issue-Labels**: Repository-Labels, die dem spezifischen Linear-Issue zugewiesen sind
3. **Projekt-Labels**: Repository-Labels, die dem Linear-Projekt zugewiesen sind
4. **Standard-Repository**: Im Cursor-Dashboard festgelegtes Repository
#### Repository-Labels einrichten
So erstellst du Repository-Labels in Linear:
1. Geh zu **Settings** in deinem Linear-Workspace
2. Klick auf **Labels**
3. Klick auf **New group**
4. Benenn die Gruppe „repo“ (Groß-/Kleinschreibung egal – muss genau „repo“ sein, nicht „Repository“ oder andere Varianten)
5. Erstell innerhalb dieser Gruppe Labels für jedes Repository im Format `owner/repo`
Diese Labels kannst du dann Issues oder Projekten zuweisen, um festzulegen, in welchem Repository der Background Agent arbeiten soll.
{/* ### Getting help
Check [agent activity](https://www.cursor.com/dashboard?tab=background-agents) and include request IDs when contacting support.
## Feedback
Share feedback through Linear comments or your Cursor dashboard support channels. */}
# Slack
Source: https://docs.cursor.com/de/integrations/slack
Mit Background Agents in Slack arbeiten
export const SlackThread = ({messages = []}) => {
const MessageWithMentions = ({text}) => {
const parts = text.split(/(@\w+)/g);
return <>
{parts.map((part, index) => {
if (part.startsWith('@')) {
return
{part}
;
}
return {part};
})}
>;
};
return
;
};
Mit der Cursor-Integration für Slack kannst du [Background Agents](/de/background-agent) nutzen, um direkt in Slack an deinen Aufgaben zu arbeiten, indem du mit einem Prompt erwähnst.
## Einstieg
### Installation
1. Geh zu [Cursor Integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Klick auf *Connect* neben Slack oder geh von hier zur [Installationsseite](https://cursor.com/api/install-slack-app)
3. Du wirst aufgefordert, die Cursor-App für Slack in deinem Workspace zu installieren.
4. Nachdem du die Installation in Slack abgeschlossen hast, wirst du zurück zu Cursor weitergeleitet, um das Setup abzuschließen
1. GitHub verbinden (falls noch nicht verbunden) und ein Standard-Repository auswählen
2. Nutzungsbasierte Abrechnung aktivieren
3. Datenschutzeinstellungen bestätigen
5. Starte mit Background Agents in Slack, indem du erwähnst
## So verwendest du’s
Erwähne und gib deinen Prompt ein. Das deckt die meisten Use-Cases ab, aber du kannst auch die folgenden Befehle verwenden, um deinen Agent anzupassen.
Zum Beispiel kannst du direkt in der Unterhaltung erwähnen oder spezifische Befehle wie verwenden, um ein bestimmtes Repository anzusteuern.
### Commands
Führe aus, um eine aktuelle Befehlsliste zu erhalten.
| Command | Description |
| :---------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- |
| | Startet einen Background Agent. In Threads mit bestehenden Agenten werden Follow-up-Anweisungen hinzugefügt |
| | Standardwerte und das Standard-Repository des Channels konfigurieren |
| | Erweiterte Optionen verwenden: `branch`, `model`, `repo` |
| | Erzwingt das Erstellen eines neuen Agenten in einem Thread |
| | Zeig deine laufenden Agenten |
#### Options
Passe das Verhalten des Background Agent mit diesen Optionen an:
Verwende Optionen auf mehrere Arten:
1. **Bracket-Format**
2. **Inline-Format**
##### Option precedence
Beim Kombinieren von Optionen gilt:
* **Explizite Werte** überschreiben Defaults
* **Spätere Werte** überschreiben frühere bei Duplikaten
* **Inline-Optionen** haben Vorrang vor Defaults im Settings-Modal
Der Bot parst Optionen überall im Text der Nachricht, was natürliches Schreiben von Befehlen ermöglicht.
#### Thread-Kontext verwenden
Background Agents verstehen und nutzen Kontext aus bestehenden Thread-Diskussionen. Nützlich, wenn dein Team ein Issue diskutiert und du willst, dass der Agent die Lösung basierend auf dieser Unterhaltung umsetzt.
Background Agents lesen beim Aufruf den gesamten Thread als Kontext,
verstehen die Diskussion des Teams und setzen darauf basierend Lösungen um.
#### Wann Force-Befehle verwenden
**Wann brauch ich ?**
In Threads mit bestehenden Agenten fügt Follow-up-Anweisungen hinzu (funktioniert nur, wenn der Agent dir gehört). Verwende , um einen separaten Agent zu starten.
**Wann brauch ich `Add follow-up` (über das Kontextmenü)?**
Verwende das Kontextmenü (⋯) bei der Antwort eines Agenten für Follow-up-Anweisungen. Nützlich, wenn mehrere Agenten in einem Thread existieren und du angeben musst, auf welchen du dich beziehst.
### Status-Updates & Handoff
Wenn der Background Agent läuft, bekommst du zuerst die Option, *Open in Cursor* zu öffnen.
Wenn der Background Agent fertig ist, bekommst du eine Benachrichtigung in Slack und kannst den erstellten PR auf GitHub ansehen.
### Agents verwalten
Um alle laufenden Agents zu sehen, führe aus.
Verwalte Background Agents über das Kontextmenü, indem du auf die drei Punkte (⋯) in einer Agent-Nachricht klickst.
Verfügbare Optionen:
* **Add follow-up**: Füge einem bestehenden Agent weitere Anweisungen hinzu
* **Delete**: Stoppe und archiviere den Background Agent
* **View request ID**: Zeige die eindeutige Request-ID zur Problembehebung an (mit angeben, wenn du den Support kontaktierst)
* **Give feedback**: Gib Feedback zur Agent-Performance
## Konfiguration
Verwalte Standard-Einstellungen und Datenschutzoptionen im [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
### Einstellungen
#### Standardmodell
Wird verwendet, wenn kein Modell explizit mit angegeben ist. Siehe [Einstellungen](https://www.cursor.com/dashboard?tab=background-agents) für verfügbare Optionen.
#### Standard-Repository
Wird verwendet, wenn kein Repository angegeben ist. Nutze diese Formate:
* `https://github.com/org/repository`
* `org/repository`
Wenn du ein nicht vorhandenes Repository angibst, wirkt es so, als hättest du
keinen Zugriff. Das zeigt sich in der Fehlermeldung, wenn der Background Agent nicht startet.
#### Basis-Branch
Start-Branch für Background Agent. Leer lassen, um den Standard-Branch des Repositorys zu verwenden (oft `main`)
### Kanaleinstellungen
Konfiguriere Standard-Einstellungen auf Kanalebene mit . Diese Einstellungen gelten pro Team und überschreiben deine persönlichen Standardwerte für diesen Kanal.
Besonders nützlich, wenn:
* Unterschiedliche Kanäle an unterschiedlichen Repositories arbeiten
* Teams konsistente Einstellungen für alle Mitglieder wollen
* Du vermeiden willst, das Repository in jedem Befehl anzugeben
So konfigurierst du Kanaleinstellungen:
1. Führe im gewünschten Kanal aus
2. Setze das Standard-Repository für diesen Kanal
3. Alle Teammitglieder, die Background Agents in diesem Kanal verwenden, nutzen diese Standardwerte
Kanaleinstellungen haben Vorrang vor persönlichen Standardwerten, können aber durch
explizite Optionen wie{" "}
überschrieben werden
### Datenschutz
Background Agents unterstützen den Privacy Mode.
Lies mehr über den [Privacy Mode](https://www.cursor.com/privacy-overview) oder verwalte deine [Datenschutzeinstellungen](https://www.cursor.com/dashboard?tab=background-agents).
Privacy Mode (Legacy) wird nicht unterstützt. Background Agents benötigen während der Ausführung temporären
Codespeicher.
#### Agent-Zusammenfassung anzeigen
Zeige Agent-Zusammenfassungen und Diff-Bilder an. Kann Dateipfade oder Code-Snippets enthalten. Kann ein-/ausgeschaltet werden.
#### Agent-Zusammenfassung in externen Kanälen anzeigen
Für Slack Connect mit anderen Workspaces oder Kanälen mit externen Mitgliedern wie Gästen kannst du festlegen, ob Agent-Zusammenfassungen in externen Kanälen angezeigt werden.
## Berechtigungen
Cursor fordert diese Slack-Berechtigungen an, damit Background Agents in deinem Workspace funktionieren:
| Permission | Description |
| :------------------ | :--------------------------------------------------------------------------------------------------------------- |
| `app_mentions:read` | Erkennt @-Erwähnungen, um Background Agents zu starten und auf Anfragen zu reagieren |
| `channels:history` | Liest frühere Nachrichten in Threads, um beim Hinzufügen von Folgeanweisungen Kontext zu haben |
| `channels:join` | Tritt öffentlichen Channels automatisch bei, wenn eingeladen oder angefordert |
| `channels:read` | Greift auf Channel-Metadaten (IDs und Namen) zu, um Antworten und Updates zu posten |
| `chat:write` | Sendet Status-Updates, Abschlussbenachrichtigungen und PR-Links, sobald Agents fertig sind |
| `files:read` | Lädt geteilte Dateien (Logs, Screenshots, Codebeispiele) für zusätzlichen Kontext herunter |
| `files:write` | Lädt visuelle Zusammenfassungen von Agent-Änderungen für eine schnelle Durchsicht hoch |
| `groups:history` | Liest frühere Nachrichten in privaten Channels, um Kontext in mehrstufigen Gesprächen zu haben |
| `groups:read` | Greift auf Metadaten privater Channels zu, um Antworten zu posten und den Gesprächsfluss aufrechtzuerhalten |
| `im:history` | Greift auf den Verlauf von Direktnachrichten zu, um Kontext in fortgesetzten Gesprächen zu haben |
| `im:read` | Liest DM-Metadaten, um Teilnehmende zu identifizieren und korrektes Threading sicherzustellen |
| `im:write` | Startet Direktnachrichten für private Benachrichtigungen oder individuelle Kommunikation |
| `mpim:history` | Greift auf den Verlauf von Gruppen-DMs zu, um Gespräche mit mehreren Teilnehmenden zu unterstützen |
| `mpim:read` | Liest Gruppen-DM-Metadaten, um Teilnehmende anzusprechen und eine korrekte Zustellung sicherzustellen |
| `reactions:read` | Beobachtet Emoji-Reaktionen als Nutzerfeedback und Statussignale |
| `reactions:write` | Fügt Emoji-Reaktionen hinzu, um den Status zu markieren – ⏳ für läuft, ✅ für abgeschlossen, ❌ für fehlgeschlagen |
| `team:read` | Identifiziert Workspace-Details, um Installationen zu trennen und Einstellungen anzuwenden |
| `users:read` | Ordnet Slack-Nutzer:innen Cursor-Konten zu, um Berechtigungen und sicheren Zugriff zu gewährleisten |
;
};
Cursor unterstützt alle wegweisenden Coding-Modelle aller großen Anbieter.
## Modellpreise
Die Cursor-[Pläne](/de/account/pricing) umfassen Nutzung zu den API-Tarifen der jeweiligen Modelle. Zum Beispiel werden die im Pro-Plan enthaltenen 20 \$ entsprechend deiner Modellauswahl und dem jeweiligen Preis verbraucht.
Deine Nutzungslimits siehst du im Editor basierend auf deinem aktuellen Verbrauch. Alle Modell-API-Preise findest du in der Dokumentation der Anbieter:
* [OpenAI Pricing](https://openai.com/api/pricing/)
* [Anthropic Pricing](https://www.anthropic.com/pricing#api)
* [Google Gemini Pricing](https://ai.google.dev/gemini-api/docs/pricing)
* [xAI Pricing](https://docs.x.ai/docs/models)
## Auto
Wenn Auto aktiviert ist, wählt Cursor abhängig von der aktuellen Auslastung das Premium-Modell, das am besten zur jeweiligen Aufgabe passt und die höchste Zuverlässigkeit bietet. Dieses Feature kann eine nachlassende Ausgabeleistung erkennen und automatisch das Modell wechseln, um sie zu beheben.
## Kontextfenster
Ein [Kontextfenster](/de/guides/working-with-context) ist die maximale Anzahl von Tokens (Text und Code), die ein LLM auf einmal berücksichtigen kann – einschließlich sowohl des Eingabeprompts als auch der vom Modell generierten Ausgabe.
Jeder Chat in Cursor hat sein eigenes Kontextfenster. Je mehr Prompts, angehängte Dateien und Antworten in einer Sitzung enthalten sind, desto größer wird das Kontextfenster.
Erfahre mehr über das [Arbeiten mit Kontext](/de/guides/working-with-context) in Cursor.
## Max Mode
Normalerweise nutzt Cursor ein Kontextfenster von 200k Tokens (\~15.000 Zeilen Code). Max Mode erweitert das Kontextfenster für einige Modelle auf das maximal Verfügbare. Das ist etwas langsamer und teurer. Am relevantesten ist es für Gemini 2.5 Flash, Gemini 2.5 Pro, GPT 4.1 und Grok 4, die Kontextfenster größer als 200k haben.
## FAQ
Modelle werden auf US-amerikanischer Infrastruktur gehostet – entweder vom jeweiligen Anbieter, einem vertrauenswürdigen Partner oder direkt von Cursor.
Wenn der Privacy Mode aktiviert ist, speichern weder Cursor noch die Modellanbieter deine Daten. Alle Daten werden nach jeder Anfrage gelöscht. Details findest du auf unseren Seiten [Privacy](/de/account/privacy), [Privacy Policy](https://cursor.com/privacy) und [Security](https://cursor.com/security).
# API-Schlüssel
Source: https://docs.cursor.com/de/settings/api-keys
Verwende deinen eigenen LLM-Anbieter
Verwende deine eigenen API-Schlüssel, um unbegrenzt AI-Nachrichten auf eigene Kosten zu senden. Wenn eingerichtet, nutzt Cursor deine API-Schlüssel, um LLM-Anbieter direkt aufzurufen.
Um deinen API-Schlüssel zu verwenden, geh zu `Cursor Settings` > `Models` und gib deine API-Schlüssel ein. Klick auf **Verify**. Nach erfolgreicher Prüfung ist dein API-Schlüssel aktiviert.
Eigene API-Schlüssel funktionieren nur mit Standard-Chatmodellen. Features, die spezialisierte Modelle erfordern (z. B. Tab Completion), verwenden weiterhin die integrierten Modelle von Cursor.
## Unterstützte Anbieter
* **OpenAI** - Nur Standard-Chatmodelle ohne Reasoning. Der Model-Picker zeigt die verfügbaren OpenAI-Modelle an.
* **Anthropic** - Alle Claude-Modelle, die über die Anthropic-API verfügbar sind.
* **Google** - Gemini-Modelle, die über die Google AI API verfügbar sind.
* **Azure OpenAI** - In deiner Azure OpenAI Service-Instanz bereitgestellte Modelle.
* **AWS Bedrock** - Verwende AWS Access Keys, Secret Keys oder IAM-Rollen. Funktioniert mit Modellen, die in deiner Bedrock-Konfiguration verfügbar sind.
Nach der Validierung deiner Bedrock-IAM-Rolle wird eine eindeutige externe ID generiert, die du für zusätzliche Sicherheit der Trust-Policy deiner IAM-Rolle hinzufügen kannst.
## FAQ
Dein API-Schlüssel wird nicht gespeichert, aber bei jeder Anfrage an unseren Server gesendet. Alle Anfragen laufen über unser Backend, wo der endgültige Prompt zusammengestellt wird.
# Tab
Source: https://docs.cursor.com/de/tab/overview
Autovervollständigung mit mehrzeiligen Edits, dateiübergreifenden Vorschlägen und kontextsensitiven Code-Vervollständigungen
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Tab ist ein spezialisertes Cursor-Modell für Autovervollständigung. Je mehr du es nutzt, desto besser wird es, weil du deine Absicht vermittelst, indem du Vorschläge mit Tab annimmst oder mit Escape ablehnst. Mit Tab kannst du:
* Mehrere Zeilen auf einmal ändern
* Import-Anweisungen hinzufügen, wenn sie fehlen
* Innerhalb einer Datei und über Dateien hinweg springen, um koordinierte Änderungen vorzunehmen
* Vorschläge auf Basis jüngster Änderungen, Linter-Fehler und angenommener Änderungen erhalten
## Vorschläge
Wenn du Text hinzufügst, erscheinen Vervollständigungen als halbtransparenter Ghost-Text. Beim Ändern von bestehendem Code werden sie als Diff-Popup rechts neben deiner aktuellen Zeile angezeigt.
Nimm Vorschläge mit Tab an, lehne mit Escape ab oder akzeptier sie wortweise mit Cmd+Arrow Right. Tipp weiter oder drück Escape, um Vorschläge auszublenden.
### Im File springen
Tab sagt deine nächste Edit-Position im File voraus und schlägt Sprünge vor. Nachdem du einen Edit akzeptiert hast, drück Tab nochmal, um zur nächsten Stelle zu springen.
### Über Files springen
Tab prognostiziert kontextabhängige Edits über mehrere Files hinweg. Unten erscheint ein Portal-Fenster, wenn ein Cross-File-Sprung vorgeschlagen wird.
### Auto-Import
In TypeScript und Python fügt Tab fehlende Import-Statements automatisch hinzu. Nutzt du eine Methode aus einem anderen File, schlägt Tab den Import vor. Beim Akzeptieren wird er eingefügt, ohne deinen Flow zu stören.
Wenn Auto-Import nicht funktioniert:
* Stell sicher, dass dein Projekt den richtigen Language Server oder die richtigen Extensions hat
* Teste mit Cmd ., um zu prüfen, ob der Import in den *Quick Fix*-Vorschlägen auftaucht
### Tab in Peek
Tab funktioniert in den Peek-Views von *Go to Definition* und *Go to Type Definition*. Praktisch, um Funktionssignaturen zu ändern und Call-Sites zu fixen.
In Vim zusammen mit `gd` nutzen, um zu Definitionen zu springen, Änderungen vorzunehmen und Referenzen in einem Flow aufzulösen.
### Teilweises Akzeptieren
Akzeptier ein Wort nach dem anderen mit Cmd Right oder setz dein Keybinding via `editor.action.inlineSuggest.acceptNextWord`. Aktivieren unter: `Cursor Settings` → `Tab`.
## Einstellungen
| Einstellung | Beschreibung |
| :-------------------------------- | :------------------------------------------------------------------------------------------ |
| **Cursor Tab** | Kontextabhängige, mehrzeilige Vorschläge an deinem Cursor basierend auf jüngsten Änderungen |
| **Teilweise übernehmen** | Übernimm das nächste Wort eines Vorschlags mit Cmd Right |
| **Vorschläge in Kommentaren** | Aktivier Tab innerhalb von Kommentarblöcken |
| **Nur-Whitespace-Vorschläge** | Erlaub Änderungen, die nur das Format betreffen |
| **Imports** | Aktivier Auto-Import für TypeScript |
| **Auto-Import für Python (Beta)** | Aktivier Auto-Import für Python-Projekte |
### Umschalten
Benutz die Statusleiste (unten rechts), um:
* **Snooze**: Deaktivier Tab vorübergehend für eine festgelegte Dauer
* **Global deaktivieren**: Deaktivier Tab für alle Dateien
* **Für Endungen deaktivieren**: Deaktivier Tab für bestimmte Dateiendungen (z. B. Markdown oder JSON)
## FAQ
Deaktiviere Tab in Kommentaren, indem du zu `Cursor Settings` → `Tab Completion` gehst und **Trigger in comments** deaktivierst.
Belege Annehmen und Ablehnen von Vorschlägen mit beliebigen Tasten, indem du `Accept Cursor Tab Suggestions` in den `Keyboard Shortcuts`-Einstellungen verwendest.
Cursor nimmt einen kleinen Teil des relevanten Codes in das Kontextfenster auf. Der Kontext wird verschlüsselt und an unser Backend gesendet. Das Backend entschlüsselt ihn und liest den Kontext sicher. Anschließend sagt das Cursor-Tab-Modell einen Codevorschlag voraus und sendet ihn an den Client zurück, um ihn im Editor anzuzeigen.
# Developers
Source: https://docs.cursor.com/de/tools/developers
Installationslinks für Tools und MCP-Server erzeugen
export const McpInstallLinkGenerator = () => {
const [config, setConfig] = useState("");
const [error, setError] = useState("");
const [showOverlay, setShowOverlay] = useState(null);
const [extractedServerName, setExtractedServerName] = useState("");
const debounceTimerRef = useRef(null);
useEffect(() => {
return () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
};
}, []);
const handleConfigChange = e => {
const configValue = e.target.value;
setConfig(configValue);
setError("");
setExtractedServerName("");
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
if (configValue.trim()) {
debounceTimerRef.current = setTimeout(() => {
validateConfigWithValue(configValue);
}, 500);
}
};
const handleBlur = () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
debounceTimerRef.current = null;
}
if (config.trim()) {
validateConfig();
}
};
const validateConfig = () => {
return validateConfigWithValue(config);
};
const validateConfigWithValue = configValue => {
try {
if (!configValue.trim()) {
setError("");
setExtractedServerName("");
return false;
}
const parsedConfig = JSON.parse(configValue);
if (typeof parsedConfig !== 'object' || parsedConfig === null) {
throw new Error("Config must be a JSON object");
}
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
if (!serverName) {
throw new Error("No server configuration found");
}
const serverConfig = configToUse[serverName];
if (typeof serverConfig !== 'object' || serverConfig === null) {
throw new Error("Server config must be an object");
}
if (!serverConfig.command && !serverConfig.url) {
throw new Error("Server config must have either 'command' or 'url' property");
}
if (serverConfig.command && typeof serverConfig.command !== 'string') {
throw new Error("'command' must be a string");
}
if (serverConfig.url && typeof serverConfig.url !== 'string') {
throw new Error("'url' must be a string");
}
if (serverConfig.args && !Array.isArray(serverConfig.args)) {
throw new Error("'args' must be an array");
}
if (serverConfig.env && (typeof serverConfig.env !== 'object' || serverConfig.env === null)) {
throw new Error("'env' must be an object");
}
setError("");
setExtractedServerName(serverName);
return true;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
setExtractedServerName("");
return false;
}
};
const INSTALL_BUTTON_IMAGE_URL = {
DARK: "https://cursor.com/deeplink/mcp-install-dark.svg",
LIGHT: "https://cursor.com/deeplink/mcp-install-light.svg"
};
const generateDeepLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
const protocol = window.location.hostname === 'localhost' ? 'cursor-dev' : 'cursor';
return `${protocol}://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(safeBase64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const generateWebLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
return `https://cursor.com/en/install-mcp?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(base64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const copyDeepLink = () => {
const link = generateDeepLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('link');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyWebLink = () => {
const link = generateWebLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('weblink');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyHtmlLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const htmlLink = ``;
navigator.clipboard.writeText(htmlLink);
setShowOverlay(theme.toLowerCase());
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyMarkdownLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const markdownLink = `[](${link})`;
navigator.clipboard.writeText(markdownLink);
setShowOverlay(`${theme.toLowerCase()}-md`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyJsxLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const jsxLink = ``;
navigator.clipboard.writeText(jsxLink);
setShowOverlay(`${theme.toLowerCase()}-jsx`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
return
{error &&
{error}
}
{extractedServerName.length > 0 ?
{extractedServerName}
: No server detected}
{showOverlay === 'link' &&
Copied
}
{showOverlay === 'weblink' &&
Copied
}
{showOverlay === 'dark-md' &&
Copied
}
{showOverlay === 'light-md' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark' &&
Copied
}
{showOverlay === 'light' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark-jsx' &&
Copied
}
{showOverlay === 'light-jsx' &&
Copied
}
Click to copy. Paste in JSX components
;
};
# MCP-Server
MCP-Server kannst du per Cursor-Deeplinks installieren. Sie verwenden dasselbe Format wie [`mcp.json`](/de/context/model-context-protocol.mdx) mit einem Namen und einer Transportkonfiguration.
Installationslinks:
```
cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$BASE64_ENCODED_CONFIG
```
1. Namen und JSON-Konfiguration des Servers abrufen
2. Die Konfiguration mit `JSON.stringify` serialisieren und anschließend base64-codieren
3. `$NAME` und `$BASE64_ENCODED_CONFIG` durch den Namen und die codierte Konfiguration ersetzen
Helfer zum Generieren von Links:
## Beispiel
Probier dieses JSON im MCP-Install-Link-Generator aus:
```json Konfiguration eines einzelnen MCP-Servers theme={null}
{
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
```
Ergebnis:
| Format | Beispiel |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Text link | [cursor://anysphere.curs...](cursor://anysphere.cursor-deeplink/mcp/install?name=postgres\&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItcG9zdGdyZXMiLCJwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0L215ZGIiXX0=) |
| Dark button | |
| Light button | |
## Server installieren
1. Klicke auf den Link oder füge ihn in die Adressleiste deines Browsers ein
2. Cursor fordert dich auf, den Server zu installieren
3. Nutze den Server in Cursor
# MCP-Server
Source: https://docs.cursor.com/de/tools/mcp
Entdecke und installiere MCP-Server für Cursor
export const McpInstallButton = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
Erkunde und installiere MCP-Server für Cursor
Entwickler können [einen „Add to Cursor“-Button erstellen](/de/tools/developers#generate-install-link) und einen Link einbinden, den du in deiner Entwicklerdoku verwenden kannst, um die Installation in Cursor zu erleichtern
Notion
All-in-one-Workspace für Notizen, Doks und Projektmanagement.
Figma
Design- und Collaboration-Plattform für Teams.
Lade die neueste Version der Figma-Desktop-App herunter, um den Figma-MCP-Server zu hosten. Schau dir die offizielle Figma-Setup-Anleitung für Installationsschritte an
>}
/>
Linear
Issue-Tracking und Projektmanagement für Developer-Teams.
GitHub
Plattform für Versionskontrolle und kollaborative Entwicklung.
Playwright
End-to-End-Tests im Browser.
Sentry
Fehler-Tracking und Performance-Monitoring.
DuckDB
In-Prozess-SQL-OLAP-Datenbank für lokale Analysen.
Vercel
Projekte und Deployments auf Vercel managen.
GitLab
DevSecOps‑Plattform für Code, CI/CD und Sicherheit.
Atlassian
Tools für Projektmanagement und Zusammenarbeit, darunter Jira und Confluence.
PostHog
Analytics, Fehler-Tracking und Feature Flags.
Stripe
APIs für Zahlungsabwicklung.
PayPal
Payment-APIs.
dbt Labs
dbt CLI, Semantic Layer und Discovery API.
Browserbase
Headless-Browser-Sessions für Agents.
Netlify
Webprojekte erstellen und deployen.
Shopify
Entwicklungstools für Shopify-Apps.
snyk
Schwachstellenscan deiner Codebasis.
Zapier
Workflows zwischen Apps automatisieren.
Heroku
Verwalte Heroku-Apps und Ressourcen.
Hugging Face
Greif auf den Hugging Face Hub und die Gradio MCP-Server zu.
Wix
Wix-Websites erstellen und verwalten.
Semgrep
Code auf Sicherheitslücken prüfen.
Plaid
Greif auf Finanzkontodaten zu.
Mercado Pago
Greif auf die Mercado-Pago-Dokumentation zu.
"}}}} />
LaunchDarkly
Feature Flags als Service.
Context7
Aktualisierte Code-Dokumentation.
AWS-Dokumentation
Greif auf die AWS-Dokumentation zu, such und hol dir Empfehlungen.
Endor Labs
Security-Risiko-Insights für Code.
InstantDB
InstantDB abfragen und verwalten.
Tinybird
APIs für Echtzeit-Analytics.
MongoDB
MongoDB-Daten und Deployments verwalten.
Neon
Verwalte Neon Postgres.
SonarQube
Code mit SonarQube analysieren.
Socket
Abhängigkeiten analysieren und absichern.
Select Star
Datenkatalog, Datenherkunft und Kontext.
Pipedream
Mit APIs und Workflows verbinden.
/"}}} />
Auth0
Auth0-Ressourcen verwalten.
MS Learn Docs
Durchsuche die Microsoft-Dokumentation.
Mercado Libre
Greif auf die Mercado‑Libre-Dokumentation zu.
Honeycomb
Observability-Daten und SLOs abfragen
PagerDuty
Incidents und Alerts verwalten.
Graphite
Erstelle und verwalte gestapelte PRs.
Railway
Apps, Datenbanken und Services deployen.
Postman
API-Zusammenarbeit und Tests.
Das ist eine kuratierte Auswahl von MCP‑Tools für Entwickler von offiziellen Anbietern.
Wenn deine Firma oder dein Tool einen offiziellen MCP‑Server bereitstellt und du ihn
aufgenommen sehen willst, dann{" "}
erstelle auf GitHub einen PR oder ein Issue
{" "}
und wir prüfen die Aufnahme.
# Häufige Probleme
Source: https://docs.cursor.com/de/troubleshooting/common-issues
Lösungen für häufige Probleme und FAQs
Unten findest du häufige Probleme und ihre Lösungen.
### Netzwerkprobleme
Check zuerst deine Netzwerkverbindung. Geh zu `Cursor Settings` > `Network` und klick auf `Run Diagnostics`. Das testet deine Verbindung zu den Cursor‑Servern und hilft, netzwerkbedingte Probleme zu erkennen, die AI‑Features, Updates oder andere Online‑Funktionen beeinträchtigen könnten.
Cursor setzt für AI‑Features auf HTTP/2, weil damit gestreamte Antworten effizient übertragen werden. Wenn dein Netzwerk kein HTTP/2 unterstützt, kann es zu Indexierungsfehlern und Problemen mit AI‑Features kommen.
Das passiert oft in Unternehmensnetzwerken, mit VPNs oder bei Proxys wie Zscaler.
Um das zu beheben, aktiviere das HTTP/1.1‑Fallback in den App‑Einstellungen (nicht in den Cursor‑Einstellungen): Drück `CMD/CTRL + ,`, such nach `HTTP/2` und aktiviere `Disable HTTP/2`. Dadurch wird HTTP/1.1 erzwungen und das Problem behoben.
Wir planen, automatische Erkennung und automatisches Fallback hinzuzufügen.
### Ressourcenprobleme (CPU, RAM, etc.)
Hohe CPU‑ oder RAM‑Auslastung kann deinen Rechner verlangsamen oder Ressourcenwarnungen auslösen.
Große Codebasen benötigen zwar mehr Ressourcen, aber hohe Auslastung kommt meist von Erweiterungen oder fehlerhaften Einstellungen.
Wenn du auf **macOS** eine Warnung für wenig RAM siehst, beachte bitte, dass es bei einigen Nutzer:innen einen Bug gibt, der völlig falsche Werte anzeigen kann. Öffne in diesem Fall den Aktivitätsmonitor und schau im Tab „Memory“ nach, um die korrekte Speicherauslastung zu sehen.
Wenn du hohe CPU‑ oder RAM‑Auslastung feststellst, probier Folgendes:
Erweiterungen können die Performance beeinflussen.
Der Extension Monitor zeigt den Ressourcenverbrauch aller installierten und integrierten Erweiterungen.
Aktiviere den Extension Monitor unter `Settings` > `Application` > `Experimental` und schalte `Extension Monitor: Enabled` ein. Danach wirst du aufgefordert, Cursor neu zu starten.
Öffnen: `Cmd/Ctrl + Shift + P` → `Developer: Open Extension Monitor`.
Cursor führt deine Erweiterungen in einem oder mehreren **Extension Hosts** aus. Meist laufen die meisten deiner Erweiterungen im selben Extension Host – eine Erweiterung mit hohem CPU‑Verbrauch kann dadurch ihre Nachbarerweiterungen ausbremsen!
Der Extension Monitor zeigt:
* Jeden langlebigen Prozess, der von einer Erweiterung gestartet wurde (nur macOS und Linux).
* **% Ext Host**: Den Prozentsatz der gesamten Extension‑Host‑Zeit, den diese Erweiterung verbraucht. Hilft zu erkennen, welche Erweiterungen relativ am meisten Zeit nutzen.
* **Max Blocking**: Den längsten ununterbrochenen Ausführungsblock einer Erweiterung pro Monitoring‑Intervall.
* **% CPU**:
* Für Erweiterungen: Den Prozentsatz der gesamten CPU‑Nutzung, der dem Code der Erweiterung zugerechnet wird.
* Für Prozesse: Den Prozentsatz der gesamten CPU‑Nutzung, der dem gestarteten Prozess zugerechnet wird (nur macOS und Linux).
* **Memory**:
* Für Erweiterungen: Die Menge an JS‑Heap‑Speicher, die vom Code der Erweiterung genutzt wird (externe Allokationen nicht enthalten).
* Für Prozesse: Die Menge an Systemspeicher, die vom gestarteten Prozess genutzt wird (nur macOS und Linux).
Du kannst auch testen, indem du `cursor --disable-extensions` in der Kommandozeile ausführst. Wenn sich die Performance verbessert, aktiviere Erweiterungen nacheinander wieder, um die problematischen zu finden.
Probier Extension Bisect, um problematische Erweiterungen zu identifizieren. Mehr dazu [hier](https://code.visualstudio.com/blogs/2021/02/16/extension-bisect#_welcome-extension-bisect). Hinweis: Das funktioniert am besten bei sofort auftretenden Problemen, nicht bei schleichender Performance‑Verschlechterung.
Der Process Explorer zeigt, welche Prozesse Ressourcen verbrauchen.
Öffnen: Command Palette (`Cmd/Ctrl + Shift + P`) → `Developer: Open Process Explorer`.
Check die Prozesse unter:
* **`extensionHost`**: Erweiterungsbezogene Probleme
* **`ptyHost`**: Ressourcenverbrauch des Terminals
Der Process Explorer zeigt jedes Terminal und seine laufenden Befehle zur Diagnose an.
Für andere Prozesse mit hoher Auslastung melde dich im [Forum](https://forum.cursor.com/).
Nutze die Monitoring‑Tools deines Betriebssystems, um festzustellen, ob das Problem Cursor‑spezifisch oder systemweit ist.
Wenn Probleme weiterhin bestehen, teste eine minimale Cursor‑Installation.
## Allgemeine FAQs
Neue Updates werden in Wellen ausgerollt – zufällig ausgewählte Nutzer bekommen sie zuerst. Dein Update sollte in ein paar Tagen kommen.
Nutze `Sign Out of GitHub` in der Befehlspalette `Ctrl/⌘ + Shift + P`.
GitHub Codespaces wird noch nicht unterstützt.
SSH zu Mac- oder Windows-Maschinen wird nicht unterstützt. Für andere Probleme poste mit Logs im [Forum](https://forum.cursor.com/).
Wenn du „SSH is only supported in Microsoft versions of VS Code“ siehst:
1. Remote-SSH deinstallieren:
* Erweiterungen-Ansicht öffnen (`Ctrl + Shift + X`)
* Nach „Remote-SSH“ suchen
* Zahnrad-Symbol klicken → „Uninstall“
2. Anysphere Remote SSH installieren:
* Cursor-Marktplatz öffnen
* Nach „SSH“ suchen
* Die Anysphere Remote SSH-Erweiterung installieren
3. Nach der Installation:
* Alle VS Code-Instanzen mit aktiven SSH-Verbindungen schließen
* Cursor neu starten
* Erneut per SSH verbinden
Prüfe, ob deine SSH-Konfiguration und -Keys korrekt eingerichtet sind.
Cursor Tab und Inline Edit verwenden HTTP/2 für geringere Latenz und Ressourcennutzung. Einige Unternehmens-Proxys (z. B. Zscaler) blockieren HTTP/2. Beheb das, indem du `"cursor.general.disableHttp2": true` in den Einstellungen setzt (`Cmd/Ctrl + ,`, nach `http2` suchen).
Melde dich in den Cursor-Einstellungen ab und wieder an.
Pro-Abonnenten: Klicke im [Dashboard](https://cursor.com/dashboard) auf `Manage Subscription`, um dein Verlängerungsdatum zu sehen.
Free-User: Check das Datum deiner ersten Cursor-E-Mail. Die Nutzung wird monatlich ab diesem Datum zurückgesetzt.
Wenig Speicherplatz kann dazu führen, dass Cursor während Updates historische Daten löscht. Um das zu verhindern:
1. Vor dem Update genug freien Speicherplatz sicherstellen
2. Regelmäßig unnötige Systemdateien bereinigen
3. Wichtige Unterhaltungen vor dem Update sichern
Folge [dieser Anleitung](https://code.visualstudio.com/docs/setup/uninstall). Ersetze „VS Code“ oder „Code“ durch „Cursor“ und „.vscode“ durch „.cursor“.
Klicke im [Dashboard](https://cursor.com/dashboard) auf `Delete Account`. Dadurch werden dein Konto und alle zugehörigen Daten dauerhaft gelöscht.
Führe `cursor` in deinem Terminal aus. Falls der Befehl fehlt:
1. Befehlspalette öffnen `⌘⇧P`
2. `install command` eingeben
3. `Install 'cursor' command` auswählen (optional den `code`-Befehl installieren, um den von VS Code zu überschreiben)
Wenn ein Klick auf Sign In zu cursor.com weiterleitet, dich aber nicht anmeldet, deaktivier deine Firewall oder Antiviren-Software – die könnte den Anmeldeprozess blockieren.
Aufgrund der jüngsten Zunahme von Missbrauch könnte deine Anfrage aus Sicherheitsgründen blockiert worden sein. So löst du das:
Check zuerst dein VPN. Wenn du eins nutzt, probier es auszuschalten, da VPNs manchmal unsere Sicherheitssysteme triggern.
Wenn das nicht hilft, kannst du Folgendes probieren:
* Einen neuen Chat erstellen
* Kurz warten und später erneut versuchen
* Ein neues Konto mit Google- oder GitHub-Authentifizierung erstellen
* Auf Cursor Pro upgraden
# Eine Request-ID abrufen
Source: https://docs.cursor.com/de/troubleshooting/request-reporting
Request-IDs für den technischen Support finden
Wenn das Cursor-Team ein technisches Problem untersucht, bitten wir dich möglicherweise um eine „Request-ID“.
## Was ist eine Request-ID?
Eine Request-ID dient zur eindeutigen Identifizierung jeder Anfrage an Cursor in unseren internen Systemen.
Formatbeispiel: `8f2a5b91-4d3e-47c6-9f12-5e8d94ca7d23`
## Wie finde ich eine Request-ID?
Request-IDs sind eingeschränkt, wenn der Privacy Mode aktiviert ist. Deaktiviere den Privacy Mode, wenn du Probleme meldest.
Hinweis: Bei Nutzer:innen des Business-Plans ist der Privacy Mode standardmäßig vom Admin der Organisation aktiviert.
### Deine aktuelle Request-ID abrufen
So meldest du ein Problem in deinem aktuellen oder jüngsten Chat:
Öffne die Unterhaltung in der Chat-Sidebar, öffne das Kontextmenü (oben rechts) und wähle `Copy Request ID`.
Schick uns die kopierte Request-ID wie angefordert über das Forum oder per E-Mail.
### Eine Request-ID aus einer früheren Aktion abrufen
Ruf frühere Request-IDs mit dem Befehl `Report AI Action` ab:
1. Öffne die Command Palette `⌘⇧P`
2. Tippe `Report AI Action`
3. Wähle die Option `Report AI Action` aus
Dadurch werden deine letzten AI-Aktionen in Chat, CMD+K und Apply angezeigt.
Wähle die Aktion anhand von Zeitpunkt und Feature aus. Kopiere die Request-ID und schick sie uns.
# Leitfaden zur Fehlerbehebung
Source: https://docs.cursor.com/de/troubleshooting/troubleshooting-guide
Schritte zur Behebung von Problemen und zum Melden von Bugs
Probleme mit Cursor können durch Extensions, App-Daten oder Systemprobleme verursacht werden. Probier diese Schritte zur Fehlerbehebung aus.
Schritte, um ein Problem an das Cursor-Team zu melden
## Fehlerbehebung
Check zuerst, ob Cursor seine Dienste erreichen kann.
**Netzwerkdiagnose ausführen:** Geh zu `Cursor Settings` > `Network` und klick auf `Run Diagnostics`. Das testet deine Verbindung zu den Cursor-Servern und erkennt Netzwerkprobleme, die KI-Features, Updates oder andere Online-Funktionen beeinträchtigen.
Wenn die Diagnose Verbindungsprobleme anzeigt, check Firewall-Einstellungen, Proxy-Konfiguration oder Netzwerkeinschränkungen, die den Zugriff von Cursor blockieren.
Bei Problemen mit Erweiterungen:
**Alle Erweiterungen temporär deaktivieren:** Führ `cursor --disable-extensions` in der Kommandozeile aus. Wenn die Probleme weg sind, aktiviere die Erweiterungen nacheinander wieder, um die fehlerhafte zu finden.
**Erweiterungsdaten zurücksetzen:** Deinstallier und installier problematische Erweiterungen neu, um ihre gespeicherten Daten zurückzusetzen. Check die Einstellungen auf Erweiterungskonfigurationen, die nach der Neuinstallation bestehen bleiben.
Dadurch werden deine App-Daten gelöscht, einschließlich Erweiterungen, Themes, Snippets und installationsbezogener Daten. Exportier zuerst dein Profil, um diese Daten zu sichern.
Cursor speichert App-Daten außerhalb der App, damit sie über Updates und Neuinstallationen hinweg wiederhergestellt werden können.
So löschst du App-Daten:
**Windows:** Führ diese Befehle in der Eingabeaufforderung aus:
```txt theme={null}
rd /s /q "%USERPROFILE%\AppData\Local\Programs\Cursor"
rd /s /q "%USERPROFILE%\AppData\Local\Cursor"
rd /s /q "%USERPROFILE%\AppData\Roaming\Cursor"
del /f /q "%USERPROFILE%\.cursor*"
rd /s /q "%USERPROFILE%\.cursor"
```
**macOS:** Führ `sudo rm -rf ~/Library/Application\ Support/Cursor` und `rm -f ~/.cursor.json` im Terminal aus.
**Linux:** Führ `rm -rf ~/.cursor ~/.config/Cursor/` im Terminal aus.
So deinstallierst du Cursor:
Such im Startmenü nach „Add or Remove Programs“, finde „Cursor“, klick auf „Uninstall“.
Öffne den Programme-Ordner, klick mit Rechts auf „Cursor“, wähl „Move to Trash“.
**Für .deb-Pakete:** `sudo apt remove cursor`
**Für .rpm-Pakete:** `sudo dnf remove cursor` oder `sudo yum remove cursor`
**Für AppImage:** Lösch die Datei Cursor.appimage an ihrem Speicherort.
Installier neu über die [Download-Seite](https://www.cursor.com/downloads). Wenn du die App-Daten nicht gelöscht hast, stellt Cursor den vorherigen Zustand wieder her. Andernfalls bekommst du eine frische Installation.
## Ein Problem melden
Wenn diese Schritte nicht helfen, melde dich im [Forum](https://forum.cursor.com/).
Melde einen Bug oder ein Problem im Cursor-Forum
Für eine schnelle Lösung gib Folgendes an:
Mach einen Screenshot und schwärze sensible Informationen.
Dokumentiere die genauen Schritte, um das Problem zu reproduzieren.
Hol dir die Systeminfos von:
`Cursor` > `Help` > `About`
Klicke, um unseren Guide zum Sammeln von Request-IDs zu öffnen
Öffne die Entwicklerkonsole:
`Developer: Toggle Developer Tools`
Öffne die Logs:
`Developer: Open Logs Folder`
# Willkommen
Source: https://docs.cursor.com/de/welcome
Erfahre mehr über Cursor und wie du loslegst
Cursor ist ein KI-gestützter Code-Editor, der deine Codebase versteht und dir mit natürlicher Sprache hilft, schneller zu coden. Beschreib einfach, was du bauen oder ändern willst, und Cursor generiert den Code für dich.
Lade Cursor herunter, installier es und leg in wenigen Minuten los
Bleib über die neuesten Features und Verbesserungen auf dem Laufenden
Nutze Cursor in deinem Terminal
Versteh die Kernkonzepte und Features, die Cursor antreiben
Entdecke verfügbare KI-Modelle und wie du das richtige auswählst
Lern Best Practices und Workflows für verschiedene Use Cases
Hol dir Cursor für deinen Computer
Für technische Fragen und zum Erfahrungsaustausch, besuch unser Forum
Bei Konto- und Abrechnungsfragen schreib unserem Support-Team eine E‑Mail
# Agent Security
Source: https://docs.cursor.com/en/account/agent-security
Security considerations for using Cursor Agent
Prompt injection, AI hallucinations, and other issues may cause AI to behave in unexpected and potentially malicious ways. While we continue to work on solving prompt injection at a more foundational level, our primary protection in Cursor products are guardrails around what an agent can do, including requiring manual approval for sensitive actions by default. The goal of this document is to explain our guardrails and what users can expect from them.
All of the controls and behavior below are our default and recommended settings.
## First-party tool calls
Cursor comes bundled with tools that enable the agent to help our users write code. These include file read, edits, calling terminal commands, searching the web for documentation, and others.
Read tools do not require approval (ie reading files, searching across code). Users may use [.cursorignore](/en/context/ignore-files) to block the agent from accessing specific files at all, but otherwise reads are generally permitted without approval. For actions that carry risk of exfiltrating sensitive data, we require explicit approval.
Modifying files within the current workspace does not require explicit approval with some exceptions. When an agent makes changes to files they are immediately saved to disk. We recommend that Cursor be run in version controlled workspaces, so that the contents of the files can be reverted at any time. We require explicit approval before changing files that modify the configuration of our IDE/CLI, such as the workspace settings file of the editor. However, users automatically reloading on file change should be aware that agent changes to files may trigger automatic execution before they have had a chance to review the changes.
Any terminal command suggested by Agents requires approval by default. We recommend that users review every command before the agent executes it. Users who accept the risk may choose to enable the agent to run all commands without approval. We include an [allowlist](/en/agent/tools) feature in Cursor, but do not consider it to be a security control. Some users choose to allow specific commands, but this is a best effort system and bypasses may be possible. We do not recommend "Run Everything", which bypasses any configured allowlists.
## Third-party tool calls
Cursor enables connecting external tools via [MCP](/en/context/mcp). All third party MCP connections must be explicitly approved by the user. Once a user approves an MCP, by default each tool call suggested in Agent Mode for every external MCP integration must be explicitly approved prior to execution.
## Network requests
Network requests may be used by an attacker to exfiltrate data. We presently do not support any first-party tools making network requests outside of a very select set of hosts (ie Github), explicit link retrieval, and to support web search with a select set of providers. Arbitrary agent network requests are prevented with default settings.
## Workspace trust
The Cursor IDE supports the standard [workspace trust](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust) feature that is *disabled* by default. Workspace trust presents users with a prompt when they open a new workspace to choose normal or restricted mode. Restricted mode breaks AI and other features our users typically use Cursor for. We recommend other tools, such as a basic text editor for working with repos that you do not trust.
Workspace trust may be enabled in a users' settings by performing these steps:
1. Open your user settings.json file
2. Add the following configuration:
```json theme={null}
"security.workspace.trust.enabled": true
```
This setting can also be enforced organization-wide through Mobile Device Management (MDM) solutions.
## Responsible disclosure
If you believe you have found a vulnerability in Cursor, please follow the guide on our GitHub Security page and submit the report there. If you're unable to use GitHub, you may also reach us at [security@cursor.com](mailto:security@cursor.com).
We commit to acknowledging vulnerability reports within 5 business days, and addressing them as soon as we are able to. We will publish the results in the form of security advisories on our GitHub security page. Critical incidents will be communicated both on the GitHub security page and via email to all users.
# Billing
Source: https://docs.cursor.com/en/account/billing
Managing Cursor subscriptions, refunds, and invoices
### How do I access billing settings?
Access the billing portal through the [Dashboard](https://cursor.com/dashboard) by clicking "Billing" in your Dashboard. This opens a secure portal for all billing tasks.
### What are Cursor's billing cycles?
Billing cycles run monthly or annually, starting on your subscription date. Teams accounts are charged per seat with pro-rated billing for new members.
### How do seats work for Teams accounts?
Teams accounts charge per seat (one per Team member). When adding members mid-cycle, you're only charged for their remaining time. If a member has used any credits and is removed, their seat remains occupied until the end of the billing cycle - no pro-rated refunds are given. Team admins can manage seats through the dashboard.
### Can I switch between monthly and annual billing?
Yes! Here's how:
**Pro plan**
1. Go to the Cursor [dashboard](https://cursor.com/dashboard)
2. Click "Billing and Invoices" from the left sidebar to reach the billing page
3. Click "Manage subscription"
4. Click "Update subscription"
5. Select "Yearly" or "Monthly", then click "Continue"
**Teams plan**
1. Go to the Cursor [dashboard](https://cursor.com/dashboard)
2. Click "Billing and Invoices" from the left sidebar to reach the billing page
3. Click the "Upgrade Now" button to switch to yearly billing
You can only switch from monthly to yearly billing self-serve. To switch from yearly to monthly, contact us at
[hi@cursor.com](mailto:hi@cursor.com).
### Where can I find my invoices?
Find all billing history in the billing portal. View and download current and past invoices.
### Can I get invoices automatically emailed to me?
Invoices must be downloaded manually from the billing portal. We're developing automatic invoice emails. You'll be able to opt-in once available.
### How do I update my billing information?
Update payment method, company name, address, and tax information through the billing portal. We use Stripe for secure transactions. Changes only affect future invoices, we cannot modify historical invoices.
### How do I cancel my subscription?
Cancel your subscription through the Billing and Invoices page by clicking "Manage Subscription" the "Cancel subscription" button. Access continues until the end of your current billing period.
### I'm having other billing issues. How can I get help?
For billing questions not covered here, email [hi@cursor.com](mailto:hi@cursor.com) from the email linked to your account. Please include your account details and concerns.
# Pricing
Source: https://docs.cursor.com/en/account/pricing
Cursor's plans and their pricing
You can try Cursor for free or purchase an individual or team plan.
## Individual
All individual plans include:
* Unlimited tab completions
* Extended agent usage limits on all models
* Access to Bugbot
* Access to Background Agents
Each plan includes usage charged at model inference [API prices](/en/models#model-pricing):
* Pro includes \$20 of API agent usage + additional bonus usage
* Pro Plus includes \$70 of API agent usage + additional bonus usage
* Ultra includes \$400 of API agent usage + additional bonus usage
We work hard to grant additional bonus capacity beyond the guaranteed included usage. Since different models have different API costs, your model selection affects token output and how quickly your included usage is consumed. You can view usage and token breakdowns on [your dashboard](https://cursor.com/dashboard?tab=usage). Limit notifications are routinely shown in the editor.
### How much usage do I need?
Based on our usage data, you can expect the following usage levels:
* **Daily Tab users**: Always stay within \$20
* **Limited Agent users**: Often stay within the included \$20
* **Daily Agent users**: Typically \$60–\$100/mo total usage
* **Power users (multiple agents/automation)**: Often \$200+/mo total usage
Based on our usage data, limits are roughly equivalent to the following for a *median user*:
* Pro: \~225 Sonnet 4 requests, \~550 Gemini requests, or \~500 GPT 5 requests
* Pro+: \~675 Sonnet 4 requests, \~1,650 Gemini requests, or \~1,500 GPT 5 requests
* Ultra: \~4,500 Sonnet 4 requests, \~11,000 Gemini requests, or \~10,000 GPT 5 requests
### What happens when I reach my limit?
When you exceed your included monthly usage, you'll be notified in the editor and can choose to:
* **Add on-demand usage**: Continue using Cursor at the same API rates with pay-as-you-go billing
* **Upgrade your plan**: Move to a higher tier for more included usage
On-demand usage is billed monthly at the same rates as your included usage. Requests are never downgraded in quality or speed.
## Teams
There are two teams plans: Teams (\$40/user/mo) and Enterprise (Custom).
Team plans provide additional features like:
* Privacy Mode enforcement
* Admin Dashboard with usage stats
* Centralized team billing
* SAML/OIDC SSO
We recommend Teams for any customer that is happy self-serving. We recommend [Enterprise](/en/contact-sales) for customers that need priority support, pooled usage, invoicing, SCIM, or advanced security controls.
Learn more about [Teams pricing](/en/account/teams/pricing).
## Auto
Enabling Auto allows Cursor to select the premium model best fit for the immediate task and with the highest reliability based on current demand. This feature can detect degraded output performance and automatically switch models to resolve it.
We've heavily invested in the quality and overall performance of Auto. Starting at your next billing renewal after September 15, Auto consumes usage at the following API rates.
* **Input + Cache Write**: \$1.25 per 1M tokens
* **Output**: \$6.00 per 1M tokens
* **Cache Read**: \$0.25 per 1M tokens
Both the editor and dashboard will show your usage, which includes Auto. If you prefer to select a model directly, usage is incurred at that model's list API price.
## Max Mode
Certain models have the ability to use [Max Mode](/en/models#max-mode), which allows for longer reasoning and larger context windows up to 1M tokens. While the majority of coding tasks do not need to use Max Mode, it can be helpful for more complex queries, especially with large files or codebases. Using Max Mode will consume more usage. You can view all requests and token breakdowns on [your dashboard](https://cursor.com/dashboard?tab=usage).
## Bugbot
Bugbot is a separate product from Cursor subscriptions and has its own pricing plan.
* **Pro** (\$40/mo): Unlimited reviews on up to 200 PRs/month, unlimited access to Cursor Ask, integration with Cursor to fix bugs, and access to Bugbot Rules
* **Teams** (\$40/user/mo): Unlimited code reviews across all PRs, unlimited access to Cursor Ask, pooled usage across your team, and advanced rules and settings
* **Enterprise** (Custom): Everything in Teams plus advanced analytics and reporting, priority support, and account management
Learn more about [Bugbot pricing](https://cursor.com/bugbot#pricing).
## Background Agent
Background Agents are charged at API pricing for the selected [model](/en/models). You'll be asked to set a spend limit for Background Agents when you first start using them.
Virtual Machine (VM) compute for background agents will be priced in the future.
# Admin API
Source: https://docs.cursor.com/en/account/teams/admin-api
Access team metrics, usage data, and spending information via API
The Admin API lets you programmatically access your team's data, including member information, usage metrics, and spending details. Build custom dashboards, monitoring tools, or integrate with existing workflows.
The API is in its first release. We're expanding capabilities based on feedback - let us know what endpoints you need!
## Authentication
All API requests require authentication using an API key. Only team administrators can create and manage API keys.
API keys are tied to the organization, viewable by all admins, and are unaffected by the original creator's account status.
### Creating an API Key
1. Navigate to **cursor.com/dashboard** → **Settings** tab → **Cursor Admin API Keys**
2. Click **Create New API Key**
3. Give your key a descriptive name (e.g., "Usage Dashboard Integration")
4. Copy the generated key immediately - you won't see it again
Format: `key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
### Using Your API Key
Use your API key as the username in basic authentication:
**Using curl with basic auth:**
```bash theme={null}
curl https://api.cursor.com/{route} -u API_KEY:
```
**Or set the Authorization header directly:**
```bash theme={null}
Authorization: Basic {base64_encode('API_KEY:')}
```
## Base URL
All API endpoints use:
```
https://api.cursor.com
```
## Endpoints
### Get Team Members
Retrieve all team members and their details.
```
GET /teams/members
```
#### Response
Returns an array of team member objects:
```typescript theme={null}
{
teamMembers: {
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
}[];
}
```
#### Example Response
```json theme={null}
{
"teamMembers": [
{
"name": "Alex",
"email": "developer@company.com",
"role": "member"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "owner"
}
]
}
```
#### Example Request
```bash theme={null}
curl -X GET https://api.cursor.com/teams/members \
-u YOUR_API_KEY:
```
### Get Daily Usage Data
Retrieve detailed daily usage metrics for your team within a date range. Provides insights into code edits, AI assistance usage, and acceptance rates.
```
POST /teams/daily-usage-data
```
#### Request Body
| Parameter | Type | Required | Description |
| :---------- | :----- | :------- | :------------------------------- |
| `startDate` | number | Yes | Start date in epoch milliseconds |
| `endDate` | number | Yes | End date in epoch milliseconds |
| Field | Description |
| :------------------------- | :-------------------------------------------- |
| `spendCents` | Total spend in cents |
| `fastPremiumRequests` | Fast premium model requests |
| `name` | Member's name |
| `email` | Member's email |
| `role` | Team role |
| `hardLimitOverrideDollars` | Custom spending limit override |
| `subscriptionCycleStart` | Subscription cycle start (epoch milliseconds) |
| `totalMembers` | Total team members |
| `totalPages` | Total pages |
#### Example Response
```json theme={null}
{
"teamMemberSpend": [
{
"spendCents": 2450,
"fastPremiumRequests": 1250,
"name": "Alex",
"email": "developer@company.com",
"role": "member",
"hardLimitOverrideDollars": 100
},
{
"spendCents": 1875,
"fastPremiumRequests": 980,
"name": "Sam",
"email": "admin@company.com",
"role": "owner",
"hardLimitOverrideDollars": 0
},
],
"subscriptionCycleStart": 1708992000000,
"totalMembers": 15,
"totalPages": 1
}
```
#### Example Requests
**Basic spending data:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Search specific user with pagination:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"searchTerm": "alex@company.com",
"page": 2,
"pageSize": 25
}'
```
### Get Usage Events Data
Retrieve detailed usage events for your team with comprehensive filtering, search, and pagination options. This endpoint provides granular insights into individual API calls, model usage, token consumption, and costs.
```
POST /teams/filtered-usage-events
```
#### Request Body
| Parameter | Type | Required | Description |
| :---------- | :----- | :------- | :---------------------------------------- |
| `startDate` | number | No | Start date in epoch milliseconds |
| `endDate` | number | No | End date in epoch milliseconds |
| `userId` | number | No | Filter by specific user ID |
| `page` | number | No | Page number (1-indexed). Default: `1` |
| `pageSize` | number | No | Number of results per page. Default: `10` |
| `email` | string | No | Filter by user email address |
| Field | Description |
| :---------------------- | :------------------------------------------------------------------- |
| `totalUsageEventsCount` | Total number of usage events matching the query |
| `pagination` | Pagination metadata for navigating results |
| `timestamp` | Event timestamp in epoch milliseconds |
| `model` | AI model used for the request |
| `kind` | Usage category (e.g., "Usage-based", "Included in Business") |
| `maxMode` | Whether max mode was enabled |
| `requestsCosts` | Cost in request units |
| `isTokenBasedCall` | True when the event is charged as a usage-based event |
| `tokenUsage` | Detailed token consumption (available when isTokenBasedCall is true) |
| `isFreeBugbot` | Whether this was a free bugbot usage |
| `userEmail` | Email of the user who made the request |
| `period` | Date range of the queried data |
#### Example Response
```json theme={null}
{
"totalUsageEventsCount": 113,
"pagination": {
"numPages": 12,
"currentPage": 1,
"pageSize": 10,
"hasNextPage": true,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"model": "claude-4-opus",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 5,
"isTokenBasedCall": true,
"tokenUsage": {
"inputTokens": 126,
"outputTokens": 450,
"cacheWriteTokens": 6112,
"cacheReadTokens": 11964,
"totalCents": 20.18232
},
"isFreeBugbot": false,
"userEmail": "developer@company.com"
},
{
"timestamp": "1750979173824",
"model": "claude-4-opus",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 10,
"isTokenBasedCall": true,
"tokenUsage": {
"inputTokens": 5805,
"outputTokens": 311,
"cacheWriteTokens": 11964,
"cacheReadTokens": 0,
"totalCents": 40.16699999999999
},
"isFreeBugbot": false,
"userEmail": "developer@company.com"
},
{
"timestamp": "1750978339901",
"model": "claude-4-sonnet-thinking",
"kind": "Included in Business",
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isFreeBugbot": false,
"userEmail": "admin@company.com"
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
```
#### Example Requests
**Get all usage events with default pagination:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Filter by date range and specific user:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
```
**Get usage events for a specific user with custom pagination:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": 12345,
"page": 2,
"pageSize": 50
}'
```
### Set User Spend Limit
Set spending limits for individual team members. This allows you to control how much each user can spend on AI usage within your team.
```
POST /teams/user-spend-limit
```
**Rate limiting:** 60 requests per minute per team
#### Request Body
| Parameter | Type | Required | Description |
| :------------------ | :----- | :------- | :----------------------------------------------------- |
| `userEmail` | string | Yes | Email address of the team member |
| `spendLimitDollars` | number | Yes | Spending limit in dollars (integer only, no decimals). |
* The user must already be a member of your team
* Only integer values are accepted (no decimal amounts)
* Setting `spendLimitDollars` to 0 will set the limit to \$0
#### Response
Returns a standardized response indicating success or failure:
```typescript theme={null}
{
outcome: 'success' | 'error';
message: string;
}
```
#### Example Responses
**Successfully set a limit:**
```json theme={null}
{
"outcome": "success",
"message": "Spend limit set to $100 for user developer@company.com"
}
```
**Error response:**
```json theme={null}
{
"outcome": "error",
"message": "Invalid email format"
}
```
#### Example Requests
**Set a spending limit:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/user-spend-limit \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userEmail": "developer@company.com",
"spendLimitDollars": 100
}'
```
### Repo Blocklists API
Add repositories and use patterns to prevent files or directories from being indexed or used as context for your team.
#### Get Team Repo Blocklists
Retrieve all repository blocklists configured for your team.
```
GET /settings/repo-blocklists/repos
```
##### Response
Returns an array of repository blocklist objects:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
##### Example Response
```json theme={null}
{
"repos": [
{
"id": "repo_123",
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"id": "repo_456",
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}
```
##### Example Request
```bash theme={null}
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u YOUR_API_KEY:
```
#### Upsert Repo Blocklists
Replace existing repository blocklists for the provided repos.
*Note: This endpoint will only overwrite the patterns for the repositories provided. All other repos will be unaffected.*
```
POST /settings/repo-blocklists/repos/upsert
```
##### Request Body
| Parameter | Type | Required | Description |
| --------- | ----- | -------- | ------------------------------------- |
| repos | array | Yes | Array of repository blocklist objects |
Each repository object must contain:
| Field | Type | Required | Description |
| -------- | --------- | -------- | --------------------------------------------------------- |
| url | string | Yes | Repository URL to blocklist |
| patterns | string\[] | Yes | Array of file patterns to block (glob patterns supported) |
##### Response
Returns the updated list of repository blocklists:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
##### Example Request
```bash theme={null}
curl -X POST https://api.cursor.com/settings/repo-blocklists/repos/upsert \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"repos": [
{
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}'
```
#### Delete Repo Blocklist
Remove a specific repository from the blocklist.
```
DELETE /settings/repo-blocklists/repos/:repoId
```
##### Parameters
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ---------------------------------------- |
| repoId | string | Yes | ID of the repository blocklist to delete |
##### Response
Returns 204 No Content on successful deletion.
##### Example Request
```bash theme={null}
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u YOUR_API_KEY:
```
#### Pattern Examples
Common blocklist patterns:
* `*` - Block entire repository
* `*.env` - Block all .env files
* `config/*` - Block all files in config directory
* `**/*.secret` - Block all .secret files in any subdirectory
* `src/api/keys.ts` - Block specific file
# AI Code Tracking API
Source: https://docs.cursor.com/en/account/teams/ai-code-tracking-api
Access AI-generated code analytics for your team's repositories
Access AI-generated code analytics for your team's repositories. This includes per-commit AI usage as well as granular accepted AI changes.
The API is in its first release. We're expanding capabilities based on feedback - let us know what endpoints you need!
* **Availability**: Only for enterprise teams
* **Status**: Alpha (response shapes and fields may change)
## Authentication
All API requests require authentication using an API key. This API uses the same Admin API authentication as other endpoints.
For detailed authentication instructions, see [Admin API authentication](/en/account/teams/admin-api#authentication).
## Base URL
All API endpoints use:
```
https://api.cursor.com
```
## Rate Limits
* 5 requests per minute per team, per endpoint
## Query Parameters
All endpoints below accept the same query parameters via query string:
| Parameter | Type | Required | Description |
| :---------- | :------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startDate` | string \| date | No | ISO date string, the literal "now", or relative days like "7d" (means now - 7 days). Default: now - 7 days |
| `endDate` | string \| date | No | ISO date string, the literal "now", or relative days like "0d". Default: now |
| `page` | number | No | Page number (1-based). Default: 1 |
| `pageSize` | number | No | Results per page. Default: 100, Max: 1000 |
| `user` | string | No | Optional filter by a single user. Accepts email (e.g., [developer@company.com](mailto:developer@company.com)), encoded ID (e.g., user\_abc123...), or numeric ID (e.g., 42) |
Responses return userId as an encoded external ID with the prefix user\_. This is stable for API consumption.
## Semantics and How Metrics Are Computed
* **Sources**: "TAB" represents inline completions that were accepted; "COMPOSER" represents accepted diffs from Composer
* **Lines metrics**: tabLinesAdded/Deleted and composerLinesAdded/Deleted are separately counted; nonAiLinesAdded/Deleted are derived as max(0, totalLines - AI lines)
* **Privacy mode**: If enabled in the client, some metadata (like fileName) may be omitted
* **Branch info**: isPrimaryBranch is true when the current branch equals the repo's default branch; may be undefined if repo info is unavailable
You can scan that file to understand how commits and changes are detected and reported.
## Endpoints
### Get AI Commit Metrics (JSON, paginated)
Retrieve aggregated per-commit metrics that attribute lines to TAB, COMPOSER, and non-AI.
```
GET /analytics/ai-code/commits
```
#### Response
```typescript theme={null}
{
items: AiCommitMetric[];
totalCount: number;
page: number;
pageSize: number;
}
```
#### AiCommitMetric Fields
| Field | Type | Description |
| :--------------------- | :-------------- | :----------------------------------- |
| `commitHash` | string | Git commit hash |
| `userId` | string | Encoded user ID (e.g., user\_abc123) |
| `userEmail` | string | User's email address |
| `repoName` | string \| null | Repository name |
| `branchName` | string \| null | Branch name |
| `isPrimaryBranch` | boolean \| null | Whether this is the primary branch |
| `totalLinesAdded` | number | Total lines added in commit |
| `totalLinesDeleted` | number | Total lines deleted in commit |
| `tabLinesAdded` | number | Lines added via TAB completions |
| `tabLinesDeleted` | number | Lines deleted via TAB completions |
| `composerLinesAdded` | number | Lines added via Composer |
| `composerLinesDeleted` | number | Lines deleted via Composer |
| `nonAiLinesAdded` | number \| null | Non-AI lines added |
| `nonAiLinesDeleted` | number \| null | Non-AI lines deleted |
| `message` | string \| null | Commit message |
| `commitTs` | string \| null | Commit timestamp (ISO format) |
| `createdAt` | string | Ingestion timestamp (ISO format) |
#### Example Response
```json theme={null}
{
"items": [
{
"commitHash": "a1b2c3d4",
"userId": "user_3k9x8q...",
"userEmail": "developer@company.com",
"repoName": "company/repo",
"branchName": "main",
"isPrimaryBranch": true,
"totalLinesAdded": 120,
"totalLinesDeleted": 30,
"tabLinesAdded": 50,
"tabLinesDeleted": 10,
"composerLinesAdded": 40,
"composerLinesDeleted": 5,
"nonAiLinesAdded": 30,
"nonAiLinesDeleted": 15,
"message": "Refactor: extract analytics client",
"commitTs": "2025-07-30T14:12:03.000Z",
"createdAt": "2025-07-30T14:12:30.000Z"
}
],
"totalCount": 42,
"page": 1,
"pageSize": 100
}
```
#### Example Requests
**Basic request:**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/commits?startDate=7d&endDate=now&page=1&pageSize=100" \
-u YOUR_API_KEY:
```
**Filter by user (email):**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/commits?startDate=2025-06-01T00:00:00Z&endDate=now&user=developer@company.com" \
-u YOUR_API_KEY:
```
### Download AI Commit Metrics (CSV, streaming)
Download commit metrics data in CSV format for large data extractions.
```
GET /analytics/ai-code/commits.csv
```
#### Response
Headers:
* Content-Type: text/csv; charset=utf-8
#### CSV Columns
| Column | Type | Description |
| :----------------------- | :------ | :--------------------------------- |
| `commit_hash` | string | Git commit hash |
| `user_id` | string | Encoded user ID |
| `user_email` | string | User's email address |
| `repo_name` | string | Repository name |
| `branch_name` | string | Branch name |
| `is_primary_branch` | boolean | Whether this is the primary branch |
| `total_lines_added` | number | Total lines added in commit |
| `total_lines_deleted` | number | Total lines deleted in commit |
| `tab_lines_added` | number | Lines added via TAB completions |
| `tab_lines_deleted` | number | Lines deleted via TAB completions |
| `composer_lines_added` | number | Lines added via Composer |
| `composer_lines_deleted` | number | Lines deleted via Composer |
| `non_ai_lines_added` | number | Non-AI lines added |
| `non_ai_lines_deleted` | number | Non-AI lines deleted |
| `message` | string | Commit message |
| `commit_ts` | string | Commit timestamp (ISO format) |
| `created_at` | string | Ingestion timestamp (ISO format) |
#### Sample CSV Output
```csv theme={null}
commit_hash,user_id,user_email,repo_name,branch_name,is_primary_branch,total_lines_added,total_lines_deleted,tab_lines_added,tab_lines_deleted,composer_lines_added,composer_lines_deleted,non_ai_lines_added,non_ai_lines_deleted,message,commit_ts,created_at
a1b2c3d4,user_3k9x8q...,developer@company.com,company/repo,main,true,120,30,50,10,40,5,30,15,"Refactor: extract analytics client",2025-07-30T14:12:03.000Z,2025-07-30T14:12:30.000Z
e5f6g7h8,user_3k9x8q...,developer@company.com,company/repo,feature-branch,false,85,15,30,5,25,3,30,7,"Add error handling",2025-07-30T13:45:21.000Z,2025-07-30T13:45:45.000Z
```
#### Example Request
```bash theme={null}
curl -L "https://api.cursor.com/analytics/ai-code/commits.csv?startDate=2025-07-01T00:00:00Z&endDate=now&user=user_3k9x8q..." \
-u YOUR_API_KEY: \
-o commits.csv
```
### Get AI Code Change Metrics (JSON, paginated)
Retrieve granular accepted AI changes, grouped by deterministic changeId. Useful to analyze accepted AI events independent of commits.
```
GET /analytics/ai-code/changes
```
#### Response
```typescript theme={null}
{
items: AiCodeChangeMetric[];
totalCount: number;
page: number;
pageSize: number;
}
```
#### AiCodeChangeMetric Fields
| Field | Type | Description |
| :------------------ | :------------------ | :------------------------------------------------------ |
| `changeId` | string | Deterministic ID for the change |
| `userId` | string | Encoded user ID (e.g., user\_abc123) |
| `userEmail` | string | User's email address |
| `source` | "TAB" \| "COMPOSER" | Source of the AI change |
| `model` | string \| null | AI model used |
| `totalLinesAdded` | number | Total lines added |
| `totalLinesDeleted` | number | Total lines deleted |
| `createdAt` | string | Ingestion timestamp (ISO format) |
| `metadata` | Array | File metadata (fileName may be omitted in privacy mode) |
#### Example Response
```json theme={null}
{
"items": [
{
"changeId": "749356201",
"userId": "user_3k9x8q...",
"userEmail": "developer@company.com",
"source": "COMPOSER",
"model": null,
"totalLinesAdded": 18,
"totalLinesDeleted": 4,
"createdAt": "2025-07-30T15:10:12.000Z",
"metadata": [
{ "fileName": "src/analytics/report.ts", "fileExtension": "ts", "linesAdded": 12, "linesDeleted": 3 },
{ "fileName": "src/analytics/ui.tsx", "fileExtension": "tsx", "linesAdded": 6, "linesDeleted": 1 }
]
}
],
"totalCount": 128,
"page": 1,
"pageSize": 200
}
```
#### Example Requests
**Basic request:**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?startDate=14d&endDate=now&page=1&pageSize=200" \
-u YOUR_API_KEY:
```
**Filter by user (encoded ID):**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?user=user_3k9x8q..." \
-u YOUR_API_KEY:
```
**Filter by user (email):**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?user=developer@company.com" \
-u YOUR_API_KEY:
```
### Download AI Code Change Metrics (CSV, streaming)
Download change metrics data in CSV format for large data extractions.
```
GET /analytics/ai-code/changes.csv
```
#### Response
Headers:
* Content-Type: text/csv; charset=utf-8
#### CSV Columns
| Column | Type | Description |
| :-------------------- | :----- | :----------------------------------------- |
| `change_id` | string | Deterministic ID for the change |
| `user_id` | string | Encoded user ID |
| `user_email` | string | User's email address |
| `source` | string | Source of the AI change (TAB or COMPOSER) |
| `model` | string | AI model used |
| `total_lines_added` | number | Total lines added |
| `total_lines_deleted` | number | Total lines deleted |
| `created_at` | string | Ingestion timestamp (ISO format) |
| `metadata_json` | string | JSON stringified array of metadata entries |
#### Notes
* metadata\_json is a JSON stringified array of metadata entries (may omit fileName under privacy mode)
* When consuming CSV, be sure to parse quoted fields
#### Sample CSV Output
```csv theme={null}
change_id,user_id,user_email,source,model,total_lines_added,total_lines_deleted,created_at,metadata_json
749356201,user_3k9x8q...,developer@company.com,COMPOSER,gpt-4o,18,4,2025-07-30T15:10:12.000Z,"[{""fileName"":""src/analytics/report.ts"",""fileExtension"":""ts"",""linesAdded"":12,""linesDeleted"":3},{""fileName"":""src/analytics/ui.tsx"",""fileExtension"":""tsx"",""linesAdded"":6,""linesDeleted"":1}]"
749356202,user_3k9x8q...,developer@company.com,TAB,,8,2,2025-07-30T15:08:45.000Z,"[{""fileName"":""src/utils/helpers.ts"",""fileExtension"":""ts"",""linesAdded"":8,""linesDeleted"":2}]"
```
#### Example Request
```bash theme={null}
curl -L "https://api.cursor.com/analytics/ai-code/changes.csv?startDate=30d&endDate=now" \
-u YOUR_API_KEY: \
-o changes.csv
```
## Tips
* Use `user` parameter to quickly filter a single user across all endpoints
* For large data extractions, prefer CSV endpoints—they stream in pages of 10,000 records server-side
* `isPrimaryBranch` may be undefined if the client couldn't resolve the default branch
* `commitTs` is the commit timestamp; `createdAt` is the ingestion time on our servers
* Some fields may be absent when privacy mode is enabled on the client
## Changelog
* **Alpha release**: Initial endpoints for commits and changes. Response shapes may evolve based on feedback
# Analytics
Source: https://docs.cursor.com/en/account/teams/analytics
Track team usage and activity metrics
Team admins can track metrics from the [dashboard](/en/account/teams/dashboard).
### Total Usage
View aggregate metrics across your team, including total tabs and premium requests. For teams under 30 days old, metrics reflect usage since creation, including team members' pre-join activity.
### Per Active User
See average metrics per active user: tabs accepted, lines of code, and premium requests.
### User Activity
Track weekly and monthly active users.
## Analytics Report Headers
When you export analytics data from the dashboard, the report includes detailed metrics about user behavior and feature usage. Here's what each header means:
### User Information
The date when the analytics data was recorded (e.g., 2024-01-15T04:30:00.000Z)
Unique identifier for each user in the system
User's email address associated with their account
Indicates if the user was active on this date
### AI-Generated Code Metrics
Total lines of code suggested by the AI chat feature
Total lines of code suggested for deletion by the AI chat
AI-suggested lines that the user accepted and added to their code
AI-suggested deletions that the user accepted
### Feature Usage Metrics
Times a user applied AI-generated changes from chat
Times a user accepted AI suggestions
Times a user rejected AI suggestions
Times AI suggestion tabs were displayed to the user
AI suggestion tabs that were accepted by the user
### Request Type Metrics
Requests made through the composer/edit feature (Cmd+K inline edits)
Chat requests where users asked questions to the AI
Requests made to AI agents (specialized AI assistants)
Times the Cmd+K (or Ctrl+K) command palette was used
### Subscription and API Metrics
AI requests covered under the user's subscription plan
Requests made using API keys for programmatic access
Requests that count toward usage-based billing
### Additional Features
Times the bug detection/fixing AI feature was used
### Configuration Information
The AI model that the user used most frequently (e.g., GPT-4, Claude)
File extension most commonly used when applying AI suggestions (e.g., .ts,
.py, .java)
File extension most commonly used with tab completion features
Version of the Cursor editor being used
### Calculated Metrics
The report also includes processed data that helps understand AI code contribution:
* **Total Lines Added/Deleted**: Raw count of all code changes
* **Accepted Lines Added/Deleted**: Lines that originated from AI suggestions and were accepted
* **Composer Requests**: Requests made through the inline composer feature
* **Chat Requests**: Requests made through the chat interface
All numeric values default to 0 if not present, boolean values default to
false, and string values default to empty strings. Metrics are aggregated at
the daily level per user.
# Analytics V2
Source: https://docs.cursor.com/en/account/teams/analyticsV2
Advanced team usage and activity metrics tracking
We are working on a V2 release of our analytics infrastructure. This includes a refactor of the way in which we track various metrics.
As of **September 1, 2025**, and for users on **Cursor version 1.5**, analytics will utilize our V2 infrastructure. Prior versions would have undercounted various metrics, including:
* Total Accepted Lines of Code
* Total Suggested Lines of Code
* Total Tabs Accepted
Please stay tuned as we continue to invest in analytics and release new features in this space.
# Dashboard
Source: https://docs.cursor.com/en/account/teams/dashboard
Manage billing, usage, and team settings from your dashboard
The dashboard lets you access billing, set up usage-based pricing, and manage your Team.
## Overview
Get a quick summary of your team's activity, usage statistics, and recent changes. The overview page provides at-a-glance insights into your workspace.
## Settings
Configure team-wide preferences and security settings. The settings page includes:
## Teams & Enterprise Settings
Control data sharing preferences for your team. Configure zero data retention policies with AI providers (OpenAI, Anthropic, Google Vertex AI, xAi Grok) and manage team-wide privacy enforcement.
{" "}
Enable usage-based pricing and set spending limits. Configure monthly team
spending limits and optional per-user limits. Control whether only admins can
modify these settings.
{" "}
Configure AWS Bedrock IAM roles for secure cloud integration.
{" "}
Set up SSO authentication for enterprise teams to streamline user access and
improve security.
{" "}
Create and manage API keys for programmatic access to Cursor's admin features.
{" "}
Monitor and manage active user sessions across your team.
Create and manage invite codes for adding new team members.
Access Cursor's REST API endpoints for programmatic integration. All API endpoints are available on both Team and Enterprise plans, except for the [AI Code Tracking API](/en/docs/account/teams/ai-code-tracking-api) which requires Enterprise membership.
## Enterprise-Only Settings
{" "}
Control which AI models are available to team members. Set restrictions on
specific models or model tiers to manage costs and ensure appropriate usage
across your organization.
{" "}
Configure automatic command execution settings for Cursor version 0.49 and
above. Control which commands can be executed automatically and set security
policies for code execution.
Prevent access to specific repositories for security or compliance reasons.
{" "}
Configure Model Context Protocol settings for Cursor version 0.51 and above.
Manage how models access and process context from your development
environment.
{" "}
Set up ignore patterns for files and directories in Cursor version 0.50 and
above. Control which files and directories are excluded from AI analysis and
suggestions.
Protect the .cursor directory from unauthorized access in version 0.51 and above. Ensure sensitive configuration and cache files remain secure.
Access detailed AI-generated code analytics for your team's repositories. Retrieve per-commit AI usage metrics and granular accepted AI changes through REST API endpoints. Requires Enterprise plan. Find more information [here](/en/account/teams/ai-code-tracking-api).
**SCIM** (System for Cross-domain Identity Management) provisioning is also
available for Enterprise plans. See our [SCIM
documentation](/en/account/teams/scim) for setup instructions.
## Members
Manage your team members, invite new users, and control access permissions. Set role-based permissions and monitor member activity.
## Integrations
{" "}
Connect Cursor with your favorite tools and services. Configure integrations with version control systems, project management tools, and other developer services.
## Background Agents
{" "}
Monitor and manage background agents running in your workspace. View agent status, logs, and resource usage.
## Bugbot
Access automated bug detection and fixing capabilities. Bugbot helps identify and resolve common issues in your codebase automatically.
## Active Directory Management
For enterprise teams, manage user authentication and access through Active Directory integration. Configure SSO and user provisioning.
## Usage
Track detailed usage metrics including AI requests, model usage, and resource consumption. Monitor usage across team members and projects.
## Billing & Invoices
Manage your subscription, update payment methods, and access billing history. Download invoices and manage usage-based pricing settings.
# Enterprise Settings
Source: https://docs.cursor.com/en/account/teams/enterprise-settings
Centrally manage Cursor settings for your organization
# Enterprise settings
You can centrally manage specific features of Cursor through device management solutions to ensure it meets the needs of your organization. When you specify a Cursor policy, its value overrides the corresponding Cursor setting on users' devices.
Settings editor showing that the 'Extensions: Allowed' setting is managed by the organization.
Cursor currently provides policies to control the following admin-controlled features:
| Policy | Description | Cursor setting | Available since |
| ----------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------ | --------------- |
| AllowedExtensions | Controls which extensions can be installed. | extensions.allowed | 1.2 |
| AllowedTeamId | Controls which team IDs are allowed to log in. Users with unauthorized team IDs are forcefully logged out. | cursorAuth.allowedTeamId | 1.3 |
## Configure allowed extensions
The `extensions.allowed` Cursor setting controls which extensions can be installed. This setting accepts a JSON object where keys are publisher names and values are booleans indicating whether extensions from that publisher are allowed.
For example, setting `extensions.allowed` to `{"anysphere": true, "github": true}` allows extensions from Anysphere and GitHub publishers, while setting it to `{"anysphere": false}` blocks Anysphere extensions.
To centrally manage allowed extensions for your organization, configure the `AllowedExtensions` policy using your device management solution. This policy overrides the `extensions.allowed` setting on users' devices. The value of this policy is a JSON string that defines the allowed publishers.
If you want to learn more about extensions in Cursor, refer to the extensions documentation.
## Configure allowed team IDs
The `cursorAuth.allowedTeamId` Cursor setting controls which team IDs are permitted to log into Cursor. This setting accepts a comma-separated list of team IDs that are authorized for access.
For example, setting `cursorAuth.allowedTeamId` to `"1,3,7"` allows users from those specific team IDs to log in.
When a user attempts to log in with a team ID that is not in the allowed list:
* They are forcefully logged out immediately
* An error message is displayed
* The application prevents further authentication attempts until a valid team ID is used
To centrally manage allowed team IDs for your organization, configure the `AllowedTeamId` policy using your device management solution. This policy overrides the `cursorAuth.allowedTeamId` setting on users' devices. The value of this policy is a string containing the comma-separated list of authorized team IDs.
## Group Policy on Windows
Cursor has support for Windows Registry-based Group Policy. When policy definitions are installed, admins can use the Local Group Policy Editor to manage the policy values.
To add a policy:
1. Copy the Policy ADMX and ADML files from `AppData\Local\Programs\cursor\policies`.
2. Paste the ADMX file into the `C:\Windows\PolicyDefinitions` directory, and the ADML file into the `C:\Windows\PolicyDefinitions\\` directory.
3. Restart the Local Group Policy Editor.
4. Set the appropriate policy values (e.x. `{"anysphere": true, "github": true}` for the `AllowedExtensions` policy) in the Local Group Policy Editor.
Policies can be set both at the Computer level and the User level. If both are set, Computer level will take precedence. When a policy value is set, the value overrides the Cursor setting value configured at any level (default, user, workspace, etc.).
## Configuration profiles on macOS
Configuration profiles manage settings on macOS devices. A profile is an XML file with key/value pairs that correspond to available policy. These profiles can be deployed using Mobile Device Management (MDM) solutions, or installed manually.
An example `.mobileconfig` file for macOS is shown below:
```
PayloadContentPayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92.J6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadTypecom.todesktop.230313mzl4w4u92PayloadUUIDJ6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadVersion1AllowedExtensions{"anysphere":true}AllowedTeamId1,2PayloadDescriptionThis profile manages Cursor.PayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92PayloadOrganizationAnyspherePayloadTypeConfigurationPayloadUUIDF2C1A7B3-9D4E-4B2C-8E1F-7A6C5D4B3E2FPayloadVersion1TargetDeviceType5
```
### String policies
The example below demonstrates configuration of the `AllowedExtensions` policy. The policy value starts empty in the sample file (no extensions are allowed).
```
AllowedExtensions
```
Add the appropriate JSON string defining your policy between the `` tags.
```
AllowedExtensions{"anysphere": true, "github": true}
```
For the `AllowedTeamId` policy, add the comma-separated list of team IDs:
```
AllowedTeamId1,3,7
```
**Important:** The provided `.mobileconfig` file initializes **all** policies available in that version of Cursor. Delete any policies that are not needed.
If you do not edit or remove a policy from the sample `.mobileconfig`, that policy will be enforced with its default (restrictive) policy value.
Manually install a configuration profile by double-clicking on the `.mobileconfig` profile in Finder and then enabling it in System Preferences under **General** > **Device Management**. Removing the profile from System Preferences will remove the policies from Cursor.
For more information on configuration profiles, refer to Apple's documentation.
## Additional policies
The goal is to promote current Cursor settings as policies and closely follow existing settings, so that the naming and behavior are consistent. If there are requests to enact more policies, please open an issue in the Cursor GitHub repository. The team will determine if there is already a corresponding setting for the behavior or if a new setting should be created to control the desired behavior.
## Frequently asked questions
### Does Cursor support configuration profiles on Linux?
Support for Linux is not on the roadmap. If you're interested in configuration profiles on Linux, open an issue in the Cursor GitHub repository and share details about your scenario.
# Members & Roles
Source: https://docs.cursor.com/en/account/teams/members
Manage team members and roles
Cursor teams have three roles:
## Roles
**Members** are the default role with access to Cursor's Pro features.
* Full access to Cursor's Pro features
* No access to billing settings or admin dashboard
* Can see their own usage and remaining usage-based budget
**Admins** control team management and security settings.
* Full access to Pro features
* Add/remove members, modify roles, setup SSO
* Configure usage-based pricing and spending limits
* Access to team analytics
**Unpaid Admins** manage teams without using a paid seat - ideal for IT or finance staff who don't need Cursor access.
* Not billable, no Pro features
* Same administrative capabilities as Admins
Unpaid Admins require at least one paid user on the team.
## Role Comparison
## Managing members
All team members can invite others. We don't currently control invites.
### Add member
Add members three ways:
1. **Email invitation**
* Click `Invite Members`
* Enter email addresses
* Users receive email invites
2. **Invite link**
* Click `Invite Members`
* Copy `Invite Link`
* Share with team members
3. **SSO**
* Configure SSO in [admin dashboard](/en/account/teams/sso)
* Users auto-join when logging in via SSO email
Invite links have a long expiration date - anyone with the link can join.
Revoke them or use [SSO](/en/account/teams/sso)
### Remove member
Admins can remove members anytime via context menu → "Remove". If a member has used any credits, their seat remains occupied until the end of the billing cycle.
### Change role
Admins can change roles for other members by clicking the context menu and then use the "Change role" option.
There must be at least one Admin, and one paid member on the team at all times.
## Security & SSO
SAML 2.0 Single Sign-On (SSO) is available on Team plans. Key features include:
* Configure SSO connections ([learn more](/en/account/teams/sso))
* Set up domain verification
* Automatic user enrollment
* SSO enforcement options
* Identity provider integration (Okta, etc)
Domain verification is required to enable SSO.
## Usage Controls
Access usage settings to:
* Enable usage-based pricing
* Enable for premium models
* Set admin-only modifications
* Set monthly spending limits
* Monitor team-wide usage
## Billing
When adding team members:
* Each member or admin adds a billable seat (see [pricing](https://cursor.com/pricing))
* New members are charged pro-rata for their remaining time in the billing period
* Unpaid admin seats aren't counted
Mid-month additions charge only for days used. When removing members who have used credits, their seat remains occupied until the end of the billing cycle - no pro-rated refunds are given.
Role changes (e.g., Admin to Unpaid Admin) adjust billing from the change date. Choose monthly or yearly billing.
Monthly/yearly renewal occurs on your original signup date, regardless of member changes.
### Switch to Yearly billing
Save **20%** by switching from monthly to yearly:
1. Go to [Dashboard](https://cursor.com/dashboard)
2. In account section, click "Advanced" then "Upgrade to yearly billing"
You can only switch from monthly to yearly via dashboard. To switch from
yearly to monthly, contact [hi@cursor.com](mailto:hi@cursor.com).
# SCIM
Source: https://docs.cursor.com/en/account/teams/scim
Set up SCIM provisioning for automated user and group management
## Overview
SCIM 2.0 provisioning automatically manages your team members and directory groups through your identity provider. Available on Enterprise plans with SSO enabled.
SCIM settings dashboard showing Active Directory Management configuration
## Prerequisites
* Cursor Enterprise plan
* SSO must be configured first - **SCIM requires an active SSO connection**
* Admin access to your identity provider (Okta, Azure AD, etc.)
* Admin access to your Cursor organization
## How it works
### User provisioning
Users are automatically added to Cursor when assigned to the SCIM application in your identity provider. When unassigned, they're removed. Changes sync in real-time.
### Directory groups
Directory groups and their membership sync from your identity provider. Group and user management must be done through your identity provider - Cursor displays this information as read-only.
### Spend management
Set different per-user spend limits for each directory group. Directory group limits take precedence over team-level limits. Users in multiple groups receive the highest applicable spend limit.
## Setup
SCIM requires SSO to be set up first. If you haven't configured SSO yet,
follow the [SSO setup guide](/en/account/teams/sso) before proceeding.
Navigate to
[cursor.com/dashboard?tab=active-directory](https://www.cursor.com/dashboard?tab=active-directory)
with an admin account, or go to your dashboard settings and select the
"Active Directory Management" tab.
Once SSO is verified, you'll see a link for step-by-step SCIM setup. Click
this to begin the configuration wizard.
In your identity provider: - Create or configure your SCIM application - Use
the SCIM endpoint and token provided by Cursor - Enable user and push group
provisioning - Test the connection
Back in Cursor's Active Directory Management page: - View your synchronized
directory groups - Set per-user spend limits for specific groups as needed -
Review which limits apply to users in multiple groups
### Identity provider setup
For provider-specific setup instructions:
Setup instructions for Okta, Azure AD, Google Workspace, and more.
## Managing users and groups
All user and group management must be done through your identity provider.
Changes made in your identity provider will automatically sync to Cursor, but
you cannot modify users or groups directly in Cursor.
### User management
* Add users by assigning them to your SCIM application in your identity provider
* Remove users by unassigning them from the SCIM application
* User profile changes (name, email) sync automatically from your identity provider
### Group management
* Directory groups are automatically synced from your identity provider
* Group membership changes are reflected in real-time
* Use groups to organize users and set different spend limits
### Spend limits
* Set different per-user limits for each directory group
* Users inherit the highest spend limit from their groups
* Group limits override the default team-wide per-user limit
## FAQ
### Why isn't SCIM management showing up in my dashboard?
Ensure SSO is properly configured and working before setting up SCIM. SCIM requires an active SSO connection to function.
### Why aren't users syncing?
Verify that users are assigned to the SCIM application in your identity provider. Users must be explicitly assigned to appear in Cursor.
### Why aren't groups appearing?
Check that push group provisioning is enabled in your identity provider's SCIM settings. Group sync must be configured separately from user sync.
### Why aren't spend limits applying?
Confirm users are properly assigned to the expected groups in your identity provider. Group membership determines which spend limits apply.
### Can I manage SCIM users and groups directly in Cursor?
No. All user and group management must be done through your identity provider. Cursor displays this information as read-only.
### How quickly do changes sync?
Changes made in your identity provider sync to Cursor in real-time. There may be a brief delay for large bulk operations.
# Get Started
Source: https://docs.cursor.com/en/account/teams/setup
Create and set up a Cursor team
## Cursor for Teams
Cursor works for individuals and teams. The Teams plan provides tools for organizations: SSO, team management, access controls, and usage analytics.
## Creating a Team
Create a team by following these steps:
To create a Team, follow these steps:
1. **For new users**: Visit [cursor.com/team/new-team](https://cursor.com/team/new-team) to create a new account and team
2. **For existing users**: Go to your [dashboard](/en/account/dashboard) and click "Upgrade to Teams"
Select a Team name and billing cycle
Invite team members. User counts are prorated - you only pay for the time users are members.
Enable [SSO](/en/account/teams/sso) for security and automated onboarding.
## FAQ
Cursor uses HTTP/2 by default. Some proxies and VPNs block this.
Enable HTTP/1.1 fallback in settings to use HTTP/1.1 instead.
Cursor bills per active user, not seats. Add or remove users anytime - new members are charged pro-rata for their remaining time. If a removed user has used any credits, their seat remains occupied until the end of the billing cycle.
Your renewal date stays the same.
Set yourself as an [Unpaid Admin](/en/account/teams/members) to manage without a license.
Teams need at least one paid member. You can set up, invite a member, then change your role before billing.
Download links for all platforms are available at [cursor.com/downloads](https://cursor.com/downloads).
MDM instructions:
* [Omnissa Workspace ONE](https://docs.omnissa.com/bundle/MobileApplicationManagementVSaaS/page/DeployInternalApplications.html) (formerly VMware)
* [Microsoft Intune (Windows)](https://learn.microsoft.com/en-us/mem/intune-service/apps/apps-win32-app-management)
* [Microsoft Intune (Mac)](https://learn.microsoft.com/en-us/mem/intune-service/apps/lob-apps-macos-dmg)
* [Kandji MDM](https://support.kandji.io/kb/custom-apps-overview)
# SSO
Source: https://docs.cursor.com/en/account/teams/sso
Set up single sign-on for your team
## Overview
SAML 2.0 SSO is available at no additional cost on Business plans. Use your existing identity provider (IdP) to authenticate team members without separate Cursor accounts.
## Prerequisites
* Cursor Team plan
* Admin access to your identity provider (e.g., Okta)
* Admin access to your Cursor organization
## Configuration Steps
Navigate to [cursor.com/dashboard?tab=settings](https://www.cursor.com/dashboard?tab=settings) with an admin account.
Find the "Single Sign-On (SSO)" section and expand it.
Click the "SSO Provider Connection settings"button to start SSO setup and follow the wizard.
In your identity provider (e.g., Okta):
* Create new SAML application
* Configure SAML settings using Cursor's information
* Set up Just-in-Time (JIT) provisioning
Verify the domain of your users in Cursor by clicking the "Domain verification settings" button.
### Identity Provider Setup Guides
For provider-specific setup instructions:
Setup instructions for Okta, Azure AD, Google Workspace, and more.
## Additional Settings
* Manage SSO enforcement through admin dashboard
* New users auto-enroll when signing in through SSO
* Handle user management through your identity provider
## Troubleshooting
If issues occur:
* Verify domain is verified in Cursor
* Ensure SAML attributes are properly mapped
* Check SSO is enabled in admin dashboard
* Match first and last names between identity provider and Cursor
* Check provider-specific guides above
* Contact [hi@cursor.com](mailto:hi@cursor.com) if issues persist
# Update Access
Source: https://docs.cursor.com/en/account/update-access
Choose how often you receive updates
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor has two update channels.
The default update channel with tested releases.
* Stable releases
* Bug fixes from pre-release testing
* Default for all users
* Only option for team users
Team and business accounts use Default mode.
Pre-release versions with new features.
Early Access builds may have bugs or stability issues.
* Access to features in development
* May contain bugs
* Not available for team accounts
## Change update channel
1. **Open settings**: Press Cmd+Shift+J
2. **Go to Beta**: Select Beta in the sidebar
3. **Select channel**: Choose Default or Early Access
Report Early Access issues on the [Forum](https://forum.cursor.com).
# Apply
Source: https://docs.cursor.com/en/agent/apply
Learn how to apply, accept, or reject code suggestions from chat using Apply
## How Apply works
Apply is a specialized Cursor model that takes code generated by chat and integrates it into your files. It processes the code blocks from chat conversations and applies the changes to your codebase.
Apply does not generate code itself. The chat model generates the code, and Apply handles the integration into existing files. It can process changes across multiple files and large codebases.
## Apply code blocks
To apply a code block suggestion, press the play button in the top right corner of a code block.
# Checkpoints
Source: https://docs.cursor.com/en/agent/chat/checkpoints
Save and restore previous states after Agent changes
Checkpoints are automatic snapshots of Agent's changes to your codebase. They let you undo Agent modifications if needed.
## Restoring checkpoints
Two ways to restore:
1. **From input box**: Click `Restore Checkpoint` button on previous requests
2. **From message**: Click the + button when hovering over a message
Checkpoints are not version control. Use Git for permanent history.
## How they work
* Stored locally, separate from Git
* Track only Agent changes (not manual edits)
* Cleaned up automatically
Manual edits aren't tracked. Only use checkpoints for Agent changes.
## FAQ
No. They're separate from Git history.
{" "}
For the current session and recent history. Automatically cleaned up.
No. They're created automatically by Cursor.
{" "}
# Commands
Source: https://docs.cursor.com/en/agent/chat/commands
Define commands for reusable workflows
Custom commands allow you to create reusable workflows that can be triggered with a simple `/` prefix in the chat input box. These commands help standardize processes across your team and make common tasks more efficient.
Commands are currently in beta. The feature and syntax may change as we continue to improve it.
## How commands work
Commands are defined as plain Markdown files that can be stored in two locations:
1. **Project commands**: Stored in the `.cursor/commands` directory of your project
2. **Global commands**: Stored in the `~/.cursor/commands` directory in your home directory
When you type `/` in the chat input box, Cursor will automatically detect and display available commands from both directories, making them instantly accessible across your workflow.
## Creating commands
1. Create a `.cursor/commands` directory in your project root
2. Add `.md` files with descriptive names (e.g., `review-code.md`, `write-tests.md`)
3. Write plain Markdown content describing what the command should do
4. Commands will automatically appear in the chat when you type `/`
Here's an example of how your commands directory structure might look:
```
.cursor/
└── commands/
├── address-github-pr-comments.md
├── code-review-checklist.md
├── create-pr.md
├── light-review-existing-diffs.md
├── onboard-new-developer.md
├── run-all-tests-and-fix.md
├── security-audit.md
└── setup-new-feature.md
```
## Examples
Try these commands in your projects to get a feel for how they work.
```markdown theme={null}
# Code Review Checklist
## Overview
Comprehensive checklist for conducting thorough code reviews to ensure quality, security, and maintainability.
## Review Categories
### Functionality
- [ ] Code does what it's supposed to do
- [ ] Edge cases are handled
- [ ] Error handling is appropriate
- [ ] No obvious bugs or logic errors
### Code Quality
- [ ] Code is readable and well-structured
- [ ] Functions are small and focused
- [ ] Variable names are descriptive
- [ ] No code duplication
- [ ] Follows project conventions
### Security
- [ ] No obvious security vulnerabilities
- [ ] Input validation is present
- [ ] Sensitive data is handled properly
- [ ] No hardcoded secrets
```
```markdown theme={null}
# Security Audit
## Overview
Comprehensive security review to identify and fix vulnerabilities in the codebase.
## Steps
1. **Dependency audit**
- Check for known vulnerabilities
- Update outdated packages
- Review third-party dependencies
2. **Code security review**
- Check for common vulnerabilities
- Review authentication/authorization
- Audit data handling practices
3. **Infrastructure security**
- Review environment variables
- Check access controls
- Audit network security
## Security Checklist
- [ ] Dependencies updated and secure
- [ ] No hardcoded secrets
- [ ] Input validation implemented
- [ ] Authentication secure
- [ ] Authorization properly configured
```
```markdown theme={null}
# Setup New Feature
## Overview
Systematically set up a new feature from initial planning through to implementation structure.
## Steps
1. **Define requirements**
- Clarify feature scope and goals
- Identify user stories and acceptance criteria
- Plan technical approach
2. **Create feature branch**
- Branch from main/develop
- Set up local development environment
- Configure any new dependencies
3. **Plan architecture**
- Design data models and APIs
- Plan UI components and flow
- Consider testing strategy
## Feature Setup Checklist
- [ ] Requirements documented
- [ ] User stories written
- [ ] Technical approach planned
- [ ] Feature branch created
- [ ] Development environment ready
```
```markdown theme={null}
# Create PR
## Overview
Create a well-structured pull request with proper description, labels, and reviewers.
## Steps
1. **Prepare branch**
- Ensure all changes are committed
- Push branch to remote
- Verify branch is up to date with main
2. **Write PR description**
- Summarize changes clearly
- Include context and motivation
- List any breaking changes
- Add screenshots if UI changes
3. **Set up PR**
- Create PR with descriptive title
- Add appropriate labels
- Assign reviewers
- Link related issues
## PR Template
- [ ] Feature A
- [ ] Bug fix B
- [ ] Unit tests pass
- [ ] Manual testing completed
```
```markdown theme={null}
# Run All Tests and Fix Failures
## Overview
Execute the full test suite and systematically fix any failures, ensuring code quality and functionality.
## Steps
1. **Run test suite**
- Execute all tests in the project
- Capture output and identify failures
- Check both unit and integration tests
2. **Analyze failures**
- Categorize by type: flaky, broken, new failures
- Prioritize fixes based on impact
- Check if failures are related to recent changes
3. **Fix issues systematically**
- Start with the most critical failures
- Fix one issue at a time
- Re-run tests after each fix
```
```markdown theme={null}
# Onboard New Developer
## Overview
Comprehensive onboarding process to get a new developer up and running quickly.
## Steps
1. **Environment setup**
- Install required tools
- Set up development environment
- Configure IDE and extensions
- Set up git and SSH keys
2. **Project familiarization**
- Review project structure
- Understand architecture
- Read key documentation
- Set up local database
## Onboarding Checklist
- [ ] Development environment ready
- [ ] All tests passing
- [ ] Can run application locally
- [ ] Database set up and working
- [ ] First PR submitted
```
# Compact
Source: https://docs.cursor.com/en/agent/chat/compact
Save space in chat with compact mode interface
Compact mode provides a streamlined chat interface by reducing visual clutter and maximizing available space for conversations.
## Overview
When enabled, compact mode transforms the chat interface by:
* **Hiding icons** for a cleaner, minimalist appearance
* **Auto-collapsing diffs** to reduce visual noise
* **Auto-collapsing input** to maximize conversation space
This setting is particularly useful when working on smaller screens or when you prefer a focused, distraction-free chat experience.
## Before and After
### Default mode
### Compact mode
## Enabling compact mode
To enable compact mode:
1. Open Cursor Settings
2. Navigate to **Chat** settings
3. Toggle **Compact Mode** to enable
The interface will immediately update to the streamlined view, giving you more space to focus on your conversations.
# Duplicate
Source: https://docs.cursor.com/en/agent/chat/duplicate
Create branches from any point in a conversation
Duplicate/fork chats to explore alternative solutions without losing your current conversation.
## How to duplicate
1. Find where you want to branch off
2. Click the three dots on the message
3. Select "Duplicate Chat"
## What happens
* Context up to that point is preserved
* Original conversation remains unchanged
* Both chats maintain separate history
# Export
Source: https://docs.cursor.com/en/agent/chat/export
Export chats to markdown format
Export Agent chats as markdown files for sharing or documentation.
## What's exported
* All messages and responses
* Code blocks with syntax highlighting
* File references and context
* Chronological conversation flow
## How to export
1. Navigate to the chat to export
2. Click context menu → "Export Chat"
3. Save the file locally
Review exports for sensitive data: API keys, internal URLs, proprietary code,
personal information
# History
Source: https://docs.cursor.com/en/agent/chat/history
View and manage chat conversations
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Access past Agent conversations from the history panel.
## Opening history
* Click the history icon in Agent sidepane
* Press Opt Cmd '
## Managing chats
* **Edit titles**: Click to rename
* **Delete**: Remove unneeded chats
* **Open**: Click to review full conversation
Chat history is stored locally in a SQLite database on your machine.
To preserve chats, [export them](/en/agent/chats/export) as markdown.
## Background Agents
Background agent chats aren't in regular history but instead stored in a remote database. Use Cmd E to view them.
## Referencing past chats
Use [@Past Chats](/en/context/@-symbols/@-past-chats) to include context from previous conversations in your current chat.
# Summarization
Source: https://docs.cursor.com/en/agent/chat/summarization
Context management for long conversations in chat
## Message summarization
As conversations grow longer, Cursor automatically summarizes and manages context to keep your chats efficient. Learn how to use the context menu and understand how files are condensed to fit within model context windows.
### Using the /summarize command
You can manually trigger summarization using the `/summarize` command in chat. This command helps manage context when conversations become too long, allowing you to continue working efficiently without losing important information.
For a deeper dive into how context works in Cursor, check our [Working with
Context](/en/guides/working-with-context) guide.
### How summarization works
When conversations grow longer, they exceed the model's context window limit:
User
Cursor
User
Context window limit
Cursor
User
Cursor
To solve this, Cursor summarizes older messages to make room for new conversations.
Context window limit
Summarized Messages
Cursor
User
Cursor
## File & folder condensation
While chat summarization handles long conversations, Cursor uses a different strategy for managing large files and folders: **smart condensation**. When you include files in your conversation, Cursor determines the best way to present them based on their size and available context space.
Here are the different states a file/folder can be in:
### Condensed
When files or folders are too large to fit within the context window, Cursor automatically condenses them. Condensing shows the model key structural elements like function signatures, classes, and methods. From this condensed view, the model can choose to expand specific files if needed. This approach maximizes effective use of the available context window.
### Significantly condensed
When a file name appears with a "Significantly Condensed" label, the file was too large to include in full, even in condensed form. Only the file name will be shown to the model.
### Not included
When a warning icon appears next to a file or folder, the item is too large to be included in the context window, even in condensed form. This helps you understand which parts of your codebase are accessible to the model.
# Tabs
Source: https://docs.cursor.com/en/agent/chat/tabs
Run multiple Agent conversations simultaneously
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Overview
Press Cmd+T to create new tabs. Each tab maintains separate conversation history, context, and model selection.
For parallel workflows, try [Background Agents](/en/background-agents)
## Managing tabs
* Create new tabs with Cmd+T. Each tab starts with a fresh conversation and maintains its own context.
* Switch between tabs by clicking their headers or using Ctrl+Tab to cycle through them.
* Tab titles are auto-generated after the first message, but you can rename them by right-clicking on the tab header.
Use one task per tab, provide clear initial descriptions, and close finished
tabs to keep your workspace organized.
### Conflicts
Cursor prevents multiple tabs from editing the same files. You'll be prompted to resolve conflicts.
## Reference other chats
Use [@Past Chats](/en/context/@-symbols/@-past-chats) to include context from other tabs or previous sessions.
# Modes
Source: https://docs.cursor.com/en/agent/modes
Choose the right mode for your task - from autonomous coding to focused edits
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Agent offers different modes optimized for specific tasks. Each mode has different capabilities and tools enabled to match your workflow needs.
## Agent
The default mode for complex coding tasks. Agent autonomously explores your codebase, edits multiple files, runs commands, and fixes errors to complete your requests.
## Ask
Read-only mode for learning and exploration. Ask searches your codebase and provides answers without making any changes - perfect for understanding code before modifying it.
## Custom
Create your own modes with specific tool combinations and instructions. Mix and match capabilities to fit your workflow.
Custom modes are in beta. Enable them in `Cursor Settings` → `Chat` → `Custom
Modes`
### Examples
**Tools:** All Search\
**Instructions:** Focus on explaining concepts thoroughly and ask clarifying questions
{" "}
**Tools:** Edit & Reapply **Instructions:** Improve code structure without
adding new functionality
{" "}
**Tools:** Codebase, Read file, Terminal **Instructions:** Create detailed
implementation plans in `plan.md`
**Tools:** All Search, Terminal, Edit & Reapply\
**Instructions:** Investigate issues thoroughly before proposing fixes
## Switching modes
* Use the mode picker dropdown in Agent
* Press Cmd+. for quick switching
* Set keyboard shortcuts in [settings](#settings)
## Settings
All modes share common configuration options:
| Setting | Description |
| :----------------- | :------------------------------------ |
| Model | Choose which AI model to use |
| Keyboard shortcuts | Set shortcuts to switch between modes |
Agent uses tools to search, edit, and run commands. From semantic codebase
search to terminal execution, these tools enable autonomous task
completion.
Agent executes terminal commands, monitors output, and handles multi-step
processes. Configure auto-run for trusted workflows or require
confirmation for safety.
Define custom instructions for Agent behavior. Rules help maintain coding
standards, enforce patterns, and personalize how Agent assists with your
project.
# Planning
Source: https://docs.cursor.com/en/agent/planning
How Agent plans and manages complex tasks with todos and queuing
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Agent can plan ahead and manage complex tasks with structured to-do lists and message queuing, making long-horizon tasks easier to understand and track.
## Agent to-dos
Agent can break down longer tasks into manageable steps with dependencies, creating a structured plan that updates as work progresses.
### How it works
* Agent automatically creates to-do lists for complex tasks
* Each item can have dependencies on other tasks
* The list updates in real-time as work progresses
* Completed tasks are marked off automatically
### Visibility
* To-dos appear in the chat interface
* If [Slack integration](/en/slack) is set up, to-dos are also visible there
* You can view the full task breakdown at any time
For better planning, describe your end goal clearly. Agent will create more
accurate task breakdowns when it understands the full scope.
Planning and to-dos are currently not supported for auto mode.
## Queued messages
Queue follow-up messages while Agent is working on the current task. Your instructions wait in line and execute automatically when ready.
### Using the queue
1. While Agent is working, type your next instruction
2. Press Ctrl+Enter to add it to the queue
3. Messages appear in order below the active task
4. Reorder queued messages by clicking arrow
5. Agent processes them sequentially after finishing
### Override the queue
To queue your message instead of using default messaging, use Ctrl+Enter. To send a message immediately without queuing, use Cmd+Enter. This "force pushes" your message, bypassing the queue to execute right away.
## Default messaging
Messages send as fast as possible by default, typically appearing right after Agent completes a tool call. This creates the most responsive experience.
### How default messaging works
* Your message gets appended to the most recent user message in the chat
* Messages typically attach to tool results and send immediately when ready
* This creates a more natural conversation flow without interrupting Agent's current work
* By default, this happens when you press Enter while Agent is working
# Diffs & Review
Source: https://docs.cursor.com/en/agent/review
Review and manage code changes generated by the AI agent
When Agent generates code changes, they're presented in a review interface that shows additions and deletions with color-coded lines. This allows you to examine and control which changes are applied to your codebase.
The review interface displays code changes in a familiar diff format:
## Diffs
## Review
After generation completes, you'll see a prompt to review all changes before proceeding. This gives you an overview of what will be modified.
### File-by-file
A floating review bar appears at the bottom of your screen, allowing you to:
* **Accept** or **reject** changes for the current file
* Navigate to the **next file** with pending changes
### Selective acceptance
For fine-grained control:
* To accept most changes: reject unwanted lines, then click **Accept all**
* To reject most changes: accept wanted lines, then click **Reject all**
## Review changes
At the end of the agent response, click the **Review changes** button to see the full diff of the changes.
# Terminal
Source: https://docs.cursor.com/en/agent/terminal
Run terminal commands automatically as part of agent operations
Agent executes commands in Cursor's native terminal with preserved history. Click skip to send Ctrl+C and interrupt commands.
## Troubleshooting
Some shell themes (for example, Powerlevel9k/Powerlevel10k) can interfere with
the inline terminal output. If your command output looks truncated or
misformatted, disable the theme or switch to a simpler prompt when Agent runs.
### Disable heavy prompts for Agent sessions
Use the `CURSOR_AGENT` environment variable in your shell config to detect when
the Agent is running and skip initializing fancy prompts/themes.
```zsh theme={null}
# ~/.zshrc — disable Powerlevel10k when Cursor Agent runs
if [[ -n "$CURSOR_AGENT" ]]; then
# Skip theme initialization for better compatibility
else
[[ -r ~/.p10k.zsh ]] && source ~/.p10k.zsh
fi
```
```bash theme={null}
# ~/.bashrc — fall back to a simple prompt in Agent sessions
if [[ -n "$CURSOR_AGENT" ]]; then
PS1='\u@\h \W \$ '
fi
```
# Tools
Source: https://docs.cursor.com/en/agent/tools
Tools available to agents for searching, editing, and running code
A list of all tools available to modes within the [Agent](/en/agent/overview), which you can enable or disable when building your own [custom modes](/en/agent/modes#custom).
There is no limit on the number of tool calls Agent can make during a task. Agent will continue using tools as needed to complete your request.
## Search
Tools used to search your codebase and the web to find relevant information.
Reads up to 250 lines (750 in max mode) of a file.
Read the structure of a directory without reading file contents.
Perform semantic searches within your [indexed
codebase](/en/context/codebase-indexing).
Search for exact keywords or patterns within files.
Find files by name using fuzzy matching.
Generate search queries and perform web searches.
Retrieve specific [rules](/en/context/rules) based on type and description.
## Edit
Tools used to make specific edits to your files and codebase.
Suggest edits to files and [apply](/en/agent/apply) them automatically.
Delete files autonomously (can be disabled in settings).
## Run
Chat can interact with your terminal.
Execute terminal commands and monitor output.
By default, Cursor uses the first terminal profile available.
To set your preferred terminal profile:
1. Open Command Palette (`Cmd/Ctrl+Shift+P`)
2. Search for "Terminal: Select Default Profile"
3. Choose your desired profile
## MCP
Chat can use configured MCP servers to interact with external services, such as databases or 3rd party APIs.
Toggle available MCP servers. Respects auto-run configuration.
Learn more about [Model Context Protocol](/en/context/model-context-protocol) and explore available servers in the [MCP directory](/en/tools).
## Advanced options
Automatically apply edits without manual confirmation.
Automatically execute terminal commands and accept edits. Useful for running test suites and verifying changes.
Configure allow lists to specify which tools can execute automatically. Allow lists provide better security by explicitly defining permitted operations.
Automatically resolve linter errors and warnings when encountered by Agent.
# Background Agents
Source: https://docs.cursor.com/en/background-agent
Asynchronous remote agents in Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
With background agents, spawn asynchronous agents that edit and run code in a remote environment. View their status, send follow-ups, or take over anytime.
## How to Use
You can access background agents in two ways:
1. **Background Agent Sidebar**: Use the background agent tab in the native Cursor sidebar to view all background agents associated with your account, search existing agents, and start new ones.
2. **Background Agent Mode**: Hit Cmd E to trigger background agent mode in the UI.
After submitting a prompt, select your agent from the list to view status and enter the machine.
Background agents require data retention on the order of a few days.
## Setup
Background agents run in an isolated ubuntu-based machine by default. Agents have internet access and can install packages.
#### GitHub connection
Background agents clone your repo from GitHub and work on a separate branch, pushing to your repo for easy handoff.
Grant read-write privileges to your repo (and any dependent repos or submodules). We'll support other providers (GitLab, BitBucket, etc) in the future.
##### IP Allow List Configuration
If your organization uses GitHub's IP allow list feature, you'll need to configure access for background agents. See the [GitHub integration documentation](/en/integrations/github#ip-allow-list-configuration) for complete setup instructions including contact information and IP addresses.
#### Base Environment Setup
For advanced cases, set up the environment yourself. Get an IDE instance connected to the remote machine. Set up your machine, install tools and packages, then take a snapshot. Configure runtime settings:
* Install command runs before an agent starts and installs runtime dependencies. This might mean running `npm install` or `bazel build`.
* Terminals run background processes while the agent works - like starting a web server or compiling protobuf files.
For the most advanced cases, use a Dockerfile for machine setup. The dockerfile lets you set up system-level dependencies: install specific compiler versions, debuggers, or switch the base OS image. Don't `COPY` the entire project - we manage the workspace and check out the correct commit. Still handle dependency installation in the install script.
Enter any required secrets for your dev environment - they're stored encrypted-at-rest (using KMS) in our database and provided in the background agent environment.
The machine setup lives in `.cursor/environment.json`, which can be committed in your repo (recommended) or stored privately. The setup flow guides you through creating `environment.json`.
#### Maintenance Commands
When setting up a new machine, we start from the base environment, then run the `install` command from your `environment.json`. This command is what a developer would run when switching branches - install any new dependencies.
For most people, the `install` command is `npm install` or `bazel build`.
To ensure fast machine startup, we cache disk state after the `install` command runs. Design it to run multiple times. Only disk state persists from the `install` command - processes started here won't be alive when the agent starts.
#### Startup Commands
After running `install`, the machine starts and we run the `start` command followed by starting any `terminals`. This starts processes that should be alive when the agent runs.
The `start` command can often be skipped. Use it if your dev environment relies on docker - put `sudo service docker start` in the `start` command.
`terminals` are for app code. These terminals run in a `tmux` session available to you and the agent. For example, many website repos put `npm run watch` as a terminal.
#### The `environment.json` Spec
The `environment.json` file can look like:
```json theme={null}
{
"snapshot": "POPULATED_FROM_SETTINGS",
"install": "npm install",
"terminals": [
{
"name": "Run Next.js",
"command": "npm run dev"
}
]
}
```
Formally, the spec is [defined here](https://www.cursor.com/schemas/environment.schema.json).
## Models
Only [Max Mode](/en/context/max-mode)-compatible models are available for background agents.
## Pricing
Learn more about [Background Agent pricing](/en/account/pricing#background-agent).
## Security
Background Agents are available in Privacy Mode. We never train on your code and only retain code for running the agent. [Learn more about Privacy mode](https://www.cursor.com/privacy-overview).
What you should know:
1. Grant read-write privileges to our GitHub app for repos you want to edit. We use this to clone the repo and make changes.
2. Your code runs inside our AWS infrastructure in isolated VMs and is stored on VM disks while the agent is accessible.
3. The agent has internet access.
4. The agent auto-runs all terminal commands, letting it iterate on tests. This differs from the foreground agent, which requires user approval for every command. Auto-running introduces data exfiltration risk: attackers could execute prompt injection attacks, tricking the agent to upload code to malicious websites. See [OpenAI's explanation about risks of prompt injection for background agents](https://platform.openai.com/docs/codex/agent-network#risks-of-agent-internet-access).
5. If privacy mode is disabled, we collect prompts and dev environments to improve the product.
6. If you disable privacy mode when starting a background agent, then enable it during the agent's run, the agent continues with privacy mode disabled until it completes.
## Dashboard settings
Workspace admins can configure additional settings from the Background Agents tab on the dashboard.
### Defaults Settings
* **Default model** – the model used when a run does not specify one. Pick any model that supports Max Mode.
* **Default repository** – when empty, agents ask the user to choose a repo. Supplying a repo here lets users skip that step.
* **Base branch** – the branch agents fork from when creating pull requests. Leave blank to use the repository’s default branch.
### Security Settings
All security options require admin privileges.
* **User restrictions** – choose *None* (all members can start background agents) or *Allow list*. When set to *Allow list* you specify exactly which teammates can create agents.
* **Team follow-ups** – when on, anyone in the workspace can add follow-up messages to an agent someone else started. Turn it off to restrict follow-ups to the agent owner and admins.
* **Display agent summary** – controls whether Cursor shows the agent’s file-diff images and code snippets. Disable this if you prefer not to expose file paths or code in the sidebar.
* **Display agent summary in external channels** – extends the previous toggle to Slack or any external channel you’ve connected.
Changes save instantly and affect new agents immediately.
# Add Follow-up
Source: https://docs.cursor.com/en/background-agent/api/add-followup
en/background-agent/api/openapi.yaml post /v0/agents/{id}/followup
Send an additional instruction to a running background agent.
# Agent Conversation
Source: https://docs.cursor.com/en/background-agent/api/agent-conversation
en/background-agent/api/openapi.yaml get /v0/agents/{id}/conversation
Retrieve the conversation history of a background agent.
If the background agent has been deleted, you cannot access the conversation.
# Agent Status
Source: https://docs.cursor.com/en/background-agent/api/agent-status
en/background-agent/api/openapi.yaml get /v0/agents/{id}
Get the current status and results of a specific background agent.
# API Key Info
Source: https://docs.cursor.com/en/background-agent/api/api-key-info
en/background-agent/api/openapi.yaml get /v0/me
Retrieve metadata about the API key used for authentication.
# Delete an Agent
Source: https://docs.cursor.com/en/background-agent/api/delete-agent
en/background-agent/api/openapi.yaml delete /v0/agents/{id}
Permanently delete a background agent and its associated resources.
# Launch an Agent
Source: https://docs.cursor.com/en/background-agent/api/launch-an-agent
en/background-agent/api/openapi.yaml post /v0/agents
Start a new background agent to work on your repository.
# List Agents
Source: https://docs.cursor.com/en/background-agent/api/list-agents
en/background-agent/api/openapi.yaml get /v0/agents
Retrieve a paginated list of all background agents for the authenticated user.
# List Models
Source: https://docs.cursor.com/en/background-agent/api/list-models
en/background-agent/api/openapi.yaml get /v0/models
Retrieve a list of recommended models for background agents.
If you want to provide the background agent's model during creation, you can use this endpoint to see a list of recommended models.
In that case, we also recommend having an "Auto" option, in which you would not provide a model name to the creation endpoint,
and we will pick the most appropriate model.
# List GitHub Repositories
Source: https://docs.cursor.com/en/background-agent/api/list-repositories
en/background-agent/api/openapi.yaml get /v0/repositories
Retrieve a list of GitHub repositories accessible to the authenticated user.
**This endpoint has very strict rate limits.**
Limit requests to **1 / user / minute**, and **30 / user / hour.**
This request can take tens of seconds to respond for users with access to many repositories.
Make sure to handle this information not being available gracefully.
# Overview
Source: https://docs.cursor.com/en/background-agent/api/overview
Programmatically create and manage background agents that work on your repositories
# Background Agents API
Beta
The Background Agents API allows you to programmatically create and manage AI-powered coding agents that work autonomously on your repositories.
You can use the API to automatically respond to user feedback, fix bugs, update docs, and much more!
Background Agents API is currently in beta, we'd love your feedback on it!
## Key features
* **Autonomous code generation** - Create agents that can understand your prompt and make changes to your codebase
* **Repository integration** - Work directly with GitHub repositories
* Follow-up prompts - Add additional instructions to running agents
* **Usage-based pricing** - Pay only for the tokens you use
* **Scalable** - Support for up to 256 active agents per API key
## Quick start
### 1. Get your API key
**Navigate** to [Cursor Dashboard → Integrations](https://cursor.com/dashboard?tab=integrations) to create your API key.
### 2. Start using the API
All API endpoints are relative to:
```
https://api.cursor.com
```
See the [API reference](/en/background-agent/api/launch-an-agent) for a detailed list of endpoints.
## Authentication
All API requests require authentication using a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
API keys are created in the [Cursor Dashboard](https://cursor.com/dashboard?tab=integrations). Keys are scoped to your account and grant permission to create and manage agents (subject to your plan limits and repository access).
## Pricing
The API is currently in beta with the same pricing as Background Agents. Pricing may change as we scale the service. See [Background Agent pricing](/en/account/pricing#background-agent).
## Next steps
* Read the main [Background Agents overview](/en/background-agent) to understand environments, permissions, and workflows.
* Try Background Agents from [web & mobile](/en/background-agent/web-and-mobile).
* Join the discussion in [Discord #background-agent](https://discord.gg/jfgpZtYpmb) or email [background-agent-feedback@cursor.com](mailto:background-agent-feedback@cursor.com).
# Webhooks
Source: https://docs.cursor.com/en/background-agent/api/webhooks
Receive real-time notifications about background agent status changes
# Webhooks
When you create an agent with a webhook URL, Cursor will send HTTP POST requests to notify you about status changes. Currently, only `statusChange` events are supported, specifically when an agent encounters an `ERROR` or `FINISHED` state.
## Webhook verification
To ensure the webhook requests are authentically from Cursor, verify the signature included with each request:
### Headers
Each webhook request includes the following headers:
* **`X-Webhook-Signature`** – Contains the HMAC-SHA256 signature in the format `sha256=`
* **`X-Webhook-ID`** – A unique identifier for this delivery (useful for logging)
* **`X-Webhook-Event`** – The event type (currently only `statusChange`)
* **`User-Agent`** – Always set to `Cursor-Agent-Webhook/1.0`
### Signature verification
To verify the webhook signature, compute the expected signature and compare it with the received signature:
```javascript theme={null}
const crypto = require('crypto');
function verifyWebhook(secret, rawBody, signature) {
const expectedSignature = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return signature === expectedSignature;
}
```
```python theme={null}
import hmac
import hashlib
def verify_webhook(secret, raw_body, signature):
expected_signature = 'sha256=' + hmac.new(
secret.encode(),
raw_body,
hashlib.sha256
).hexdigest()
return signature == expected_signature
```
Always use the raw request body (before any parsing) when computing the signature.
## Payload format
The webhook payload is sent as JSON with the following structure:
```json theme={null}
{
"event": "statusChange",
"timestamp": "2024-01-15T10:30:00Z",
"id": "bc_abc123",
"status": "FINISHED",
"source": {
"repository": "https://github.com/your-org/your-repo",
"ref": "main"
},
"target": {
"url": "https://cursor.com/agents?id=bc_abc123",
"branchName": "cursor/add-readme-1234",
"prUrl": "https://github.com/your-org/your-repo/pull/1234"
},
"summary": "Added README.md with installation instructions"
}
```
Note that some fields are optional and will only be included when available.
## Best practices
* **Verify signatures** – Always verify the webhook signature to ensure the request is from Cursor
* **Handle retries** – Webhooks may be retried if your endpoint returns an error status code
* **Return quickly** – Return a 2xx status code as soon as possible
* **Use HTTPS** – Always use HTTPS URLs for webhook endpoints in production
* **Store raw payloads** – Store the raw webhook payload for debugging and future verification
# Web & Mobile
Source: https://docs.cursor.com/en/background-agent/web-and-mobile
Run coding agents from any device with seamless handoff to desktop
## Overview
Cursor's Agent on web brings a powerful coding assistant to every device. Whether you're on your phone during a walk, or working in your web browser, you can now kick off powerful coding agents that work in the background.
When they're done, pick up their work inside Cursor, review and merge changes, or share links with your team to collaborate.
Get started at [cursor.com/agents](https://cursor.com/agents).
## Getting started
### Quick setup
1. **Visit the web app**: Go to [cursor.com/agents](https://cursor.com/agents) on any device
2. **Sign in**: Log in with your Cursor account
3. **Connect GitHub**: Link your GitHub account to access repositories
4. **Start your first agent**: Type in a task and watch the agent get to work
### Mobile installation
For the best mobile experience, install Cursor as a Progressive Web App (PWA):
* **iOS**: Open [cursor.com/agents](https://cursor.com/agents) in Safari, tap the share button, then "Add to Home Screen"
* **Android**: Open the URL in Chrome, tap the menu, then "Add to Home Screen" or "Install App"
Installing as a PWA provides a native-feeling experience with: - Full-screen
interface - Faster startup times - App icon on your home screen
## Working across devices
The Web and Mobile Agent is designed to work with your desktop workflow; click "Open in Cursor" to continue the agent's work in your IDE.
### Team collaboration
* **Shared access**: Share links with team members to collaborate on agent runs.
* **Review process**: Collaborators can review diffs and provide feedback.
* **Pull request management**: Create, review, and merge pull requests directly from the web interface.
### Slack integration
Trigger agents directly from Slack by mentioning `@Cursor`, and when starting agents from web or mobile, opt to receive Slack notifications upon completion.
Learn more about setting up and using the Slack integration, including
triggering agents and receiving notifications.
## Pricing
Web & mobile agents use the same pricing model as Background Agents.
Learn more about [Background Agent pricing](/en/account/pricing#background-agent).
## Troubleshooting
* Ensure you're logged in and have connected your GitHub account. - Check
that you have the necessary repository permissions - You will also need to
be on a Pro Trial or paid plan with usage based pricing enabled. To enable
usage based pricing, go to your
[Dashboard](https://www.cursor.com/dashboard?tab=settings) settings tab.
Try refreshing the page or clearing your browser cache. Ensure you're using
the same account across devices.
Verify that your workspace admin has installed the Cursor Slack app and that
you have the proper permissions.
# Bugbot
Source: https://docs.cursor.com/en/bugbot
AI code review for pull requests
Bugbot reviews pull requests and identifies bugs, security issues, and code quality problems.
Bugbot includes a free tier: every user gets a limited number of free PR reviews each month. When you reach the limit, reviews pause until your next billing cycle. You can upgrade anytime to a 14‑day free Pro trial for unlimited reviews (subject to standard abuse guardrails).
## How it works
Bugbot analyzes PR diffs and leaves comments with explanations and fix suggestions. It runs automatically on each PR update or manually when triggered.
* Runs **automatic reviews** on every PR update
* **Manual trigger** by commenting `cursor review` or `bugbot run` on any PR
* **Fix in Cursor** links open issues directly in Cursor
* **Fix in Web** links open issues directly in [cursor.com/agents](https://cursor.com/agents)
## Setup
Requires Cursor admin access and GitHub org admin access.
1. Go to [cursor.com/dashboard](https://cursor.com/dashboard?tab=bugbot)
2. Navigate to the Bugbot tab
3. Click `Connect GitHub` (or `Manage Connections` if already connected)
4. Follow the GitHub installation flow
5. Return to the dashboard to enable Bugbot on specific repositories
## Configuration
### Repository settings
Enable or disable Bugbot per repository from your installations list. Bugbot runs only on PRs you author.
### Personal settings
* Run **only when mentioned** by commenting `cursor review` or `bugbot run`
* Run **only once** per PR, skipping subsequent commits
### Repository settings
Team admins can enable Bugbot per repository, configure allow/deny lists for reviewers, and set:
* Run **only once** per PR per installation, skipping subsequent commits
* **Disable inline reviews** to prevent Bugbot from leaving comments directly on code lines
Bugbot runs for all contributors to enabled repositories, regardless of team membership.
### Personal settings
Team members can override settings for their own PRs:
* Run **only when mentioned** by commenting `cursor review` or `bugbot run`
* Run **only once** per PR, skipping subsequent commits
* **Enable reviews on draft PRs** to include draft pull requests in automatic reviews
### Analytics
## Rules
Create `.cursor/BUGBOT.md` files to provide project-specific context for reviews. Bugbot always includes the root `.cursor/BUGBOT.md` file and any additional files found while traversing upward from changed files.
```
project/
.cursor/BUGBOT.md # Always included (project-wide rules)
backend/
.cursor/BUGBOT.md # Included when reviewing backend files
api/
.cursor/BUGBOT.md # Included when reviewing API files
frontend/
.cursor/BUGBOT.md # Included when reviewing frontend files
```
```markdown theme={null}
# Project review guidelines
## Security focus areas
- Validate user input in API endpoints
- Check for SQL injection vulnerabilities in database queries
- Ensure proper authentication on protected routes
## Architecture patterns
- Use dependency injection for services
- Follow the repository pattern for data access
- Implement proper error handling with custom error classes
## Common issues
- Memory leaks in React components (check useEffect cleanup)
- Missing error boundaries in UI components
- Inconsistent naming conventions (use camelCase for functions)
```
## Pricing
Bugbot offers two tiers: **Free** and **Pro**.
### Free tier
Every user gets a limited number of free PR reviews each month. For teams, each team member gets their own free reviews. When you reach the limit, reviews pause until your next billing cycle. You can upgrade anytime to the 14‑day free Pro trial for unlimited reviews.
### Pro tier
### Flat rate
\$40 per month for unlimited Bugbot reviews on up to 200 PRs per month across all repositories.
### Getting started
Subscribe through your account settings.
### Per-user billing
Teams pay \$40 per user per month for unlimited reviews.
We count a user as someone who authored PRs reviewed by Bugbot in a month.
All licenses are relinquished at the start of each billing cycle, and will be assigned out on a first-come, first-served basis. If a user doesn't author any PRs reviewed by Bugbot in a month, the seat can be used by another user.
### Seat limits
Team admins can set maximum Bugbot seats per month to control costs.
### Getting started
Subscribe through your team dashboard to enable billing.
### Abuse guardrails
In order to prevent abuse, we have a pooled cap of 200 pull requests per month for every Bugbot license. If you need more than 200 pull requests per month, please contact us at [hi@cursor.com](mailto:hi@cursor.com) and we'll be happy to help you out.
For example, if your team has 100 users, your organization will initially be able to review 20,000 pull requests per month. If you reach that limit naturally, please reach out to us and we'll be happy to increase the limit.
## Troubleshooting
If Bugbot isn't working:
1. **Enable verbose mode** by commenting `cursor review verbose=true` or `bugbot run verbose=true` for detailed logs and request ID
2. **Check permissions** to verify Bugbot has repository access
3. **Verify installation** to confirm the GitHub app is installed and enabled
Include the request ID from verbose mode when reporting issues.
## FAQ
Yes, Bugbot follows the same privacy compliance as Cursor and processes data identically to other Cursor requests.
When you reach your monthly free tier limit, Bugbot reviews pause until your next billing cycle. You can upgrade to the 14‑day free Pro trial for unlimited reviews (subject to standard abuse guardrails).
```
```
# Code Review
Source: https://docs.cursor.com/en/cli/cookbook/code-review
Build a GitHub Actions workflow that uses Cursor CLI to automatically review pull requests and provide feedback
This tutorial shows you how to set up code review using Cursor CLI in GitHub Actions. The workflow will analyze pull requests, identify issues, and post feedback as comments.
For most users, we recommend using [Bugbot](/en/bugbot) instead. Bugbot provides managed automated code review with no setup required. This CLI approach is useful to explore capabilities and for advanced customization.
```yaml cursor-code-review.yml theme={null}
name: Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
pull-requests: write
contents: read
issues: write
jobs:
code-review:
runs-on: ubuntu-latest
# Skip automated code review for draft PRs
if: github.event.pull_request.draft == false
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Perform automated code review
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BLOCKING_REVIEW: ${{ vars.BLOCKING_REVIEW || 'false' }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print 'You are operating in a GitHub Actions runner performing automated code review. The gh CLI is available and authenticated via GH_TOKEN. You may comment on pull requests.
Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
- Blocking Review: ${{ env.BLOCKING_REVIEW }}
Objectives:
1) Re-check existing review comments and reply resolved when addressed.
2) Review the current PR diff and flag only clear, high-severity issues.
3) Leave very short inline comments (1-2 sentences) on changed lines only and a brief summary at the end.
Procedure:
- Get existing comments: gh pr view --json comments
- Get diff: gh pr diff
- Get changed files with patches to compute inline positions: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --paginate --jq '.[] | {filename,patch}'
- Compute exact inline anchors for each issue (file path + diff position). Comments MUST be placed inline on the changed line in the diff, not as top-level comments.
- Detect prior top-level "no issues" style comments authored by this bot (match bodies like: "✅ no issues", "No issues found", "LGTM").
- If CURRENT run finds issues and any prior "no issues" comments exist:
- Prefer to remove them to avoid confusion:
- Try deleting top-level issue comments via: gh api -X DELETE repos/${{ github.repository }}/issues/comments/
- If deletion isn't possible, minimize them via GraphQL (minimizeComment) or edit to prefix "[Superseded by new findings]".
- If neither delete nor minimize is possible, reply to that comment: "⚠️ Superseded: issues were found in newer commits".
- If a previously reported issue appears fixed by nearby changes, reply: ✅ This issue appears to be resolved by the recent changes
- Analyze ONLY for:
- Null/undefined dereferences
- Resource leaks (unclosed files or connections)
- Injection (SQL/XSS)
- Concurrency/race conditions
- Missing error handling for critical operations
- Obvious logic errors with incorrect behavior
- Clear performance anti-patterns with measurable impact
- Definitive security vulnerabilities
- Avoid duplicates: skip if similar feedback already exists on or near the same lines.
Commenting rules:
- Max 10 inline comments total; prioritize the most critical issues
- One issue per comment; place on the exact changed line
- All issue comments MUST be inline (anchored to a file and line/position in the PR diff)
- Natural tone, specific and actionable; do not mention automated or high-confidence
- Use emojis: 🚨 Critical 🔒 Security ⚡ Performance ⚠️ Logic ✅ Resolved ✨ Improvement
Submission:
- If there are NO issues to report and an existing top-level comment indicating "no issues" already exists (e.g., "✅ no issues", "No issues found", "LGTM"), do NOT submit another comment. Skip submission to avoid redundancy.
- If there are NO issues to report and NO prior "no issues" comment exists, submit one brief summary comment noting no issues.
- If there ARE issues to report and a prior "no issues" comment exists, ensure that prior comment is deleted/minimized/marked as superseded before submitting the new review.
- If there ARE issues to report, submit ONE review containing ONLY inline comments plus an optional concise summary body. Use the GitHub Reviews API to ensure comments are inline:
- Build a JSON array of comments like: [{ "path": "", "position": , "body": "..." }]
- Submit via: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews -f event=COMMENT -f body="$SUMMARY" -f comments='[$COMMENTS_JSON]'
- Do NOT use: gh pr review --approve or --request-changes
Blocking behavior:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
'
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
## Configure authentication
[Set up your API key and repository secrets](/en/cli/github-actions#authentication) to authenticate Cursor CLI in GitHub Actions.
## Set up agent permissions
Create a configuration file to control what actions the agent can perform. This prevents unintended operations like pushing code or creating pull requests.
Create `.cursor/cli.json` in your repository root:
```json theme={null}
{
"permissions": {
"deny": [
"Shell(git push)",
"Shell(gh pr create)",
"Write(**)"
]
}
}
```
This configuration allows the agent to read files and use the GitHub CLI for comments, but prevents it from making changes to your repository. See the [permissions reference](/en/cli/reference/permissions) for more configuration options.
## Build the GitHub Actions workflow
Now let's build the workflow step by step.
### Set up the workflow trigger
Create `.github/workflows/cursor-code-review.yml` and configure it to run on pull requests:
```yaml theme={null}
name: Cursor Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
```
### Checkout the repository
Add the checkout step to access the pull request code:
```yaml theme={null}
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
```
### Install Cursor CLI
Add the CLI installation step:
```yaml theme={null}
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
```
### Configure the review agent
Before implementing the full review step, let's understand the anatomy of our review prompt. This section outlines how we want the agent to behave:
**Objective**:
We want the agent to review the current PR diff and flag only clear, high-severity issues, then leave very short inline comments (1-2 sentences) on changed lines only with a brief summary at the end. This keeps the signal-to-noise ratio balanced.
**Format**:
We want comments that are short and to the point. We use emojis to make scanning comments easier, and we want a high-level summary of the full review at the end.
**Submission**:
When the review is done, we want the agent to include a short comment based on what was found during the review. The agent should submit one review containing inline comments plus a concise summary.
**Edge cases**:
We need to handle:
* Existing comments being resolved: The agent should mark them as done when addressed
* Avoid duplicates: The agent should skip commenting if similar feedback already exists on or near the same lines
**Final prompt**:
The complete prompt combines all these behavioral requirements to create focused, actionable feedback
Now let's implement the review agent step:
```yaml theme={null}
- name: Perform code review
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ github.token }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print "You are operating in a GitHub Actions runner performing automated code review. The gh CLI is available and authenticated via GH_TOKEN. You may comment on pull requests.
Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
Objectives:
1) Re-check existing review comments and reply resolved when addressed
2) Review the current PR diff and flag only clear, high-severity issues
3) Leave very short inline comments (1-2 sentences) on changed lines only and a brief summary at the end
Procedure:
- Get existing comments: gh pr view --json comments
- Get diff: gh pr diff
- If a previously reported issue appears fixed by nearby changes, reply: ✅ This issue appears to be resolved by the recent changes
- Avoid duplicates: skip if similar feedback already exists on or near the same lines
Commenting rules:
- Max 10 inline comments total; prioritize the most critical issues
- One issue per comment; place on the exact changed line
- Natural tone, specific and actionable; do not mention automated or high-confidence
- Use emojis: 🚨 Critical 🔒 Security ⚡ Performance ⚠️ Logic ✅ Resolved ✨ Improvement
Submission:
- Submit one review containing inline comments plus a concise summary
- Use only: gh pr review --comment
- Do not use: gh pr review --approve or --request-changes"
```
```text theme={null}
.
├── .cursor/
│ └── cli.json
├── .github/
│ └── workflows/
│ └── cursor-code-review.yml
```
## Test your reviewer
Create a test pull request to verify the workflow works and the agent posts review comments with emoji feedback.
## Next steps
You now have a working automated code review system. Consider these enhancements:
* Set up additional workflows for [fixing CI failures](/en/cli/cookbook/fix-ci)
* Configure different review levels for different branches
* Integrate with your team's existing code review process
* Customize the agent's behavior for different file types or directories
You can configure the workflow to fail if critical issues are found, preventing the pull request from being merged until addressed.
**Add blocking behavior to the prompt**
First, update your review agent step to include the `BLOCKING_REVIEW` environment variable and add this blocking behavior to the prompt:
```
Blocking behavior:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
```
**Add the blocking check step**
Then add this new step after your code review step:
```yaml theme={null}
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
# Fix CI Failures
Source: https://docs.cursor.com/en/cli/cookbook/fix-ci
Fix CI issues for a repository by using Cursor CLI in GitHub Actions
Fix CI failures using Cursor CLI in GitHub Actions. This workflow analyzes failures, makes targeted fixes, and creates a fix branch with a quick-create PR link.
This workflow monitors a specific workflow by name. Update the `workflows` list to match your actual CI workflow name.
```yaml auto-fix-ci.yml theme={null}
name: Fix CI Failures
on:
workflow_run:
workflows: [Test]
types: [completed]
permissions:
contents: write
pull-requests: write
actions: read
jobs:
attempt-fix:
if: >-
${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.name != 'Fix CI Failures' }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Fix CI failure
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: ci-fix
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- Workflow Run ID: ${{ github.event.workflow_run.id }}
- Workflow Run URL: ${{ github.event.workflow_run.html_url }}
- Fix Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end CI fix flow driven by the failing PR, creating a separate persistent fix branch and proposing a quick-create PR back into the original PR's branch.
# Requirements:
1) Identify the PR associated with the failed workflow run and determine its base and head branches. Let HEAD_REF be the PR's head branch (the contributor/origin branch).
2) Maintain a persistent fix branch for this PR head using the Fix Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
3) Attempt to resolve the CI failure by making minimal, targeted edits consistent with the repo's style. Keep changes scoped and safe.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the CI fix and includes an inline compare link to quick-create a PR.
# Inputs and conventions:
- Use `gh api`, `gh run view`, `gh pr view`, `gh pr diff`, `gh pr list`, `gh run download`, and git commands as needed to discover the failing PR and branches.
- Avoid duplicate comments; if a previous bot comment exists, update it instead of posting a new one.
- If no actionable fix is possible, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent fix branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above.
" --force --model "$MODEL" --output-format=text
```
# Secret Audit
Source: https://docs.cursor.com/en/cli/cookbook/secret-audit
Audit secrets for a repository by using Cursor CLI in GitHub Actions
Audit your repository for security vulnerabilities and secrets exposure using Cursor CLI. This workflow scans for potential secrets, detects risky workflow patterns, and proposes security fixes.
```yaml auto-secret-audit.yml theme={null}
name: Secrets Audit
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
actions: read
jobs:
secrets-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Scan and propose hardening
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: audit
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Hardening Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Perform a repository secrets exposure and workflow hardening audit on a schedule, and propose minimal safe fixes.
# Requirements:
1) Scan for potential secrets in tracked files and recent history; support allowlist patterns if present (e.g., .gitleaks.toml).
2) Detect risky workflow patterns: unpinned actions, overbroad permissions, unsafe pull_request_target usage, secrets in forked PR contexts, deprecated insecure commands, missing permissions blocks.
3) Maintain a persistent branch for this run using the Hardening Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) Propose minimal edits: redact literals where safe, add ignore rules, pin actions to SHA, reduce permissions, add guardrails to workflows, and add a SECURITY_LOG.md summarizing changes and remediation guidance.
5) Push to origin.
6) If there is at least one open PR in the repo, post or update a single natural-language comment (1–2 sentences) on the most recently updated open PR that briefly explains the hardening changes and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update an existing bot comment if present. If no changes or no open PRs, post nothing.
# Inputs and conventions:
- Use `gh` to list PRs and to post comments. Avoid duplicate comments.
# Deliverables when updates occur:
- Pushed commits to the persistent hardening branch for this run.
- A single natural-language PR comment with the compare link above (only if an open PR exists).
" --force --model "$MODEL" --output-format=text
```
# Translate Keys
Source: https://docs.cursor.com/en/cli/cookbook/translate-keys
Translate keys for a repository by using Cursor CLI in GitHub Actions
Manage translation keys for internationalization using Cursor CLI. This workflow detects new or changed i18n keys in pull requests and fills missing translations without overwriting existing ones.
```yaml auto-translate-keys.yml theme={null}
name: Translate Keys
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
i18n:
if: ${{ !startsWith(github.head_ref, 'translate/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Propose i18n updates
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: translate
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- Head Ref: ${{ github.head_ref }}
- Translate Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Detect i18n keys added or changed in the PR and fill only missing locales in message files. Never overwrite existing translations.
# Requirements:
1) Determine changed keys by inspecting the PR diff (source files and messages files).
2) Compute missing keys per locale using the source/canonical locale as truth.
3) Add entries only for missing keys. Preserve all existing values untouched.
4) Validate JSON formatting and schemas.
5) Maintain a persistent translate branch for this PR head using the Translate Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
6) Post or update a single PR comment on the original PR written in natural language (1–2 sentences) that briefly explains what was updated and why, and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update a previous bot comment if present.
8) If no changes are necessary, make no commits and post no comment.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes.
# Deliverables when updates occur:
- Pushed commits to the persistent translate branch for this PR head.
- A single natural-language PR comment on the original PR with the compare link above.
" --force --model "$MODEL" --output-format=text
```
# Update Docs
Source: https://docs.cursor.com/en/cli/cookbook/update-docs
Update docs for a repository by using Cursor CLI in GitHub Actions
Update documentation using Cursor CLI in GitHub Actions. Two approaches: full agent autonomy or deterministic workflow with agent-only file modifications.
```yaml auto-update-docs.yml theme={null}
name: Update Docs
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Update docs
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
- Docs Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end docs update flow driven by incremental changes to the original PR.
# Requirements:
1) Determine what changed in the original PR and, if there have been multiple pushes, compute the incremental diffs since the last successful docs update.
2) Update only the relevant docs based on those incremental changes.
3) Maintain the persistent docs branch for this PR head using the Docs Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the docs updates and includes an inline compare link to quick-create a PR
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes and derive incremental ranges since the last docs update.
- Do not attempt to create or edit PRs directly. Use the compare link format above.
- Keep changes minimal and consistent with repo style. If no doc updates are necessary, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent docs branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above. Avoid posting duplicates; update a previous bot comment if present.
" --force --model "$MODEL" --output-format=text
```
```yaml auto-update-docs-deterministic.yml theme={null}
name: Update Docs
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Generate docs updates (no commit/push/comment)
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available.
IMPORTANT: Do NOT create branches, commit, push, or post PR comments. Only modify files in the working directory as needed. A later workflow step is responsible for publishing changes and commenting on the PR.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
# Goal:
- Update repository documentation based on incremental changes introduced by this PR.
# Requirements:
1) Determine what changed in the original PR (use `gh pr diff` and git history as needed). If an existing persistent docs branch `${{ env.BRANCH_PREFIX }}/${{ github.head_ref }}` exists, you may use it as a read-only reference point to understand prior updates.
2) Update only the relevant docs based on those changes. Keep edits minimal and consistent with repo style.
3) Do NOT commit, push, create branches, or post PR comments. Leave the working tree with updated files only; a later step will publish.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes and focus documentation edits accordingly.
- If no doc updates are necessary, make no changes and produce no output.
# Deliverables when updates occur:
- Modified documentation files in the working directory only (no commits/pushes/comments).
" --force --model "$MODEL" --output-format=text
- name: Publish docs branch
id: publish_docs
env:
BRANCH_PREFIX: docs
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
echo "changes_published=false" >> "$GITHUB_OUTPUT"
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
# Ensure we are on a local branch that we can push
git fetch origin --prune
# Create/switch to the persistent docs branch, keeping current working tree changes
git checkout -B "$DOCS_BRANCH"
# Stage and detect changes
git add -A
if git diff --staged --quiet; then
echo "No docs changes to publish. Skipping commit/push."
exit 0
fi
COMMIT_MSG="docs: update for PR #${PR_NUMBER} (${HEAD_REF} @ $(git rev-parse --short HEAD))"
git commit -m "$COMMIT_MSG"
git push --set-upstream origin "$DOCS_BRANCH"
echo "changes_published=true" >> "$GITHUB_OUTPUT"
- name: Post or update PR comment
if: steps.publish_docs.outputs.changes_published == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
COMPARE_URL="https://github.com/${REPO}/compare/${BASE_REF}...${DOCS_BRANCH}?quick_pull=1&title=docs%3A+updates+for+PR+%23${PR_NUMBER}"
COMMENT_FILE="${RUNNER_TEMP}/auto-docs-comment.md"
{
echo "Cursor updated docs branch: \`${DOCS_BRANCH}\`"
echo "You can now [view the diff and quick-create a PR to merge these docs updates](${COMPARE_URL})."
echo
echo "_This comment will be updated on subsequent runs as the PR changes._"
echo
echo ""
} > "$COMMENT_FILE"
# If editing the last bot comment fails (older gh), fall back to creating a new comment
if gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE" --edit-last; then
echo "Updated existing PR comment."
else
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "Posted new PR comment."
fi
```
# GitHub Actions
Source: https://docs.cursor.com/en/cli/github-actions
Learn how to use Cursor CLI in GitHub Actions and other continuous integration systems
Use Cursor CLI in GitHub Actions and other CI/CD systems to automate development tasks.
## GitHub Actions integration
Basic setup:
```yaml theme={null}
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Run Cursor Agent
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
run: |
cursor-agent -p "Your prompt here" --model gpt-5
```
## Cookbook examples
See our cookbook examples for practical workflows: [updating documentation](/en/cli/cookbook/update-docs) and [fixing CI issues](/en/cli/cookbook/fix-ci).
## Other CI systems
Use Cursor CLI in any CI/CD system with:
* **Shell script execution** (bash, zsh, etc.)
* **Environment variables** for API key configuration
* **Internet connectivity** to reach Cursor's API
## Autonomy levels
Choose your agent's autonomy level:
### Full autonomy approach
Give the agent complete control over git operations, API calls, and external interactions. Simpler setup, requires more trust.
**Example:** In our [Update Documentation](/en/cli/cookbook/update-docs) cookbook, the first workflow lets the agent:
* Analyze PR changes
* Create and manage git branches
* Commit and push changes
* Post comments on pull requests
* Handle all error scenarios
```yaml theme={null}
- name: Update docs (full autonomy)
run: |
cursor-agent -p "You have full access to git, GitHub CLI, and PR operations.
Handle the entire docs update workflow including commits, pushes, and PR comments."
```
### Restricted autonomy approach
We recommend using this approach with **permission-based restrictions** for production CI workflows. This gives you the best of both worlds: the agent can intelligently handle complex analysis and file modifications while critical operations remain deterministic and auditable.
Limit agent operations while handling critical steps in separate workflow steps. Better control and predictability.
**Example:** The second workflow in the same cookbook restricts the agent to only file modifications:
```yaml theme={null}
- name: Generate docs updates (restricted)
run: |
cursor-agent -p "IMPORTANT: Do NOT create branches, commit, push, or post PR comments.
Only modify files in the working directory. A later workflow step handles publishing."
- name: Publish docs branch (deterministic)
run: |
# Deterministic git operations handled by CI
git checkout -B "docs/${{ github.head_ref }}"
git add -A
git commit -m "docs: update for PR"
git push origin "docs/${{ github.head_ref }}"
- name: Post PR comment (deterministic)
run: |
# Deterministic PR commenting handled by CI
gh pr comment ${{ github.event.pull_request.number }} --body "Docs updated"
```
### Permission-based restrictions
Use [permission configurations](/en/cli/reference/permissions) to enforce restrictions at the CLI level:
```json theme={null}
{
"permissions": {
"allow": [
"Read(**/*.md)",
"Write(docs/**/*)",
"Shell(grep)",
"Shell(find)"
],
"deny": [
"Shell(git)",
"Shell(gh)",
"Write(.env*)",
"Write(package.json)"
]
}
}
```
## Authentication
### Generate your API key
First, [generate an API key](/en/cli/reference/authentication#api-key-authentication) from your Cursor dashboard.
### Configure repository secrets
Store your Cursor API key securely in your repository:
1. Go to your GitHub repository
2. Click **Settings** → **Secrets and variables** → **Actions**
3. Click **New repository secret**
4. Name it `CURSOR_API_KEY`
5. Paste your API key as the value
6. Click **Add secret**
### Use in workflows
Set your `CURSOR_API_KEY` environment variable:
```yaml theme={null}
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
```
# Using Headless CLI
Source: https://docs.cursor.com/en/cli/headless
Learn how to write scripts using Cursor CLI for automated code analysis, generation, and modification
Use Cursor CLI in scripts and automation workflows for code analysis, generation, and refactoring tasks.
## How it works
Use [print mode](/en/cli/using#non-interactive-mode) (`-p, --print`) for non-interactive scripting and automation.
### File modification in scripts
Combine `--print` with `--force` to modify files in scripts:
```bash theme={null}
# Enable file modifications in print mode
cursor-agent -p --force "Refactor this code to use modern ES6+ syntax"
# Without --force, changes are only proposed, not applied
cursor-agent -p "Add JSDoc comments to this file" # Won't modify files
# Batch processing with actual file changes
find src/ -name "*.js" | while read file; do
cursor-agent -p --force "Add comprehensive JSDoc comments to $file"
done
```
The `--force` flag allows the agent to make direct file changes without confirmation
## Setup
See [Installation](/en/cli/installation) and [Authentication](/en/cli/reference/authentication) for complete setup details.
```bash theme={null}
# Install Cursor CLI
curl https://cursor.com/install -fsS | bash
# Set API key for scripts
export CURSOR_API_KEY=your_api_key_here
cursor-agent -p "Analyze this code"
```
## Example scripts
Use different output formats for different script needs. See [Output format](/en/cli/reference/output-format) for details.
### Searching the codebase
Use `--output-format text` for readable responses:
```bash theme={null}
#!/bin/bash
# Simple codebase question
cursor-agent -p --output-format text "What does this codebase do?"
```
### Automated code review
Use `--output-format json` for structured analysis:
```bash theme={null}
#!/bin/bash
# simple-code-review.sh - Basic code review script
echo "Starting code review..."
# Review recent changes
cursor-agent -p --force --output-format text \
"Review the recent code changes and provide feedback on:
- Code quality and readability
- Potential bugs or issues
- Security considerations
- Best practices compliance
Provide specific suggestions for improvement and write to review.txt"
if [ $? -eq 0 ]; then
echo "✅ Code review completed successfully"
else
echo "❌ Code review failed"
exit 1
fi
```
### Real-time progress tracking
Use `--output-format stream-json` for real-time progress tracking:
```bash theme={null}
#!/bin/bash
# stream-progress.sh - Track progress in real-time
echo "🚀 Starting stream processing..."
# Track progress in real-time
accumulated_text=""
tool_count=0
start_time=$(date +%s)
cursor-agent -p --force --output-format stream-json \
"Analyze this project structure and create a summary report in analysis.txt" | \
while IFS= read -r line; do
type=$(echo "$line" | jq -r '.type // empty')
subtype=$(echo "$line" | jq -r '.subtype // empty')
case "$type" in
"system")
if [ "$subtype" = "init" ]; then
model=$(echo "$line" | jq -r '.model // "unknown"')
echo "🤖 Using model: $model"
fi
;;
"assistant")
# Accumulate streaming text deltas
content=$(echo "$line" | jq -r '.message.content[0].text // empty')
accumulated_text="$accumulated_text$content"
# Show live progress
printf "\r📝 Generating: %d chars" ${#accumulated_text}
;;
"tool_call")
if [ "$subtype" = "started" ]; then
tool_count=$((tool_count + 1))
# Extract tool information
if echo "$line" | jq -e '.tool_call.writeToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.writeToolCall.args.path // "unknown"')
echo -e "\n🔧 Tool #$tool_count: Creating $path"
elif echo "$line" | jq -e '.tool_call.readToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.readToolCall.args.path // "unknown"')
echo -e "\n📖 Tool #$tool_count: Reading $path"
fi
elif [ "$subtype" = "completed" ]; then
# Extract and show tool results
if echo "$line" | jq -e '.tool_call.writeToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.linesCreated // 0')
size=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.fileSize // 0')
echo " ✅ Created $lines lines ($size bytes)"
elif echo "$line" | jq -e '.tool_call.readToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.readToolCall.result.success.totalLines // 0')
echo " ✅ Read $lines lines"
fi
fi
;;
"result")
duration=$(echo "$line" | jq -r '.duration_ms // 0')
end_time=$(date +%s)
total_time=$((end_time - start_time))
echo -e "\n\n🎯 Completed in ${duration}ms (${total_time}s total)"
echo "📊 Final stats: $tool_count tools, ${#accumulated_text} chars generated"
;;
esac
done
```
# Installation
Source: https://docs.cursor.com/en/cli/installation
Install and update Cursor CLI
## Installation
### macOS, Linux and Windows (WSL)
Install Cursor CLI with a single command:
```bash theme={null}
curl https://cursor.com/install -fsS | bash
```
### Verification
After installation, verify that Cursor CLI is working correctly:
```bash theme={null}
cursor-agent --version
```
## Post-installation setup
1. **Add \~/.local/bin to your PATH:**
For bash:
```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
For zsh:
```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
2. **Start using Cursor Agent:**
```bash theme={null}
cursor-agent
```
## Updates
Cursor CLI will try to auto-update by default to ensure you always have the latest version.
To manually update Cursor CLI to the latest version:
```bash theme={null}
cursor-agent update
# or
cursor-agent upgrade
```
Both commands will update Cursor Agent to the latest version.
# MCP
Source: https://docs.cursor.com/en/cli/mcp
Use MCP servers with cursor-agent to connect external tools and data sources
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Overview
The Cursor CLI supports [Model Context Protocol (MCP)](/en/context/mcp) servers, allowing you to connect external tools and data sources to `cursor-agent`. **MCP in the CLI uses the same configuration as the editor** - any MCP servers you've configured will work seamlessly with both.
New to MCP? Read the complete guide on configuration, authentication, and available servers
## CLI commands
Use the `cursor-agent mcp` command to manage MCP servers:
### List configured servers
View all configured MCP servers and their current status:
```bash theme={null}
cursor-agent mcp list
```
This shows:
* Server names and identifiers
* Connection status (connected/disconnected)
* Configuration source (project or global)
* Transport method (stdio, HTTP, SSE)
### List available tools
View tools provided by a specific MCP server:
```bash theme={null}
cursor-agent mcp list-tools
```
This displays:
* Tool names and descriptions
* Required and optional parameters
* Parameter types and constraints
### Login to MCP server
Authenticate with an MCP server configured in your `mcp.json`:
```bash theme={null}
cursor-agent mcp login
```
### Disable MCP server
Remove an MCP server from the local approved list:
```bash theme={null}
cursor-agent mcp disable
```
## Using MCP with Agent
Once you have MCP servers configured (see the [main MCP guide](/en/context/mcp) for setup), `cursor-agent` automatically discovers and uses available tools when relevant to your requests.
```bash theme={null}
# Check what MCP servers are available
cursor-agent mcp list
# See what tools a specific server provides
cursor-agent mcp list-tools playwright
# Use cursor-agent - it automatically uses MCP tools when helpful
cursor-agent --prompt "Navigate to google.com and take a screenshot of the search page"
```
The CLI follows the same configuration precedence as the editor (project → global → nested), automatically discovering configurations from parent directories.
## Related
Complete MCP guide: setup, configuration, and authentication
Browse pre-built MCP servers you can use
# Cursor CLI
Source: https://docs.cursor.com/en/cli/overview
Get started with Cursor CLI to code in your terminal
Cursor CLI lets you interact with AI agents directly from your terminal to write, review, and modify code. Whether you prefer an interactive terminal interface or print automation for scripts and CI pipelines, the CLI provides powerful coding assistance right where you work.
```bash theme={null}
# Install
curl https://cursor.com/install -fsS | bash
# Run interactive session
cursor-agent
```
Cursor CLI is currently in beta, we'd love your feedback on it!
### Interactive mode
Start a conversational session with the agent to describe your goals, review proposed changes, and approve commands:
```bash theme={null}
# Start interactive session
cursor-agent
# Start with initial prompt
cursor-agent "refactor the auth module to use JWT tokens"
```
### Non-interactive mode
Use print mode for non-interactive scenarios like scripts, CI pipelines, or automation:
```bash theme={null}
# Run with specific prompt and model
cursor-agent -p "find and fix performance issues" --model "gpt-5"
# Use with git changes included for review
cursor-agent -p "review these changes for security issues" --output-format text
```
### Sessions
Resume previous conversations to maintain context across multiple interactions:
```bash theme={null}
# List all previous chats
cursor-agent ls
# Resume latest conversation
cursor-agent resume
# Resume specific conversation
cursor-agent --resume="chat-id-here"
```
# Authentication
Source: https://docs.cursor.com/en/cli/reference/authentication
Authenticate Cursor CLI using browser flow or API keys
Cursor CLI supports two authentication methods: browser-based login (recommended) and API keys.
## Browser authentication (recommended)
Use the browser flow for the easiest authentication experience:
```bash theme={null}
# Log in using browser flow
cursor-agent login
# Check authentication status
cursor-agent status
# Log out and clear stored authentication
cursor-agent logout
```
The login command will open your default browser and prompt you to authenticate with your Cursor account. Once completed, your credentials are securely stored locally.
## API key authentication
For automation, scripts, or CI/CD environments, use API key authentication:
### Step 1: Generate an API key
Generate an API key in your Cursor dashboard under Integrations > User API Keys.
### Step 2: Set the API key
You can provide the API key in two ways:
**Option 1: Environment variable (recommended)**
```bash theme={null}
export CURSOR_API_KEY=your_api_key_here
cursor-agent "implement user authentication"
```
**Option 2: Command line flag**
```bash theme={null}
cursor-agent --api-key your_api_key_here "implement user authentication"
```
## Authentication status
Check your current authentication status:
```bash theme={null}
cursor-agent status
```
This command will display:
* Whether you're authenticated
* Your account information
* Current endpoint configuration
## Troubleshooting
* **"Not authenticated" errors:** Run `cursor-agent login` or ensure your API key is correctly set
* **SSL certificate errors:** Use the `--insecure` flag for development environments
* **Endpoint issues:** Use the `--endpoint` flag to specify a custom API endpoint
# Configuration
Source: https://docs.cursor.com/en/cli/reference/configuration
Agent CLI configuration reference for cli-config.json
Configure the Agent CLI using the `cli-config.json` file.
## File location
| Type | Platform | Path |
| :------ | :---------- | :----------------------------------------- |
| Global | macOS/Linux | `~/.cursor/cli-config.json` |
| Global | Windows | `$env:USERPROFILE\.cursor\cli-config.json` |
| Project | All | `/.cursor/cli.json` |
Only permissions can be configured at the project level. All other CLI settings must be set globally.
Override with environment variables:
* **`CURSOR_CONFIG_DIR`**: custom directory path
* **`XDG_CONFIG_HOME`** (Linux/BSD): uses `$XDG_CONFIG_HOME/cursor/cli-config.json`
## Schema
### Required fields
| Field | Type | Description |
| :------------------ | :-------- | :---------------------------------------------------------------------- |
| `version` | number | Config schema version (current: `1`) |
| `editor.vimMode` | boolean | Enable Vim keybindings (default: `false`) |
| `permissions.allow` | string\[] | Permitted operations (see [Permissions](/en/cli/reference/permissions)) |
| `permissions.deny` | string\[] | Forbidden operations (see [Permissions](/en/cli/reference/permissions)) |
### Optional fields
| Field | Type | Description |
| :----------------------- | :------ | :------------------------------ |
| `model` | object | Selected model configuration |
| `hasChangedDefaultModel` | boolean | CLI-managed model override flag |
## Examples
### Minimal config
```json theme={null}
{
"version": 1,
"editor": { "vimMode": false },
"permissions": { "allow": ["Shell(ls)"], "deny": [] }
}
```
### Enable Vim mode
```json theme={null}
{
"version": 1,
"editor": { "vimMode": true },
"permissions": { "allow": ["Shell(ls)"], "deny": [] }
}
```
### Configure permissions
```json theme={null}
{
"version": 1,
"editor": { "vimMode": false },
"permissions": {
"allow": ["Shell(ls)", "Shell(echo)"],
"deny": ["Shell(rm)"]
}
}
```
See [Permissions](/en/cli/reference/permissions) for available permission types and examples.
## Troubleshooting
**Config errors**: Move the file aside and restart:
```bash theme={null}
mv ~/.cursor/cli-config.json ~/.cursor/cli-config.json.bad
```
**Changes don't persist**: Ensure valid JSON and write permissions. Some fields are CLI-managed and may be overwritten.
## Notes
* Pure JSON format (no comments)
* CLI performs self-repair for missing fields
* Corrupted files are backed up as `.bad` and recreated
* Permission entries are exact strings (see [Permissions](/en/cli/reference/permissions) for details)
# Output format
Source: https://docs.cursor.com/en/cli/reference/output-format
Output schema for text, JSON and stream-JSON formats
The Cursor Agent CLI provides multiple output formats with the `--output-format` option when combined with `--print`. These formats include structured formats for programmatic use (`json`, `stream-json`) and a simplified text format for human-readable progress tracking.
The default `--output-format` is `stream-json`. This option is only valid when printing (`--print`) or when print mode is inferred (non-TTY stdout or piped stdin).
## JSON format
The `json` output format emits a single JSON object (followed by a newline) when the run completes successfully. Deltas and tool events are not emitted; text is aggregated into the final result.
On failure, the process exits with a non-zero code and writes an error message to stderr. No well-formed JSON object is emitted in failure cases.
### Success response
When successful, the CLI outputs a JSON object with the following structure:
```json theme={null}
{
"type": "result",
"subtype": "success",
"is_error": false,
"duration_ms": 1234,
"duration_api_ms": 1234,
"result": "",
"session_id": "",
"request_id": ""
}
```
| Field | Description |
| ----------------- | ------------------------------------------------------------------- |
| `type` | Always `"result"` for terminal results |
| `subtype` | Always `"success"` for successful completions |
| `is_error` | Always `false` for successful responses |
| `duration_ms` | Total execution time in milliseconds |
| `duration_api_ms` | API request time in milliseconds (currently equal to `duration_ms`) |
| `result` | Complete assistant response text (concatenation of all text deltas) |
| `session_id` | Unique session identifier |
| `request_id` | Optional request identifier (may be omitted) |
## Stream JSON format
The `stream-json` output format emits newline-delimited JSON (NDJSON). Each line contains a single JSON object representing a real-time event during execution.
The stream ends with a terminal `result` event on success. On failure, the process exits with a non-zero code and the stream may end early without a terminal event; an error message is written to stderr.
### Event types
#### System initialization
Emitted once at the beginning of each session:
```json theme={null}
{
"type": "system",
"subtype": "init",
"apiKeySource": "env|flag|login",
"cwd": "/absolute/path",
"session_id": "",
"model": "",
"permissionMode": "default"
}
```
Future fields like `tools` and `mcp_servers` may be added to this event.
#### User message
Contains the user's input prompt:
```json theme={null}
{
"type": "user",
"message": {
"role": "user",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
#### Assistant text delta
Emitted multiple times as the assistant generates its response. These events contain incremental text chunks:
```json theme={null}
{
"type": "assistant",
"message": {
"role": "assistant",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
Concatenate all `message.content[].text` values in order to reconstruct the complete assistant response.
#### Tool call events
Tool calls are tracked with start and completion events:
**Tool call started:**
```json theme={null}
{
"type": "tool_call",
"subtype": "started",
"call_id": "",
"tool_call": {
"readToolCall": {
"args": { "path": "file.txt" }
}
},
"session_id": ""
}
```
**Tool call completed:**
```json theme={null}
{
"type": "tool_call",
"subtype": "completed",
"call_id": "",
"tool_call": {
"readToolCall": {
"args": { "path": "file.txt" },
"result": {
"success": {
"content": "file contents...",
"isEmpty": false,
"exceededLimit": false,
"totalLines": 54,
"totalChars": 1254
}
}
}
},
"session_id": ""
}
```
#### Tool call types
**Read file tool:**
* **Started**: `tool_call.readToolCall.args` contains `{ "path": "file.txt" }`
* **Completed**: `tool_call.readToolCall.result.success` contains file metadata and content
**Write file tool:**
* **Started**: `tool_call.writeToolCall.args` contains `{ "path": "file.txt", "fileText": "content...", "toolCallId": "id" }`
* **Completed**: `tool_call.writeToolCall.result.success` contains `{ "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }`
**Other tools:**
* May use `tool_call.function` structure with `{ "name": "tool_name", "arguments": "..." }`
#### Terminal result
The final event emitted on successful completion:
```json theme={null}
{
"type": "result",
"subtype": "success",
"duration_ms": 1234,
"duration_api_ms": 1234,
"is_error": false,
"result": "",
"session_id": "",
"request_id": ""
}
```
### Example sequence
Here's a representative NDJSON sequence showing the typical flow of events:
```json theme={null}
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Read README.md and create a summary"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"I'll "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"read the README.md file"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Project\n\nThis is a sample project...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":" and create a summary"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"I'll read the README.md file and create a summary","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}
```
## Text format
The `text` output format provides a simplified, human-readable stream of agent actions. Instead of detailed JSON events, it outputs concise text descriptions of what the agent is doing in real-time.
This format is useful for monitoring agent progress without the overhead of parsing structured data, making it ideal for logging, debugging, or simple progress tracking.
### Example output
```
Read file
Edited file
Ran terminal command
Created new file
```
Each action appears on a new line as the agent performs it, providing immediate feedback on the agent's progress through the task.
## Implementation notes
* Each event is emitted as a single line terminated by `\n`
* `thinking` events are suppressed in print mode and will not appear in either output format
* Field additions may occur over time in a backward-compatible way (consumers should ignore unknown fields)
* The stream format provides real-time updates, while the JSON format waits for completion before outputting results
* Concatenate all `assistant` message deltas to reconstruct the complete response
* Tool call IDs can be used to correlate start/completion events
* Session IDs remain consistent throughout a single agent execution
# Parameters
Source: https://docs.cursor.com/en/cli/reference/parameters
Complete command reference for Cursor Agent CLI
## Global options
Global options can be used with any command:
| Option | Description |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `-v, --version` | Output the version number |
| `-a, --api-key ` | API key for authentication (can also use `CURSOR_API_KEY` env var) |
| `-p, --print` | Print responses to console (for scripts or non-interactive use). Has access to all tools, including write and bash. |
| `--output-format ` | Output format (only works with `--print`): `text`, `json`, or `stream-json` (default: `stream-json`) |
| `-b, --background` | Start in background mode (open composer picker on launch) |
| `--fullscreen` | Enable fullscreen mode |
| `--resume [chatId]` | Resume a chat session |
| `-m, --model ` | Model to use |
| `-f, --force` | Force allow commands unless explicitly denied |
| `-h, --help` | Display help for command |
## Commands
| Command | Description | Usage |
| ----------------- | ----------------------------------------- | ----------------------------------------------- |
| `login` | Authenticate with Cursor | `cursor-agent login` |
| `logout` | Sign out and clear stored authentication | `cursor-agent logout` |
| `status` | Check authentication status | `cursor-agent status` |
| `mcp` | Manage MCP servers | `cursor-agent mcp` |
| `update\|upgrade` | Update Cursor Agent to the latest version | `cursor-agent update` or `cursor-agent upgrade` |
| `ls` | Resume a chat session | `cursor-agent ls` |
| `resume` | Resume the latest chat session | `cursor-agent resume` |
| `help [command]` | Display help for command | `cursor-agent help [command]` |
When no command is specified, Cursor Agent starts in interactive chat mode by default.
## MCP
Manage MCP servers configured for Cursor Agent.
| Subcommand | Description | Usage |
| ------------------------- | ---------------------------------------------------------------- | ------------------------------------------ |
| `login ` | Authenticate with an MCP server configured in `.cursor/mcp.json` | `cursor-agent mcp login ` |
| `list` | List configured MCP servers and their status | `cursor-agent mcp list` |
| `list-tools ` | List available tools and their argument names for a specific MCP | `cursor-agent mcp list-tools ` |
All MCP commands support `-h, --help` for command-specific help.
## Arguments
When starting in chat mode (default behavior), you can provide an initial prompt:
**Arguments:**
* `prompt` — Initial prompt for the agent
## Getting help
All commands support the global `-h, --help` option to display command-specific help.
# Permissions
Source: https://docs.cursor.com/en/cli/reference/permissions
Permission types for controlling agent access to files and commands
Configure what the agent is allowed to do using permission tokens in your CLI configuration. Permissions are set in `~/.cursor/cli-config.json` (global) or `/.cursor/cli.json` (project-specific).
## Permission types
### Shell commands
**Format:** `Shell(commandBase)`
Controls access to shell commands. The `commandBase` is the first token in the command line.
### File writes
**Format:** `Write(pathOrGlob)`
Controls write access to files and directories. Supports glob patterns. When using in print mode, `--force` is required to write files.
## Configuration
Add permissions to the `permissions` object in your CLI configuration file:
```json theme={null}
{
"permissions": {
"allow": [
"Shell(ls)",
"Shell(git)",
"Read(src/**/*.ts)",
"Write(package.json)"
],
"deny": [
"Shell(rm)",
"Read(.env*)",
"Write(**/*.key)"
]
}
}
```
## Pattern matching
* Glob patterns use `**`, `*`, and `?` wildcards
* Relative paths are scoped to the current workspace
* Absolute paths can target files outside the project
* Deny rules take precedence over allow rules
# Slash commands
Source: https://docs.cursor.com/en/cli/reference/slash-commands
Quick actions available within Cursor CLI sessions
| Command | Description |
| --------------------- | --------------------------------------------------- |
| `/model ` | Set or list models |
| `/auto-run [state]` | Toggle auto-run (default) or set \[on\|off\|status] |
| `/new-chat` | Start a new chat session |
| `/vim` | Toggle Vim keys |
| `/help [command]` | Show help (/help \[cmd]) |
| `/feedback ` | Share feedback with the team |
| `/resume ` | Resume a previous chat by folder name |
| `/copy-req-id` | Copy last request ID |
| `/logout` | Sign out from Cursor |
| `/quit` | Exit |
# Shell Mode
Source: https://docs.cursor.com/en/cli/shell-mode
Run shell commands directly from the CLI without leaving your conversation
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Shell Mode runs shell commands directly from the CLI without leaving your conversation. Use it for quick, non-interactive commands with safety checks and output displayed in the conversation.
## Command execution
Commands run in your login shell (`$SHELL`) with the CLI's working directory and environment. Chain commands to run in other directories:
```bash theme={null}
cd subdir && npm test
```
## Output
Command output showing header with exit code, stdout/stderr display, and truncation controls
Large outputs are truncated automatically and long-running processes timeout to maintain performance.
## Limitations
* Commands timeout after 30 seconds
* Long-running processes, servers, and interactive prompts are not supported
* Use short, non-interactive commands for best results
## Permissions
Commands are checked against your permissions and team settings before execution. See [Permissions](/en/cli/reference/permissions) for detailed configuration.
Decision banner showing approval options: Run, Reject/Propose, Add to allowlist, and Auto-run
Admin policies may block certain commands, and commands with redirection cannot be allowlisted inline.
## Usage guidelines
Shell Mode works well for status checks, quick builds, file operations, and environment inspection.
Avoid long-running servers, interactive applications, and commands requiring input.
Each command runs independently - use `cd && ...` to run commands in other directories.
## Troubleshooting
* If a command hangs, cancel with Ctrl+C and add non-interactive flags
* When prompted for permissions, approve once or add to allowlist with Tab
* For truncated output, use Ctrl+O to expand
* To run in different directories, use `cd && ...` since changes don't persist
* Shell Mode supports zsh and bash from your `$SHELL` variable
## FAQ
No. Each command runs independently. Use `cd && ...` to run commands in different directories.
No. Commands are limited to 30 seconds and this is not configurable.
Permissions are managed by CLI and team configuration. Use the decision banner to add commands to allowlists.
Press Escape when the input is empty, Backspace/Delete on empty input, or Ctrl+C to clear and exit.
# Using Agent in CLI
Source: https://docs.cursor.com/en/cli/using
Prompt, review, and iterate effectively with Cursor CLI
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Prompting
Stating intent clearly is recommended for the best results. For example, you can use the prompt "do not write any code" to ensure that the agent won't edit any files. This is generally helpful when planning tasks before implementing them.
Agent currently has tools for file operations, searching, and running shell commands. More tools are being added, similar to the IDE agent.
## MCP
Agent supports [MCP (Model Context Protocol)](/en/tools/mcp) for extended functionality and integrations. The CLI will automatically detect and respect your `mcp.json` configuration file, enabling the same MCP servers and tools that you've configured for the IDE.
## Rules
The CLI agent supports the same [rules system](/en/context/rules) as the IDE. You can create rules in the `.cursor/rules` directory to provide context and guidance to the agent. These rules will be automatically loaded and applied based on their configuration, allowing you to customize the agent's behavior for different parts of your project or specific file types.
The CLI also reads `AGENTS.md` and `CLAUDE.md` at the project root (if present) and applies them as rules alongside `.cursor/rules`.
## Working with Agent
### Navigation
Previous messages can be accessed using arrow up (ArrowUp) where you can cycle through them.
### Review
Review changes with Cmd+R. Press i to add follow-up instructions. Use ArrowUp/ArrowDown to scroll, and ArrowLeft/ArrowRight to switch files.
### Selecting context
Select files and folders to include in context with @. Free up space in the context window by running `/compress`. See [Summarization](/en/agent/chat/summarization) for details.
## History
Continue from an existing thread with `--resume [thread id]` to load prior context.
To resume the most recent conversation, use `cursor-agent resume`.
You can also run `cursor-agent ls` to see a list of previous conversations.
## Command approval
Before running terminal commands, CLI will ask you to approve (y) or reject (n) execution.
## Non-interactive mode
Use `-p` or `--print` to run Agent in non-interactive mode. This will print the response to the console.
With non-interactive mode, you can invoke Agent in a non-interactive way. This allows you to integrate it in scripts, CI pipelines, etc.
You can combine this with `--output-format` to control how the output is formatted. For example, use `--output-format json` for structured output that's easier to parse in scripts, or `--output-format text` for plain text output.
Cursor has full write access in non-interactive mode.
# Keyboard Shortcuts
Source: https://docs.cursor.com/en/configuration/kbd
Keyboard shortcuts and keybindings in Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Overview of keyboard shortcuts in Cursor. See all keyboard shortcuts by pressing Cmd R then Cmd S or by opening command palette Cmd Shift P and searching for `Keyboard Shortcuts`.
Learn more about Keyboard Shortcuts in Cursor with [Key Bindings for VS Code](https://code.visualstudio.com/docs/getstarted/keybindings) as a baseline for Cursor's keybindings.
All Cursor keybindings, including Cursor-specific features, can be remapped in Keyboard Shortcuts settings.
## General
| Shortcut | Action |
| ---------------------- | --------------------------------------- |
| Cmd I | Toggle Sidepanel (unless bound to mode) |
| Cmd L | Toggle Sidepanel (unless bound to mode) |
| Cmd E | Background Agent control panel |
| Cmd . | Mode Menu |
| Cmd / | Loop between AI models |
| Cmd Shift J | Cursor settings |
| Cmd , | General settings |
| Cmd Shift P | Command palette |
## Chat
Shortcuts for the chat input box.
| Shortcut | Action |
| ---------------------------------------------------- | ---------------------------- |
| Return | Nudge (default) |
| Ctrl Return | Queue message |
| Cmd Return when typing | Force send message |
| Cmd Shift Backspace | Cancel generation |
| Cmd Shift L with code selected | Add selected code as context |
| Cmd V with code or log in clipboard | Add clipboard as context |
| Cmd Shift V with code or log in clipboard | Add clipboard to input box |
| Cmd Return with suggested changes | Accept all changes |
| Cmd Backspace | Reject all changes |
| Tab | Cycle to next message |
| Shift Tab | Cycle to previous message |
| Cmd Opt / | Model toggle |
| Cmd N / Cmd R | New chat |
| Cmd T | New chat tab |
| Cmd \[ | Previous chat |
| Cmd ] | Next chat |
| Cmd W | Close chat |
| Escape | Unfocus field |
| Shortcut | Action |
| --------------------- | ------------------------ |
| Cmd K | Open terminal prompt bar |
| Cmd Return | Run generated command |
| Escape | Accept command |
# Shell Commands
Source: https://docs.cursor.com/en/configuration/shell
Install and use Cursor shell commands
Cursor provides command-line tools to open files and folders from your terminal. Install both the `cursor` and `code` commands to integrate Cursor with your development workflow.
## Installing CLI commands
Install the CLI commands through the Command Palette:
1. Open the Command Palette (Cmd/Ctrl + P)
2. Type "Install" to filter installation commands
3. Select and run `Install 'cursor' to shell`
4. Repeat and select `Install 'code' to shell`
Command Palette showing CLI installation options
## Using the CLI commands
After installation, use either command to open files or folders in Cursor:
```bash theme={null}
# Using the cursor command
cursor path/to/file.js
cursor path/to/folder/
# Using the code command (VS Code compatible)
code path/to/file.js
code path/to/folder/
```
## Command options
Both commands support these options:
* Open a file: `cursor file.js`
* Open a folder: `cursor ./my-project`
* Open multiple items: `cursor file1.js file2.js folder1/`
* Open in a new window: `cursor -n` or `cursor --new-window`
* Wait for the window to close: `cursor -w` or `cursor --wait`
## FAQ
They're identical. The `code` command is provided for VS Code compatibility.
No, install either or both based on preference.
Commands are installed in your system's default shell configuration file (e.g., `.bashrc`, `.zshrc`, or `.config/fish/config.fish`).
# Themes
Source: https://docs.cursor.com/en/configuration/themes
Customize the appearance of Cursor
Cursor supports both light and dark themes for your coding environment. Cursor inherits VS Code's theming capabilities - use any VS Code theme, create custom themes, and install theme extensions from the marketplace.
## Changing theme
1. Open the Command Palette (Cmd/Ctrl + P)
2. Type "theme" to filter commands
3. Select "Preferences: Color Theme"
4. Choose a theme
## FAQ
Yes! Cursor is compatible with VS Code themes. Install any VS Code marketplace theme or copy custom theme files.
Create custom themes like in VS Code. Use "Developer: Generate Color Theme From Current Settings" to start from current settings, or follow the VS Code theme authoring guide.
# @Code
Source: https://docs.cursor.com/en/context/@-symbols/@-code
Reference specific code snippets in Cursor using @Code
Reference specific code sections using the `@Code` symbol. This provides more granular control than [`@Files & Folders`](/en/context/@-symbols/@-files-and-folders), letting you select precise code snippets instead of entire files.
# @Cursor Rules
Source: https://docs.cursor.com/en/context/@-symbols/@-cursor-rules
Apply project-specific rules and guidelines
The `@Cursor Rules` symbol provides access to [project rules](/en/context/rules) and guidelines you've set up, letting you explicitly apply them to your context.
# @Files & Folders
Source: https://docs.cursor.com/en/context/@-symbols/@-files-and-folders
Reference files and folders as context in Chat and Inline Edit
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Files
Reference entire files in Chat and Inline Edit by selecting `@Files & Folders` followed by the filename to search. You can also drag files from the sidebar directly into Agent to add as context.
## Folders
When referencing folders using `@Folders`, Cursor provides the folder path and overview of its contents to help the AI understand what's available.
After selecting a folder, type `/` to navigate deeper and see all subfolders.
### Full folder content
Enable **Full Folder Content** in settings. When enabled, Cursor attempts to include all files from the folder in the context.
For large folders exceeding the context window, an outline view appears with a tooltip showing how many files were included while Cursor manages the available context space.
Using full folder content with [Max mode enabled](/en/context/max-mode)
significantly increases request costs as more input tokens are consumed.
## Context management
Large files and folders are automatically condensed to fit within context limits. See [file & folder condensation](/en/agent/chats/summarization#file--folder-condensation) for details.
# @Git
Source: https://docs.cursor.com/en/context/@-symbols/@-git
Reference Git changes and branch differences
* `@Commit`: Reference current working state changes compared to the last commit. Shows all modified, added, and deleted files not yet committed.
* `@Branch`: Compare your current branch's changes with the main branch. Shows all commits and changes in your branch but not in main.
# @Link
Source: https://docs.cursor.com/en/context/@-symbols/@-link
Include web content by pasting URLs
When you paste a URL in Chat, Cursor automatically tags it as an `@Link` and fetches the content to use as context. This includes support for PDF documents - Cursor extracts and parses text content from any publicly accessible PDF URL.
## Unlink
To use a URL as plain text without fetching its content:
* Click the tagged link and select `Unlink`
* Or paste while holding `Shift` to prevent automatic tagging
# @Linter Errors
Source: https://docs.cursor.com/en/context/@-symbols/@-linter-errors
Access and reference linting errors in your codebase
`@Linter Errors` symbol automatically captures and provides context about linting errors and warnings from your currently active file. [Agent](/en/agent/overview) can see lint errors by default.
For linter errors to be visible, you need the appropriate language server
installed and configured for your programming language. Cursor automatically
detects and uses installed language servers, but you may need to install
additional extensions or tools for specific languages.
# @Past Chats
Source: https://docs.cursor.com/en/context/@-symbols/@-past-chats
Include summarized chats from history
When working on complex tasks in [Chat](/en/chat), you might need to reference context or decisions from previous conversations. The `@Past Chats` symbol includes summarized versions of previous chats as context.
Particularly useful when:
* You have a long Chat session with important context to reference
* You're starting a new related task and want continuity
* You want to share reasoning or decisions from a previous session
# @Recent Changes
Source: https://docs.cursor.com/en/context/@-symbols/@-recent-changes
Include recently modified code as context
The `@Recent Changes` symbol includes recent code modifications as context in AI conversations.
* Changes are chronologically ordered
* Prioritizes the last 10 changes
* Respects `.cursorignore` settings
# @Web
Source: https://docs.cursor.com/en/context/@-symbols/@-web
Search the web for current information
With `@Web`, Cursor searches the web using [exa.ai](https://exa.ai) to find up-to-date information and add it as context. This includes the ability to parse PDF files from direct links.
Web search is disabled by default. Enable it in Settings → Features → Web
Search.
# Overview
Source: https://docs.cursor.com/en/context/@-symbols/overview
Reference code, files, and documentation using @ symbols
Navigate suggestions using arrow keys. Press `Enter` to select. If the suggestion is a category like `Files`, the suggestions filter to show the most relevant items within that category.
Here's the list of all @ symbols available:
* [@Files](/en/context/@-symbols/@-files) - Reference specific files in your project
* [@Folders](/en/context/@-symbols/@-folders) - Reference entire folders for broader context
* [@Code](/en/context/@-symbols/@-code) - Reference specific code snippets or symbols from your codebase
* [@Docs](/en/context/@-symbols/@-docs) - Access documentation and guides
* [@Git](/en/context/@-symbols/@-git) - Access git history and changes
* [@Past Chats](/en/context/@-symbols/@-past-chats) - Work with summarized composer sessions
* [@Cursor Rules](/en/context/@-symbols/@-cursor-rules) - Work with cursor rules
* [@Web](/en/context/@-symbols/@-web) - Reference external web resources and documentation
* [@Link (paste)](/en/context/@-symbols/@-link) - Create links to specific code or documentation
* [@Recent Changes](/en/context/@-symbols/@-recent-changes) - Create links to specific code or documentation
* [@Lint Errors](/en/context/@-symbols/@-lint-errors) - Reference lint errors ([Chat](/en/chat/overview) only)
* [@Definitions](/en/context/@-symbols/@-definitions) - Look up symbol definitions ([Inline Edit](/en/inline-edit/overview) only)
* [# Files](/en/context/@-symbols/pill-files) - Add files to the context without referencing
* [/ Commands](/en/context/@-symbols/slash-commands) - Add open and active files to the context
# #Files
Source: https://docs.cursor.com/en/context/@-symbols/pill-files
Select specific files using the # prefix
Use `#` followed by a filename to focus on specific files. Combine with `@` symbols for precise context control.
# /command
Source: https://docs.cursor.com/en/context/@-symbols/slash-commands
Quick commands to add files and control context
The `/` command provides quick access to your open editor tabs, letting you add multiple files as context.
## Commands
* **`/Reset Context`**: Resets context to default state
* **`/Generate Cursor Rules`**: Generates rules for Cursor to follow
* **`/Disable Iterate on Lints`**: Will not try to fix linter errors and warnings
* **`/Add Open Files to Context`**: References all editor tabs currently open
* **`/Add Active Files to Context`**: References all editor tabs currently in view (useful with split layouts)
# Codebase Indexing
Source: https://docs.cursor.com/en/context/codebase-indexing
How Cursor learns your codebase for better understanding
Cursor indexes your codebase by computing embeddings for each file. This improves AI-generated answers about your code. When you open a project, Cursor starts indexing automatically. New files are indexed incrementally.
Check indexing status at: `Cursor Settings` > `Indexing & Docs`
## Configuration
Cursor indexes all files except those in [ignore files](/en/context/ignore-files) (e.g. `.gitignore`, `.cursorignore`).
Click `Show Settings` to:
* Enable automatic indexing for new repositories
* Configure which files to ignore
[Ignoring large content files](/en/context/ignore-files) improves answer
accuracy.
### View indexed files
To see indexed file paths: `Cursor Settings` > `Indexing & Docs` > `View included files`
This opens a `.txt` file listing all indexed files.
## Multi-root workspaces
Cursor supports [multi-root workspaces](https://code.visualstudio.com/docs/editor/workspaces#_multiroot-workspaces), letting you work with multiple codebases:
* All codebases get indexed automatically
* Each codebase's context is available to AI
* `.cursor/rules` work in all folders
## PR search
PR search helps you understand your codebase's evolution by making historical changes searchable and accessible through AI.
### How it works
Cursor automatically **indexes all merged PRs** from your repository history. Summaries appear in semantic search results, with smart filtering to prioritize recent changes.
Agent can **fetch PRs, commits, issues, or branches** into context using `@[PR number]`, `@[commit hash]`, or `@[branch name]`. Includes GitHub comments and Bugbot reviews when connected.
**Platform support** includes GitHub, GitHub Enterprise, and Bitbucket. GitLab is not currently supported.
GitHub Enterprise users: The fetch tool falls back to git commands due to
VSCode auth limitations.
### Using PR search
Ask questions like "How are services implemented in other PRs?" and Agent will automatically fetch relevant PRs into context to provide comprehensive answers based on your repository's history.
## FAQ
No global list exists yet. Check each project individually by opening it in
Cursor and checking Codebase Indexing settings.
Delete your Cursor account from Settings to remove all indexed codebases.
Otherwise, delete individual codebases from each project's Codebase Indexing
settings.
Indexed codebases are deleted after 6 weeks of inactivity. Reopening the
project triggers re-indexing.
No. Cursor creates embeddings without storing filenames or source code. Filenames are obfuscated and code chunks are encrypted.
When Agent searches the codebase, Cursor retrieves the embeddings from the server and decrypts the chunks.
# Ignore files
Source: https://docs.cursor.com/en/context/ignore-files
Control file access with .cursorignore and .cursorindexingignore
## Overview
Cursor reads and indexes your project's codebase to power its features. Control which directories and files Cursor can access using a `.cursorignore` file in your root directory.
Cursor blocks access to files listed in `.cursorignore` from:
* Codebase indexing
* Code accessible by [Tab](/en/tab/overview), [Agent](/en/agent/overview), and [Inline Edit](/en/inline-edit/overview)
* Code accessible via [@ symbol references](/en/context/@-symbols/overview)
Tool calls initiated by Agent, like terminal and MCP servers, cannot block
access to code governed by `.cursorignore`
## Why ignore files?
**Security**: Restrict access to API keys, credentials, and secrets. While Cursor blocks ignored files, complete protection isn't guaranteed due to LLM unpredictability.
**Performance**: In large codebases or monorepos, exclude irrelevant portions for faster indexing and more accurate file discovery.
## Global ignore files
Set ignore patterns for all projects in user settings to exclude sensitive files without per-project configuration.
Default patterns include:
* Environment files: `**/.env`, `**/.env.*`
* Credentials: `**/credentials.json`, `**/secrets.json`
* Keys: `**/*.key`, `**/*.pem`, `**/id_rsa`
## Configuring `.cursorignore`
Create a `.cursorignore` file in your root directory using `.gitignore` syntax.
### Pattern examples
```sh theme={null}
config.json # Specific file
dist/ # Directory
*.log # File extension
**/logs # Nested directories
!app/ # Exclude from ignore (negate)
```
### Hierarchical ignore
Enable `Cursor Settings` > `Features` > `Editor` > `Hierarchical Cursor Ignore` to search parent directories for `.cursorignore` files.
**Notes**: Comments start with `#`. Later patterns override earlier ones. Patterns are relative to file location.
## Limit indexing with `.cursorindexingignore`
Use `.cursorindexingignore` to exclude files from indexing only. These files remain accessible to AI features but won't appear in codebase searches.
## Files ignored by default
Cursor automatically ignores files in `.gitignore` and the default ignore list below. Override with `!` prefix in `.cursorignore`.
For indexing only, these files are ignored in addition to files in your `.gitignore`, `.cursorignore` and `.cursorindexingignore`:
```sh theme={null}
package-lock.json
pnpm-lock.yaml
yarn.lock
composer.lock
Gemfile.lock
bun.lockb
.env*
.git/
.svn/
.hg/
*.lock
*.bak
*.tmp
*.bin
*.exe
*.dll
*.so
*.lockb
*.qwoff
*.isl
*.csv
*.pdf
*.doc
*.doc
*.xls
*.xlsx
*.ppt
*.pptx
*.odt
*.ods
*.odp
*.odg
*.odf
*.sxw
*.sxc
*.sxi
*.sxd
*.sdc
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tif
*.mp3
*.wav
*.wma
*.ogg
*.flac
*.aac
*.mp4
*.mov
*.wmv
*.flv
*.avi
*.zip
*.tar
*.gz
*.7z
*.rar
*.tgz
*.dmg
*.iso
*.cue
*.mdf
*.mds
*.vcd
*.toast
*.img
*.apk
*.msi
*.cab
*.tar.gz
*.tar.xz
*.tar.bz2
*.tar.lzma
*.tar.Z
*.tar.sz
*.lzma
*.ttf
*.otf
*.pak
*.woff
*.woff2
*.eot
*.webp
*.vsix
*.rmeta
*.rlib
*.parquet
*.svg
.egg-info/
.venv/
node_modules/
__pycache__/
.next/
.nuxt/
.cache/
.sass-cache/
.gradle/
.DS_Store/
.ipynb_checkpoints/
.pytest_cache/
.mypy_cache/
.tox/
.git/
.hg/
.svn/
.bzr/
.lock-wscript/
.Python/
.jupyter/
.history/
.yarn/
.yarn-cache/
.eslintcache/
.parcel-cache/
.cache-loader/
.nyc_output/
.node_repl_history/
.pnp.js/
.pnp/
```
### Negation pattern limitations
When using negation patterns (prefixed with `!`), you cannot re-include a file if a parent directory is excluded via \*.
```sh theme={null}
# Ignore all files in public folder
public/*
# ✅ This works, as the file exists at the top level
!public/index.html
# ❌ This doesn't work - cannot re-include files from nested directories
!public/assets/style.css
```
**Workaround**: Explicitly exclude nested directories:
```sh theme={null}
public/assets/*
!public/assets/style.css # This file is now accessible
```
Excluded directories are not traversed for performance, so patterns on contained files have no effect.
This matches the .gitignore implementation for negation patterns in nested directories. For more details, see the [official Git documentation on gitignore patterns](https://git-scm.com/docs/gitignore).
## Troubleshooting
Test patterns with `git check-ignore -v [file]`.
# Model Context Protocol (MCP)
Source: https://docs.cursor.com/en/context/mcp
Connect external tools and data sources to Cursor using MCP
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## What is MCP?
[Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) enables Cursor to connect to external tools and data sources.
### Why use MCP?
MCP connects Cursor to external systems and data. Instead of explaining your project structure repeatedly, integrate directly with your tools.
Write MCP servers in any language that can print to `stdout` or serve an HTTP endpoint - Python, JavaScript, Go, etc.
### How it works
MCP servers expose capabilities through the protocol, connecting Cursor to external tools or data sources.
Cursor supports three transport methods:
| Transport | Execution environment | Deployment | Users | Input | Auth |
| :--------------------------------------------------------------- | :-------------------- | :--------------- | :------------- | :---------------------- | :----- |
| **`stdio`** | Local | Cursor manages | Single user | Shell command | Manual |
| **`SSE`** | Local/Remote | Deploy as server | Multiple users | URL to an SSE endpoint | OAuth |
| **`Streamable HTTP`** | Local/Remote | Deploy as server | Multiple users | URL to an HTTP endpoint | OAuth |
### Protocol support
Cursor supports these MCP protocol capabilities:
| Feature | Support | Description |
| :-------------- | :-------- | :------------------------------------------------------------------------- |
| **Tools** | Supported | Functions for the AI model to execute |
| **Prompts** | Supported | Templated messages and workflows for users |
| **Resources** | Supported | Structured data sources that can be read and referenced |
| **Roots** | Supported | Server-initiated inquiries into uri or filesystem boundaries to operate in |
| **Elicitation** | Supported | Server-initiated requests for additional information from users |
## Installing MCP servers
### One-click installation
Install MCP servers from our collection and authenticate with OAuth.
Browse available MCP servers
Create an "Add to Cursor" button
### Using `mcp.json`
Configure custom MCP servers with a JSON file:
```json CLI Server - Node.js theme={null}
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "mcp-server"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json CLI Server - Python theme={null}
{
"mcpServers": {
"server-name": {
"command": "python",
"args": ["mcp-server.py"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json Remote Server theme={null}
// MCP server using HTTP or SSE - runs on a server
{
"mcpServers": {
"server-name": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}
```
### STDIO server configuration
For STDIO servers (local command-line servers), configure these fields in your `mcp.json`:
| Field | Required | Description | Examples |
| :---------- | :------- | :------------------------------------------------------------------------------------------------------ | :---------------------------------------- |
| **type** | Yes | Server connection type | `"stdio"` |
| **command** | Yes | Command to start the server executable. Must be available on your system path or contain its full path. | `"npx"`, `"node"`, `"python"`, `"docker"` |
| **args** | No | Array of arguments passed to the command | `["server.py", "--port", "3000"]` |
| **env** | No | Environment variables for the server | `{"API_KEY": "${input:api-key}"}` |
| **envFile** | No | Path to an environment file to load more variables | `".env"`, `"${workspaceFolder}/.env"` |
### Using the Extension API
For programmatic MCP server registration, Cursor provides an extension API that allows dynamic configuration without modifying `mcp.json` files. This is particularly useful for enterprise environments and automated setup workflows.
Learn how to register MCP servers programmatically using `vscode.cursor.mcp.registerServer()`
### Configuration locations
Create `.cursor/mcp.json` in your project for project-specific tools.
Create `~/.cursor/mcp.json` in your home directory for tools available everywhere.
### Config interpolation
Use variables in `mcp.json` values. Cursor resolves variables in these fields: `command`, `args`, `env`, `url`, and `headers`.
Supported syntax:
* `${env:NAME}` environment variables
* `${userHome}` path to your home folder
* `${workspaceFolder}` project root (the folder that contains `.cursor/mcp.json`)
* `${workspaceFolderBasename}` name of the project root
* `${pathSeparator}` and `${/}` OS path separator
Examples
```json theme={null}
{
"mcpServers": {
"local-server": {
"command": "python",
"args": ["${workspaceFolder}/tools/mcp_server.py"],
"env": {
"API_KEY": "${env:API_KEY}"
}
}
}
}
```
```json theme={null}
{
"mcpServers": {
"remote-server": {
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${env:MY_SERVICE_TOKEN}"
}
}
}
}
```
### Authentication
MCP servers use environment variables for authentication. Pass API keys and tokens through the config.
Cursor supports OAuth for servers that require it.
## Using MCP in chat
The Composer Agent automatically uses MCP tools listed under `Available Tools` when relevant. Ask for a specific tool by name or describe what you need. Enable or disable tools from settings.
### Toggling tools
Enable or disable MCP tools directly from the chat interface. Click a tool name in the tools list to toggle it. Disabled tools won't be loaded into context or available to Agent.
### Tool approval
Agent asks for approval before using MCP tools by default. Click the arrow next to the tool name to see arguments.
#### Auto-run
Enable auto-run for Agent to use MCP tools without asking. Works like terminal commands. Read more about Auto-run settings [here](/en/agent/tools#auto-run).
### Tool response
Cursor shows the response in chat with expandable views of arguments and responses:
### Images as context
MCP servers can return images - screenshots, diagrams, etc. Return them as base64 encoded strings:
```js theme={null}
const RED_CIRCLE_BASE64 = "/9j/4AAQSkZJRgABAgEASABIAAD/2w...";
// ^ full base64 clipped for readability
server.tool("generate_image", async (params) => {
return {
content: [
{
type: "image",
data: RED_CIRCLE_BASE64,
mimeType: "image/jpeg",
},
],
};
});
```
See this [example server](https://github.com/msfeldstein/mcp-test-servers/blob/main/src/image-server.js) for implementation details. Cursor attaches returned images to the chat. If the model supports images, it analyzes them.
## Security considerations
When installing MCP servers, consider these security practices:
* **Verify the source**: Only install MCP servers from trusted developers and repositories
* **Review permissions**: Check what data and APIs the server will access
* **Limit API keys**: Use restricted API keys with minimal required permissions
* **Audit code**: For critical integrations, review the server's source code
Remember that MCP servers can access external services and execute code on your behalf. Always understand what a server does before installation.
## Real-world examples
For practical examples of MCP in action, see our [Web Development guide](/en/guides/tutorials/web-development) which demonstrates integrating Linear, Figma, and browser tools into your development workflow.
## FAQ
MCP servers connect Cursor to external tools like Google Drive, Notion, and
other services to bring docs and requirements into your coding workflow.
{" "}
View MCP logs by: 1. Open the Output panel in Cursor (Cmd+Shift+U)
2\. Select "MCP Logs" from the dropdown 3. Check for connection errors,
authentication issues, or server crashes The logs show server initialization,
tool calls, and error messages.
{" "}
Yes! Toggle servers on/off without removing them: 1. Open Settings (
Cmd+Shift+J) 2. Go to Features → Model Context Protocol 3. Click
the toggle next to any server to enable/disable Disabled servers won't load or
appear in chat. This is useful for troubleshooting or reducing tool clutter.
{" "}
If an MCP server fails: - Cursor shows an error message in chat - The tool
call is marked as failed - You can retry the operation or check logs for
details - Other MCP servers continue working normally Cursor isolates server
failures to prevent one server from affecting others.
{" "}
For npm-based servers: 1. Remove the server from settings 2. Clear npm cache:
`npm cache clean --force` 3. Re-add the server to get the latest version For
custom servers, update your local files and restart Cursor.
Yes, but follow security best practices: - Use environment variables for
secrets, never hardcode them - Run sensitive servers locally with `stdio`
transport - Limit API key permissions to minimum required - Review server
code before connecting to sensitive systems - Consider running servers in
isolated environments
# Memories
Source: https://docs.cursor.com/en/context/memories
Memories are automatically generated rules based on your conversations in Chat. These memories are scoped to your project and maintain context across sessions.
## How memories are created
1. **Sidecar observation**: Cursor uses a sidecar approach where another model observes your conversations and automatically extracts relevant memories. This happens passively in the background as you work. Background-generated memories require user approval before being saved, ensuring trust and control over what gets remembered.
2. **Tool calls**: Agent can directly create memories using tool calls when you explicitly ask it to remember something or when it notices important information that should be preserved for future sessions.
## Manage memories
You can manage memories from Cursor Settings → Rules.
# Rules
Source: https://docs.cursor.com/en/context/rules
Control how the Agent model behaves with reusable, scoped instructions.
Rules provide system-level instructions to Agent and Inline Edit. Think of them as persistent context, preferences, or workflows for your projects.
Cursor supports four types of rules:
Stored in `.cursor/rules`, version-controlled and scoped to your codebase.
Global to your Cursor environment. Defined in settings and always applied.
Agent instructions in markdown format. Simple alternative to `.cursor/rules`.
Still supported, but deprecated. Use Project Rules instead.
## How rules work
Large language models don't retain memory between completions. Rules provide persistent, reusable context at the prompt level.
When applied, rule contents are included at the start of the model context. This gives the AI consistent guidance for generating code, interpreting edits, or helping with workflows.
Rules apply to [Chat](/en/chat/overview) and [Inline
Edit](/en/inline-edit/overview). Active rules show in the Agent sidebar.
## Project rules
Project rules live in `.cursor/rules`. Each rule is a file and version-controlled. They can be scoped using path patterns, invoked manually, or included based on relevance. Subdirectories can include their own `.cursor/rules` directory scoped to that folder.
Use project rules to:
* Encode domain-specific knowledge about your codebase
* Automate project-specific workflows or templates
* Standardize style or architecture decisions
### Rule anatomy
Each rule file is written in **MDC** (`.mdc`), a format supporting metadata and content. Control how rules are applied from the type dropdown which changes properties `description`, `globs`, `alwaysApply`.
| Rule Type | Description |
| :--------------------------------------------- | :------------------------------------------------------------------------------- |
| `Always` | Always included in model context |
| `Auto Attached` | Included when files matching a glob pattern are referenced |
| `Agent Requested` | Available to AI, which decides whether to include it. Must provide a description |
| `Manual` | Only included when explicitly mentioned using `@ruleName` |
```
---
description: RPC Service boilerplate
globs:
alwaysApply: false
---
- Use our internal RPC pattern when defining services
- Always use snake_case for service names.
@service-template.ts
```
### Nested rules
Organize rules by placing them in `.cursor/rules` directories throughout your project. Nested rules automatically attach when files in their directory are referenced.
```
project/
.cursor/rules/ # Project-wide rules
backend/
server/
.cursor/rules/ # Backend-specific rules
frontend/
.cursor/rules/ # Frontend-specific rules
```
### Creating a rule
Create rules using the `New Cursor Rule` command or going to `Cursor Settings > Rules`. This creates a new rule file in `.cursor/rules`. From settings you can see all rules and their status.
### Generating rules
Generate rules directly in conversations using the `/Generate Cursor Rules` command. Useful when you've made decisions about agent behavior and want to reuse them.
## Best practices
Good rules are focused, actionable, and scoped.
* Keep rules under 500 lines
* Split large rules into multiple, composable rules
* Provide concrete examples or referenced files
* Avoid vague guidance. Write rules like clear internal docs
* Reuse rules when repeating prompts in chat
## Examples
This rule provides standards for frontend components:
When working in components directory:
* Always use Tailwind for styling
* Use Framer Motion for animations
* Follow component naming conventions
This rule enforces validation for API endpoints:
In API directory:
* Use zod for all validation
* Define return types with zod schemas
* Export types generated from schemas
This rule provides a template for Express services:
Use this template when creating Express service:
* Follow RESTful principles
* Include error handling middleware
* Set up proper logging
@express-service-template.ts
This rule defines React component structure:
React components should follow this layout:
* Props interface at top
* Component as named export
* Styles at bottom
@component-template.tsx
This rule automates app analysis:
When asked to analyze the app:
1. Run dev server with `npm run dev`
2. Fetch logs from console
3. Suggest performance improvements
This rule helps generate documentation:
Help draft documentation by:
* Extracting code comments
* Analyzing README.md
* Generating markdown documentation
First create a property to toggle in `@reactiveStorageTypes.ts`.
Add default value in `INIT_APPLICATION_USER_PERSISTENT_STORAGE` in `@reactiveStorageService.tsx`.
For beta features, add toggle in `@settingsBetaTab.tsx`, otherwise add in `@settingsGeneralTab.tsx`. Toggles can be added as `` for general checkboxes. Look at the rest of the file for examples.
```
{
vsContext.reactiveStorageService.setApplicationUserPersistentStorage(
'myNewProperty',
newVal
);
}}
/>
```
To use in the app, import reactiveStorageService and use the property:
```
const flagIsEnabled = vsContext.reactiveStorageService.applicationUserPersistentStorage.myNewProperty
```
Many examples available from providers and frameworks. Community-contributed rules are found across crowdsourced collections and repositories online.
## AGENTS.md
`AGENTS.md` is a simple markdown file for defining agent instructions. Place it in your project root as an alternative to `.cursor/rules` for straightforward use cases.
Unlike Project Rules, `AGENTS.md` is a plain markdown file without metadata or complex configurations. It's perfect for projects that need simple, readable instructions without the overhead of structured rules.
```markdown theme={null}
# Project Instructions
## Code Style
- Use TypeScript for all new files
- Prefer functional components in React
- Use snake_case for database columns
## Architecture
- Follow the repository pattern
- Keep business logic in service layers
```
## User Rules
User rules are global preferences defined in **Cursor Settings → Rules** that apply across all projects. They're plain text and perfect for setting preferred communication style or coding conventions:
```
Please reply in a concise style. Avoid unnecessary repetition or filler language.
```
## `.cursorrules` (Legacy)
The `.cursorrules` file in your project root is still supported but will be deprecated. We recommend migrating to Project Rules for more control, flexibility, and visibility.
## FAQ
Check the rule type. For `Agent Requested`, ensure a description is defined. For `Auto Attached`, ensure the file pattern matches referenced files.
{" "}
Yes. Use `@filename.ts` to include files in your rule's context.
{" "}
Yes, generate project rules from chat using the `/Generate Cursor Rules`
command. If Memories are enabled, memories are generated automatically.
No. Rules only apply to Agent and Inline Edit
# Concepts
Source: https://docs.cursor.com/en/get-started/concepts
Learn the key features that make Cursor powerful
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Different AI models available for code generation. Each model has
different speed and capability characteristics.
# Installation
Source: https://docs.cursor.com/en/get-started/installation
Get Cursor installed on your computer in just a few minutes
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Download Cursor
Getting started is simple:
1. Go to [cursor.com](https://cursor.com) and click "Download"
2. Run the installer once it downloads
3. Open Cursor when installation finishes
Need a specific version? Find all platforms and installation methods at
[cursor.com/downloads](https://cursor.com/downloads)
## First-time setup
When you open Cursor for the first time, we'll walk you through a quick setup:
* Choose keyboard shortcuts that feel familiar
* Pick a theme you like
* Set up your terminal preferences
You can revisit the setup wizard anytime by pressing Cmd Shift P{" "}
and searching for `Cursor: Start Onboarding`.
Read more about [Keyboard Shortcuts](/en/kbd), [Themes](/en/settings/themes) and [Shell Commands](/en/settings/shell)
See keyboard shortcuts
Selecting a theme in Cursor
Install shell commands
## Moving from another editor?
If you're already using another code editor, we make it easy to switch:
Import VS Code settings directly
Migration guides for JetBrains, Eclipse, Neovim, and Sublime
More migration guides coming soon.
## Language support
Cursor works with all major programming languages. Here are some popular ones with enhanced AI support:
}
arrow
/>
}
arrow
/>
}
arrow
/>
}
arrow
/>
You can add support for more languages through extensions, just like VS Code.
## Creating your account
While Cursor works without an account, signing up unlocks all AI features:
1. You'll be prompted to sign up during setup, or you can do it later in Settings (Cmd Shift J)
2. Once signed up, manage your account at [cursor.com/dashboard](https://cursor.com/dashboard)
## Understanding codebase indexing
When you open a project, Cursor starts learning about your code. This is called "indexing" and it's what makes the AI suggestions accurate.
* Indexing starts automatically when you open a project
* It takes about 1-15 minutes depending on your project size
* The more Cursor learns about your code, the smarter its suggestions become
* Teams can share indexes with each other to save time
* You can check indexing progress in Settings (Cmd Shift J) → Indexing & Docs
Want to learn more? See [how indexing works](/en/context/codebase-indexing)
## Next steps
Now that Cursor is installed, you're ready to experience AI-powered coding:
* Follow our [quickstart guide](/en/get-started/quickstart) to learn the basics in 5 minutes
* Read about [key concepts](/en/get-started/concepts) to understand how Cursor works
* [Browse guides](/en/guides) to explore what you can build with Cursor
* If you run into issues, [get help](/en/troubleshooting/common-issues) from our troubleshooting guide
* [Join our community](https://cursor.com/community) to connect with other Cursor users
# Quickstart
Source: https://docs.cursor.com/en/get-started/quickstart
Get started with Cursor in 5 minutes
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
This quickstart will walk you through a project using Cursor's core features. By the end, you'll be familiar with Tab, Inline Edit, and Agent.
## Open a project in Cursor
Use an existing project or clone our example:
1. Ensure git is installed
2. Clone the example project:
```bash theme={null}
git clone git@github.com:voxelize/voxelize.git && \
cd voxelize && \
cursor .
```
1. Open Cursor
2. Open a project folder with Cmd O or `cursor `
We'll be showcasing using the example project, but you can use any project you have locally.
## Autocomplete with [Tab](/en/kbd#tab)
Tab is the autocomplete model we've trained in-house. It's a great way to ease into AI assisted coding if you're not used to it. With Tab, you can:
* Autocomplete **multiple lines and blocks** of code
* Jump **in** and **across** files to the next autocomplete suggestion
1. Start typing the beginning of a function:
```javascript theme={null}
function calculate
```
2. Tab suggestions appear automatically
3. Press Tab to accept the suggestion
4. Cursor suggests parameters and function bodies
## [Inline Edit](/en/inline-edit) a selection
1. Select the function you just created
2. Press Cmd K
3. Type "make this function calculate fibonacci numbers"
4. Press Return to apply the changes
5. Cursor adds imports and documentation
## Chat with [Agent](/en/agent)
1. Open the Chat panel (Cmd I)
2. Ask: "Add tests for this function and run them"
3. Agent will create a test file, write test cases, and run them for you
## Bonus
Advanced features:
1. Open the Background Agent control panel (Cmd E)
2. Ask: "Find and fix a bug in this project"
3. [Background Agent](/en/background-agent) will:
* Create a remote Virtual Machine (VM)
* Explore your project
* Detect bugs
* Propose fixes
Review and apply changes.
{" "}
1. Open the command palette (Cmd Shift P) 2. Search: "New Cursor
Rule" 3. Name it (e.g., `style-guide`) 4. Select Rule Type "Always" 5. Define
your style: `Prefer using camelCase for variable names`
1. Visit our [MCP directory](https://docs.cursor.com/tools)
2. Choose a tool
3. Click "Install"
Servers can also be installed manually:
1. Open Cursor Settings (Cmd Shift J)
2. Go to "Tools & Integrations"
3. Click "New MCP Server"
## Next steps
Explore these guides to learn more:
Provide effective context for better results
Choose the right model for your task
Learn all [Cursor concepts](/en/get-started/concepts) and start building!
# Data Science
Source: https://docs.cursor.com/en/guides/advanced/datascience
Learn how to set up Cursor for data science workflows including Python, R, and SQL with notebooks, remote environments, and AI-powered analysis
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor provides integrated tooling for data science development through reproducible environments, notebook
support, and AI-powered code assistance. This guide covers essential setup patterns for Python, R, and SQL
workflows.
## Notebook development
For full notebook support, download the Jupyter (id: ms-toolsai.jupyter) extension, published by ms-toolsai.
Cursor supports both `.ipynb` and `.py` files with integrated cell execution. Tab, Inline Edit, and Agents
work within notebooks, just as they do in other code files.
Key capabilities:
* **Inline cell execution** runs code directly within the editor interface
* **Tab, Inline Edit, and Agent** all understand data science libraries including pandas, NumPy, scikit-learn, and SQL magic commands
## Database integration
Databases can be integrated with Cursor through two main mechanisms: MCP servers and Extensions.
* **MCP Servers** let your Agents connect with your databases
* **Extensions** integrate your broader IDE with your databases
### Via MCP
MCP servers allow your agent to make queries directly against your database. This allows your agent to choose to query your database, write the appropriate query, run the command and analyze outputs, all as part of an ongoing task.
For example, you can connect a Postgres database to your Cursor instance by adding the following [MCP config](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) to Cursor:
```json theme={null}
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
}
```
For more on MCP, see our [MCP documentation](/en/tools/mcp).
### Via Extensions
Install database-specific extensions (PostgreSQL, BigQuery, SQLite, Snowflake) to execute queries directly from the editor. This eliminates context switching between tools and enables AI assistance for query optimization.
```sql theme={null}
-- Cursor provides suggestions for indexes, window functions, and query optimization
SELECT
user_id,
event_type,
COUNT(*) as event_count,
RANK() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) as frequency_rank
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id, event_type;
```
Use Agents to analyze slow queries, suggest performance improvements, or generate visualization code for query results. Cursor understands SQL context and can recommend appropriate chart types based on your data structure.
## Data visualization
Cursor's AI assistance extends to data visualization libraries including Matplotlib, Plotly, and Seaborn. The agent can generate code for data visualization, helping you quickly and easily explore data, while creating a replicable and shareable artifact.
```python theme={null}
import plotly.express as px
import pandas as pd
# AI suggests relevant plot types based on data columns
df = pd.read_csv('sales_data.csv')
fig = px.scatter(df, x='advertising_spend', y='revenue',
color='region', size='customer_count',
title='Revenue vs Advertising Spend by Region')
fig.show()
```
## Frequently asked questions
**Can I use existing Jupyter notebooks?**
Yes, Cursor opens `.ipynb` files with full cell execution and AI completion support.
**How do I handle large datasets that don't fit in memory?**
Use distributed computing libraries like Dask or connect to Spark clusters through Remote-SSH connections to larger machines.
**Does Cursor support R and SQL files?**
Yes, Cursor provides AI assistance and syntax highlighting for R scripts (`.R`) and SQL files (`.sql`).
**What's the recommended way to share development environments?**
Commit the `.devcontainer` folder to version control. Team members can rebuild the environment automatically when opening the project.
**How do I debug data processing pipelines?**
Use Cursor's integrated debugger with breakpoints in Python scripts, or leverage Agent to analyze and explain complex data transformations step by step.
## Environment reproducibility
### Development containers
Development containers help you ensure consistent runtimes and dependencies across team members and deployment environments. They can eliminate environment-specific bugs and reduce onboarding time for new team members.
To use a development container, start by creating a `.devcontainer` folder in your repository root. Next, create a `devcontainer.json`, `Dockerfile`, and `requirements.txt` file.
```json theme={null}
// .devcontainer/devcontainer.json
{
"name": "ds-env",
"build": { "dockerfile": "Dockerfile" },
"features": {
"ghcr.io/devcontainers/features/python:1": { "version": "3.11" }
},
"postCreateCommand": "pip install -r requirements.txt"
}
```
```dockerfile theme={null}
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/python:3.11
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install -r requirements.txt
```
```txt theme={null}
# requirements.txt
pandas==2.3.0
numpy
# add other dependencies you need for your project
```
Cursor will automatically detect the devcontainer and prompt you to reopen your project within a container. Alternatively, you can manually reopen in a container using the Command Palette (Cmd+Shift+P) and searching for `Reopen in Container`.
Development containers provide several advantages:
* **Dependency isolation** prevents conflicts between projects
* **Reproducible builds** ensure consistent behavior across development and production environments
* **Simplified onboarding** allows new team members to start immediately without manual setup
### Remote development with SSH
When your analysis requires additional compute resources, GPUs, or access to private datasets, connect to remote machines while maintaining your local development environment.
1. Provision a cloud instance or access an on-premises server with required resources
2. Clone your repository to the remote machine, including the `.devcontainer` configuration
3. Connect through Cursor: Cmd+Shift+P → "Remote-SSH: Connect to Host"
This approach maintains consistent tooling while scaling compute resources as needed. The same development container configuration works across local and remote environments.
# Large Codebases
Source: https://docs.cursor.com/en/guides/advanced/large-codebases
How to work with large codebases in Cursor
Working with large codebases introduces a new set of challenges than working on smaller projects. Drawing from both our experience scaling Cursor's own codebase and insights from customers managing massive codebases, we've discovered some useful patterns for handling increased complexity.
In this guide, we'll walk through some of these techniques that we've found be useful for large codebases.
```mermaid theme={null}
flowchart LR
A[Build codebase understanding] --> B[Define outcome / Diff]
B --> C[Plan changes]
C --> D[Implement changes]
D --> A
```
# Use Chat to quickly get up to speed on unfamiliar code
Navigating a large codebase, especially if it's new to you, can be challenging. You often grep, search, and click around to find the specific parts of the codebase you're looking for. With [Chat](/en/chat/overview), you can start asking questions to find what you're looking for and get a detailed explanation of how it works.
Here we're getting help to find implementation details of codebase indexing in Cursor, and even asking for some examples to make it easier to understand.
# Write rules for domain-specific knowledge
If you were onboarding a new collaborator into your codebase, what context would you give them to make sure they can start doing meaningful contributions?
Your answer to this question is likely valuable information for Cursor to understand as well. For every organization or project, there's latent knowledge that might not be fully captured in your documentation. Using rules effectively is the single best way to ensure Cursor is getting the full picture.
For example, if you're writing instructions for how to implement a new feature or service, consider writing a short rule to document it for posterity.
```mdc Boilerplate theme={null}
---
description: Add a new VSCode frontend service
---
1. **Interface Definition:**
- Define a new service interface using `createDecorator` and ensure `_serviceBrand` is included to avoid errors.
2. **Service Implementation:**
- Implement the service in a new TypeScript file, extending `Disposable`, and register it as a singleton with `registerSingleton`.
3. **Service Contribution:**
- Create a contribution file to import and load the service, and register it in the main entrypoint.
4. **Context Integration:**
- Update the context to include the new service, allowing access throughout the application.
```
If there are common formatting patterns that you want to make sure Cursor adheres to, consider auto-attaching rules based on glob patterns.
```mdc Formatting theme={null}
---
globs: *.ts
---
- Use bun as package manager. See [package.json](mdc:backend/reddit-eval-tool/package.json) for scripts
- Use kebab-case for file names
- Use camelCase for function and variable names
- Use UPPERCASE_SNAKE_CASE for hardcoded constants
- Prefer `function foo()` over `const foo = () =>`
- Use `Array` instead of `T[]`
- Use named exports over default exports, e.g (`export const variable ...`, `export function `)
```
# Stay close to the plan-creation process
For larger changes, spending an above-average amount of thought to create a precise, well-scoped plan can significantly improve Cursor's output.
If you find that you're not getting the result you want after a few different variations of the same prompt, consider zooming out and creating a more detailed plan from scratch, as if you were creating a PRD for a coworker. Oftentimes **the hard part is figuring out what** change should be made, a task suited well for humans. With the right instructions, we can delegate some parts of the implementation to Cursor.
One way to use AI to augment the plan-creation process is to use Ask mode. To create a plan, turn on Ask mode in Cursor and dump whatever context you have from your project management systems, internal docs, or loose thoughts. Think about what files and dependencies you have in the codebase that you already know you want to include. This can be a file that includes pieces of code you want to integrate with, or perhaps a whole folder.
Here's an example prompt:
```mdc Planning prompt theme={null}
- create a plan for how we shoud create a new feature (just like @existingfeature.ts)
- ask me questions (max 3) if anything is unclear
- make sure to search the codebase
@Past Chats (my earlier exploration prompts)
here's some more context from [project management tool]:
[pasted ticket description]
```
We're asking the model to create a plan and gather context by asking the human questions, referencing any earlier exploration prompts and also the ticket descriptions. Using a thinking model like `claude-3.7-sonnet`, `gemini-2.5-pro`, or `o3` is recommended as they can understand the intent of the change and better synthesize a plan.
From this, you can iteratively formulate the plan with the help of Cursor before starting implementation.
```mermaid theme={null}
flowchart LR
A[Context] -- Ask --> B[Plan]
B -- Agent --> C[Implementation]
```
# Pick the right tool for the job
One of the most important skills in using Cursor effectively is choosing the right tool for the job. Think about what you're trying to accomplish and pick the approach that will keep you in flow.
| **Tool** | **Use case** | **Strength** | **Limitation** |
| :------------------------------------------ | :------------------------- | :------------------------------- | :-------------------- |
| **[Tab](/en/tab/overview)** | Quick, manual changes | Full control, fast | Single-file |
| **[Inline Edit](/en/inline-edit/overview)** | Scoped changes in one file | Focused edits | Single-file |
| **[Chat](/en/chat/overview)** | Larger, multi-file changes | Auto-gathers context, deep edits | Slower, context-heavy |
Each tool has its sweet spot:
* Tab is your go-to for quick edits where you want to be in the driver's seat
* Inline Edit shines when you need to make focused changes to a specific section of code
* Chat is perfect for those bigger changes where you need Cursor to understand the broader context
When you're using Chat mode (which can feel a bit slower but is incredibly powerful), help it help you by providing good context. Use [@files](/en/context/@-symbols/@-files) to point to similar code you want to emulate, or [@folder](/en/context/@-symbols/@-folders) to give it a better understanding of your project structure. And don't be afraid to break bigger changes into smaller chunks - starting fresh chats helps keep things focused and efficient.
# Takeaways
* Scope down changes and don't try to do too much at once
* Include relevant context when you can
* Use Chat, Inline Edit & Tab for what they're best at
* Create new chats often
* Plan with [Ask mode](/en/chat/ask), implement with [Agent mode](/en/chat/agent)
# Working with Documentation
Source: https://docs.cursor.com/en/guides/advanced/working-with-documentation
How to leverage documentation effectively in Cursor through prompting, external sources, and internal context
export const ChatInput = ({content = []}) => {
const renderContent = () => {
return content.map((item, index) => {
if (item.type === 'mention') {
return
{item.text}
;
}
return item.text;
});
};
return <>
>;
};
# Why documentation matters
Documentation provides current, accurate context. Without it, models use outdated or incomplete training data. Documentation helps models understand things like:
* Current APIs and parameters
* Best practices
* Organization conventions
* Domain terminology
And much more. Read on to learn how to use documentation right in Cursor without having to context switch.
## Model knowledge cutoff
Large language models are trained on data up to a specific point in time, called a "knowledge cutoff." This means:
* Recent library updates might not be reflected
* New frameworks or tools may be unknown
* API changes after the cutoff date are missed
* Best practices may have evolved since training
For example, if a model's knowledge cutoff is early 2024, it won't know about features released in late 2024, even for popular frameworks.
# Which tool should I use?
Use this decision tree to quickly determine the best approach for your documentation needs:
```mermaid theme={null}
flowchart TD
A[What information do you need?] --> B[Public frameworks/libraries]
A --> C[Recent community knowledge/troubleshooting]
A --> D[Internal company information]
B --> E[Official documentation needed?]
E -->|Yes| F[Use @Docs API references, guides, best practices]
E -->|No| G[Use @Web Community tutorials, comparisons]
C --> H[Use @Web Recent posts, GitHub issues]
D --> I[Existing MCP integrations available?]
I -->|Yes| J[Use existing MCP Confluence, Google Drive, etc.]
I -->|No| K[Build custom MCP Internal APIs, proprietary systems]
style F fill:#e1f5fe
style G fill:#e8f5e8
style H fill:#e8f5e8
style J fill:#fff3e0
style K fill:#fce4ec
```
## Mental model
| Tool | Mental Model |
| ----------- | ------------------------------------------------ |
| **`@Docs`** | Like browsing and reading official documentation |
| **`@Web`** | Like searching for solutions on the internet |
| **MCP** | Like accessing your internal documentation |
# Public documentation
External documentation covers publicly available information that models might have limited or outdated knowledge about. Cursor provides two primary ways to access this information.
## Using @Docs
`@Docs` connects Cursor to official documentation from popular tools and frameworks. Use it when you need current, authoritative information about:
* **API references**: Function signatures, parameters, return types
* **Getting started guides**: Setup, configuration, basic usage
* **Best practices**: Recommended patterns from the source
* **Framework-specific debugging**: Official troubleshooting guides
## Using @Web
`@Web` searches the live internet for current information, blog posts, and community discussions. Use it when you need:
* **Recent tutorials**: Community-generated content and examples
* **Comparisons**: Articles comparing different approaches
* **Recent updates**: Very recent updates or announcements
* **Multiple perspectives**: Different approaches to problems
# Internal documentation
Internal documentation includes information specific to your organization that AI models have never encountered during training. This might be:
* **Internal APIs**: Custom services and microservices
* **Company standards**: Coding conventions, architecture patterns
* **Proprietary systems**: Custom tools, databases, workflows
* **Domain knowledge**: Business logic, compliance requirements
## Accessing internal docs with MCP
Model Context Protocol (MCP) provides a standardized way to bring your private documentation and systems into Cursor. MCP acts as a thin layer between Cursor and your internal resources.
**Why MCP matters:**
* Models can't guess your internal conventions
* API documentation for custom services isn't publicly available
* Business logic and domain knowledge is unique to your organization
* Compliance and security requirements vary by company
### Common MCP integrations
| Integration | Access | Examples |
| ---------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| **Confluence** | Company Confluence spaces | Architecture documentation, API specifications for internal services, coding standards and guidelines, process documentation |
| **Google Drive** | Shared documents and folders | Specification documents, meeting notes and decision records, design documents and requirements, team knowledge bases |
| **Notion** | Workspace databases and pages | Project documentation, team wikis, knowledge bases, product requirements, technical specifications |
| **Custom** | Internal systems and databases | Proprietary APIs, legacy documentation systems, custom knowledge bases, specialized tools and workflows |
#### Custom solutions
For unique needs, you can build custom MCP servers that:
* Scrape internal websites or portals
* Connect to proprietary databases
* Access custom documentation systems
* Pull from internal wikis or knowledge bases
If you build a custom MCP server, you can also expose tools for Cursor to update the documentation
Example custom MCP server for scraping internal docs:
```javascript TypeScript theme={null}
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import TurndownService from "turndown";
// Create an MCP server for scraping internal docs
const server = new McpServer({
name: "internal-docs",
version: "1.0.0"
});
const turndownService = new TurndownService();
// Add tool to scrape internal documentation
server.tool("get_doc",
{ url: z.string() },
async ({ url }) => {
try {
const response = await fetch(url);
const html = await response.text();
// Convert HTML to markdown
const markdown = turndownService.turndown(html);
return {
content: [{ type: "text", text: markdown }]
};
} catch (error) {
return {
content: [{ type: "text", text: `Error scraping ${url}: ${error.message}` }]
};
}
}
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);
```
```python Python theme={null}
# server.py
import os
import asyncio
from mcp.server.fastmcp import FastMCP
import aiohttp
from markdownify import markdownify as md
# Create an MCP server for scraping internal docs
mcp = FastMCP("internal-docs")
@mcp.tool()
async def get_doc(url: str) -> dict:
"""Scrape internal documentation from a URL"""
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
html = await response.text()
# Convert HTML to markdown
markdown = md(html)
return {
"content": [{"type": "text", "text": markdown}]
}
except Exception as error:
return {
"content": [{"type": "text", "text": f"Error scraping {url}: {str(error)}"}]
}
```
# Keeping docs up to date
Documentation becomes stale quickly. Cursor can help you maintain current, useful documentation by generating and updating it based on your actual code and development conversations.
## From existing code
Use Cursor to create documentation directly from your codebase:
## From chat sessions
Your conversations with Cursor contain valuable intent that can be turned into documentation.
**After solving a complex problem:**
**After architectural decisions:**
**After debugging sessions:**
## Takeaways
* Documentation as context makes Cursor more accurate and current
* Use `@Docs` for official documentation and `@Web` for community knowledge
* MCP bridges the gap between Cursor and your internal systems
* Generate documentation from code and conversations to keep knowledge current
* Combine external and internal documentation sources for comprehensive understanding
# Java
Source: https://docs.cursor.com/en/guides/languages/java
Set up Java development with JDK, extensions, and build tools
This guide will help you configure Cursor for Java development, including setting up the JDK, installing necessary extensions, debugging, running Java applications, and integrating build tools like Maven and Gradle. It also covers workflow features similar to IntelliJ or VS Code.
Before starting, ensure you have Cursor installed and updated to the latest
version.
## Setting up Java for Cursor
### Java Installation
Before setting up Cursor itself, you will need Java installed on your machine.
Cursor does not ship with a Java compiler, so you need to install a JDK if you
haven't already.
Download and install a JDK (e.g., OpenJDK, Oracle JDK, Microsoft Build of
OpenJDK).
Set JAVA\_HOME and add JAVA\_HOME\bin to your PATH.
Install via Homebrew (`brew install openjdk`) or download an installer.
Ensure JAVA\_HOME points to the installed JDK.
Use your package manager (`sudo apt install openjdk-17-jdk` or equivalent)
or install via SDKMAN.
To check installation, run:
```bash theme={null}
java -version
javac -version
```
If Cursor does not detect your JDK, configure it manually in settings.json:
```json theme={null}
{
"java.jdt.ls.java.home": "/path/to/jdk",
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/path/to/jdk-17",
"default": true
}
]
}
```
Restart Cursor to apply changes.
### Cursor Setup
Cursor supports VS Code extensions. Install the following manually:
Includes Java language support, debugger, test runner, Maven support, and
project manager
Essential for working with Gradle build system
Required for Spring Boot development
Necessary for Kotlin application development
### Configure Build Tools
#### Maven
Ensure Maven is installed (`mvn -version`). Install from [maven.apache.org](https://maven.apache.org/download.cgi) if needed:
1. Download the binary archive
2. Extract to desired location
3. Set MAVEN\_HOME environment variable to the extracted folder
4. Add %MAVEN\_HOME%\bin (Windows) or \$MAVEN\_HOME/bin (Unix) to PATH
#### Gradle
Ensure Gradle is installed (`gradle -version`). Install from [gradle.org](https://gradle.org/install/) if needed:
1. Download the binary distribution
2. Extract to desired location
3. Set GRADLE\_HOME environment variable to the extracted folder
4. Add %GRADLE\_HOME%\bin (Windows) or \$GRADLE\_HOME/bin (Unix) to PATH
Alternatively, use the Gradle Wrapper which will automatically download and use the correct Gradle version:
## Running and Debugging
Now you are all set up, it's time to run and debug your Java code.
Depending on your needs, you can use the following methods:
Click the "Run" link that appears above any main method to quickly execute
your program
Open the Run and Debug sidebar panel and use the Run button to start your
application
Execute from command line using Maven or Gradlecommands
Launch Spring Boot applications directly from the Spring Boot Dashboard
extension
## Java x Cursor Workflow
Cursor's AI-powered features can significantly enhance your Java development workflow. Here are some ways to leverage Cursor's capabilities specifically for Java:
Smart completions for methods, signatures, and Java boilerplate like
getters/setters.
Implement design patterns, refactor code, or generate classes with proper
inheritance.
Quick inline edits to methods, fix errors, or generate unit tests without
breaking flow.
Get help with Java concepts, debug exceptions, or understand framework
features.
### Example Workflows
1. **Generate Java Boilerplate**\
Use [Tab completion](/en/tab/overview) to quickly generate constructors, getters/setters, equals/hashCode methods, and other repetitive Java patterns.
2. **Debug Complex Java Exceptions**\
When facing a cryptic Java stack trace, highlight it and use [Ask](/en/chat/overview) to explain the root cause and suggest potential fixes.
3. **Refactor Legacy Java Code**\
Use [Agent mode](/en/chat/agent) to modernize older Java code - convert anonymous classes to lambdas, upgrade to newer Java language features, or implement design patterns.
4. **Frameworks Development**\
Add your documentation to Cursor's context with @docs, and generate framework-specific code throughout Cursor.
# JavaScript & TypeScript
Source: https://docs.cursor.com/en/guides/languages/javascript
JavaScript and TypeScript development with framework support
Welcome to JavaScript and TypeScript development in Cursor! The editor provides exceptional support for JS/TS development through its extension ecosystem. Here's what you need to know to get the most out of Cursor.
## Essential Extensions
While Cursor works great with any extensions you prefer, we recommend these for those just getting started:
* **ESLint** - Required for Cursor's AI-powered lint fixing capabilities
* **JavaScript and TypeScript Language Features** - Enhanced language support and IntelliSense
* **Path Intellisense** - Intelligent path completion for file paths
## Cursor Features
Cursor enhances your existing JavaScript/TypeScript workflow with:
* **Tab Completions**: Context-aware code completions that understand your project structure
* **Automatic Imports**: Tab can automatically import libraries as soon as you use them
* **Inline Editing**: Use `CMD+K` on any line to edit with perfect syntax
* **Composer Guidance**: Plan and edit your code across multiple files with the Composer
### Framework Intelligence with @Docs
Cursor's @Docs feature lets you supercharge your JavaScript development by adding custom documentation sources that the AI can reference. Add documentation from MDN, Node.js, or your favorite framework to get more accurate and contextual code suggestions.
Discover how to add and manage custom documentation sources in Cursor.
### Automatic Linting Resolution
One of Cursor's standout features is its seamless integration with Linter extensions.
Ensure you have a linter, like ESLint, setup, and enable the 'Iterate on Lints' setting.
Then, when using the Agent mode in Composer, once the AI has attempted to answer your query, and has made any code changes, it will automatically read the output of the linter and will attempt to fix any lint errors it might not have known about.
## Framework Support
Cursor works seamlessly with all major JavaScript frameworks and libraries, such as:
### React & Next.js
* Full JSX/TSX support with intelligent component suggestions
* Server component and API route intelligence for Next.js
* Recommended: [**React Developer Tools**](cursor:extension/msjsdiag.vscode-react-native) extension
### Vue.js
* Template syntax support with Volar integration
* Component auto-completion and type checking
* Recommended: [**Vue Language Features**](cursor:extension/vue.volar)
### Angular
* Template validation and TypeScript decorator support
* Component and service generation
* Recommended: [**Angular Language Service**](cursor:extension/Angular.ng-template)
### Svelte
* Component syntax highlighting and intelligent completions
* Reactive statement and store suggestions
* Recommended: [**Svelte for VS Code**](cursor:extension/svelte.svelte-vscode)
### Backend Frameworks (Express/NestJS)
* Route and middleware intelligence
* TypeScript decorator support for NestJS
* API testing tools integration
Remember, Cursor's AI features work well with all these frameworks, understanding their patterns and best practices to provide relevant suggestions. The AI can help with everything from component creation to complex refactoring tasks, while respecting your project's existing patterns.
# Python
Source: https://docs.cursor.com/en/guides/languages/python
Set up Python development with extensions and linting tools
This guide was heavily inspired by [Jack Fields](https://x.com/OrdinaryInds)
and his
[article](https://medium.com/ordinaryindustries/the-ultimate-vs-code-setup-for-python-538026b34d94)
about setting up VS Code for Python development. Please check his article for
more details.
## Prerequisites
Before we begin, ensure you have:
* [Python](https://python.org) installed (3.8 or higher recommended)
* [Git](https://git-scm.com/) for version control
* Cursor installed and updated to the latest version
## Essential Extensions
The following extensions setup Cursor to be fully featured for Python development. These provide you with syntax highlighting, linting, debugging and unit testing.
Core language support from Microsoft
Fast Python language server
Enhanced debugging capabilities
Python linter and formatter
### Advanced Python Tooling
While the above extensions have previously been the most popular extensions for Python development in Cursor, we've also added some additional extensions that can help you get the most out of your Python development.
#### `uv` - Python Environment Manager
[uv](https://github.com/astral-sh/uv) is a modern Python package manager that can be used to create and manage virtual environments, in addition to replacing pip as the default package manager.
To install uv, run the following command in your terminal:
```bash theme={null}
pip install uv
```
#### `ruff` - Python Linter and Formatter
[Ruff](https://docs.astral.sh/ruff/) is a modern Python linter and formatter that can be used to check for programming errors, helps enforce coding standards, and can suggest refactoring. It can be used alongside Black for code formatting.
To install Ruff, run the following command in your terminal:
```bash theme={null}
pip install ruff
```
## Cursor Configuration
### 1. Python Interpreter
Configure your Python interpreter in Cursor:
1. Open Command Palette (Cmd/Ctrl + Shift + P)
2. Search for "Python: Select Interpreter"
3. Choose your Python interpreter (or virtual environment if you're using one)
### 2. Code Formatting
Set up automatic code formatting with Black:
Black is a code formatter that automatically formats your code to follow a
consistent style. It requires zero configuration and is widely adopted in the
Python community.
To install Black, run the following command in your terminal:
```bash theme={null}
pip install black
```
Then, configure Cursor to use Black for code formatting, by adding the following to your `settings.json` file:
```json theme={null}
{
"python.formatting.provider": "black",
"editor.formatOnSave": true,
"python.formatting.blackArgs": ["--line-length", "88"]
}
```
### 3. Linting
We can use PyLint to check for programming errors, helps enforce coding standards, and can suggest refactoring.
To install PyLint, run the following command in your terminal:
```bash theme={null}
pip install pylint
```
```json theme={null}
{
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.lintOnSave": true
}
```
### 4. Type Checking
In addition to linting, we can use MyPy to check for type errors.
To install MyPy, run the following command in your terminal:
```bash theme={null}
pip install mypy
```
```json theme={null}
{
"python.linting.mypyEnabled": true
}
```
## Debugging
Cursor provides powerful debugging capabilities for Python:
1. Set breakpoints by clicking the gutter
2. Use the Debug panel (Cmd/Ctrl + Shift + D)
3. Configure `launch.json` for custom debug configurations
## Recommended Features
Intelligent code suggestions that understand your actions
Explore and understand code through natural conversations
Handle complex development tasks with AI assistance
Pull in context from 3rd party systems
Automatically import modules as you code
Cursor constantly reviews your code with AI
## Framework Support
Cursor works seamlessly with popular Python frameworks:
* **Web Frameworks**: Django, Flask, FastAPI
* **Data Science**: Jupyter, NumPy, Pandas
* **Machine Learning**: TensorFlow, PyTorch, scikit-learn
* **Testing**: pytest, unittest
* **API**: requests, aiohttp
* **Database**: SQLAlchemy, psycopg2
# iOS & macOS (Swift)
Source: https://docs.cursor.com/en/guides/languages/swift
Integrate Cursor with Xcode for Swift development
Welcome to Swift development in Cursor! Whether you're building iOS apps, macOS applications, or server-side Swift projects, we've got you covered. This guide will help you set up your Swift environment in Cursor, starting with the basics and moving on to more advanced features.
## Basic Workflow
The simplest way to use Cursor with Swift is to treat it as your primary code editor while still relying on Xcode for building and running your apps. You'll get great features like:
* Smart code completion
* AI-powered coding assistance (try [CMD+K](/en/inline-edit/overview) on any line)
* Quick access to documentation with [@Docs](/en/context/@-symbols/@-docs)
* Syntax highlighting
* Basic code navigation
When you need to build or run your app, simply switch to Xcode. This workflow is perfect for developers who want to leverage Cursor's AI capabilities while sticking to familiar Xcode tools for debugging and deployment.
### Hot Reloading
When using Xcode workspaces or projects (instead of opening a folder directly in Xcode), Xcode can often ignore changes to your files that were made in Cursor, or outside of Xcode in general.
While you can open the folder in Xcode to resolve this, you may need to use a project for your Swift development workflow.
A great solution to this is to use [Inject](https://github.com/krzysztofzablocki/Inject), a hot reloading library for Swift that allows your app to "hot reload" and update as soon as changes are made in real time. This does not suffer from the side effects of the Xcode workspace/project issue, and allows you to make changes in Cursor and have them reflected in your app immediately.
Learn more about Inject and how to use it in your Swift projects.
## Advanced Swift Development
This section of the guide was heavily inspired by [Thomas
Ricouard](https://x.com/Dimillian) and his
[article](https://dimillian.medium.com/how-to-use-cursor-for-ios-development-54b912c23941)
about using Cursor for iOS development. Please check his article for more
details and drop him a follow for more Swift content.
If you are looking to only need one editor open at a time, and want to avoid the need to switch between Xcode and Cursor, you can use an extension like [Sweetpad](https://sweetpad.hyzyla.dev/) to integrate Cursor directly with Xcode's underlying build system.
Sweetpad is a powerful extension that allows you to build, run and debug your Swift projects directly in Cursor, without compromising on Xcode's features.
To get started with Sweetpad, you'll still need to have Xcode installed on your Mac - it's the foundation of Swift development. You can download Xcode from the [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835). Once you have Xcode set up, let's enhance your development experience in Cursor with a few essential tools.
Open your terminal and run:
```bash theme={null}
# Builds your projects without needing Xcode open
brew install xcode-build-server
# Pretty print's the `xcodebuild` command output into Cursor's terminal
brew install xcbeautify
# Allows for advanced formating and language features
brew install swiftformat
```
Next, install the [Swift Language Support](cursor:extension/chrisatwindsurf.swift-vscode) extension in Cursor. This will give you syntax highlighting and basic language features right out of the box.
Then, we can install the [Sweetpad](https://sweetpad.hyzyla.dev/) extension to integrate Cursor with Xcode. Sweetpad wraps a bunch of shortcuts around the `xcodebuild` CLI (and much more), and allows you to scan your targets, select the destination, build, and run your app just like Xcode. On top of that, it’ll set up your project for Xcode Build Server so you get all the features mentioned above.
### Sweetpad Usage
Once Sweetpad is installed, and you have a Swift project open in Cursor, you should first run the `Sweetpad: Generate Build Server Config` command. This will generate a `buildServer.json` file in the root of your project that allows the Xcode Build Server to work with your project.
Then, from either the Command Palette or the Sweetpad sidebar, you can select the target you want to build and run.
{" "}
You need to build your project once to enable auto-completion, jump to definition,
and other language features.{" "}
You can also now hit F5 to build and run your project with a debugger - you might need to create a launch configuration first, but just select Sweetpad from the list when prompted!
As with many extensions in Cursor, you can bind many of the Sweetpad commands to keyboard shortcuts, to make your workflow even more efficient.
To learn more about Sweetpad, check out these resources:
Official Sweetpad website with features and installation instructions
Comprehensive guide covering configuration, usage and advanced features
# JetBrains
Source: https://docs.cursor.com/en/guides/migration/jetbrains
Migrate from JetBrains IDEs to Cursor with familiar tools
Cursor offers a modern, AI-powered coding experience that can replace your JetBrains IDEs. While the transition might feel different at first, Cursor's VS Code-based foundation provides powerful features and extensive customization options.
## Editor Components
### Extensions
JetBrains IDEs are great tools, as they come already pre-configured for the languages and frameworks they are intended for.
Cursor is different - being a blank canvas out of the box, you can customize it to your liking, not being limited by the languages and frameworks the IDE was intended for.
Cursor has access to a vast ecosystem of extensions, and almost all of the functionality (and more!) that JetBrains IDEs offer can be recreated through these extensions.
Take a look at some of these popular extensions below:
SSH Extension
Manage multiple projects
Enhanced Git integration
Track local file changes
Inline error highlighting
Code linting
Code formatting
Track TODOs and FIXMEs
### Keyboard Shortcuts
Cursor has a built-in keyboard shortcut manager that allows you to map your favorite keyboard shortcuts to actions.
With this extension, you can bring almost all of the JetBrains IDEs shortcuts directly to Cursor!
Be sure to read the extension's documentation to learn how to configure it to your liking:
Install this extension to bring JetBrains IDEs keyboard shortcuts to Cursor.
Common shortcuts that differ:
* Find Action: ⌘/Ctrl+Shift+P (vs. ⌘/Ctrl+Shift+A)
* Quick Fix: ⌘/Ctrl+. (vs. Alt+Enter)
* Go to File: ⌘/Ctrl+P (vs. ⌘/Ctrl+Shift+N)
### Themes
Recreate the look and feel of your favorite JetBrains IDEs in Cursor with these community themes.
Choose from the standard Darcula Theme, or pick a theme to match the syntax highlighting of your JetBrains tools.
Experience the classic JetBrains Darcula dark theme
Get the familiar JetBrains file and folder icons
### Font
To complete your JetBrains-like experience, you can use the official JetBrains Mono font:
1. Download and install JetBrains Mono font onto your system:
2. Restart Cursor after installing the font
3. Open Settings in Cursor (⌘/Ctrl + ,)
4. Search for "Font Family"
5. Set the font family to `'JetBrains Mono'`
For the best experience, you can also enable font ligatures by setting `"editor.fontLigatures": true` in your settings.
## IDE-Specific Migration
Many users loved the JetBrains IDEs for their out-the-box support for the languages and frameworks they were intended for. Cursor is different - being a blank canvas out of the box, you can customize it to your liking, not being limited by the languages and frameworks the IDE was intended for.
Cursor already has access to the extension ecosystem of VS Code, and almost all of the functionality (and more!) that JetBrains IDEs offer can be recreated through these extensions.
Take a look at the following suggested extensions for each JetBrains IDE below.
### IntelliJ IDEA (Java)
Core Java language features
Java debugging support
Run and debug Java tests
Maven support
Project management tools
Key differences:
* Build/Run configurations are managed through launch.json
* Spring Boot tools available through ["Spring Boot Extension Pack"](cursor:extension/vmware.vscode-boot-dev-pack) extension
* Gradle support via ["Gradle for Java"](cursor:extension/vscjava.vscode-gradle) extension
### PyCharm (Python)
Core Python support
Fast type checking
Notebook support
Python formatter and linter
Key differences:
* Virtual environments managed through command palette
* Debug configurations in launch.json
* Requirements management through requirements.txt or Poetry
### WebStorm (JavaScript/TypeScript)
Latest language features
React development
Vue.js support
Angular development
Most WebStorm features are built into Cursor/VS Code, including:
* npm scripts view
* Debugging
* Git integration
* TypeScript support
### PhpStorm (PHP)
PHP language server
Xdebug integration
Code intelligence
Documentation tools
Key differences:
* Xdebug configuration through launch.json
* Composer integration via terminal
* Database tools through ["SQLTools"](cursor:extension/mtxr.sqltools) extension
### Rider (.NET)
Core C# support
Open-Source C# Development Environment
JetBrains C# Plugin
.NET SDK management
Key differences:
* Solution explorer through file explorer
* NuGet package management through CLI or extensions
* Test runner integration through test explorer
### GoLand (Go)
Official Go extension
Key differences:
* Go tools installation prompted automatically
* Debugging through launch.json
* Package management integrated with go.mod
## Tips for a Smooth Transition
Press ⌘/Ctrl + Shift + P to find commands
Leverage Cursor's AI features for code completion and refactoring
Fine-tune your settings.json for optimal workflow
Use the built-in terminal for command-line operations
Browse the VS Code marketplace for additional tools
Remember that while some workflows might be different, Cursor offers powerful AI-assisted coding features that can enhance your productivity beyond traditional IDE capabilities.
# VS Code
Source: https://docs.cursor.com/en/guides/migration/vscode
Import VS Code settings and extensions with one click
Cursor is based upon the VS Code codebase, allowing us to focus on making the best AI-powered coding experience while maintaining a familiar editing environment. This makes it easy to migrate your existing VS Code settings to Cursor.
## Profile Migration
### One-click Import
Here's how to get your entire VS Code setup in one click:
1. Open the Cursor Settings (⌘/Ctrl + Shift + J)
2. Navigate to General > Account
3. Under "VS Code Import", click the Import button
This will transfer your:
* Extensions
* Themes
* Settings
* Keybindings
### Manual Profile Migration
If you are moving between machines, or want more control over your settings, you can manually migrate your profile.
#### Exporting a Profile
1. On your VS Code instance, open the Command Palette (⌘/Ctrl + Shift + P)
2. Search for "Preferences: Open Profiles (UI)"
3. Find the profile you want to export on the left sidebar
4. Click the 3-dot menu and select "Export Profile"
5. Choose to export it either to your local machine or to a GitHub Gist
#### Importing a Profile
1. On your Cursor instance, open the Command Palette (⌘/Ctrl + Shift + P)
2. Search for "Preferences: Open Profiles (UI)"
3. Click the dropdown menu next to 'New Profile' and click 'Import Profile'
4. Either paste in the URL of the GitHub Gist or choose 'Select File' to upload a local file
5. Click 'Import' at the bottom of the dialog to save the profile
6. Finally, in the sidebar, choose the new profile and click the tick icon to active it
## Settings and Interface
### Settings Menus
Access via Command Palette (⌘/Ctrl + Shift{" "}
* P), then type "Cursor Settings"
Access via Command Palette (⌘/Ctrl + Shift{" "}
* P), then type "Preferences: Open Settings (UI)"
### Version Updates
We regularly rebase Cursor onto the latest VS Code version to stay current
with features and fixes. To ensure stability, Cursor often uses slightly older
VS Code versions.
### Activity Bar Orientation
We made it horizontal to optimize space for the AI chat interface. If you prefer vertical:
1. Open the Command Palette (⌘/Ctrl + Shift + P)
2. Search for "Preferences: Open Settings (UI)"
3. Search for `workbench.activityBar.orientation`
4. Set the value to `vertical`
5. Restart Cursor
# Architectural Diagrams
Source: https://docs.cursor.com/en/guides/tutorials/architectural-diagrams
Learn to generate architectural diagrams using Mermaid to visualize system structure and data flow
Architectural diagrams help you make sense of how your system works. You can use them to explore logic, track data, and communicate structure. Cursor supports generating these diagrams directly using tools like Mermaid, so you can go from code to visual in just a few prompts.
## Why diagrams matter
Diagrams clarify how data flows and how components interact. They're useful when you:
* Want to understand flow control in your codebase
* Need to trace data lineage from input to output
* Are onboarding others or documenting your system
They're also great for debugging and asking smarter questions. Visuals help you (and the model) see the bigger picture.
## Two dimensions to consider
There are a few different angles to think about:
* **Purpose**: Are you mapping logic, data flow, infrastructure, or something else?
* **Format**: Do you want something quick (like a Mermaid diagram) or formal (like UML)?
## How to prompt
Start with a clear goal. Here are some common ways to ask:
* **Flow control**: "Show me how requests go from the controller to the database."
* **Data lineage**: "Trace this variable from where it enters to where it ends up."
* **Structure**: "Give me a component-level view of this service."
You can include start and end points, or ask Cursor to find the full path.
## Working with Mermaid
Mermaid is simple to learn and renders directly in Markdown (with the right extension). Cursor can generate diagrams like:
* `flowchart` for logic and sequences
* `sequenceDiagram` for interactions
* `classDiagram` for object structure
* `graph TD` for simple directional maps
```mermaid theme={null}
sequenceDiagram
participant User
participant Server
participant Database
User->>Server: Submit Form
Server->>Database: Save Entry
Database-->>Server: Success
Server-->>User: Confirmation
```
You can install the [Mermaid extension](https://marketplace.cursorapi.com/items?itemName=bierner.markdown-mermaid) to preview diagrams.
1. Go to Extensions tab
2. Search for Mermaid
3. Install
## Diagram strategy
Start small. Don't aim to map everything at once.
* Pick one function, route, or process
* Ask Cursor to diagram that part using Mermaid
* Once you have a few, ask it to combine them
This mirrors the **C4 model** – where you start at a low level (code or components) and work upward to higher-level overviews.
### Recommended flow
1. Start with a detailed, low-level diagram
2. Summarize it into a mid-level view
3. Repeat until you reach the level of abstraction you want
4. Ask Cursor to merge them into a single diagram or system map
```mermaid theme={null}
graph TD
subgraph Level 1: Low-level components
A1[AuthService] --> A2[TokenValidator]
A1 --> A3[UserDB]
B1[PaymentService] --> B2[BillingEngine]
B1 --> B3[InvoiceDB]
end
subgraph Level 2: Mid-level systems
A[User System] --> A1
B[Billing System] --> B1
end
subgraph Level 3: High-level application
App[Main App] --> A
App --> B
end
```
## Takeaways
* Use diagrams to understand flow, logic, and data
* Start with small prompts and grow your diagram from there
* Mermaid is the easiest format to work with in Cursor
* Start low-level and abstract upward, just like in the C4 model
* Cursor can help you generate, refine, and combine diagrams with ease
# Building an MCP Server
Source: https://docs.cursor.com/en/guides/tutorials/building-mcp-server
Learn how to build a Model Context Protocol (MCP) server with PostgreSQL integration for Cursor
## Introduction
MCP servers let you connect custom data sources and make them available for use inside Cursor. This is particularly useful when you need context from places such as browsers, databases, or error and system logs. Setting up an MCP server is straightforward, and with Cursor it can be done quickly.
In this guide, we will walk through how to build an MCP server for Postgres. Our goal is to enable Cursor to run SQL queries directly against a Postgres database and to expose table schemas in a structured way.
This tutorial is designed to teach the fundamentals of building MCP servers.
```mermaid theme={null}
graph LR
A[User in Cursor] --> B[Cursor]
B <--> C["MCP Server (stdio)"]
C <--> D[(Postgres Database)]
subgraph Local Machine
B
C
end
class B cursor
class C mcp
class D db
```
## What is an MCP Server?
An [MCP server](/en/context/mcp) is a process that communicates with Cursor and provides access to external data or actions. It can be implemented in several ways, but here we will use the simplest method: a server that runs locally on your computer over [stdio](https://en.wikipedia.org/wiki/Standard_streams) (standard input/output streams). This avoids complicated security considerations and allows us to focus on the MCP logic itself.
One of the most common use cases for MCP is database access. When building dashboards, running analyses, or creating migrations, it is often necessary to query and inspect a database. Our Postgres MCP server will support two core capabilities: running arbitrary queries and listing table schemas.
Although both of these tasks could be performed with plain SQL, MCP offers features that make them more powerful and more generally useful. Tools provide a way to expose actions such as executing queries, while resources allow us to share standardized context such as schema information. Later in this guide we will also look at prompts, which enable more advanced workflows.
Under the hood, we will rely on the postgres npm package to execute SQL statements against the database. The MCP SDK will serve as a wrapper around these calls, letting us integrate Postgres functionality seamlessly into Cursor.
## How to Build the MCP Server
The first step in building the server is to setup a new project. We’ll start with creating a new folder and initializing a Bun project
```bash theme={null}
> mkdir postgres-mcp-server
> Bun init
```
From here, we’ll select `Blank` project. Once our boilerplate is setup, we need to install the required dependencies. `zod` is required to define schemas for i/o in MCP sdk
```bash theme={null}
bun add postgres @modelcontextprotocol/sdk zod
```
From here, we’ll go to the repositories for each of the libraries and get the link to the raw file contents of each respective README files. We’ll use these for context when building the server
* `postgres`
* Repo: [https://github.com/porsager/postgres](https://github.com/porsager/postgres),
* README: [https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md](https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md)
* `@modelcontextprotocol/sdk`:
* Repo: [https://github.com/modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)
* README: [https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md](https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md)
Now, we’ll define how we want the server to behave. To do that, we’ll create a `spec.md` and write out the high level goals
```markdown theme={null}
# Spec
- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
- By default, make it readonly
- Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
```
As you can see, this is quite a lightweight spec.Fee free to ad more details as needed.. Together with the README links, we’ll construct the final prompt
```markdown theme={null}
Read the following and follow @spec.md to understand what we want. All necesary dependeies are installed
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
```
With these three components in place (the specification, the MCP SDK documentation, and the Postgres library documentation), we can use Cursor to scaffold the server implementation. Cursor will help us stitch the pieces together, generating the code that connects the MCP SDK with Postgres.
After some back and forth prompting, we now have a first version of the MCP server going. To try it out, we can use the [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector)
```bash theme={null}
npx @modelcontextprotocol/inspector bun run index.ts
```
## Testing the MCP Server
Once the initial implementation is complete, we can test it using the MCP Inspector. The inspector provides a way to see what the server exposes and to verify that the tools and resources behave as expected. We should confirm that queries can be executed and that schema information is returned correctly.
When everything looks good, we can connect the server to Cursor itself and test it in a real environment. At this point, Cursor will be able to use the Postgres MCP server as if it were a built-in capability, letting us query and inspect the database directly.
## Next Steps
Running the MCP server locally over stdio is a great starting point, but teams often require shared access to the same database through their MCP server. In these scenarios, deploying the MCP server as a centralized HTTP service becomes necessary.
A deployed MCP server offers several advantages over individual stdio instances:
* **Shared database access:** Multiple team members can query the same database instance through Cursor
* **Centralized configuration:** Schema updates and permission changes are managed in one location
* **Enhanced security:** Proper authentication, rate limiting, and access controls can be implemented
* **Observability:** Usage patterns and performance metrics can be monitored across the team
To achieve this, you would switch the transport method from stdio to HTTP.
While we won’t cover the whole setup, here’s a good starting prompt you can give to Cursor
```
Based on the existing MCP server, create a new file that implements the HTTP protocol.
Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)
@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
```
The final results can be seen here: [pg-mcp-server](https://github.com/ericzakariasson/pg-mcp-server)
```mermaid theme={null}
graph LR
subgraph Team_Network_or_Cloud["VPC"]
SVC["MCP Server (HTTP transport)"] <--> DB[(Postgres DB)]
end
Dev1["Developer 1 on Cursor"] -->|HTTP| SVC
Dev2["Developer 2 on Cursor"] -->|HTTP| SVC
Dev3["Developer 3 on Cursor"] -->|HTTP| SVC
subgraph SVC_Internals["Internals"]
direction TB
T1["Auth and ACLs"]
T2["Rate limiting and logging"]
T3["Tool: query"]
T4["Resource: table_schemas"]
T5["Prompts"]
T1 --> T2 --> T3
T3 --> T4
T3 --> T5
end
SVC --> SVC_Internals
class SVC svc
class DB db
class T1,T2,T3,T4,T5 internals
class Dev1,Dev2,Dev3 dev
```
# Web Development
Source: https://docs.cursor.com/en/guides/tutorials/web-development
How to set up Cursor for web development
export const McpInstallButtonPrimary = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
Web development involves fast iterations and tight feedback loops between Cursor and external tools like Figma or the browser. At Cursor, we've found workflows that tighten this loop. Clear task scoping, reusing components, and leveraging design systems help keep things fast and consistent.
This guide covers how to set up Cursor to support web development and tighten the feedback loop.
```mermaid theme={null}
graph LR
A[Project] --> B[Design]
B --> C[Code]
C -- Test --> D[Verify]
D -- Feedback --> C
```
# Start orchestrating in Cursor
**Chat** is great for bootstrapping changes. Once the major pieces are in place, switching to **Inline Edit** and **Tab** helps maintain your flow state.
After setting up Cursor, you'll be able to orchestrate workflows across different tools. Below is a demonstration of what's possible: a snake game created by combining Linear, Figma, and browser tools. While real-world projects are typically more complex, this example showcases the potential of these integrated workflows.
# Connect to your project management tools
You can integrate Cursor into your existing project management software using different tooling. In this guide, we'll look at integrating Linear with their MCP server.
### Installation
Or manually add the Linear MCP server to `mcp.json`:
```jsx theme={null}
{
"mcpServers": {
"Linear": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.linear.app/sse"
]
}
}
}
```
Then:
1. Make sure to enable Linear from MCP settings
2. Web browser will open and you will be prompted to authorize with Linear
Due to the current state of MCP, the set up can require multiple attempts.
If the integration is not working, try to "Reload" server from Cursor
settings.
### Using Linear in Cursor
Linear MCP servers expose different tools that Cursor can use to read and manage issues. Go to MCP settings an locate the Linear server to see a list of all tools. To verify, try this prompt in Chat:
```jsx theme={null}
list all issues related to this project
```
It should return a list of issues if the integration is set up properly.
# Bring in your Figma designs
Designs and mockups are core to web development. Using the official MCP server for Figma, you can directly access and work with design files in Cursor. To get started, follow the set up instructions at [Figma Dev Mode MCP Server](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
### Installation
You can click the button below to install the MCP server.
Or manually add to your `mcp.json`:
```jsx theme={null}
{
"mcpServers": {
"Figma": {
"url": "http://127.0.0.1:3845/sse"
}
}
}
```
### Usage
The server exposes multiple tools you can use in your prompts. E.g try to ask for the designs of the current selection in Figma. Read more in the [documentation](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
# Keep your code scaffolding consistent
You probably have existing code, a design system, or established conventions you want to reuse. When working with models, it's helpful to reference patterns already in your codebase, such as dropdown menus or other common components.
Working in a large web-based codebase ourselves, we've found that declarative code works especially well, particularly for React and JSX.
If you have a design system, you can help the agent discover it by providing a rule for it. Here's a `ui-components.mdc` file where we try to enforce reuse of components when possible:
```mdc components.mdc theme={null}
---
description: Implementing designs and building UI
---
- reuse existing UI components from `/src/components/ui`. these are the primitives we can build with
- create new components by orchestrating ui components if you can't find any existing that solves the problem
- ask the human how they want to proceed when there are missing components and designs
```
As your component library grows, add new rules accordingly. When the rules become too numerous, consider splitting them into more specific categories, such as "only apply when working with user inputs."
# Give Cursor access to browser
To extend Cursor's capabilities, you can set up the browser tools MCP server, which provides access to console logs and network requests. Once configured, you can verify your changes by monitoring console output and network activity. This set up helps ensure your implementation matches your intention. Follow the instructions here to set up the MCP server: [https://browsertools.agentdesk.ai/installation](https://browsertools.agentdesk.ai/installation)
We're working on making this easier to integrate natively in Cursor.
# Takeaways
* Tight feedback loops are essential in web development. Use Cursor alongside tools like Figma, Linear, and the browser to move quickly and stay in flow.
* MCP servers let you integrate external systems directly into Cursor, reducing context switching and improving task execution.
* Reusing components and design systems helps the model produce cleaner, more consistent code and outputs.
* Clear, scoped tasks lead to better results. Be intentional with how you prompt and what you ask for.
* If you're not getting good outputs, try adjusting:
* **Instructions:** Use rules, prompts, and give access to more context with e.g., MCP servers.
* **Systems:** Patterns, abstractions, and clarity make it easier for the model to understand, help, and work more autonomously
* You can extend the model's context by including runtime info like console logs, network requests, and UI element data.
* Not everything needs to be automated. If your system becomes too complex, fall back to more surgical edits with Tab and Inline Edit.
* Cursor is most powerful when it's a co-pilot, not an autopilot. Use it to improve, not replace, your own decision-making.
# Working with Context
Source: https://docs.cursor.com/en/guides/working-with-context
How to work with context in Cursor
First, what is a context window? And how does it relate to effectively coding with Cursor?
To zoom out a bit, a large language model (LLM) is an artificial intelligence model trained to predict and generate text by learning patterns from massive datasets. It powers tools like Cursor by understanding your input and suggesting code or text based on what it’s seen before.
Tokens are the inputs and outputs of these models. They are chunks of text, often a fragment of a word, that an LLM processes one-by-one. Models don’t read entire sentences at once; they predict the next token based on the ones that came before.
To see how some text tokenizes, you can use a tokenizer like [this one](https://tiktokenizer.vercel.app/).
# What is context?
When we’re generating a code suggestion in Cursor, “context” refers to the information that is provided to the model (in the form of "input tokens") that the model then uses to predict the subsequent information (in the form of “output tokens”).
There are two types of context:
1. **Intent context** defines what the user wants to get out of the model. For example, a system prompt usually serves as high-level instructions for how the user wants the model to behave. Most of the "prompting" done in Cursor is intent context. “Turn that button from blue to green” is an example of stated intent; it is prescriptive.
2. **State context** describes the state of the current world. Providing Cursor with error messages, console logs, images, and chunks of code are examples of context related to state. It is descriptive, not prescriptive.
Together, these two types of context work in harmony by describing the current state and desired future state, enabling Cursor to make useful coding suggestions.
```mermaid theme={null}
flowchart LR
A["Intent (what you want)"] --> C[Model]
B["State (what's true)"] --> C
C -- Predict --> D["Action (what it does)"]
```
# Providing context in Cursor
The more relevant context you can provide a model, the more useful it will be. If insufficient context is provided in Cursor, the model will try to solve it without the relevant information. This typically results in:
1. Hallucinations where the model tries to pattern match (when there’s no pattern) causing unexpected results. This can happen frequently for models like `claude-3.5-sonnet` when it’s not given enough context.
2. The Agent trying to gather context by itself by searching the codebase, reading files, and calling tools. A strong thinking model (like `claude-3.7-sonnet`) can go quite far with this strategy, and providing the right initial context will determine the trajectory.
The good news is that Cursor is built with contextual awareness at its core and is designed to require minimal intervention from the user. Cursor automatically pulls in the parts of your codebase that the model estimates are relevant, such as the current file, semantically-similar patterns in other files, and other information from your session.
However, there’s a lot of context that can be pulled from, so manually specifying the context that you know is relevant to the task is a helpful way to steer the models in the right direction.
## @-symbol
The easiest way to provide explicit context is with the @-symbol. These are great when you know specifically what file, folder, website, or other piece of context you want to include. The more specific you can be, the better. Here’s a breakdown of how to get more surgical with context:
| Symbol | Example | Use case | Drawback |
| --------- | -------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| `@code` | `@LRUCachedFunction` | You know which function, constant or symbol is relevant to the output you’re generating | Requires a lot of knowledge of codebase |
| `@file` | `cache.ts` | You know which file should be read or edited, but not exactly where in the file | Might include a lot of irrelevant context for the task at hand depending on file size |
| `@folder` | `utils/` | Everything or majority of files in a folder is relevant | Might include a lot of irrelevant context for the task at hand |
## Rules
You should think of rules as long-term memory that you want you or other members of your team to have access to. Capturing domain-specific context, including workflows, formatting and other conventions, is a great starting point for writing rules.
Rules can also be generated from existing conversations by using `/Generate Cursor Rules`. If you’ve had a long back and forth conversation with lots of prompting, there’s probably some useful directives or general rules that you might want to reuse later.
## MCP
[Model Context Protocol](https://modelcontextprotocol.io/introduction) is an extensibility layer where you can give Cursor capabilities to perform actions and pull in external context.
Depending on your development setup, you might want to leverage different types of servers, but two categories that we’ve seen be particularly useful are:
* **Internal documentation**: e.g., Notion, Confluence, Google Docs
* **Project management**: e.g., Linear, Jira
If you have existing tooling for accessing context and performing actions through an API, you can build an MCP server for it. Here’s a short guide on how to build [MCP servers](https://modelcontextprotocol.io/tutorials/building-mcp-with-llms).
## Self-gathering context
A powerful pattern many users are adopting is letting the Agent write short-lived tools that it can then run to gather more context. This is especially effective in human-in-the-loop workflows where you review the code before it’s executed.
For example, adding debugging statements to your code, running it, and letting the model inspect the output gives it access to dynamic context it couldn’t infer statically.
In Python, you can do this by prompting the Agent to:
1. Add print("debugging: ...") statements in relevant parts of the code
2. Run the code or tests using the terminal
The Agent will read the terminal output and decide what to do next. The core idea is to give the Agent access to the actual runtime behavior, not just the static code.
# Takeaways
* Context is the foundation of effective AI coding, consisting of intent (what you want) and state (what exists). Providing both helps Cursor make accurate predictions.
* Use surgical context with @-symbols (@code, @file, @folder) to guide Cursor precisely, rather than relying solely on automatic context gathering.
* Capture repeatable knowledge in rules for team-wide reuse, and extend Cursor's capabilities with Model Context Protocol to connect external systems.
* Insufficient context leads to hallucinations or inefficiency, while too much irrelevant context dilutes the signal. Strike the right balance for optimal results.
# Inline Edit
Source: https://docs.cursor.com/en/inline-edit/overview
Edit and ask questions with Inline Edit (Cmd/Ctrl+K) in Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Inline Edit lets you edit code or ask questions directly in your editor with Cmd+K, which opens an input field where your selected code and instructions create your request.
## Modes
### Edit Selection
With code selected, Cmd+K edits that specific code based on your instructions.
Without selection, Cursor generates new code at your cursor position. The AI includes relevant surrounding code for context. For example, triggering on a function name includes the entire function.
### Quick Question
Press Opt+Return in the inline editor to ask questions about selected code.
After getting an answer, type "do it" or similar wording to convert the suggestion into code. This lets you explore ideas before implementing.
### Full File Edits
For file-wide changes, use Cmd+Shift+Return. This mode enables comprehensive changes while maintaining control.
### Send to Chat
For multi-file edits or advanced features, use Cmd+L to send selected code to [Chat](/en/agent/modes#agent). This provides multi-file editing, detailed explanations, and advanced AI capabilities.
## Follow-up instructions
After each edit, refine results by adding instructions and pressing Return. The AI updates changes based on your feedback.
## Default context
Inline Edit includes default context to improve code generation beyond any [@ symbols](/en/context/@-symbols/@-files) you add.
This includes related files, recently viewed code, and relevant information. Cursor prioritizes the most relevant context for better results.
# Terminal
Source: https://docs.cursor.com/en/inline-edit/terminal
Generate terminal commands with Cmd/Ctrl+K
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
In Cursor terminal, press Cmd+K to open a prompt bar at the bottom.
Describe your desired action and Inline Edit generates a command.
Inline Edit in terminal uses your recent terminal history, instructions, and prompt content as context.
# Git
Source: https://docs.cursor.com/en/integrations/git
AI-powered Git features including commit message generation and merge conflict resolution
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor provides AI-powered Git features to streamline your workflow, including automatic commit message generation and intelligent merge conflict resolution.
## AI Commit Message
Cursor generates commit messages from staged changes.
1. Stage files to commit
2. Open the Git tab in the sidebar
3. Click the sparkle (✨) icon next to the commit message input
Generated messages use staged changes and repository git history. If you use conventions like [Conventional Commits](https://www.conventionalcommits.org/), messages follow the same pattern.
### Add shortcut
To bind to a keyboard shortcut:
1. Go to Keyboard Shortcuts (Cmd+R Cmd+S or Cmd+Shift+P and search "Open Keyboard Shortcuts (JSON)")
2. Add this binding for Cmd+M:
```json theme={null}
{
"key": "cmd+m",
"command": "cursor.generateGitCommitMessage"
}
```
3. Save
You cannot customize commit message generation. Cursor adapts to your existing commit style.
## AI Resolve Conflicts
When merge conflicts occur, Cursor Agent can help resolve them by understanding both sides of the conflict and proposing a resolution.
### How to use
1. When a merge conflict occurs, you'll see the conflict markers in your file
2. Click the **Resolve in Chat** button that appears in the merge conflict UI
3. Agent will analyze both versions and suggest a resolution
4. Review the proposed changes and apply them
# GitHub
Source: https://docs.cursor.com/en/integrations/github
Official Cursor GitHub app for background agents
[Background Agents](/en/background-agent) and [Bugbot](/en/bugbot) require the Cursor GitHub app to clone repositories and push changes.
## Installation
1. Go to [Integrations in Dashboard](https://cursor.com/dashboard?tab=integrations)
2. Click **Connect** next to GitHub
3. Choose repository either **All repositories** or **Selected repositories**
To disconnect your GitHub account, return to the integrations dashboard and click **Disconnect Account**.
## Using Agent in GitHub
The GitHub integration enables background agent workflows directly from pull requests and issues. You can trigger an agent to read context, implement fixes, and push commits by commenting `@cursor [prompt]` on any PR or issue.
If you have [Bugbot](/en/bugbot) enabled, you can comment `@cursor fix` to read the suggested fix from Bugbot to trigger a background agent to address the issue.
## Permissions
The GitHub app requires specific permissions to work with background agents:
| Permission | Purpose |
| ------------------------- | ------------------------------------------------ |
| **Repository access** | Clone your code and create working branches |
| **Pull requests** | Create PRs with agent changes for your review |
| **Issues** | Track bugs and tasks that agents discover or fix |
| **Checks and statuses** | Report on code quality and test results |
| **Actions and workflows** | Monitor CI/CD pipelines and deployment status |
All permissions follow the principle of least privilege needed for background agent functionality.
## IP Allow List Configuration
If your organization uses GitHub's IP allow list feature to restrict access to your repositories, you'll need to contact support first to enable IP allowlist functionality for your team.
### Contact Support
Before configuring IP allowlists, contact [hi@cursor.com](mailto:hi@cursor.com) to enable this feature for your team. This is required for both configuration methods below.
### Enable IP allow list configuration for installed GitHub Apps (Recommended)
The Cursor GitHub app has the IP list already pre-configured. You can enable the allowlist for installed apps to automatically inherit this list. This is the **recommended approach**, as it allows us to update the list and your organization receives updates automatically.
To enable this:
1. Go to your organization's Security settings
2. Navigate to IP allow list settings
3. Check **"Allow access by GitHub Apps"**
For detailed instructions, see [GitHub's documentation](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#allowing-access-by-github-apps).
### Add IPs directly to your allowlist
If your organization uses IdP-defined allowlists in GitHub or otherwise cannot use the pre-configured allowlist, you can manually add the IP addresses:
```
184.73.225.134
3.209.66.12
52.44.113.131
```
The list of IP addresses may infrequently change. Teams using IP allow lists will be given advanced notice before IP addresses are added or removed.
## Troubleshooting
* Install the GitHub app with repository access
* Check repository permissions for private repos
* Verify your GitHub account permissions
* Grant the app write access to pull requests
* Check branch protection rules
* Reinstall if the app installation expired
* Check if installed at organization level
* Reinstall from [github.com/apps/cursor](https://github.com/apps/cursor)
* Contact support if installation is corrupted
# Linear
Source: https://docs.cursor.com/en/integrations/linear
Work with Background Agents from Linear
Use [Background Agents](/en/background-agent) directly from Linear by delegating issues to Cursor or mentioning `@Cursor` in comments.
## Get started
### Installation
You must be a Cursor admin to connect the Linear integration. Other team settings are available to non-admin members.
1. Go to [Cursor integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Click *Connect* next to Linear
3. Connect your Linear workspace and select team
4. Click *Authorize*
5. Complete any remaining Background Agent setup in Cursor:
* Connect GitHub and select default repository
* Enable usage-based pricing
* Confirm privacy settings
### Account linking
First use prompts account linking between Cursor and Linear. GitHub connection required for PR creation.
## How to use
Delegate issues to Cursor or mention `@Cursor` in comments. Cursor analyzes issues and filters out non-development work automatically.
### Delegating issues
1. Open Linear issue
2. Click assignee field
3. Select "Cursor"
### Mentioning Cursor
Mention `@Cursor` in a comment to assign a new agent or provide additional instructions, for example: `@Cursor fix the authentication bug described above`.
## Workflow
Background Agents show real-time status in Linear and create PRs automatically when complete. Track progress in [Cursor dashboard](https://www.cursor.com/dashboard?tab=background-agents).
### Follow-up instructions
You can respond in the agent session and it'll get sent as a follow-up to the agent. Simply mention `@Cursor` in a Linear comment to provide additional guidance to a running Background Agent.
## Configuration
Configure Background Agent settings from [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
| Setting | Location | Description |
| :--------------------- | :--------------- | :-------------------------------------------------------- |
| **Default Repository** | Cursor Dashboard | Primary repository when no project repository configured |
| **Default Model** | Cursor Dashboard | AI model for Background Agents |
| **Base Branch** | Cursor Dashboard | Branch to create PRs from (typically `main` or `develop`) |
### Configuration options
You can configure Background Agent behavior using several methods:
**Issue description or comments**: Use `[key=value]` syntax, for example:
* `@cursor please fix [repo=anysphere/everysphere]`
* `@cursor implement feature [model=claude-3.5-sonnet] [branch=feature-branch]`
**Issue labels**: Use parent-child label structure where the parent label is the configuration key and the child label is the value.
**Project labels**: Same parent-child structure as issue labels, applied at the project level.
Supported configuration keys:
* `repo`: Specify target repository (e.g., `owner/repository`)
* `branch`: Specify base branch for PR creation
* `model`: Specify AI model to use
### Repository selection
Cursor determines which repository to work on using this priority order:
1. **Issue description/comments**: `[repo=owner/repository]` syntax in issue text or comments
2. **Issue labels**: Repository labels attached to the specific Linear issue
3. **Project labels**: Repository labels attached to the Linear project
4. **Default repository**: Repository specified in Cursor dashboard settings
#### Setting up repository labels
To create repository labels in Linear:
1. Go to **Settings** in your Linear workspace
2. Click **Labels**
3. Click **New group**
4. Name the group "repo" (case insensitive - must be exactly "repo", not "Repository" or other variations)
5. Within that group, create labels for each repository using the format `owner/repo`
These labels can then be assigned to issues or projects to specify which repository the Background Agent should work on.
{/* ### Getting help
Check [agent activity](https://www.cursor.com/dashboard?tab=background-agents) and include request IDs when contacting support.
## Feedback
Share feedback through Linear comments or your Cursor dashboard support channels. */}
# Slack
Source: https://docs.cursor.com/en/integrations/slack
Work with Background Agents from Slack
export const SlackThread = ({messages = []}) => {
const MessageWithMentions = ({text}) => {
const parts = text.split(/(@\w+)/g);
return <>
{parts.map((part, index) => {
if (part.startsWith('@')) {
return
{part}
;
}
return {part};
})}
>;
};
return
;
};
With Cursor's integration for Slack, you can use [Background Agents](/en/background-agent) to work on your tasks directly from Slack by mentioning with a prompt.
## Get started
### Installation
1. Go to [Cursor integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Click *Connect* next to Slack or go to [installation page](https://cursor.com/api/install-slack-app) from here
3. You'll be prompted to install the Cursor app for Slack in your workspace.
4. After installing in Slack, you'll be redirected back to Cursor to finalize setup
1. Connect GitHub (if not already connected) and pick a default repository
2. Enable usage-based pricing
3. Confirm privacy settings
5. Start using Background Agents in Slack by mentioning
## How to use
Mention and give your prompt. This handles most use cases, but you can also use commands below to customize your agent.
For example, mention directly in conversation, or use specific commands like to target a particular repository.
### Commands
Run for an up-to-date command list.
| Command | Description |
| :---------------------------------------------------------- | :------------------------------------------------------------------------------------ |
| | Start a Background Agent. In threads with existing agents, adds followup instructions |
| | Configure defaults and channel's default repository |
| | Use advanced options: `branch`, `model`, `repo` |
| | Force create a new agent in a thread |
| | Show your running agents |
#### Options
Customize Background Agent behavior with these options:
##### Syntax Formats
Use options in several ways:
1. **Bracket format**
2. **Inline format**
##### Option precedence
When combining options:
* **Explicit values** override defaults
* **Later values** override earlier ones if duplicated
* **Inline options** take precedence over settings modal defaults
The bot parses options from anywhere in the message, allowing natural command writing.
#### Using thread context
Background Agents understand and use context from existing thread discussions. Useful when your team discusses an issue and you want the agent to implement the solution based on that conversation.
Background Agents read the entire thread for context when invoked,
understanding and implementing solutions based on the team's discussion.
#### When to use force commands
**When do I need ?**
In threads with existing agents, adds followup instructions (only works if you own the agent). Use to launch a separate agent.
**When do I need `Add follow-up` (from context menu)?**
Use the context menu (⋯) on an agent's response for followup instructions. Useful when multiple agents exist in a thread and you need to specify which one to follow up on.
### Status updates & handoff
When Background Agent runs, you first get an option to *Open in Cursor*.
When Background Agent completes, you get a notification in Slack and an option to view the created PR in GitHub.
### Managing agents
To see all running agents, run .
Manage Background Agents using the context menu by clicking the three dots (⋯) on any agent message.
Available options:
* **Add follow-up**: Add instructions to an existing agent
* **Delete**: Stop and archive the Background Agent
* **View request ID**: View unique request ID for troubleshooting (include when contacting support)
* **Give feedback**: Provide feedback about agent performance
## Configuration
Manage default settings and privacy options from [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
### Settings
#### Default Model
Used when no model is explicitly specified with . See [settings](https://www.cursor.com/dashboard?tab=background-agents) for available options.
#### Default Repository
Used when no repository is specified. Use these formats:
* `https://github.com/org/repository`
* `org/repository`
If you reference a non-existent repository, it appears as if you don't have
access. This shows in the error message when Background Agent fails to start.
#### Base Branch
Starting branch for Background Agent. Leave blank to use the repository's default branch (often `main`)
### Channel Settings
Configure default settings at the channel level using . These settings are per team and override your personal defaults for that channel.
Particularly useful when:
* Different channels work on different repositories
* Teams want consistent settings across all members
* You want to avoid specifying the repository in every command
To configure channel settings:
1. Run in the desired channel
2. Set the default repository for that channel
3. All team members using Background Agents in that channel use these defaults
Channel settings take precedence over personal defaults but can be overridden
by explicit options like{" "}
### Privacy
Background Agents support Privacy Mode.
Read more about [Privacy Mode](https://www.cursor.com/privacy-overview) or manage your [privacy settings](https://www.cursor.com/dashboard?tab=background-agents).
Privacy Mode (Legacy) is not supported. Background Agents require temporary
code storage while running.
#### Display Agent Summary
Display agent summaries and diff images. May contain file paths or code snippets. Can be turned On/Off.
#### Display Agent Summary in External Channels
For Slack Connect with other workspaces or channels with external members like Guests, choose to display agent summaries in external channels.
## Permissions
Cursor requests these Slack permissions for Background Agents to work within your workspace:
| Permission | Description |
| :------------------ | :---------------------------------------------------------------------------------- |
| `app_mentions:read` | Detects @mentions to start Background Agents and respond to requests |
| `channels:history` | Reads previous messages in threads for context when adding follow-up instructions |
| `channels:join` | Automatically joins public channels when invited or requested |
| `channels:read` | Accesses channel metadata (IDs and names) to post replies and updates |
| `chat:write` | Sends status updates, completion notifications, and PR links when agents finish |
| `files:read` | Downloads shared files (logs, screenshots, code samples) for additional context |
| `files:write` | Uploads visual summaries of agent changes for quick review |
| `groups:history` | Reads previous messages in private channels for context in multi-turn conversations |
| `groups:read` | Accesses private channel metadata to post responses and maintain conversation flow |
| `im:history` | Accesses direct message history for context in continued conversations |
| `im:read` | Reads DM metadata to identify participants and maintain proper threading |
| `im:write` | Initiates direct messages for private notifications or individual communication |
| `mpim:history` | Accesses group DM history for multi-participant conversations |
| `mpim:read` | Reads group DM metadata to address participants and ensure proper delivery |
| `reactions:read` | Observes emoji reactions for user feedback and status signals |
| `reactions:write` | Adds emoji reactions to mark status - ⏳ for running, ✅ for completed, ❌ for failed |
| `team:read` | Identifies workspace details to separate installations and apply settings |
| `users:read` | Matches Slack users with Cursor accounts for permissions and secure access |
;
};
Cursor supports all frontier coding models from all major model providers.
## Model pricing
Cursor [plans](/en/account/pricing) include usage at the model API rates. For example, \$20 of included usage on the Pro plan will be consumed based on your model selection and its price.
Usage limits are shown in editor based on your current consumption. To view all model API prices, view the provider documentation:
* [OpenAI Pricing](https://openai.com/api/pricing/)
* [Anthropic Pricing](https://www.anthropic.com/pricing#api)
* [Google Gemini Pricing](https://ai.google.dev/gemini-api/docs/pricing)
* [xAI Pricing](https://docs.x.ai/docs/models)
## Auto
Enabling Auto allows Cursor to select the premium model best fit for the immediate task and with the highest reliability based on current demand. This feature can detect degraded output performance and automatically switch models to resolve it.
## Context windows
A [context window](/en/guides/working-with-context) is the maximum span of tokens (text and code) an LLM can consider at once, including both the input prompt and output generated by the model.
Each chat in Cursor maintains its own context window. The more prompts, attached files, and responses included in a session, the larger the context window grows.
Learn more about [working with context](/en/guides/working-with-context) in Cursor.
## Max Mode
Normally, Cursor uses a context window of 200k tokens (\~15,000 lines of code). Max Mode extends the context window to the maximum available for a handful of models. This will be a bit slower and more expensive. It is most relevant for Gemini 2.5 Flash, Gemini 2.5 Pro, GPT 4.1, and Grok 4, which have context windows larger than 200k.
## FAQ
Models are hosted on US-based infrastructure by the model's provider, a trusted partner, or Cursor directly.
When Privacy Mode is enabled, neither Cursor nor model providers store your data. All data is deleted after each request. For details see our [Privacy](/en/account/privacy), [Privacy Policy](https://cursor.com/privacy), and [Security](https://cursor.com/security) pages.
# API Keys
Source: https://docs.cursor.com/en/settings/api-keys
Bring your own LLM provider
Use your own API keys to send unlimited AI messages at your own cost. When configured, Cursor will use your API keys to call LLM providers directly.
To use your API key, go to `Cursor Settings` > `Models` and enter your API keys. Click **Verify**. Once validated, your API key is enabled.
Custom API keys only work with standard chat models. Features requiring specialized models (like Tab Completion) will continue using Cursor's built-in models.
## Supported providers
* **OpenAI** - Standard, non-reasoning chat models only. The model picker will show the OpenAI models available.
* **Anthropic** - All Claude models available through the Anthropic API.
* **Google** - Gemini models available through the Google AI API.
* **Azure OpenAI** - Models deployed in your Azure OpenAI Service instance.
* **AWS Bedrock** - Use AWS access keys, secret keys, or IAM roles. Works with models available in your Bedrock configuration.
A unique external ID is generated after validating your Bedrock IAM role, which can be added to your IAM role trust policy for additional security.
## FAQ
Your API key won't be stored but is sent to our server with every request. All requests are routed through our backend for final prompt building.
# Tab
Source: https://docs.cursor.com/en/tab/overview
Autocompletion with multi-line edits, cross-file suggestions, and context-aware code completions
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Tab is a specialized Cursor model for autocompletion. The more you use it, the better it becomes as you inject intent by accepting Tab or rejecting Escape suggestions. With Tab, you can:
* Modify multiple lines at once
* Add import statements when missing
* Jump within and across files for coordinated edits
* Get suggestions based on recent changes, linter errors and accepted edits
## Suggestions
When adding text, completions appear as semi-opaque ghost text. When modifying existing code, it shows as a diff popup right of your current line.
Accept suggestions with Tab, reject with Escape, or accept word-by-word using Cmd+Arrow Right. Keep typing or press Escape to hide suggestions.
### Jump in file
Tab predicts your next editing location in the file and suggests jumps. After accepting an edit, press Tab again to jump to the next location.
### Jump across files
Tab predicts context-aware edits across files. A portal window appears at the bottom when a cross-file jump is suggested.
### Auto-import
In TypeScript and Python, Tab automatically adds import statements when missing. Use a method from another file and Tab suggests the import. Accepting adds it without disrupting your flow.
If auto-import isn't working:
* Ensure your project has the right language server or extensions
* Test with Cmd . to check if the import appears in *Quick Fix* suggestions
### Tab in Peek
Tab works in *Go to Definition* or *Go to Type Definition* peek views. Useful for modifying function signatures and fixing call sites.
In Vim, use with `gd` to jump to definitions, modify, and resolve references in one flow.
### Partial Accepts
Accept one word at a time with Cmd Right, or set your keybinding via `editor.action.inlineSuggest.acceptNextWord`. Enable in: `Cursor Settings` → `Tab`.
## Settings
| Setting | Description |
| :-------------------------------- | :----------------------------------------------------------------------------- |
| **Cursor Tab** | Context-aware, multi-line suggestions around your cursor based on recent edits |
| **Partial Accepts** | Accept the next word of a suggestion via Cmd Right |
| **Suggestions While Commenting** | Enable Tab inside comment blocks |
| **Whitespace-Only Suggestions** | Allow edits affecting only formatting |
| **Imports** | Enable auto-import for TypeScript |
| **Auto Import for Python (beta)** | Enable auto-import for Python projects |
### Toggling
Use the status bar (bottom-right) to:
* **Snooze**: Temporarily disable Tab for a chosen duration
* **Disable globally**: Disable Tab for all files
* **Disable for extensions**: Disable Tab for specific file extensions (e.g., markdown or JSON)
## FAQ
Disable Tab for comments by going to `Cursor Settings` → `Tab Completion` and unchecking **Trigger in comments**.
Remap accepting and rejecting suggestions to any key using `Accept Cursor Tab Suggestions` in `Keyboard Shortcuts` settings.
Cursor includes a small part of relevant code in the context window. The context is encrypted and sent to our backend. The backend decrypts and securely reads the context. Then, the Cursor Tab model predicts a code suggestion, and returns it to the client to display in editor.
# Developers
Source: https://docs.cursor.com/en/tools/developers
Generate install links for Tools & MCP Servers
export const McpInstallLinkGenerator = () => {
const [config, setConfig] = useState("");
const [error, setError] = useState("");
const [showOverlay, setShowOverlay] = useState(null);
const [extractedServerName, setExtractedServerName] = useState("");
const debounceTimerRef = useRef(null);
useEffect(() => {
return () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
};
}, []);
const handleConfigChange = e => {
const configValue = e.target.value;
setConfig(configValue);
setError("");
setExtractedServerName("");
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
if (configValue.trim()) {
debounceTimerRef.current = setTimeout(() => {
validateConfigWithValue(configValue);
}, 500);
}
};
const handleBlur = () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
debounceTimerRef.current = null;
}
if (config.trim()) {
validateConfig();
}
};
const validateConfig = () => {
return validateConfigWithValue(config);
};
const validateConfigWithValue = configValue => {
try {
if (!configValue.trim()) {
setError("");
setExtractedServerName("");
return false;
}
const parsedConfig = JSON.parse(configValue);
if (typeof parsedConfig !== 'object' || parsedConfig === null) {
throw new Error("Config must be a JSON object");
}
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
if (!serverName) {
throw new Error("No server configuration found");
}
const serverConfig = configToUse[serverName];
if (typeof serverConfig !== 'object' || serverConfig === null) {
throw new Error("Server config must be an object");
}
if (!serverConfig.command && !serverConfig.url) {
throw new Error("Server config must have either 'command' or 'url' property");
}
if (serverConfig.command && typeof serverConfig.command !== 'string') {
throw new Error("'command' must be a string");
}
if (serverConfig.url && typeof serverConfig.url !== 'string') {
throw new Error("'url' must be a string");
}
if (serverConfig.args && !Array.isArray(serverConfig.args)) {
throw new Error("'args' must be an array");
}
if (serverConfig.env && (typeof serverConfig.env !== 'object' || serverConfig.env === null)) {
throw new Error("'env' must be an object");
}
setError("");
setExtractedServerName(serverName);
return true;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
setExtractedServerName("");
return false;
}
};
const INSTALL_BUTTON_IMAGE_URL = {
DARK: "https://cursor.com/deeplink/mcp-install-dark.svg",
LIGHT: "https://cursor.com/deeplink/mcp-install-light.svg"
};
const generateDeepLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
const protocol = window.location.hostname === 'localhost' ? 'cursor-dev' : 'cursor';
return `${protocol}://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(safeBase64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const generateWebLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
return `https://cursor.com/en/install-mcp?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(base64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const copyDeepLink = () => {
const link = generateDeepLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('link');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyWebLink = () => {
const link = generateWebLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('weblink');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyHtmlLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const htmlLink = ``;
navigator.clipboard.writeText(htmlLink);
setShowOverlay(theme.toLowerCase());
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyMarkdownLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const markdownLink = `[](${link})`;
navigator.clipboard.writeText(markdownLink);
setShowOverlay(`${theme.toLowerCase()}-md`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyJsxLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const jsxLink = ``;
navigator.clipboard.writeText(jsxLink);
setShowOverlay(`${theme.toLowerCase()}-jsx`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
return
{error &&
{error}
}
{extractedServerName.length > 0 ?
{extractedServerName}
: No server detected}
{showOverlay === 'link' &&
Copied
}
{showOverlay === 'weblink' &&
Copied
}
{showOverlay === 'dark-md' &&
Copied
}
{showOverlay === 'light-md' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark' &&
Copied
}
{showOverlay === 'light' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark-jsx' &&
Copied
}
{showOverlay === 'light-jsx' &&
Copied
}
Click to copy. Paste in JSX components
;
};
# MCP Servers
MCP servers can be installed with Cursor deeplinks. It uses the same format as [`mcp.json`](/en/context/model-context-protocol.mdx) with a name and transport configuration.
Install links:
```
cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$BASE64_ENCODED_CONFIG
```
## Generate install link
1. Get name and JSON configuration of server
2. `JSON.stringify` the configuration then base64 encode it
3. Replace `$NAME` and `$BASE64_ENCODED_CONFIG` with the name and encoded config
Helper for generating links:
## Example
Try this JSON in the MCP install link generator:
```json Single MCP server config theme={null}
{
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
```
Result:
| Format | Example |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Text link | [cursor://anysphere.curs...](cursor://anysphere.cursor-deeplink/mcp/install?name=postgres\&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItcG9zdGdyZXMiLCJwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0L215ZGIiXX0=) |
| Dark button | |
| Light button | |
## Install server
1. Click the link or paste into browser
2. Cursor prompts to install the server
3. Use the server in Cursor
# MCP Servers
Source: https://docs.cursor.com/en/tools/mcp
Explore and install MCP servers for Cursor
export const McpInstallButton = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
Explore and install MCP servers for Cursor
Developers can [create an Add to Cursor button](/en/tools/developers#generate-install-link) and link to include in your developer documentation for easy installation in Cursor
Notion
All-in-one workspace for notes, docs, and project management.
Figma
Design and collaboration platform for teams.
Download the latest version of the Figma desktop app to host the Figma MCP server. Check out the official Figma setup guide for installation instructions
>}
/>
Linear
Issue tracking and project management for development teams.
GitHub
Version control and collaborative development platform.
Playwright
End-to-end browser testing.
Sentry
Error tracking and performance monitoring.
DuckDB
In-process SQL OLAP database for local analytics.
Vercel
Manage projects and deployments on Vercel.
GitLab
DevSecOps platform for code, CI/CD, and security.
Atlassian
Project management and collaboration tools including Jira and Confluence.
PostHog
Analytics, error tracking, and feature flags.
Stripe
Payment processing APIs.
PayPal
Payment APIs.
dbt Labs
dbt CLI, Semantic Layer, and Discovery API.
Browserbase
Headless browser sessions for agents.
Netlify
Build and deploy web projects.
Shopify
Shopify app development tools.
snyk
Vulnerability scanning of your codebase.
Zapier
Automate workflows between apps.
Heroku
Manage Heroku apps and resources.
Hugging Face
Access the Hugging Face Hub and Gradio MCP Servers.
Wix
Build and manage Wix sites.
Semgrep
Scan code for security vulnerabilities.
Plaid
Access financial account data.
Mercado Pago
Access Mercado Pago docs.
"}}}} />
LaunchDarkly
Feature flags as a service.
Context7
Up-to-date code documentation.
AWS Documentation
Access AWS documentation, search, and get recommendations.
Endor Labs
Security risk insights for code.
InstantDB
Query and manage InstantDB.
Tinybird
Real-time analytics APIs.
MongoDB
Manage MongoDB data and deployments.
Neon
Manage Neon Postgres.
SonarQube
Analyze code with SonarQube.
Socket
Analyze and secure dependencies.
Select Star
Data catalog, lineage, and context.
Pipedream
Connect to APIs and workflows.
/"}}} />
Auth0
Manage Auth0 resources.
MS Learn Docs
Search Microsoft docs.
Mercado Libre
Access Mercado Libre docs.
Honeycomb
Query observability data and SLOs.
PagerDuty
Manage incidents and alerts.
Graphite
Create and manage stacked PRs.
Railway
Deploy apps, databases, and services.
Postman
API collaboration and testing.
This is a curated set of MCP tools for developers from official providers.
If your company or tool provides an official MCP server and you want it
included, please{" "}
create a PR or issue on GitHub
{" "}
and we'll review it for inclusion.
# Common Issues
Source: https://docs.cursor.com/en/troubleshooting/common-issues
Solutions for common problems and FAQs
Below are common issues and their solutions.
### Networking Issues
First, check your network connectivity. Go to `Cursor Settings` > `Network` and click `Run Diagnostics`. This will test your connection to Cursor's servers and help identify any network-related issues that might be affecting AI features, updates, or other online functionality.
Cursor relies on HTTP/2 for AI features because it handles streamed responses efficiently. If your network doesn't support HTTP/2, you may experience indexing failures and AI feature issues.
This occurs on corporate networks, VPNs, or when using proxies like Zscaler.
To resolve this, enable HTTP/1.1 fallback in app settings (not Cursor settings): press `CMD/CTRL + ,`, search for `HTTP/2`, then enable `Disable HTTP/2`. This forces HTTP/1.1 usage and resolves the issue.
We plan to add automatic detection and fallback.
### Resource Issues (CPU, RAM, etc.)
High CPU or RAM usage can slow your machine or trigger resource warnings.
While large codebases require more resources, high usage typically stems from extensions or settings issues.
If you are seeing a low RAM warning on **MacOS**, please note that there is a bug for some users that can show wildly incorrect values. If you are seeing this, please open the Activity Monitor and look at the "Memory" tab to see the correct memory usage.
If you're experiencing high CPU or RAM usage, try these steps:
Extensions can impact performance.
The Extension Monitor shows resource consumption for all your installed and built-in extensions.
Enable the extension monitor from `Settings` > `Application` > `Experimental` and toggle `Extension Monitor: Enabled`. This will prompt you to restart Cursor.
Open it: `Cmd/Ctrl + Shift + P` → `Developer: Open Extension Monitor`.
Cursor runs your extensions in one or more **extension hosts**. Usually, most of your extensions will run in the same extension host, which means an extension consuming a lot of CPU time can suffocate its neighboring extensions!
The Extension Monitor will show:
* Every long-lived process launched by an extension (MacOS and Linux only).
* **% Ext Host**: The percentage of total extension host time consumed by this extension. Helps identify which extensions are using the most time relative to others.
* **Max Blocking**: An extensions's longest continuous block of execution, per monitoring interval.
* **% CPU**:
* For extensions: The percentage of total CPU usage attributed to the extension's code.
* For processes: The percentage of total CPU usage attributed to the launched process (MacOS and Linux only).
* **Memory**:
* For extensions: The amount of JS heap memory used by the extension's code (external allocations not counted).
* For processes: The amount of system memory used by the launched process (MacOS and Linux only).
You can also test by running `cursor --disable-extensions` from the command line. If performance improves, re-enable extensions one by one to identify problematic ones.
Try Extension Bisect to identify problematic extensions. Read more [here](https://code.visualstudio.com/blogs/2021/02/16/extension-bisect#_welcome-extension-bisect). Note: this works best for immediate issues, not gradual performance degradation.
The Process Explorer shows which processes consume resources.
Open it: Command Palette (`Cmd/Ctrl + Shift + P`) → `Developer: Open Process Explorer`.
Review processes under:
* **`extensionHost`**: Extension-related issues
* **`ptyHost`**: Terminal resource consumption
The Process Explorer displays each terminal and its running commands for diagnosis.
For other high-usage processes, report to the [forum](https://forum.cursor.com/).
Use your operating system's monitoring tools to determine if the issue is Cursor-specific or system-wide.
If issues persist, test a minimal Cursor installation.
## General FAQs
New updates use staged rollouts - randomly selected users receive updates first. Expect your update within a few days.
Use `Sign Out of GitHub` from the command palette `Ctrl/⌘ + Shift + P`.
GitHub Codespaces isn't supported yet.
SSH to Mac or Windows machines isn't supported. For other issues, report to the [forum](https://forum.cursor.com/) with logs.
If you see "SSH is only supported in Microsoft versions of VS Code":
1. Uninstall Remote-SSH:
* Open Extensions view (`Ctrl + Shift + X`)
* Search "Remote-SSH"
* Click gear icon → "Uninstall"
2. Install Anysphere Remote SSH:
* Open Cursor marketplace
* Search "SSH"
* Install the Anysphere Remote SSH extension
3. After installation:
* Close all VS Code instances with active SSH connections
* Restart Cursor
* Reconnect via SSH
Verify your SSH configuration and keys are properly set up.
Cursor Tab and Inline Edit use HTTP/2 for lower latency and resource usage. Some corporate proxies (e.g., Zscaler) block HTTP/2. Fix by setting `"cursor.general.disableHttp2": true` in settings (`Cmd/Ctrl + ,`, search `http2`).
Log out and back in from Cursor Settings.
Pro subscribers: Click `Manage Subscription` in the [Dashboard](https://cursor.com/dashboard) to view your renewal date.
Free users: Check your first Cursor email date. Usage resets monthly from that date.
Low disk space may cause Cursor to clear historical data during updates. To prevent this:
1. Maintain sufficient free disk space before updating
2. Clean up unnecessary system files regularly
3. Back up important conversations before updating
Follow [this guide](https://code.visualstudio.com/docs/setup/uninstall). Replace "VS Code" or "Code" with "Cursor", and ".vscode" with ".cursor".
Click `Delete Account` in the [Dashboard](https://cursor.com/dashboard). This permanently deletes your account and all associated data.
Run `cursor` in your terminal. If the command is missing:
1. Open command palette `⌘⇧P`
2. Type `install command`
3. Select `Install 'cursor' command` (optionally install `code` command to override VS Code's)
If clicking Sign In redirects to cursor.com but doesn't sign you in, disable your firewall or antivirus software - they may block the sign-in process.
Due to recent increased misuse of our system, your request may have been blocked as a security measure. Here's how to resolve this:
First, check your VPN. If you're using one, try turning it off, as VPNs can sometimes trigger our security systems.
If that doesn't resolve it, you can try:
* Creating a new chat
* Waiting a bit and trying again later
* Creating a new account using Google or GitHub authentication
* Upgrading to Cursor Pro
# Getting a Request ID
Source: https://docs.cursor.com/en/troubleshooting/request-reporting
Find request IDs for technical support
When the Cursor team is investigating a technical issue, we may ask for a "request ID".
## What is a request ID?
A request ID uniquely identifies each request to Cursor in our internal systems.
Format example: `8f2a5b91-4d3e-47c6-9f12-5e8d94ca7d23`
## How do I find a request ID?
Request IDs are limited when Privacy Mode is enabled. Disable Privacy Mode when reporting issues.
Note: Business plan users have Privacy Mode enabled by default by their organization's admin.
### Getting your current request ID
To report an issue with your current or recent conversation:
With the conversation open in the Chat sidebar, use the context menu (top right) and select `Copy Request ID`.
Send the copied request ID to us via the forum or email as requested.
### Getting a request ID from a previous action
Retrieve historical request IDs using the `Report AI Action` command:
1. Open command palette `⌘⇧P`
2. Type `Report AI Action`
3. Select the `Report AI Action` option
This displays your recent AI actions across Chat, CMD+K, and Apply.
Select the action by matching its time and feature. Copy the request ID and send it to us.
# Troubleshooting Guide
Source: https://docs.cursor.com/en/troubleshooting/troubleshooting-guide
Steps to fix issues and report bugs
Cursor issues can stem from extensions, app data, or system problems. Try these troubleshooting steps.
Steps to report an issue to the Cursor team
## Troubleshooting
First check if Cursor can connect to its services.
**Run network diagnostics:** Go to `Cursor Settings` > `Network` and click `Run Diagnostics`. This tests your connection to Cursor's servers and identifies network issues affecting AI features, updates, or other online functionality.
If diagnostics reveal connectivity issues, check firewall settings, proxy configuration, or network restrictions blocking Cursor's access.
For extension issues:
**Disable all extensions temporarily:** Run `cursor --disable-extensions` from the command line. If issues resolve, re-enable extensions one by one to identify the problematic one.
**Reset extension data:** Uninstall and reinstall problematic extensions to reset their stored data. Check settings for extension configuration that persists after reinstallation.
This deletes your app data, including extensions, themes, snippets, and installation-related data. Export your profile first to preserve this data.
Cursor stores app data outside the app for restoration between updates and reinstallations.
To clear app data:
**Windows:** Run these commands in Command Prompt:
```txt theme={null}
rd /s /q "%USERPROFILE%\AppData\Local\Programs\Cursor"
rd /s /q "%USERPROFILE%\AppData\Local\Cursor"
rd /s /q "%USERPROFILE%\AppData\Roaming\Cursor"
del /f /q "%USERPROFILE%\.cursor*"
rd /s /q "%USERPROFILE%\.cursor"
```
**MacOS:** Run `sudo rm -rf ~/Library/Application\ Support/Cursor` and `rm -f ~/.cursor.json` in Terminal.
**Linux:** Run `rm -rf ~/.cursor ~/.config/Cursor/` in Terminal.
To uninstall Cursor:
Search "Add or Remove Programs" in Start Menu, find "Cursor", click "Uninstall".
Open Applications folder, right-click "Cursor", select "Move to Trash".
**For .deb packages:** `sudo apt remove cursor`
**For .rpm packages:** `sudo dnf remove cursor` or `sudo yum remove cursor`
**For AppImage:** Delete the Cursor.appimage file from its location.
Reinstall from the [Downloads page](https://www.cursor.com/downloads). Without cleared app data, Cursor restores to its previous state. Otherwise, you get a fresh install.
## Reporting an Issue
If these steps don't help, report to the [forum](https://forum.cursor.com/).
Report a bug or issue on the Cursor forum
For quick resolution, provide:
Capture a screenshot, redact sensitive information.
Document exact steps to reproduce the issue.
Get system info from:
`Cursor` > `Help` > `About`
Click to view our guide on gathering request IDs
Check developer console:
`Developer: Toggle Developer Tools`
Access logs:
`Developer: Open Logs Folder`
# Welcome
Source: https://docs.cursor.com/en/welcome
Learn about Cursor and how to get started
Cursor is an AI-powered code editor that understands your codebase and helps you code faster through natural language. Just describe what you want to build or change and Cursor will generate the code for you.
Download, install, and start building with Cursor in minutes
Stay up to date with the latest features and improvements
Use Cursor in your terminal
Understand core concepts and features that power Cursor
Explore AI models available and how to select the right one
Learn best practices and workflows for different use cases
Get Cursor for your computer
For technical queries and to share experiences, visit our forum
For account and billing questions, email our support team
# Seguridad del Agente
Source: https://docs.cursor.com/es/account/agent-security
Consideraciones de seguridad para usar Cursor Agent
La inyección de prompts, las alucinaciones de IA y otros problemas pueden hacer que la IA se comporte de formas inesperadas y potencialmente maliciosas. Mientras seguimos trabajando para resolver la inyección de prompts a un nivel más fundamental, nuestra protección principal en los productos de Cursor son los rieles de seguridad sobre lo que un agente puede hacer, incluyendo exigir aprobación manual para acciones sensibles de forma predeterminada. El objetivo de este documento es explicar estos rieles de seguridad y qué pueden esperar los usuarios de ellos.
Todos los controles y comportamientos a continuación son nuestra configuración predeterminada y recomendada.
## Llamadas a herramientas nativas
Cursor viene con herramientas integradas que le permiten al agente ayudarte a escribir código. Estas incluyen lectura de archivos, edición, ejecución de comandos de terminal, búsqueda de documentación en la web y otras.
Las herramientas de lectura no requieren aprobación (p. ej., leer archivos, buscar en el código). Puedes usar [.cursorignore](/es/context/ignore-files) para bloquear por completo el acceso del agente a archivos específicos, pero en caso contrario las lecturas generalmente están permitidas sin aprobación. Para acciones que conllevan riesgo de exfiltración de datos sensibles, requerimos aprobación explícita.
Modificar archivos dentro del espacio de trabajo actual no requiere aprobación explícita con algunas excepciones. Cuando un agente realiza cambios en archivos, estos se guardan inmediatamente en disco. Recomendamos ejecutar Cursor en espacios de trabajo con control de versiones, de modo que el contenido de los archivos pueda revertirse en cualquier momento. Requerimos aprobación explícita antes de cambiar archivos que modifiquen la configuración de nuestro IDE/CLI, como el archivo de configuración del espacio de trabajo del editor. Sin embargo, si tienes recarga automática al detectar cambios en archivos, ten en cuenta que los cambios del agente pueden activar ejecuciones automáticas antes de que hayas tenido oportunidad de revisarlos.
Cualquier comando de terminal sugerido por los agentes requiere aprobación de forma predeterminada. Recomendamos revisar cada comando antes de que el agente lo ejecute. Quienes acepten el riesgo pueden habilitar que el agente ejecute todos los comandos sin aprobación. Incluimos una [allowlist](/es/agent/tools) en Cursor, pero no la consideramos un control de seguridad. Algunas personas eligen permitir comandos específicos, pero es un sistema de mejor esfuerzo y pueden existir formas de eludirlo. No recomendamos "Run Everything", que omite cualquier allowlist configurada.
## Llamadas a herramientas de terceros
Cursor permite conectar herramientas externas a través de [MCP](/es/context/mcp). Todas las conexiones MCP de terceros deben ser aprobadas explícitamente por el usuario. Una vez que el usuario aprueba un MCP, de forma predeterminada cada llamada de herramienta sugerida en Agent Mode para cualquier integración MCP externa debe ser aprobada explícitamente antes de su ejecución.
## Solicitudes de red
Un atacante podría usar las solicitudes de red para exfiltrar datos. Actualmente no admitimos que herramientas propias realicen solicitudes de red fuera de un conjunto muy selecto de hosts (p. ej., GitHub), la recuperación explícita de enlaces ni el uso de la búsqueda web más que con un conjunto selecto de proveedores. Con la configuración predeterminada se impiden las solicitudes de red arbitrarias por parte de agentes.
## Confianza del espacio de trabajo
El IDE de Cursor admite la función estándar de [workspace trust](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust), que está *desactivada* de forma predeterminada. Workspace trust te muestra un aviso al abrir un nuevo espacio de trabajo para elegir entre modo normal o restringido. El modo restringido inutiliza la IA y otras funciones por las que normalmente usas Cursor. Te recomendamos usar otras herramientas, como un editor de texto básico, para trabajar con repos en los que no confíes.
Puedes habilitar workspace trust en la configuración de usuario siguiendo estos pasos:
1. Abre tu archivo de usuario settings.json
2. Agrega la siguiente configuración:
```json theme={null}
"security.workspace.trust.enabled": true
```
Esta configuración también puede aplicarse a nivel de organización mediante soluciones de Mobile Device Management (MDM).
## Divulgación responsable
Si crees que has encontrado una vulnerabilidad en Cursor, sigue la guía en nuestra página de seguridad de GitHub y envía el informe ahí. Si no puedes usar GitHub, también puedes escribirnos a [security@cursor.com](mailto:security@cursor.com).
Nos comprometemos a acusar recibo de los informes de vulnerabilidades en un plazo de 5 días hábiles y a resolverlos tan pronto como podamos. Publicaremos los resultados en forma de avisos de seguridad en nuestra página de seguridad de GitHub. Los incidentes críticos se comunicarán tanto en la página de seguridad de GitHub como por correo electrónico a todos los usuarios.
# Facturación
Source: https://docs.cursor.com/es/account/billing
Gestión de suscripciones, reembolsos y facturas de Cursor
### How do I access billing settings?
Accede al portal de facturación desde el [Dashboard](https://cursor.com/dashboard) haciendo clic en "Billing" en tu dashboard. Se abrirá un portal seguro para todas las tareas de facturación.
### What are Cursor's billing cycles?
Los ciclos de facturación pueden ser mensuales o anuales y comienzan en la fecha de tu suscripción. Las cuentas de Teams se cobran por asiento, con prorrateo para miembros nuevos.
### How do seats work for Teams accounts?
Las cuentas de Teams cobran por asiento (uno por cada miembro del equipo). Si agregas miembros a mitad de ciclo, solo se te cobra por el tiempo restante. Si un miembro ha usado créditos y lo quitas, su asiento permanece ocupado hasta el final del ciclo de facturación; no hay reembolsos prorrateados. Los administradores del equipo pueden gestionar los asientos desde el dashboard.
### Can I switch between monthly and annual billing?
¡Sí! Así es cómo:
**Pro plan**
1. Ve al [dashboard](https://cursor.com/dashboard) de Cursor
2. Haz clic en "Billing and Invoices" en la barra lateral izquierda para ir a la página de facturación
3. Haz clic en "Manage subscription"
4. Haz clic en "Update subscription"
5. Selecciona "Yearly" o "Monthly" y luego haz clic en "Continue"
**Teams plan**
1. Ve al [dashboard](https://cursor.com/dashboard) de Cursor
2. Haz clic en "Billing and Invoices" en la barra lateral izquierda para ir a la página de facturación
3. Haz clic en el botón "Upgrade Now" para cambiar a facturación anual
Solo puedes cambiar de facturación mensual a anual por tu cuenta. Para cambiar de anual a mensual, contáctanos en
[hi@cursor.com](mailto:hi@cursor.com).
### Where can I find my invoices?
Encuentra todo tu historial de facturación en el portal de facturación. Puedes ver y descargar facturas actuales y pasadas.
### Can I get invoices automatically emailed to me?
Las facturas deben descargarse manualmente desde el portal de facturación. Estamos desarrollando el envío automático por email. Podrás activar la opción cuando esté disponible.
### How do I update my billing information?
Actualiza el método de pago, el nombre de la empresa, la dirección y la información fiscal desde el portal de facturación. Usamos Stripe para transacciones seguras. Los cambios solo afectan a facturas futuras; no podemos modificar facturas anteriores.
### How do I cancel my subscription?
Cancela tu suscripción desde la página "Billing and Invoices" haciendo clic en "Manage Subscription" y luego en el botón "Cancel subscription". Seguirás teniendo acceso hasta el final de tu período de facturación actual.
### I'm having other billing issues. How can I get help?
Para consultas de facturación no cubiertas aquí, envía un email a [hi@cursor.com](mailto:hi@cursor.com) desde el email asociado a tu cuenta. Incluye los detalles de tu cuenta y tus inquietudes.
# Precios
Source: https://docs.cursor.com/es/account/pricing
Los planes de Cursor y sus precios
Podés probar Cursor gratis o comprar un plan individual o de equipo.
## Individual
Todos los planes individuales incluyen:
* Autocompletados en pestañas ilimitados
* Límites ampliados de uso de agentes en todos los modelos
* Acceso a Bugbot
* Acceso a Background Agents
Cada plan incluye uso facturado según los precios de inferencia del modelo [API prices](/es/models#model-pricing):
* Pro incluye \$20 de uso de API de agentes + uso adicional de bonificación
* Pro Plus incluye \$70 de uso de API de agentes + uso adicional de bonificación
* Ultra incluye \$400 de uso de API de agentes + uso adicional de bonificación
Trabajamos mucho para otorgar capacidad de bonificación adicional más allá del uso incluido garantizado. Como distintos modelos tienen diferentes costos de API, la selección de modelo afecta la salida de tokens y qué tan rápido se consume tu uso incluido. Puedes ver el uso y los desgloses de tokens en [tu panel](https://cursor.com/dashboard?tab=usage). Las notificaciones de límite se muestran de forma habitual en el editor.
### ¿Cuánto uso necesito?
Según nuestros datos de uso, puedes esperar los siguientes niveles:
* **Usuarios que usan Tab a diario**: Siempre se mantienen dentro de \$20
* **Usuarios con uso limitado de Agent**: A menudo se mantienen dentro de los \$20 incluidos
* **Usuarios que usan Agent a diario**: Normalmente $60–$100/mes de uso total
* **Usuarios avanzados (varios agents/automatización)**: A menudo \$200+/mes de uso total
Según nuestros datos de uso, los límites son aproximadamente equivalentes a lo siguiente para un *usuario mediano*:
* Pro: \~225 solicitudes de Sonnet 4, \~550 solicitudes de Gemini o \~500 solicitudes de GPT 5
* Pro+: \~675 solicitudes de Sonnet 4, \~1,650 solicitudes de Gemini o \~1,500 solicitudes de GPT 5
* Ultra: \~4,500 solicitudes de Sonnet 4, \~11,000 solicitudes de Gemini o \~10,000 solicitudes de GPT 5
### ¿Qué pasa cuando llego a mi límite?
Cuando superes tu uso mensual incluido, vas a recibir una notificación en el editor y podés elegir:
* **Agregar uso bajo demanda**: Seguí usando Cursor a las mismas tarifas de API con facturación por consumo
* **Actualizar tu plan**: Pasá a un nivel superior para tener más uso incluido
El uso bajo demanda se factura mensualmente a las mismas tarifas que tu uso incluido. Las solicitudes nunca se degradan en calidad ni velocidad.
## Teams
Hay dos planes para equipos: Teams (\$40/usuario/mes) y Enterprise (Personalizado).
Los planes de Teams incluyen funciones adicionales como:
* Aplicación del Privacy Mode
* Panel de administración con estadísticas de uso
* Facturación centralizada del equipo
* SSO con SAML/OIDC
Recomendamos Teams para cualquier cliente que esté cómodo autoatendiéndose. Recomendamos [Enterprise](/es/contact-sales) para clientes que necesiten soporte prioritario, uso compartido, facturación, SCIM o controles de seguridad avanzados.
Obtén más información sobre los [precios de Teams](/es/account/teams/pricing).
## Auto
Activar Auto permite que Cursor elija el modelo premium más adecuado para la tarea inmediata y con la mayor fiabilidad según la demanda actual. Esta función puede detectar una degradación en el rendimiento de salida y cambiar de modelo automáticamente para solucionarlo.
Hemos invertido mucho en la calidad y el rendimiento general de Auto. A partir de tu próxima renovación de facturación después del 15 de septiembre, Auto consumirá a las siguientes tarifas de API.
* **Input + Cache Write**: \$1.25 por 1M de tokens
* **Output**: \$6.00 por 1M de tokens
* **Cache Read**: \$0.25 por 1M de tokens
Tanto el editor como el panel mostrarán tu consumo, que incluye Auto. Si prefieres seleccionar un modelo directamente, el consumo se cobrará al precio de lista de la API de ese modelo.
## Modo Max
Algunos modelos pueden usar [Max Mode](/es/models#max-mode), lo que permite razonamientos más extensos y ventanas de contexto más grandes, de hasta 1M tokens. Aunque la mayoría de las tareas de programación no necesitan usar Max Mode, puede ser útil para consultas más complejas, especialmente con archivos o codebases grandes. Usar Max Mode consumirá más cuota. Puedes ver todas las solicitudes y el desglose de tokens en [tu panel](https://cursor.com/dashboard?tab=usage).
## Bugbot
Bugbot es un producto independiente de las suscripciones de Cursor y tiene su propio plan de precios.
* **Pro** (40 \$/mes): Revisiones ilimitadas en hasta 200 PR/mes, acceso ilimitado a Cursor Ask, integración con Cursor para corregir bugs y acceso a Bugbot Rules
* **Teams** (40 \$/usuario/mes): Revisiones de código ilimitadas en todos los PR, acceso ilimitado a Cursor Ask, uso compartido entre tu equipo y reglas y configuraciones avanzadas
* **Enterprise** (Personalizado): Todo lo de Teams, más analíticas y reportes avanzados, soporte prioritario y gestión de cuentas
Más información sobre los [precios de Bugbot](https://cursor.com/bugbot#pricing).
## Agente en segundo plano
Los agentes en segundo plano se cobran según los precios de la API para el [modelo](/es/models) seleccionado. Cuando empieces a usarlos por primera vez, se te pedirá que establezcas un límite de gasto para los agentes en segundo plano.
El cómputo de la máquina virtual (VM) para agentes en segundo plano se tarificará en el futuro.
# Admin API
Source: https://docs.cursor.com/es/account/teams/admin-api
Accedé a métricas del equipo, datos de uso e información de gastos vía API
La Admin API te permite acceder de forma programática a los datos de tu equipo, incluyendo información de miembros, métricas de uso y detalles de gastos. Creá dashboards personalizados, herramientas de monitoreo o integrá con tus workflows existentes.
La API está en su primera versión. Estamos ampliando capacidades según el feedback: ¡contanos qué endpoints necesitás!
## Autenticación
Todas las solicitudes a la API requieren autenticación con una clave de API. Solo los administradores del equipo pueden crear y gestionar claves de API.
Las claves de API están vinculadas a la organización, son visibles para todos los administradores y no se ven afectadas por el estado de la cuenta de quien las creó originalmente.
### Crear una clave de API
1. Ve a **cursor.com/dashboard** → pestaña **Settings** → **Cursor Admin API Keys**
2. Haz clic en **Create New API Key**
3. Dale a tu clave un nombre descriptivo (p. ej., "Integración del panel de uso")
4. Copia la clave generada de inmediato: no la volverás a ver
Formato: `key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
### Usar tu clave de API
Usa tu clave de API como nombre de usuario en la autenticación básica:
**Usar curl con autenticación básica:**
```bash theme={null}
curl https://api.cursor.com/{route} -u API_KEY:
```
**O bien establece directamente el encabezado Authorization:**
```bash theme={null}
Authorization: Basic {base64_encode('API_KEY:')}
```
## URL base
Todos los endpoints de la API utilizan:
```
https://api.cursor.com
```
## Endpoints
### Obtener miembros del equipo
Obtén todos los miembros del equipo y sus detalles.
```
GET /teams/members
```
#### Respuesta
Devuelve un array de objetos de miembros del equipo:
```typescript theme={null}
{
teamMembers: {
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
}[];
}
```
#### Respuesta de ejemplo
```json theme={null}
{
"teamMembers": [
{
"name": "Alex",
"email": "developer@company.com",
"role": "miembro"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "dueño"
}
]
}
```
#### Ejemplo de solicitud
```bash theme={null}
curl -X GET https://api.cursor.com/teams/members \
-u TU_CLAVE_API:
```
### Obtener datos de uso diario
Obtén métricas diarias detalladas para tu equipo en un rango de fechas. Ofrece información sobre ediciones de código, uso de la IA de asistencia y tasas de aceptación.
```
POST /teams/uso-diario
```
#### Cuerpo de la solicitud
| Parámetro | Tipo | Requerido | Descripción |
| :---------- | :----- | :-------- | :--------------------------------------- |
| `startDate` | number | Sí | Fecha de inicio en milisegundos de época |
| `endDate` | number | Sí | Fecha de fin en milisegundos de época |
El rango de fechas no puede superar los 90 días. Haz varias solicitudes para periodos más largos.
#### Respuesta
```typescript theme={null}
{
data: {
date: number;
isActive: boolean;
totalLinesAdded: number;
totalLinesDeleted: number;
acceptedLinesAdded: number;
acceptedLinesDeleted: number;
totalApplies: number;
totalAccepts: number;
totalRejects: number;
totalTabsShown: number;
totalTabsAccepted: number;
composerRequests: number;
chatRequests: number;
agentRequests: number;
cmdkUsages: number;
subscriptionIncludedReqs: number;
apiKeyReqs: number;
usageBasedReqs: number;
bugbotUsages: number;
mostUsedModel: string;
applyMostUsedExtension?: string;
tabMostUsedExtension?: string;
clientVersion?: string;
email?: string;
}[];
period: {
startDate: number;
endDate: number;
};
}
```
#### Campos de respuesta
| Field | Description |
| :------------------------- | :----------------------------------------------- |
| `date` | Fecha en milisegundos desde la época (epoch) |
| `isActive` | Usuario activo ese día |
| `totalLinesAdded` | Líneas de código añadidas |
| `totalLinesDeleted` | Líneas de código eliminadas |
| `acceptedLinesAdded` | Líneas añadidas de sugerencias de IA aceptadas |
| `acceptedLinesDeleted` | Líneas eliminadas de sugerencias de IA aceptadas |
| `totalApplies` | Operaciones de apply |
| `totalAccepts` | Sugerencias aceptadas |
| `totalRejects` | Sugerencias rechazadas |
| `totalTabsShown` | Autocompletados por tab mostrados |
| `totalTabsAccepted` | Autocompletados por tab aceptados |
| `composerRequests` | Solicitudes del Composer |
| `chatRequests` | Solicitudes de chat |
| `agentRequests` | Solicitudes del agente |
| `cmdkUsages` | Usos de la paleta de comandos (Cmd+K) |
| `subscriptionIncludedReqs` | Solicitudes incluidas en la suscripción |
| `apiKeyReqs` | Solicitudes con clave de API |
| `usageBasedReqs` | Solicitudes de pago por uso |
| `bugbotUsages` | Usos del detector de bugs |
| `mostUsedModel` | Modelo de IA más usado |
| `applyMostUsedExtension` | Extensión de archivo más usada en applies |
| `tabMostUsedExtension` | Extensión de archivo más usada en tabs |
| `clientVersion` | Versión de Cursor |
| `email` | Correo electrónico del usuario |
| Campo | Descripción |
| :------------------------- | :------------------------------------------------------------ |
| `spendCents` | Gasto total en centavos |
| `fastPremiumRequests` | Solicitudes al modelo premium rápido |
| `name` | Nombre del miembro |
| `email` | Correo electrónico del miembro |
| `role` | Rol en el equipo |
| `hardLimitOverrideDollars` | Anulación del límite de gasto personalizado |
| `subscriptionCycleStart` | Inicio del ciclo de suscripción (milisegundos desde la época) |
| `totalMembers` | Total de miembros del equipo |
| `totalPages` | Total de páginas |
Obtén eventos de uso detallados para tu equipo con opciones completas de filtrado, búsqueda y paginación. Este endpoint ofrece información granular sobre llamadas individuales a la API, uso de modelos, consumo de tokens y costos.
```
POST /teams/filtered-usage-events
```
#### Cuerpo de la solicitud
| Parámetro | Tipo | Requerido | Descripción |
| :---------- | :----- | :-------- | :--------------------------------------------------------- |
| `startDate` | number | No | Fecha de inicio en milisegundos de época (epoch) |
| `endDate` | number | No | Fecha de fin en milisegundos de época (epoch) |
| `userId` | number | No | Filtrar por ID de usuario específico |
| `page` | number | No | Número de página (con índice desde 1). Predeterminado: `1` |
| `pageSize` | number | No | Cantidad de resultados por página. Predeterminado: `10` |
| `email` | string | No | Filtrar por correo electrónico del usuario |
| Campo | Descripción |
| :---------------------- | :----------------------------------------------------------------------- |
| `totalUsageEventsCount` | Número total de eventos de uso que coinciden con la consulta |
| `pagination` | Metadatos de paginación para navegar los resultados |
| `timestamp` | Marca de tiempo del evento en milisegundos desde el epoch |
| `model` | Modelo de IA usado para la solicitud |
| `kind` | Categoría de uso (p. ej., "Usage-based", "Included in Business") |
| `maxMode` | Si el modo máximo estaba habilitado |
| `requestsCosts` | Costo en unidades de solicitud |
| `isTokenBasedCall` | True cuando el evento se cobra como evento basado en uso |
| `tokenUsage` | Consumo detallado de tokens (disponible cuando isTokenBasedCall es true) |
| `isFreeBugbot` | Si fue un uso gratuito de bugbot |
| `userEmail` | Correo del usuario que hizo la solicitud |
| `period` | Rango de fechas de los datos consultados |
**Obtener todos los eventos de uso con la paginación por defecto:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Filtrar por intervalo de fechas y usuario específico:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
```
**Obtén eventos de uso de un usuario específico con paginación personalizada:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": 12345,
"page": 2,
"pageSize": 50
}'
```
### Establecer límite de gasto por usuario
Establece límites de gasto para miembros específicos del equipo. Esto te permite controlar cuánto puede gastar cada usuario en uso de IA dentro de tu equipo.
```
POST /teams/user-spend-limit
```
**Limitación de frecuencia:** 60 solicitudes por minuto por equipo
#### Cuerpo de la solicitud
| Parámetro | Tipo | Obligatorio | Descripción |
| :------------------ | :----- | :---------- | :---------------------------------------------------------------- |
| `userEmail` | string | Sí | Dirección de correo del miembro del equipo |
| `spendLimitDollars` | number | Sí | Límite de gasto en dólares (solo números enteros, sin decimales). |
* El usuario ya debe ser miembro de tu equipo
* Solo se aceptan valores enteros (sin decimales)
* Establecer `spendLimitDollars` en 0 fija el límite en \$0
#### Respuesta
Devuelve una respuesta estandarizada que indica si hubo éxito o error:
```typescript theme={null}
{
outcome: 'success' | 'error';
message: string;
}
```
#### Respuestas de ejemplo
**Límite establecido correctamente:**
```json theme={null}
{
"outcome": "success",
"message": "Límite de gasto configurado en $100 para el usuario developer@company.com"
}
```
**Respuesta de error:**
```json theme={null}
{
"outcome": "error",
"message": "Formato de correo electrónico inválido"
}
```
#### Ejemplos de solicitudes
**Configurar un límite de gasto:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/user-spend-limit \
-u TU_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userEmail": "developer@company.com",
"spendLimitDollars": 100
}'
```
### API de listas de bloqueo de repos
Agrega repos y usa patrones para evitar que archivos o directorios se indexen o se usen como contexto para tu equipo.
#### Obtener las blocklists de repos del equipo
Obtén todas las blocklists de repos configuradas para tu equipo.
```
GET /settings/repo-blocklists/repos
```
##### Respuesta
Devuelve un array de objetos de lista de bloqueo del repositorio:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
Reemplaza las listas de bloqueo de repositorios existentes para los repos proporcionados.
*Nota: Este endpoint solo sobrescribirá los patrones de los repositorios proporcionados. Todos los demás repos no se verán afectados.*
```
POST /settings/repo-blocklists/repos/upsert
```
##### Cuerpo de la solicitud
| Parámetro | Tipo | Requerido | Descripción |
| --------- | ----- | --------- | ------------------------------------------- |
| repos | array | Sí | Lista de objetos de bloqueo de repositorios |
Cada objeto de repositorio debe contener:
| Campo | Tipo | Requerido | Descripción |
| -------- | --------- | --------- | ------------------------------------------------------------------- |
| url | string | Sí | URL del repositorio a bloquear |
| patterns | string\[] | Sí | Lista de patrones de archivos a bloquear (se admiten patrones glob) |
##### Respuesta
Devuelve la lista actualizada de listas de bloqueo del repositorio:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
Quita un repositorio específico de la lista de bloqueo.
```
DELETE /settings/repo-blocklists/repos/:repoId
```
##### Parámetros
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ------ | ----------- | -------------------------------------------------------------- |
| repoId | string | Sí | ID de la lista de bloqueo del repositorio que se va a eliminar |
##### Respuesta
Devuelve 204 No Content si la eliminación se realiza correctamente.
##### Ejemplo de petición
```bash theme={null}
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u TU_API_KEY:
```
#### Ejemplos de patrones
Patrones comunes de la blocklist:
* `*` - Bloquear todo el repositorio
* `*.env` - Bloquear todos los archivos .env
* `config/*` - Bloquear todos los archivos del directorio config
* `**/*.secret` - Bloquear todos los archivos .secret en cualquier subdirectorio
* `src/api/keys.ts` - Bloquear un archivo específico
# API de seguimiento de código con IA
Source: https://docs.cursor.com/es/account/teams/ai-code-tracking-api
Accede a analíticas de código generadas por IA para los repositorios de tu equipo
Accede a analíticas de código generadas por IA para los repositorios de tu equipo. Incluye uso de IA por commit y cambios de IA aceptados a nivel granular.
La API está en su primera versión. Estamos ampliando funcionalidades según el feedback; ¡cuéntanos qué endpoints necesitas!
* **Disponibilidad**: Solo para equipos Enterprise
* **Estado**: Alpha (las estructuras y los campos de la respuesta pueden cambiar)
## Autenticación
Todas las solicitudes a la API requieren autenticación con una clave de API. Esta API usa el mismo método de autenticación del Admin API que otros endpoints.
Para ver instrucciones detalladas de autenticación, consulta [Autenticación del Admin API](/es/account/teams/admin-api#authentication).
## URL base
Todas las rutas de la API usan:
```
https://api.cursor.com
```
## Límites de uso
* 5 solicitudes por minuto por equipo y por endpoint
## Parámetros de consulta
Todos los endpoints a continuación aceptan los mismos parámetros a través del query string:
| Parámetro | Tipo | Obligatorio | Descripción | |
| :---------- | :----- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `startDate` | string | date | No | Cadena de fecha ISO, el literal "now" o días relativos como "7d" (equivale a ahora - 7 días). Predeterminado: ahora - 7 días |
| `endDate` | string | date | No | Cadena de fecha ISO, el literal "now" o días relativos como "0d". Predeterminado: ahora |
| `page` | number | No | Número de página (base 1). Predeterminado: 1 | |
| `pageSize` | number | No | Resultados por página. Predeterminado: 100, máx.: 1000 | |
| `user` | string | No | Filtro opcional por un único usuario. Acepta email (p. ej., [developer@company.com](mailto:developer@company.com)), ID codificado (p. ej., user\_abc123...) o ID numérico (p. ej., 42) | |
Las respuestas devuelven userId como un ID externo codificado con el prefijo user\_. Esto es estable para el consumo por API.
## Semántica y cómo se calculan las métricas
* **Origen**: "TAB" representa las completions en línea aceptadas; "COMPOSER" representa diffs aceptados desde Composer
* **Métricas de líneas**: tabLinesAdded/Deleted y composerLinesAdded/Deleted se cuentan por separado; nonAiLinesAdded/Deleted se calculan como max(0, totalLines - AI lines)
* **Modo de privacidad**: Si está habilitado en el cliente, puede omitirse cierta metadata (como fileName)
* **Información de la rama**: isPrimaryBranch es true cuando la rama actual es igual a la rama predeterminada del repo; puede ser undefined si la info del repo no está disponible
Podés escanear ese archivo para entender cómo se detectan y reportan los commits y cambios.
## Endpoints
### Obtener métricas de commits con IA (JSON, paginadas)
Obtén métricas agregadas por commit que atribuyen líneas a TAB, COMPOSER y no IA.
```
GET /analytics/ai-code/commits
```
| Campo | Tipo | Descripción | |
| :--------------------- | :------ | :------------------------------------------------ | ---------------------------------------- |
| `commitHash` | string | Hash del commit de Git | |
| `userId` | string | ID de usuario codificado (p. ej., user\_abc123) | |
| `userEmail` | string | Dirección de correo electrónico del usuario | |
| `repoName` | string | null | Nombre del repositorio |
| `branchName` | string | null | Nombre de la rama |
| `isPrimaryBranch` | boolean | null | Indica si es la rama principal |
| `totalLinesAdded` | number | Total de líneas añadidas en el commit | |
| `totalLinesDeleted` | number | Total de líneas eliminadas en el commit | |
| `tabLinesAdded` | number | Líneas añadidas mediante autocompletado con TAB | |
| `tabLinesDeleted` | number | Líneas eliminadas mediante autocompletado con TAB | |
| `composerLinesAdded` | number | Líneas añadidas mediante Composer | |
| `composerLinesDeleted` | number | Líneas eliminadas mediante Composer | |
| `nonAiLinesAdded` | number | null | Líneas no generadas por IA añadidas |
| `nonAiLinesDeleted` | number | null | Líneas no generadas por IA eliminadas |
| `message` | string | null | Mensaje del commit |
| `commitTs` | string | null | Marca de tiempo del commit (formato ISO) |
| `createdAt` | string | Marca de tiempo de ingesta (formato ISO) | |
| Columna | Tipo | Descripción |
| :----------------------- | :------ | :------------------------------------------- |
| `commit_hash` | string | Hash del commit de Git |
| `user_id` | string | ID de usuario codificado |
| `user_email` | string | Dirección de correo electrónico del usuario |
| `repo_name` | string | Nombre del repositorio |
| `branch_name` | string | Nombre de la rama |
| `is_primary_branch` | boolean | Si es la rama principal |
| `total_lines_added` | number | Total de líneas añadidas en el commit |
| `total_lines_deleted` | number | Total de líneas eliminadas en el commit |
| `tab_lines_added` | number | Líneas añadidas con autocompletado por TAB |
| `tab_lines_deleted` | number | Líneas eliminadas con autocompletado por TAB |
| `composer_lines_added` | number | Líneas añadidas con Composer |
| `composer_lines_deleted` | number | Líneas eliminadas con Composer |
| `non_ai_lines_added` | number | Líneas no generadas por IA añadidas |
| `non_ai_lines_deleted` | number | Líneas no generadas por IA eliminadas |
| `message` | string | Mensaje del commit |
| `commit_ts` | string | Marca de tiempo del commit (formato ISO) |
| `created_at` | string | Marca de tiempo de ingesta (formato ISO) |
#### Ejemplo de salida CSV
```csv theme={null}
commit_hash,user_id,user_email,repo_name,branch_name,is_primary_branch,total_lines_added,total_lines_deleted,tab_lines_added,tab_lines_deleted,composer_lines_added,composer_lines_deleted,non_ai_lines_added,non_ai_lines_deleted,message,commit_ts,created_at
a1b2c3d4,user_3k9x8q...,developer@company.com,company/repo,main,true,120,30,50,10,40,5,30,15,"Refactor: extraer cliente de analítica",2025-07-30T14:12:03.000Z,2025-07-30T14:12:30.000Z
e5f6g7h8,user_3k9x8q...,developer@company.com,company/repo,feature-branch,false,85,15,30,5,25,3,30,7,"Añadir manejo de errores",2025-07-30T13:45:21.000Z,2025-07-30T13:45:45.000Z
```
### Obtener métricas de cambios de IA (JSON, paginadas)
Obtén cambios de IA aceptados a nivel granular, agrupados por un changeId determinista. Útil para analizar eventos de IA aceptados de forma independiente a los commits.
```
GET /analytics/ai-code/changes
```
| Campo | Tipo | Descripción | |
| :------------------ | :----- | :----------------------------------------------------------------------- | --------------------------------- |
| `changeId` | string | ID determinista del cambio | |
| `userId` | string | ID de usuario codificado (p. ej., user\_abc123) | |
| `userEmail` | string | Dirección de correo del usuario | |
| `source` | "TAB" | "COMPOSER" | Origen del cambio generado por IA |
| `model` | string | null | Modelo de IA usado |
| `totalLinesAdded` | number | Total de líneas añadidas | |
| `totalLinesDeleted` | number | Total de líneas eliminadas | |
| `createdAt` | string | Marca de tiempo de ingesta (formato ISO) | |
| `metadata` | Array | Metadatos del archivo (fileName puede omitirse en el modo de privacidad) | |
| Columna | Tipo | Descripción |
| :-------------------- | :----- | :--------------------------------------------------- |
| `change_id` | string | ID determinista del cambio |
| `user_id` | string | ID de usuario codificado |
| `user_email` | string | Dirección de correo del usuario |
| `source` | string | Origen del cambio de IA (TAB o COMPOSER) |
| `model` | string | Modelo de IA utilizado |
| `total_lines_added` | number | Total de líneas agregadas |
| `total_lines_deleted` | number | Total de líneas eliminadas |
| `created_at` | string | Marca de tiempo de ingesta (formato ISO) |
| `metadata_json` | string | Arreglo de entradas de metadatos serializado en JSON |
#### Notas
* metadata\_json es un arreglo de entradas de metadatos serializado en JSON (puede omitir fileName en modo de privacidad)
* Al consumir CSV, asegúrate de analizar los campos entre comillas
* Usa el parámetro `user` para filtrar rápido a un solo usuario en todos los endpoints
* Para extracciones de datos grandes, prefiere los endpoints CSV: hacen streaming en páginas de 10.000 registros del lado del servidor
* `isPrimaryBranch` puede ser `undefined` si el cliente no pudo resolver la rama predeterminada
* `commitTs` es la marca de tiempo del commit; `createdAt` es la hora de ingesta en nuestros servidores
* Algunos campos pueden estar ausentes cuando el modo de privacidad está habilitado en el cliente
## Registro de cambios
* **Versión alfa**: Endpoints iniciales para commits y cambios. Las formas de las respuestas pueden evolucionar según el feedback
# Analytics
Source: https://docs.cursor.com/es/account/teams/analytics
Haz seguimiento del uso del equipo y las métrricas de actividad
Los admins del equipo pueden ver métricas desde el [dashboard](/es/account/teams/dashboard).
### Uso total
Consulta métricas agregadas de tu equipo, incluidas pestañas totales y solicitudes premium. En equipos con menos de 30 días, las métricas muestran el uso desde la creación, incluida la actividad previa al ingreso de los miembros del equipo.
### Por usuario activo
Mira los promedios por usuario activo: pestañas aceptadas, líneas de código y solicitudes premium.
### Actividad de usuarios
Haz seguimiento de usuarios activos semanales y mensuales.
## Encabezados del informe de analíticas
Cuando exportas datos de analíticas desde el panel, el informe incluye métricas detalladas sobre el comportamiento de los usuarios y el uso de funcionalidades. Esto es lo que significa cada encabezado:
### Información del usuario
La fecha en que se registraron los datos de analíticas (p. ej., 2024-01-15T04:30:00.000Z)
Identificador único de cada usuario en el sistema
Dirección de correo del usuario asociada a su cuenta
Indica si el usuario estuvo activo en esta fecha
### Métricas de código generado por IA
Total de líneas de código sugeridas por la función de chat con IA
Total de líneas de código sugeridas para eliminación por el chat con IA
Líneas sugeridas por IA que el usuario aceptó y añadió a su código
Eliminaciones sugeridas por IA que el usuario aceptó
### Métricas de uso de funcionalidades
Veces que un usuario aplicó cambios generados por IA desde el chat
Veces que un usuario aceptó sugerencias de IA
Veces que un usuario rechazó sugerencias de IA
Veces que se mostraron al usuario pestañas de sugerencias de IA
Pestañas de sugerencias de IA aceptadas por el usuario
### Métricas por tipo de solicitud
Solicitudes realizadas a través de la función de composer/edición (Cmd+K ediciones en línea)
Solicitudes de chat donde los usuarios hicieron preguntas a la IA
Solicitudes realizadas a agentes de IA (asistentes de IA especializados)
Veces que se usó la paleta de comandos Cmd+K (o Ctrl+K)
### Métricas de suscripción y API
Solicitudes a la IA cubiertas por el plan de suscripción del usuario
Solicitudes realizadas usando claves de API para acceso programático
Solicitudes que computan para la facturación basada en uso
### Funcionalidades adicionales
Veces que se usó la función de detección/corrección de errores con IA
### Información de configuración
El modelo de IA que el usuario usó con mayor frecuencia (p. ej., GPT-4, Claude)
Extensión de archivo más usada al aplicar sugerencias de IA (p. ej., .ts,
.py, .java)
Extensión de archivo más usada con las funciones de autocompletado por pestañas
Versión del editor Cursor en uso
### Métricas calculadas
El informe también incluye datos procesados que ayudan a entender la contribución de código de la IA:
* Total de líneas agregadas/eliminadas: conteo bruto de todos los cambios de código
* Líneas aceptadas agregadas/eliminadas: líneas que se originaron en sugerencias de IA y fueron aceptadas
* Solicitudes del compositor: solicitudes realizadas a través de la función de compositor en línea
* Solicitudes de chat: solicitudes realizadas a través de la interfaz de chat
Todos los valores numéricos por defecto son 0 si no están presentes, los valores booleanos por defecto son false y los valores de cadena por defecto son cadenas vacías. Las métricas se agregan a nivel diario por usuario.
# Analytics V2
Source: https://docs.cursor.com/es/account/teams/analyticsV2
Seguimiento avanzado de métricas de uso y actividad del equipo
Estamos trabajando en el lanzamiento de la V2 de nuestra infraestructura de analytics. Esto incluye un refactor de cómo rastreamos varias métricas.
A partir del **1 de septiembre de 2025**, y para usuarios en **Cursor versión 1.5**, analytics utilizará nuestra infraestructura V2. Las versiones anteriores habrían infracontabilizado varias métricas, incluidas:
* Total de líneas de código aceptadas
* Total de líneas de código sugeridas
* Total de pestañas aceptadas
Mantente al tanto mientras seguimos invirtiendo en analytics y lanzando nuevas funciones en este espacio.
# Panel
Source: https://docs.cursor.com/es/account/teams/dashboard
Administra la facturación, el uso y la configuración del equipo desde tu panel
El panel te permite acceder a la facturación, configurar precios basados en uso y administrar tu equipo.
## Resumen
Obtén un resumen rápido de la actividad de tu equipo, las estadísticas de uso y los cambios recientes. La página de resumen ofrece una visión general inmediata de tu espacio de trabajo.
## Configuración
Configura las preferencias y la seguridad de todo el equipo. La página de configuración incluye:
## Configuración de Teams y Enterprise
Controla las preferencias de uso compartido de datos de tu equipo. Configura políticas de retención cero con proveedores de IA (OpenAI, Anthropic, Google Vertex AI, xAI Grok) y gestiona la aplicación de la privacidad a nivel de equipo.
{" "}
Activa la facturación basada en uso y establece límites de gasto. Configura límites de gasto mensuales del equipo y límites opcionales por usuario. Controla si solo los admins pueden modificar esta configuración.
{" "}
Configura roles de AWS Bedrock IAM para una integración segura en la nube.
{" "}
Configura la autenticación SSO para equipos Enterprise y agiliza el acceso de los usuarios y la seguridad.
{" "}
Crea y gestiona claves de API para el acceso programático a las funciones de administración de Cursor.
{" "}
Supervisa y gestiona las sesiones activas de usuarios en todo tu equipo.
Crea y gestiona códigos de invitación para añadir nuevas personas al equipo.
Accede a los endpoints de la REST API de Cursor para la integración programática. Todos los endpoints de la API están disponibles en los planes Team y Enterprise, excepto la [AI Code Tracking API](/es/docs/account/teams/ai-code-tracking-api), que requiere una suscripción Enterprise.
## Configuraciones exclusivas de Enterprise
{" "}
Controla qué modelos de IA están disponibles para los miembros del equipo. Establece restricciones en
modelos específicos o niveles de modelo para gestionar costos y garantizar un uso adecuado
en toda tu organización.
{" "}
Configura los ajustes de ejecución automática de comandos para Cursor versión 0.49 y
posteriores. Controla qué comandos pueden ejecutarse automáticamente y define políticas de seguridad
para la ejecución de código.
Evita el acceso a repositorios específicos por razones de seguridad o cumplimiento.
{" "}
Configura los ajustes de Model Context Protocol para Cursor versión 0.51 y posteriores.
Administra cómo los modelos acceden y procesan el contexto desde tu entorno de
desarrollo.
{" "}
Configura patrones de exclusión para archivos y directorios en Cursor versión 0.50 y
posteriores. Controla qué archivos y directorios se excluyen del análisis de IA y de
las sugerencias.
Protege el directorio .cursor contra accesos no autorizados en la versión 0.51 y posteriores. Asegura que los archivos sensibles de configuración y caché permanezcan protegidos.
Accede a analíticas detalladas del código generado por IA para los repositorios de tu equipo. Obtén métricas de uso de IA por commit y cambios de IA aceptados a nivel granular mediante endpoints de la API REST. Requiere un plan Enterprise. Encuentra más información [aquí](/es/account/teams/ai-code-tracking-api).
El aprovisionamiento **SCIM** (System for Cross-domain Identity Management) también está
disponible para planes Enterprise. Consulta nuestra [documentación de SCIM](/es/account/teams/scim)
para obtener instrucciones de configuración.
## Miembros
Administra a los miembros de tu equipo, invita a nuevos usuarios y controla los permisos de acceso. Configura permisos por rol y monitorea la actividad de los miembros.
## Integraciones
{" "}
Conecta Cursor con tus herramientas y servicios favoritos. Configura integraciones con sistemas de control de versiones, herramientas de gestión de proyectos y otros servicios para desarrolladores.
## Agentes en segundo plano
{" "}
Monitorea y gestiona los agentes en segundo plano que se ejecutan en tu espacio de trabajo. Revisa el estado de los agentes, los registros y el uso de recursos.
## Bugbot
Accedé a funciones automatizadas para detectar y corregir bugs. Bugbot te ayuda a identificar y resolver problemas comunes en tu codebase automáticamente.
## Gestión de Active Directory
Para equipos empresariales, gestiona la autenticación de usuarios y el acceso mediante la integración con Active Directory. Configura SSO y el aprovisionamiento de usuarios.
## Uso
Haz un seguimiento detallado de métricas de uso, como solicitudes a la IA, uso de modelos y consumo de recursos. Supervisa el uso entre los miembros del equipo y los proyectos.
## Facturación e facturas
Gestiona tu suscripción, actualiza los métodos de pago y accede al historial de facturación. Descarga las facturas y administra la configuración de precios según el uso.
# Ajustes de empresa
Source: https://docs.cursor.com/es/account/teams/enterprise-settings
Administra centralmente los ajustes de Cursor para tu organización
# Configuración para empresas
Podés gestionar de forma centralizada funciones específicas de Cursor mediante soluciones de administración de dispositivos para asegurarte de que cumpla con las necesidades de tu organización. Cuando especificás una política de Cursor, su valor reemplaza la configuración correspondiente de Cursor en los dispositivos de los usuarios.
Editor de configuración que muestra que la opción 'Extensions: Allowed' está gestionada por la organización.
Actualmente, Cursor ofrece políticas para controlar las siguientes funciones administradas por el equipo de TI:
| Policy | Description | Cursor setting | Available since |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | --------------- |
| AllowedExtensions | Controla qué extensiones se pueden instalar. | extensions.allowed | 1.2 |
| AllowedTeamId | Controla qué IDs de equipo pueden iniciar sesión. Los usuarios con IDs de equipo no autorizados se cierran sesión de forma forzosa. | cursorAuth.allowedTeamId | 1.3 |
## Configurar extensiones permitidas
La configuración de Cursor `extensions.allowed` controla qué extensiones se pueden instalar. Esta configuración acepta un objeto JSON donde las claves son nombres de publishers y los valores son booleanos que indican si se permiten las extensiones de ese publisher.
Por ejemplo, establecer `extensions.allowed` en `{"anysphere": true, "github": true}` permite extensiones de los publishers Anysphere y GitHub, mientras que configurarlo en `{"anysphere": false}` bloquea las extensiones de Anysphere.
Para gestionar de forma centralizada las extensiones permitidas para tu organización, configura la política `AllowedExtensions` usando tu solución de administración de dispositivos. Esta política reemplaza la configuración `extensions.allowed` en los dispositivos de los usuarios. El valor de esta política es una cadena JSON que define los publishers permitidos.
Si quieres saber más sobre las extensiones en Cursor, consulta la documentación de extensiones.
## Configurar IDs de equipo permitidos
La configuración de Cursor `cursorAuth.allowedTeamId` controla qué IDs de equipo pueden iniciar sesión en Cursor. Esta configuración acepta una lista de IDs de equipo autorizados separada por comas.
Por ejemplo, establecer `cursorAuth.allowedTeamId` en "1,3,7" permite que usuarios de esos IDs de equipo específicos inicien sesión.
Cuando un usuario intenta iniciar sesión con un ID de equipo que no está en la lista permitida:
* Se cierra su sesión de forma inmediata
* Se muestra un mensaje de error
* La aplicación bloquea más intentos de autenticación hasta que se use un ID de equipo válido
Para gestionar de forma centralizada los IDs de equipo permitidos de tu organización, configura la directiva `AllowedTeamId` usando tu solución de gestión de dispositivos. Esta directiva reemplaza la configuración `cursorAuth.allowedTeamId` en los dispositivos de los usuarios. El valor de esta directiva es una cadena que contiene la lista de IDs de equipo autorizados separada por comas.
## Directiva de grupo en Windows
Cursor es compatible con la Directiva de grupo basada en el Registro de Windows. Cuando se instalan las definiciones de directiva, los administradores pueden usar el Editor de directivas de grupo local para gestionar los valores de las directivas.
Para agregar una directiva:
1. Copia los archivos ADMX y ADML de `AppData\Local\Programs\cursor\policies`.
2. Pega el archivo ADMX en `C:\Windows\PolicyDefinitions` y el archivo ADML en `C:\Windows\PolicyDefinitions\\`.
3. Reinicia el Editor de directivas de grupo local.
4. Establece los valores de directiva correspondientes (p. ej., `{"anysphere": true, "github": true}` para la directiva `AllowedExtensions`) en el Editor de directivas de grupo local.
Las directivas se pueden establecer tanto a nivel de equipo como a nivel de usuario. Si ambos están configurados, el nivel de equipo tendrá prioridad. Cuando se establece un valor de directiva, ese valor reemplaza el valor de configuración de Cursor establecido en cualquier nivel (predeterminado, usuario, espacio de trabajo, etc.).
## Perfiles de configuración en macOS
Los perfiles de configuración administran ajustes en dispositivos macOS. Un perfil es un archivo XML con pares clave/valor que corresponden a las políticas disponibles. Estos perfiles pueden desplegarse con soluciones de Mobile Device Management (MDM) o instalarse manualmente.
A continuación se muestra un archivo `.mobileconfig` de ejemplo para macOS:
```
PayloadContentPayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92.J6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadTypecom.todesktop.230313mzl4w4u92PayloadUUIDJ6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadVersion1AllowedExtensions{"anysphere":true}AllowedTeamId1,2PayloadDescriptionThis profile manages Cursor.PayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92PayloadOrganizationAnyspherePayloadTypeConfigurationPayloadUUIDF2C1A7B3-9D4E-4B2C-8E1F-7A6C5D4B3E2FPayloadVersion1TargetDeviceType5
```
### Políticas de tipo string
El ejemplo de abajo muestra cómo configurar la política `AllowedExtensions`. El valor de la política comienza vacío en el archivo de ejemplo (no se permite ninguna extensión).
```
AllowedExtensions
```
Agrega la cadena JSON adecuada que defina tu policy entre las etiquetas ``.
```
AllowedExtensions{"anysphere": true, "github": true}
```
Para la directiva `AllowedTeamId`, agrega la lista de IDs de equipo separadas por comas:
```
AllowedTeamId1,3,7
```
**Importante:** El archivo `.mobileconfig` proporcionado inicializa **todas** las políticas disponibles en esa versión de Cursor. Elimina cualquier política que no necesites.
Si no editas o eliminas una política del `.mobileconfig` de muestra, esa política se aplicará con su valor predeterminado (restrictivo).
Instala manualmente un perfil de configuración haciendo doble clic en el perfil `.mobileconfig` en Finder y luego habilitándolo en Preferencias del Sistema en **General** > **Administración de dispositivos**. Al quitar el perfil desde Preferencias del Sistema, se eliminarán las políticas de Cursor.
Para obtener más información sobre los perfiles de configuración, consulta la documentación de Apple.
## Políticas adicionales
La idea es promover las configuraciones actuales de Cursor como políticas y ceñirse de cerca a las existentes, para que la nomenclatura y el comportamiento sean consistentes. Si querés proponer más políticas, abrí un issue en el repositorio de GitHub de Cursor. El equipo va a determinar si ya existe una configuración correspondiente para ese comportamiento o si se debería crear una nueva para controlar el comportamiento deseado.
## Preguntas frecuentes
### ¿Cursor admite perfiles de configuración en Linux?
El soporte para Linux no está en la hoja de ruta. Si te interesan los perfiles de configuración en Linux, abre un issue en el repositorio de GitHub de Cursor y comparte detalles sobre tu caso.
# Miembros y roles
Source: https://docs.cursor.com/es/account/teams/members
Administra los miembros y roles del equipo
Los equipos de Cursor tienen tres roles:
## Roles
**Miembros** es el rol predeterminado con acceso a las funciones Pro de Cursor.
* Acceso completo a las funciones Pro de Cursor
* Sin acceso a la configuración de facturación ni al panel de administración
* Pueden ver su propio uso y el presupuesto restante según el uso
**Admins** controlan la gestión del equipo y la configuración de seguridad.
* Acceso completo a las funciones Pro
* Agregar/quitar miembros, modificar roles, configurar SSO
* Configurar precios basados en uso y límites de gasto
* Acceso a analíticas del equipo
**Admins no pagados** gestionan equipos sin ocupar un asiento de pago; ideal para personal de TI o finanzas que no necesita acceso a Cursor.
* No facturables, sin funciones Pro
* Las mismas capacidades administrativas que los Admins
Los Admins no pagados requieren al menos un usuario de pago en el equipo.
## Comparación de roles
| Capacidades | Miembro | Admin | Admin sin pago |
| --------------------------- | :-----: | :---: | :------------: |
| Usar funciones de Cursor | ✓ | ✓ | |
| Invitar miembros | ✓ | ✓ | ✓ |
| Quitar miembros | | ✓ | ✓ |
| Cambiar rol de usuario | | ✓ | ✓ |
| Panel de administración | | ✓ | ✓ |
| Configurar SSO/seguridad | | ✓ | ✓ |
| Gestionar facturación | | ✓ | ✓ |
| Ver analíticas | | ✓ | ✓ |
| Gestionar acceso | | ✓ | ✓ |
| Establecer controles de uso | | ✓ | ✓ |
| Requiere asiento de pago | ✓ | ✓ | |
## Gestión de miembros
Todos los miembros del equipo pueden invitar a otras personas. Actualmente no controlamos las invitaciones.
### Agregar miembro
Podés agregar miembros de tres maneras:
1. **Invitación por email**
* Hacé clic en `Invite Members`
* Ingresá direcciones de email
* Les usuaries reciben invitaciones por email
2. **Enlace de invitación**
* Hacé clic en `Invite Members`
* Copiá `Invite Link`
* Compartilo con miembros del equipo
3. **SSO**
* Configurá SSO en el [admin dashboard](/es/account/teams/sso)
* Les usuaries se unen automáticamente al iniciar sesión con el email de SSO
Los enlaces de invitación tienen una fecha de vencimiento larga: cualquiera con el enlace puede unirse.
Revocalos o usá [SSO](/es/account/teams/sso)
### Eliminar miembro
Les admins pueden eliminar miembros en cualquier momento mediante el menú contextual → "Remove". Si un miembro usó créditos, su asiento permanece ocupado hasta el final del ciclo de facturación.
### Cambiar rol
Les admins pueden cambiar los roles de otres miembros haciendo clic en el menú contextual y luego usando la opción "Change role".
Debe haber al menos un admin y un miembro de pago en el equipo en todo momento.
## Seguridad y SSO
El inicio de sesión único (SSO) con SAML 2.0 está disponible en los planes Team. Las funciones clave incluyen:
* Configurar conexiones de SSO ([más info](/es/account/teams/sso))
* Configurar la verificación de dominio
* Alta automática de usuarios
* Opciones para exigir SSO
* Integración con el proveedor de identidad (Okta, etc.)
La verificación de dominio es necesaria para habilitar SSO.
## Controles de uso
Accede a la configuración de uso para:
* Habilitar la facturación basada en el uso
* Habilitar para modelos premium
* Permitir modificaciones solo para administradores
* Establecer límites de gasto mensuales
* Supervisar el uso de todo el equipo
## Facturación
Al agregar miembros al equipo:
* Cada miembro o admin suma un asiento facturable (ver [pricing](https://cursor.com/pricing))
* A los nuevos miembros se les cobra de forma prorrateada por el tiempo restante del período de facturación
* Los asientos de admin no pago no se cuentan
Las altas a mitad de mes solo cobran por los días usados. Al quitar miembros que ya usaron créditos, su asiento queda ocupado hasta el final del ciclo de facturación: no hay reembolsos prorrateados.
Los cambios de rol (p. ej., de Admin a Admin no pago) ajustan la facturación desde la fecha del cambio. Elegí facturación mensual o anual.
La renovación mensual/anual ocurre en tu fecha original de registro, sin importar los cambios de miembros.
### Cambiar a facturación anual
Ahorrá un **20%** al pasar de mensual a anual:
1. Andá al [Dashboard](https://cursor.com/dashboard)
2. En la sección de cuenta, hacé clic en "Advanced" y luego en "Upgrade to yearly billing"
Solo podés cambiar de mensual a anual desde el dashboard. Para cambiar de
anual a mensual, escribí a [hi@cursor.com](mailto:hi@cursor.com).
# SCIM
Source: https://docs.cursor.com/es/account/teams/scim
Configurá el aprovisionamiento de SCIM para la gestión automatizada de usuarios y grupos
## Descripción general
El aprovisionamiento con SCIM 2.0 gestiona automáticamente los miembros de tu equipo y los grupos del directorio a través de tu proveedor de identidad. Disponible en planes Enterprise con SSO activado.
Panel de SCIM que muestra la configuración de Active Directory Management
## Requisitos previos
* Plan de Cursor Enterprise
* Primero debe configurarse el SSO: **SCIM requiere una conexión SSO activa**
* Acceso de administrador a tu proveedor de identidad (Okta, Azure AD, etc.)
* Acceso de administrador a tu organización de Cursor
## Cómo funciona
### Aprovisionamiento de usuarios
Los usuarios se añaden automáticamente a Cursor cuando los asignas a la aplicación SCIM en tu proveedor de identidad. Al desasignarlos, se eliminan. Los cambios se sincronizan en tiempo real.
### Grupos de directorio
Los grupos de directorio y su pertenencia se sincronizan desde tu proveedor de identidad. La gestión de grupos y usuarios debe hacerse a través de tu proveedor de identidad; Cursor muestra esta información como de solo lectura.
### Gestión del gasto
Configura distintos límites de gasto por usuario para cada grupo de directorio. Los límites de los grupos de directorio tienen prioridad sobre los límites a nivel de equipo. Los usuarios que pertenezcan a varios grupos reciben el límite de gasto más alto aplicable.
## Configuración
SCIM requiere que primero configures SSO. Si aún no lo hiciste,
seguí la [guía de configuración de SSO](/es/account/teams/sso) antes de continuar.
Navegá a
[cursor.com/dashboard?tab=active-directory](https://www.cursor.com/dashboard?tab=active-directory)
con una cuenta de admin, o andá a la configuración de tu dashboard y seleccioná la
"Active Directory Management" tab.
Una vez verificado SSO, vas a ver un enlace para la configuración de SCIM paso a paso. Hacé clic
para iniciar el asistente de configuración.
En tu proveedor de identidad: Creá o configurá tu aplicación SCIM. Usá
el endpoint y el token de SCIM provistos por Cursor. Activá el aprovisionamiento de usuarios y el envío de grupos.
Probá la conexión.
De vuelta en la página de Active Directory Management de Cursor: Mirá tus grupos de directorio sincronizados.
Configurá límites de gasto por usuario para grupos específicos según sea necesario.
Revisá qué límites aplican a usuarios en múltiples grupos.
### Configuración del proveedor de identidad
Para instrucciones específicas del proveedor:
Instrucciones de configuración para Okta, Azure AD, Google Workspace y más.
## Gestión de usuarios y grupos
Toda la gestión de usuarios y grupos debe hacerse a través de tu proveedor de identidad.
Los cambios que realices en tu proveedor de identidad se sincronizan automáticamente con Cursor, pero
no puedes modificar usuarios ni grupos directamente en Cursor.
### Gestión de usuarios
* Agrega usuarios asignándolos a tu aplicación SCIM en tu proveedor de identidad
* Elimina usuarios quitándolos de la asignación de la aplicación SCIM
* Los cambios en el perfil del usuario (nombre, correo) se sincronizan automáticamente desde tu proveedor de identidad
### Gestión de grupos
* Los grupos del directorio se sincronizan automáticamente desde tu proveedor de identidad
* Los cambios en la pertenencia a grupos se reflejan en tiempo real
* Usa grupos para organizar usuarios y establecer distintos límites de gasto
### Límites de gasto
* Establece distintos límites por usuario para cada grupo del directorio
* Los usuarios heredan el límite de gasto más alto de sus grupos
* Los límites de grupo reemplazan el límite predeterminado por usuario del equipo
## Preguntas frecuentes
### ¿Por qué la administración de SCIM no aparece en mi panel?
Asegurate de que SSO esté configurado correctamente y funcionando antes de configurar SCIM. SCIM requiere una conexión de SSO activa para funcionar.
### ¿Por qué los usuarios no se están sincronizando?
Verificá que los usuarios estén asignados a la aplicación de SCIM en tu proveedor de identidad. Los usuarios tienen que estar asignados explícitamente para aparecer en Cursor.
### ¿Por qué los grupos no aparecen?
Comprobá que el aprovisionamiento de grupos por push esté habilitado en la configuración de SCIM de tu proveedor de identidad. La sincronización de grupos se configura por separado de la sincronización de usuarios.
### ¿Por qué no se aplican los límites de gasto?
Confirmá que los usuarios estén correctamente asignados a los grupos correspondientes en tu proveedor de identidad. La pertenencia a grupos determina qué límites de gasto se aplican.
### ¿Puedo administrar usuarios y grupos de SCIM directamente en Cursor?
No. Toda la administración de usuarios y grupos se tiene que hacer a través de tu proveedor de identidad. Cursor muestra esta información como de solo lectura.
### ¿Qué tan rápido se sincronizan los cambios?
Los cambios realizados en tu proveedor de identidad se sincronizan con Cursor en tiempo real. Puede haber una breve demora en operaciones masivas.
# Primeros pasos
Source: https://docs.cursor.com/es/account/teams/setup
Crea y configura un equipo de Cursor
## Cursor para equipos
Cursor funciona para personas y equipos. El plan Teams ofrece herramientas para organizaciones: SSO, gestión de equipos, controles de acceso y análisis de uso.
## Crear un equipo
Crea un equipo siguiendo estos pasos:
Para crear un equipo, sigue estos pasos:
1. **Para usuarios nuevos**: Visita [cursor.com/team/new-team](https://cursor.com/team/new-team) para crear una cuenta y un equipo nuevos
2. **Para usuarios existentes**: Ve a tu [panel](/es/account/dashboard) y haz clic en "Upgrade to Teams"
Elige un nombre para el equipo y el ciclo de facturación
Invita a miembros del equipo. Los usuarios se prorratean: solo pagas por el tiempo que son miembros.
Habilita el [SSO](/es/account/teams/sso) para mayor seguridad y onboarding automatizado.
## Preguntas frecuentes
Cursor usa HTTP/2 de forma predeterminada. Algunos proxies y VPN lo bloquean.
Activa la opción de usar HTTP/1.1 como respaldo en la configuración.
Cursor factura por usuario activo, no por plazas. Agrega o quita usuarios en cualquier momento: a los nuevos miembros se les cobra de forma prorrateada por el tiempo restante. Si un usuario eliminado ha usado créditos, su plaza sigue ocupada hasta el final del ciclo de facturación.
Tu fecha de renovación no cambia.
Ponte como [Unpaid Admin](/es/account/teams/members) para administrar sin una licencia.
Los equipos necesitan al menos un miembro de pago. Puedes configurar, invitar a un miembro y luego cambiar tu rol antes de la facturación.
Los enlaces de descarga para todas las plataformas están disponibles en [cursor.com/downloads](https://cursor.com/downloads).
Instrucciones de MDM:
* [Omnissa Workspace ONE](https://docs.omnissa.com/bundle/MobileApplicationManagementVSaaS/page/DeployInternalApplications.html) (antes VMware)
* [Microsoft Intune (Windows)](https://learn.microsoft.com/en-us/mem/intune-service/apps/apps-win32-app-management)
* [Microsoft Intune (Mac)](https://learn.microsoft.com/en-us/mem/intune-service/apps/lob-apps-macos-dmg)
* [Kandji MDM](https://support.kandji.io/kb/custom-apps-overview)
# SSO
Source: https://docs.cursor.com/es/account/teams/sso
Configura el inicio de sesión único para tu equipo
## Descripción general
El SSO con SAML 2.0 está disponible sin costo adicional en los planes Business. Usa tu proveedor de identidad (IdP) existente para autenticar a los miembros del equipo sin que necesiten cuentas independientes de Cursor.
## Requisitos previos
* Plan Cursor Team
* Acceso de admin a tu proveedor de identidad (p. ej., Okta)
* Acceso de admin a tu organización de Cursor
## Pasos de configuración
Ve a [cursor.com/dashboard?tab=settings](https://www.cursor.com/dashboard?tab=settings) con una cuenta de admin.
Busca la sección "Single Sign-On (SSO)" y ábrela.
Haz clic en el botón "SSO Provider Connection settings" para iniciar la configuración de SSO y sigue el asistente.
En tu proveedor de identidad (p. ej., Okta):
* Crea una nueva aplicación SAML
* Configura los parámetros de SAML usando la información de Cursor
* Configura el aprovisionamiento Just‑in‑Time (JIT)
Verifica el dominio de tus usuarios en Cursor haciendo clic en el botón "Domain verification settings".
### Guías de configuración del proveedor de identidad
Para instrucciones de configuración específicas por proveedor:
Instrucciones de configuración para Okta, Azure AD, Google Workspace y más.
## Configuraciones adicionales
* Controla la aplicación forzosa de SSO desde el panel de administración
* Los nuevos usuarios se registran automáticamente al iniciar sesión con SSO
* Administra a los usuarios a través de tu proveedor de identidad
## Solución de problemas
Si tienes problemas:
* Verifica que el dominio esté validado en Cursor
* Asegúrate de que los atributos SAML estén asignados correctamente
* Comprueba que el SSO esté habilitado en el panel de administración
* Asegúrate de que nombre y apellido coincidan entre el proveedor de identidad y Cursor
* Revisa las guías específicas del proveedor de más arriba
* Escríbenos a [hi@cursor.com](mailto:hi@cursor.com) si el problema persiste
# Acceso a actualizaciones
Source: https://docs.cursor.com/es/account/update-access
Elige con qué frecuencia quieres recibir actualizaciones
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor tiene dos canales de actualización.
El canal de actualización predeterminado con versiones comprobadas.
* Versiones estables
* Correcciones de errores de las pruebas previas al lanzamiento
* Predeterminado para todos los usuarios
* Única opción para usuarios de equipo
Las cuentas de equipo y empresariales usan el modo Default.
Versiones preliminares con nuevas funciones.
Las versiones de Early Access pueden tener errores o problemas de estabilidad.
* Acceso a funciones en desarrollo
* Puede contener errores
* No disponible para cuentas de equipo
## Cambiar el canal de actualización
1. **Abrir configuración**: Presiona Cmd+Shift+J
2. **Ir a Beta**: Selecciona Beta en la barra lateral
3. **Seleccionar canal**: Elige Default o Early Access
Reporta problemas de Early Access en el [Forum](https://forum.cursor.com).
# Apply
Source: https://docs.cursor.com/es/agent/apply
Aprende a aplicar, aceptar o rechazar sugerencias de código desde el chat con Apply
## Cómo funciona Apply
Apply es un modelo especializado de Cursor que toma el código generado en el chat y lo integra en tus archivos. Procesa los bloques de código de las conversaciones y aplica los cambios a tu código.
Apply no genera código por sí mismo. El modelo de chat genera el código y Apply se encarga de integrarlo en los archivos existentes. Puede procesar cambios en múltiples archivos y en bases de código grandes.
## Aplicar bloques de código
Para aplicar una sugerencia de bloque de código, haz clic en el botón de reproducir en la esquina superior derecha del bloque.
# Checkpoints
Source: https://docs.cursor.com/es/agent/chat/checkpoints
Guarda y restaura estados anteriores después de cambios del Agent
Los checkpoints son instantáneas automáticas de los cambios que el Agent hace en tu base de código. Te permiten deshacer las modificaciones del Agent cuando lo necesites.
## Restaurar checkpoints
Dos formas de restaurar:
1. **Desde el cuadro de entrada**: haz clic en el botón `Restore Checkpoint` en solicitudes anteriores
2. **Desde el mensaje**: haz clic en el botón + al pasar el cursor sobre un mensaje
Los checkpoints no son control de versiones. Usa Git para el historial permanente.
## Cómo funcionan
* Se guardan localmente, aparte de Git
* Solo registran cambios del Agent (no ediciones manuales)
* Se limpian automáticamente
Las ediciones manuales no se registran. Usa checkpoints solo para cambios del Agent.
## Preguntas frecuentes
No. Son independientes del historial de Git.
{" "}
Solo durante la sesión actual y el historial reciente. Se eliminan automáticamente.
No. Cursor los crea automáticamente.
{" "}
# Comandos
Source: https://docs.cursor.com/es/agent/chat/commands
Define comandos para flujos de trabajo reutilizables
Los comandos personalizados te permiten crear flujos de trabajo reutilizables que se pueden activar con un simple prefijo `/` en el cuadro de entrada del chat. Estos comandos ayudan a estandarizar procesos en tu equipo y hacen más eficientes las tareas comunes.
Los comandos están actualmente en versión beta. La función y la sintaxis pueden cambiar a medida que seguimos mejorándola.
## Cómo funcionan los comandos
Los comandos se definen como archivos Markdown de texto plano que se pueden guardar en dos ubicaciones:
1. **Comandos del proyecto**: almacenados en el directorio `.cursor/commands` de tu proyecto
2. **Comandos globales**: almacenados en el directorio `~/.cursor/commands` de tu directorio de inicio
Cuando escribes `/` en el cuadro de entrada del chat, Cursor detecta y muestra automáticamente los comandos disponibles de ambos directorios, haciéndolos accesibles al instante en todo tu flujo de trabajo.
## Creación de comandos
1. Crea un directorio `.cursor/commands` en la raíz de tu proyecto
2. Añade archivos `.md` con nombres descriptivos (p. ej., `review-code.md`, `write-tests.md`)
3. Escribe contenido en Markdown sencillo que describa lo que debe hacer el comando
4. Los comandos aparecerán automáticamente en el chat cuando escribas `/`
Aquí tienes un ejemplo de cómo podría verse la estructura de tu directorio de comandos:
```
.cursor/
└── commands/
├── atender-comentarios-de-pr-de-github.md
├── lista-de-verificación-para-revisión-de-código.md
├── crear-pr.md
├── revisión-ligera-de-diffs-existentes.md
├── incorporación-de-nuevo-desarrollador.md
├── ejecutar-todas-las-pruebas-y-corregir.md
├── auditoría-de-seguridad.md
└── configurar-nueva-función.md
```
## Ejemplos
Prueba estos comandos en tus proyectos para hacerte una idea de cómo funcionan.
```markdown theme={null}
# Lista de verificación para revisión de código
## Descripción general
Lista de verificación completa para realizar revisiones de código exhaustivas y garantizar calidad, seguridad y mantenibilidad.
## Categorías de revisión
### Funcionalidad
- [ ] El código hace lo que debe
- [ ] Se contemplan los casos límite
- [ ] El manejo de errores es adecuado
- [ ] No hay errores obvios ni fallos de lógica
### Calidad del código
- [ ] El código es legible y está bien estructurado
- [ ] Las funciones son pequeñas y enfocadas
- [ ] Los nombres de variables son descriptivos
- [ ] No hay duplicación de código
- [ ] Sigue las convenciones del proyecto
### Seguridad
- [ ] No hay vulnerabilidades de seguridad evidentes
- [ ] Hay validación de entradas
- [ ] Los datos sensibles se manejan correctamente
- [ ] No hay secretos codificados en duro
```
```markdown theme={null}
# Auditoría de seguridad
## Descripción general
Revisión de seguridad integral para identificar y corregir vulnerabilidades en la base de código.
## Pasos
1. **Auditoría de dependencias**
- Detectar vulnerabilidades conocidas
- Actualizar paquetes desactualizados
- Revisar dependencias de terceros
2. **Revisión de seguridad del código**
- Detectar vulnerabilidades comunes
- Revisar autenticación/autorización
- Auditar prácticas de manejo de datos
3. **Seguridad de la infraestructura**
- Revisar variables de entorno
- Verificar controles de acceso
- Auditar la seguridad de la red
## Lista de verificación de seguridad
- [ ] Dependencias actualizadas y seguras
- [ ] Sin secretos hardcodeados
- [ ] Validación de entradas implementada
- [ ] Autenticación segura
- [ ] Autorización configurada correctamente
```
```markdown theme={null}
# Configurar nueva feature
## Descripción general
Configura sistemáticamente una nueva feature, desde la planificación inicial hasta la estructura de implementación.
## Pasos
1. **Definir requisitos**
- Aclarar el alcance y los objetivos de la feature
- Identificar historias de usuario y criterios de aceptación
- Planificar el enfoque técnico
2. **Crear rama de la feature**
- Ramificar desde main/develop
- Configurar el entorno de desarrollo local
- Configurar cualquier dependencia nueva
3. **Planificar la arquitectura**
- Diseñar modelos de datos y APIs
- Planificar componentes de UI y flujos
- Definir la estrategia de testing
## Checklist de configuración de la feature
- [ ] Requisitos documentados
- [ ] Historias de usuario redactadas
- [ ] Enfoque técnico definido
- [ ] Rama de la feature creada
- [ ] Entorno de desarrollo listo
```
```markdown theme={null}
# Crear PR
## Descripción general
Crea un pull request bien estructurado con una descripción clara, etiquetas y revisores.
## Pasos
1. **Preparar la rama**
- Asegúrate de que todos los cambios estén confirmados
- Envía la rama al remoto
- Verifica que la rama esté actualizada con main
2. **Escribir la descripción del PR**
- Resume los cambios de forma clara
- Incluye contexto y motivación
- Enumera cualquier cambio incompatible
- Agrega capturas de pantalla si hay cambios en la UI
3. **Configurar el PR**
- Crea el PR con un título descriptivo
- Agrega etiquetas adecuadas
- Asigna revisores
- Vincula issues relacionados
## Plantilla de PR
- [ ] Funcionalidad A
- [ ] Corrección de bug B
- [ ] Pruebas unitarias aprobadas
- [ ] Pruebas manuales completadas
```
```markdown theme={null}
# Ejecuta todas las pruebas y corrige los errores
## Descripción general
Ejecuta toda la batería de pruebas y corrige de forma sistemática cualquier error, garantizando la calidad y la funcionalidad del código.
## Pasos
1. **Ejecuta la batería de pruebas**
- Ejecuta todas las pruebas del proyecto
- Captura la salida e identifica los errores
- Revisa tanto las pruebas unitarias como las de integración
2. **Analiza los errores**
- Clasifícalos por tipo: intermitentes, rotos, nuevos
- Prioriza las correcciones según el impacto
- Revisa si los errores están relacionados con cambios recientes
3. **Corrige los problemas de forma sistemática**
- Empieza por los errores más críticos
- Corrige un problema a la vez
- Vuelve a ejecutar las pruebas después de cada corrección
```
```markdown theme={null}
# Incorporar a un nuevo developer
## Descripción general
Proceso completo de onboarding para que un developer nuevo arranque y quede listo rápido.
## Pasos
1. **Configuración del entorno**
- Instalar las herramientas requeridas
- Configurar el entorno de desarrollo
- Configurar el IDE y las extensiones
- Configurar git y las claves SSH
2. **Familiarización con el proyecto**
- Revisar la estructura del proyecto
- Entender la arquitectura
- Leer la documentación clave
- Configurar la base de datos local
## Lista de verificación de onboarding
- [ ] Entorno de desarrollo listo
- [ ] Todas las pruebas pasando
- [ ] Puedes ejecutar la app localmente
- [ ] Base de datos configurada y funcionando
- [ ] Primer PR enviado
```
# Compacto
Source: https://docs.cursor.com/es/agent/chat/compact
Ahorra espacio en el chat con la interfaz en modo compacto
El modo compacto ofrece una interfaz de chat más limpia al reducir el ruido visual y aprovechar al máximo el espacio para las conversaciones.
## Descripción general
Cuando está activado, el modo compacto transforma la interfaz del chat al:
* **Ocultar iconos** para una apariencia más limpia y minimalista
* **Plegar automáticamente los diffs** para reducir el ruido visual
* **Plegar automáticamente el campo de entrada** para maximizar el espacio de la conversación
Esta configuración es especialmente útil cuando trabajas en pantallas más pequeñas o cuando prefieres una experiencia de chat enfocada y sin distracciones.
## Antes y después
### Modo predeterminado
### Modo compacto
## Activar el modo compacto
Para activar el modo compacto:
1. Abre la configuración de Cursor
2. Ve a la sección de **Chat**
3. Activa **Compact Mode** para habilitarlo
La interfaz se actualizará de inmediato a una vista más compacta, dándote más espacio para concentrarte en tus conversaciones.
# Duplicar
Source: https://docs.cursor.com/es/agent/chat/duplicate
Crea ramas desde cualquier punto de una conversación
Duplica o crea forks de chats para explorar soluciones alternativas sin perder tu conversación actual.
## Cómo duplicar
1. Encuentra dónde quieres crear una rama
2. Haz clic en los tres puntos del mensaje
3. Selecciona "Duplicate Chat"
## Qué pasa
* Se mantiene el contexto hasta ese punto
* La conversación original no cambia
* Ambos chats conservan historiales separados
# Exportar
Source: https://docs.cursor.com/es/agent/chat/export
Exportar chats en formato Markdown
Exporta los chats del Agent como archivos Markdown para compartir o documentar.
## Qué se exporta
* Todos los mensajes y respuestas
* Bloques de código con resaltado de sintaxis
* Referencias a archivos y contexto
* Flujo cronológico de la conversación
* Haz clic en el icono de historial en el panel lateral de Agent
* Presiona Opt Cmd '
## Administrar chats
* **Editar títulos**: Haz clic para cambiar el nombre
* **Eliminar**: Borra los chats que no necesitas
* **Abrir**: Haz clic para revisar la conversación completa
El historial de chats se guarda localmente en una base de datos SQLite en tu equipo.
Para conservar los chats, [expórtalos](/es/agent/chats/export) como Markdown.
## Agentes en segundo plano
Los chats de agentes en segundo plano no aparecen en el historial habitual; en su lugar, se guardan en una base de datos remota. Usa Cmd E para verlos.
## Referenciar chats anteriores
Usa [@Past Chats](/es/context/@-symbols/@-past-chats) para incluir contexto de conversaciones anteriores en tu chat actual.
# Resumen
Source: https://docs.cursor.com/es/agent/chat/summarization
Gestión del contexto para conversaciones largas en el chat
## Resumen de mensajes
A medida que las conversaciones crecen, Cursor resume y gestiona el contexto automáticamente para mantener tus chats eficientes. Aprende a usar el menú contextual y a entender cómo se condensan los archivos para ajustarse a las ventanas de contexto del modelo.
### Usar el comando /summarize
Podés activar manualmente un resumen usando el comando `/summarize` en el chat. Este comando ayuda a gestionar el contexto cuando las conversaciones se hacen demasiado largas, así podés seguir trabajando de forma eficiente sin perder información importante.
Para profundizar en cómo funciona el contexto en Cursor, mirá nuestra guía [Working with
Context](/es/guides/working-with-context).
### Cómo funciona el resumen
Cuando las conversaciones se alargan, superan el límite de la ventana de contexto del modelo:
User
Cursor
User
Límite de la ventana de contexto
Cursor
User
Cursor
Para resolver esto, Cursor resume los mensajes más antiguos para hacer espacio a conversaciones nuevas.
Límite de la ventana de contexto
Mensajes resumidos
Cursor
User
Cursor
## Condensación de archivos y carpetas
Aunque el resumen del chat se encarga de conversaciones largas, Cursor usa una estrategia distinta para manejar archivos y carpetas grandes: **condensación inteligente**. Cuando incluyes archivos en tu conversación, Cursor decide la mejor forma de presentarlos según su tamaño y el espacio de contexto disponible.
Estos son los diferentes estados en los que puede estar un archivo o carpeta:
### Resumen
Cuando los archivos o carpetas son demasiado grandes para entrar en la ventana de contexto, Cursor los condensa automáticamente. Al condensar, el modelo ve elementos estructurales clave como firmas de funciones, clases y métodos. Desde esta vista condensada, el modelo puede elegir expandir archivos específicos si hace falta. Este enfoque maximiza el uso efectivo de la ventana de contexto disponible.
### Significativamente comprimido
Cuando un nombre de archivo aparece con la etiqueta “Significantly Condensed”, significa que el archivo es demasiado grande para incluirlo completo, incluso en una versión comprimida. Solo se mostrará el nombre del archivo al modelo.
### No incluido
Cuando aparece un icono de advertencia junto a un archivo o carpeta, el elemento es demasiado grande para incluirlo en la ventana de contexto, incluso en versión condensada. Esto te ayuda a entender qué partes de tu codebase son accesibles para el modelo.
# Pestañas
Source: https://docs.cursor.com/es/agent/chat/tabs
Ejecuta varias conversaciones del Agente a la vez
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Descripción general
Presiona Cmd+T para crear pestañas nuevas. Cada pestaña mantiene por separado el historial de la conversación, el contexto y la selección de modelo.
Para trabajar en paralelo, prueba los [Background Agents](/es/background-agents)
## Gestión de pestañas
* Creá nuevas pestañas con Cmd+T. Cada pestaña inicia una conversación nueva y mantiene su propio contexto.
* Cambiá entre pestañas haciendo clic en sus encabezados o usando Ctrl+Tab para recorrerlas.
* Los títulos de las pestañas se generan automáticamente después del primer mensaje, pero podés renombrarlos con el botón derecho en el encabezado de la pestaña.
Usá una tarea por pestaña, brindá descripciones iniciales claras y cerrá las
pestañas terminadas para mantener tu espacio de trabajo organizado.
### Conflictos
Cursor evita que varias pestañas editen los mismos archivos. Se te pedirá que resuelvas los conflictos.
| Modo | Para | Capacidades | Herramientas |
| :-------------------- | :----------------------------------------- | :--------------------------------------------------- | :------------------------------- |
| **[Agent](#agent)** | Funcionalidades complejas, refactorización | Exploración autónoma, edición en múltiples archivos | Todas las herramientas activadas |
| **[Ask](#ask)** | Aprendizaje, planificación, preguntas | Exploración de solo lectura, sin cambios automáticos | Solo herramientas de búsqueda |
| **[Custom](#custom)** | Flujos de trabajo especializados | Capacidades definidas por el usuario | Configurable |
## Agent
El modo predeterminado para tareas de programación complejas. Agent explora tu base de código de forma autónoma, edita varios archivos, ejecuta comandos y corrige errores para completar tus solicitudes.
## Ask
Modo de solo lectura para aprender y explorar. Ask busca en tu código y te da respuestas sin hacer ningún cambio: perfecto para entender el código antes de modificarlo.
## Personalizado
Crea tus propios modos con combinaciones específicas de herramientas e instrucciones. Mezcla capacidades según lo que mejor encaje con tu flujo de trabajo.
Los modos personalizados están en beta. Actívalos en `Cursor Settings` → `Chat` → `Custom
Modes`
### Ejemplos
**Herramientas:** All Search\
**Instrucciones:** Enfócate en explicar los conceptos a fondo y haz preguntas para aclarar
{" "}
**Herramientas:** Edit & Reapply **Instrucciones:** Mejora la estructura del código sin
agregar nueva funcionalidad
{" "}
**Herramientas:** Codebase, Read file, Terminal **Instrucciones:** Crea planes de implementación detallados en `plan.md`
**Herramientas:** All Search, Terminal, Edit & Reapply\
**Instrucciones:** Investiga a fondo los problemas antes de proponer soluciones
## Cambiar de modo
* Usa el menú desplegable del selector de modo en Agent
* Presiona Cmd+. para cambiar rápidamente
* Configura los atajos de teclado en [configuración](#settings)
## Configuración
Todos los modos comparten opciones de configuración comunes:
| Configuración | Descripción |
| :---------------- | :------------------------------------- |
| Modelo | Elige qué modelo de IA usar |
| Atajos de teclado | Define atajos para cambiar entre modos |
Configuraciones específicas por modo:
| Modo | Configuraciones | Descripción |
| :--------- | :---------------------------- | :---------------------------------------------------------- |
| **Agent** | Auto-run y Auto-fix Errors | Ejecuta comandos automáticamente y corrige errores |
| **Ask** | Search Codebase | Encuentra automáticamente los archivos relevantes |
| **Custom** | Tool selection & Instructions | Configura [tools](/es/agent/tools) y prompts personalizados |
Agent utiliza herramientas para buscar, editar y ejecutar comandos. Desde la
búsqueda semántica en la base de código hasta la ejecución en la terminal, estas
herramientas permiten completar tareas de forma autónoma.
Revisa los cambios antes de aceptarlos. La interfaz de revisión muestra añadidos
y eliminaciones con líneas codificadas por color para que tengas control sobre las modificaciones.
Las instantáneas automáticas registran los cambios del Agent. Restaura estados anteriores si
los cambios no funcionan como esperabas o para probar enfoques distintos.
Agent ejecuta comandos en la terminal, supervisa la salida y gestiona procesos
de varios pasos. Configura la ejecución automática para flujos de trabajo de
confianza o pide confirmación por seguridad.
Accede a conversaciones anteriores con Opt Cmd '. Revisa
chats previos, sigue tus sesiones de código y consulta el contexto de
conversaciones anteriores.
Exporta conversaciones en formato Markdown. Comparte soluciones con tu equipo, documenta decisiones o crea bases de conocimiento a partir de sesiones de programación.
Define instrucciones personalizadas para el comportamiento de Agent. Las reglas ayudan a mantener estándares de codificación, aplicar patrones y personalizar cómo Agent te asiste en tu proyecto.
Agent puede dividir tareas largas en pasos manejables con dependencias, creando un plan estructurado que se actualiza conforme avanza el trabajo.
### Cómo funciona
* Agent crea automáticamente listas de pendientes para tareas complejas
* Cada ítem puede depender de otras tareas
* La lista se actualiza en tiempo real a medida que avanza el trabajo
* Las tareas completadas se marcan automáticamente
### Visibilidad
* Las tareas pendientes aparecen en la interfaz del chat
* Si la [integración con Slack](/es/slack) está configurada, las tareas también se ven ahí
* Podés ver el desglose completo de la tarea en cualquier momento
Para planificar mejor, describí claramente tu objetivo final. Agent creará desgloses de tareas más
precisos cuando entienda el alcance completo.
La planificación y las tareas pendientes no están disponibles actualmente en el modo auto.
## Mensajes en cola
Pon mensajes de seguimiento en cola mientras Agent trabaja en la tarea actual. Tus instrucciones esperan su turno y se ejecutan automáticamente cuando estén listas.
### Uso de la cola
1. Mientras Agent está trabajando, escribe tu siguiente instrucción
2. Pulsa Ctrl+Enter para añadirla a la cola
3. Los mensajes aparecen en orden debajo de la tarea activa
4. Reordena los mensajes en cola haciendo clic en la flecha
5. Agent los procesa secuencialmente al terminar
### Omitir la cola
Para poner tu mensaje en cola en lugar de usar la mensajería predeterminada, usa Ctrl+Enter. Para enviar un mensaje de inmediato sin ponerlo en cola, usa Cmd+Enter. Esto “empuja” tu mensaje a la fuerza, omitiendo la cola para ejecutarlo de inmediato.
## Mensajería predeterminada
De forma predeterminada, los mensajes se envían lo más rápido posible, generalmente apareciendo justo después de que Agent complete una llamada a una herramienta. Esto ofrece la experiencia más ágil.
### Cómo funciona la mensajería predeterminada
* Tu mensaje se añade al mensaje de usuario más reciente en el chat
* Los mensajes suelen adjuntarse a los resultados de las herramientas y se envían en cuanto están listos
* Esto crea un flujo de conversación más natural sin interrumpir el trabajo actual de Agent
* Por defecto, esto ocurre cuando presionas Enter mientras Agent está trabajando
# Diffs y revisión
Source: https://docs.cursor.com/es/agent/review
Revisa y gestiona los cambios de código generados por el agente de IA
Cuando Agent genera cambios de código, se muestran en una interfaz de revisión que marca adiciones y eliminaciones con líneas codificadas por color. Esto te permite revisar y controlar qué cambios se aplican a tu base de código.
La interfaz de revisión muestra los cambios de código en un formato diff familiar:
## Diffs
| Tipo | Significado | Ejemplo |
| :--------------------- | :------------------------------- | :---------------------------------------------------------------------------------------------------- |
| **Líneas añadidas** | Nuevas incorporaciones de código | + const newVariable = 'hello'; |
| **Líneas eliminadas** | Eliminaciones de código | - const oldVariable = 'goodbye'; |
| **Líneas de contexto** | Código circundante sin cambios | function example() {} |
## Revisión
Cuando termine la generación, vas a ver un aviso para revisar todos los cambios antes de continuar. Esto te da una vista general de lo que se va a modificar.
### Archivo por archivo
Aparece una barra de revisión flotante en la parte inferior de tu pantalla que te permite:
* **Aceptar** o **rechazar** cambios del archivo actual
* Ir al **siguiente archivo** con cambios pendientes
### Aceptación selectiva
Para un control más preciso:
* Para aceptar la mayoría de los cambios: rechazá las líneas que no querés y después hacé clic en **Aceptar todo**
* Para rechazar la mayoría de los cambios: aceptá las líneas que sí querés y después hacé clic en **Rechazar todo**
## Revisar cambios
Al final de la respuesta del agente, haz clic en el botón **Revisar cambios** para ver el diff completo de las modificaciones.
# Terminal
Source: https://docs.cursor.com/es/agent/terminal
Ejecuta comandos de la terminal automáticamente como parte de las operaciones del agente
El agente ejecuta comandos en la terminal nativa de Cursor y conserva el historial. Haz clic en Skip para enviar Ctrl+C y detener los comandos.
## Solución de problemas
Algunos temas de shell (por ejemplo, Powerlevel9k/Powerlevel10k) pueden interferir con
la salida del terminal en línea. Si la salida de tu comando aparece truncada o
con un formato incorrecto, desactiva el tema o cambia a un prompt más simple cuando se ejecute Agent.
### Desactiva prompts pesados para sesiones de Agent
Usa la variable de entorno `CURSOR_AGENT` en la configuración de tu shell para detectar cuándo
se está ejecutando Agent y saltarte la inicialización de prompts/temas vistosos.
```zsh theme={null}
# ~/.zshrc — desactiva Powerlevel10k cuando se ejecute Cursor Agent
if [[ -n "$CURSOR_AGENT" ]]; then
# Omitir la inicialización del tema para mejorar la compatibilidad
else
[[ -r ~/.p10k.zsh ]] && source ~/.p10k.zsh
fi
```
```bash theme={null}
# ~/.bashrc — usar un prompt simple en sesiones del Agent
if [[ -n "$CURSOR_AGENT" ]]; then
PS1='\u@\h \W \$ '
fi
```
# Herramientas
Source: https://docs.cursor.com/es/agent/tools
Herramientas disponibles para que los agentes busquen, editen y ejecuten código
Una lista de todas las herramientas disponibles para los modos dentro de [Agent](/es/agent/overview), que podés habilitar o deshabilitar al crear tus propios [modos personalizados](/es/agent/modes#custom).
No hay límite en la cantidad de llamadas a herramientas que Agent puede hacer durante una tarea. Agent seguirá usando herramientas según sea necesario para completar tu pedido.
## Búsqueda
Herramientas para buscar en tu código y en la web y encontrar información relevante.
Lee hasta 250 líneas (750 en modo máximo) de un archivo.
Lee la estructura de un directorio sin leer el contenido de los archivos.
Realiza búsquedas semánticas en tu [código
indexado](/es/context/codebase-indexing).
Busca palabras clave o patrones exactos dentro de archivos.
Encuentra archivos por nombre usando coincidencia difusa.
Genera consultas y realiza búsquedas en la web.
Obtén [reglas](/es/context/rules) específicas según el tipo y la descripción.
## Editar
Herramientas para hacer cambios específicos en tus archivos y tu código.
Sugiere cambios en archivos y [aplícalos](/es/agent/apply) automáticamente.
Elimina archivos de forma autónoma (puedes desactivarlo en la configuración).
## Ejecutar
Chat puede interactuar con tu terminal.
Ejecuta comandos en la terminal y monitorea la salida.
De forma predeterminada, Cursor usa el primer perfil de terminal disponible.
Para establecer tu perfil de terminal preferido:
1. Abre la paleta de comandos (`Cmd/Ctrl+Shift+P`)
2. Busca "Terminal: Select Default Profile"
3. Elige el perfil que quieras
## MCP
Chat puede usar servidores MCP configurados para interactuar con servicios externos, como bases de datos o API de terceros.
Activa o desactiva los servidores MCP disponibles. Respeta la configuración de ejecución automática.
Aprende más sobre el [Model Context Protocol](/es/context/model-context-protocol) y explora los servidores disponibles en el [directorio de MCP](/es/tools).
## Opciones avanzadas
Aplica las ediciones automáticamente sin confirmación manual.
Ejecuta automáticamente comandos de terminal y acepta ediciones. Útil para ejecutar suites de pruebas y verificar cambios.
Configura listas de permitidos para especificar qué herramientas pueden ejecutarse automáticamente. Estas listas mejoran la seguridad al definir explícitamente las operaciones permitidas.
Resuelve automáticamente los errores y advertencias del linter cuando el Agent los encuentre.
# Agentes en segundo plano
Source: https://docs.cursor.com/es/background-agent
Agentes remotos asíncronos en Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Con los agentes en segundo plano, podés lanzar agentes asíncronos que editen y ejecuten código en un entorno remoto. Mirá su estado, mandá seguimientos o tomá el control en cualquier momento.
## Cómo usar
Podés acceder a los agentes en segundo plano de dos maneras:
1. **Barra lateral de agentes en segundo plano**: Usá la pestaña de agentes en segundo plano en la barra lateral nativa de Cursor para ver todos los agentes en segundo plano asociados con tu cuenta, buscar agentes existentes y arrancar nuevos.
2. **Modo de agente en segundo plano**: Presioná Cmd E para activar el modo de agente en segundo plano en la UI.
Después de enviar un prompt, seleccioná tu agente de la lista para ver el estado y entrar a la máquina.
Los agentes en segundo plano requieren retener datos por unos pocos días.
## Configuración
Por defecto, los agentes en segundo plano se ejecutan en una máquina aislada basada en Ubuntu. Tienen acceso a Internet y pueden instalar paquetes.
#### Conexión con GitHub
Los agentes en segundo plano clonan tu repositorio desde GitHub y trabajan en una rama aparte, haciendo push a tu repositorio para facilitar la entrega.
Concede permisos de lectura y escritura a tu repositorio (y a cualquier repositorio dependiente o submódulo). En el futuro, admitiremos otros proveedores (GitLab, Bitbucket, etc.).
##### Configuración de la lista de IP permitidas
Si tu organización usa la función de lista de IP permitidas de GitHub, vas a tener que configurar el acceso para los agentes en segundo plano. Consulta la [documentación de la integración con GitHub](/es/integrations/github#ip-allow-list-configuration) para ver las instrucciones completas de configuración, incluida la información de contacto y las direcciones IP.
#### Configuración base del entorno
Para casos avanzados, configura el entorno por tu cuenta. Consigue una instancia del IDE conectada a la máquina remota. Prepara tu máquina, instala herramientas y paquetes, y luego toma un snapshot. Configura los ajustes de runtime:
* El comando de instalación se ejecuta antes de que arranque un agente e instala las dependencias de runtime. Esto puede implicar ejecutar `npm install` o `bazel build`.
* Los terminales ejecutan procesos en segundo plano mientras el agente trabaja, como iniciar un servidor web o compilar archivos protobuf.
Para los casos más avanzados, usa un Dockerfile para configurar la máquina. El Dockerfile te permite configurar dependencias a nivel del sistema: instalar versiones específicas de compiladores, depuradores o cambiar la imagen base del SO. No hagas `COPY` de todo el proyecto: nosotros gestionamos el workspace y hacemos checkout del commit correcto. Aun así, gestiona la instalación de dependencias en el script de instalación.
Ingresa cualquier secreto requerido para tu entorno de desarrollo: se almacenan cifrados en reposo (usando KMS) en nuestra base de datos y se proporcionan en el entorno del agente en segundo plano.
La configuración de la máquina vive en `.cursor/environment.json`, que puedes commitear en tu repo (recomendado) o almacenar de forma privada. El flujo de configuración te guía para crear `environment.json`.
#### Comandos de mantenimiento
Al configurar una máquina nueva, empezamos desde el entorno base y luego ejecutamos el comando `install` de tu `environment.json`. Este comando es el que ejecutaría un desarrollador al cambiar de rama: instalar cualquier dependencia nueva.
Para la mayoría, el comando `install` es `npm install` o `bazel build`.
Para asegurar un arranque rápido de la máquina, almacenamos en caché el estado del disco después de que se ejecute el comando `install`. Diseñalo para que pueda ejecutarse varias veces. Solo persiste el estado del disco desde el comando `install`: los procesos iniciados aquí no seguirán en ejecución cuando el agente arranque.
#### Comandos de inicio
Después de ejecutar `install`, la máquina arranca y ejecutamos el comando `start`, seguido de iniciar cualquier `terminals`. Esto levanta procesos que deberían estar en ejecución cuando se ejecute el agente.
El comando `start` a menudo se puede omitir. Úsalo si tu entorno de dev depende de Docker: pon `sudo service docker start` en el comando `start`.
Los `terminals` son para código de la app. Estos terminales se ejecutan en una sesión de `tmux` disponible para ti y para el agente. Por ejemplo, muchos repos de sitios web ponen `npm run watch` como un terminal.
#### La especificación de `environment.json`
El archivo `environment.json` puede tener este aspecto:
```json theme={null}
{
"snapshot": "POPULATED_FROM_SETTINGS",
"install": "npm install",
"terminals": [
{
"name": "Iniciar Next.js",
"command": "npm run dev"
}
]
}
```
Formalmente, la especificación se [define aquí](https://www.cursor.com/schemas/environment.schema.json).
## Modelos
Solo los modelos compatibles con [Max Mode](/es/context/max-mode) están disponibles para los agentes en segundo plano.
## Precios
Conocé más sobre los [precios de Background Agent](/es/account/pricing#background-agent).
## Seguridad
Los Background Agents están disponibles en Privacy Mode. Nunca entrenamos con tu código y solo lo conservamos para ejecutar el agente. [Más información sobre Privacy Mode](https://www.cursor.com/privacy-overview).
Lo que deberías saber:
1. Concede privilegios de lectura y escritura a nuestra app de GitHub en los repos que quieras editar. Usamos esto para clonar el repo y hacer cambios.
2. Tu código se ejecuta dentro de nuestra infraestructura en AWS, en VMs aisladas, y se almacena en discos de VM mientras el agente está activo.
3. El agente tiene acceso a Internet.
4. El agente ejecuta automáticamente todos los comandos de terminal, lo que le permite iterar en las pruebas. Esto difiere del foreground agent, que requiere tu aprobación para cada comando. La ejecución automática introduce riesgo de exfiltración de datos: atacantes podrían lanzar ataques de prompt injection, engañando al agente para que suba código a sitios web maliciosos. Consulta la [explicación de OpenAI sobre los riesgos de prompt injection para background agents](https://platform.openai.com/docs/codex/agent-network#risks-of-agent-internet-access).
5. Si Privacy Mode está deshabilitado, recopilamos prompts y entornos de desarrollo para mejorar el producto.
6. Si deshabilitas Privacy Mode al iniciar un background agent y luego lo habilitas durante la ejecución, el agente sigue con Privacy Mode deshabilitado hasta que termine.
## Configuración del dashboard
Los admins del workspace pueden configurar opciones adicionales desde la pestaña Background Agents en el dashboard.
### Configuración predeterminada
* **Modelo predeterminado** – el modelo que se usa cuando una ejecución no especifica ninguno. Elige cualquier modelo compatible con Max Mode.
* **Repositorio predeterminado** – si está vacío, los agentes te piden que elijas un repo. Indicar un repo aquí te permite saltarte ese paso.
* **Rama base** – la rama desde la que los agentes crean un fork al abrir pull requests. Déjala en blanco para usar la rama predeterminada del repositorio.
### Configuración de seguridad
Todas las opciones de seguridad requieren privilegios de admin.
* **Restricciones de usuario** – elige *Ninguna* (todos los miembros pueden iniciar agentes en segundo plano) o *Lista de permitidos*. Cuando está en *Lista de permitidos*, especificas exactamente qué compas de equipo pueden crear agentes.
* **Seguimientos del equipo** – cuando está activado, cualquiera en el espacio de trabajo puede añadir mensajes de seguimiento a un agente que inició otra persona. Apágalo para restringir los seguimientos al propietario del agente y a los admins.
* **Mostrar resumen del agente** – controla si Cursor muestra las imágenes de diferencias de archivos del agente y los fragmentos de código. Desactívalo si prefieres no exponer rutas de archivo o código en la barra lateral.
* **Mostrar resumen del agente en canales externos** – extiende la opción anterior a Slack o cualquier canal externo que tengas conectado.
Los cambios se guardan al instante y se aplican de inmediato a los nuevos agentes.
# Agregar seguimiento
Source: https://docs.cursor.com/es/background-agent/api/add-followup
en/background-agent/api/openapi.yaml post /v0/agents/{id}/followup
Envía una instrucción adicional a un agente en segundo plano que está en ejecución.
# Conversación del agente
Source: https://docs.cursor.com/es/background-agent/api/agent-conversation
en/background-agent/api/openapi.yaml get /v0/agents/{id}/conversation
Recupera el historial de conversaciones de un agente en segundo plano.
Si el agente en segundo plano se eliminó, no vas a poder acceder a la conversación.
# Estado del agente
Source: https://docs.cursor.com/es/background-agent/api/agent-status
en/background-agent/api/openapi.yaml get /v0/agents/{id}
Obtén el estado actual y los resultados de un agente específico en segundo plano.
# Información de la clave de API
Source: https://docs.cursor.com/es/background-agent/api/api-key-info
en/background-agent/api/openapi.yaml get /v0/me
Obtén metadatos sobre la clave de API utilizada para la autenticación.
# Eliminar un agente
Source: https://docs.cursor.com/es/background-agent/api/delete-agent
en/background-agent/api/openapi.yaml delete /v0/agents/{id}
Eliminar permanentemente un agente en segundo plano y sus recursos asociados.
# Iniciar un agente
Source: https://docs.cursor.com/es/background-agent/api/launch-an-agent
en/background-agent/api/openapi.yaml post /v0/agents
Inicia un nuevo agente en segundo plano para trabajar en tu repositorio.
# Listar agentes
Source: https://docs.cursor.com/es/background-agent/api/list-agents
en/background-agent/api/openapi.yaml get /v0/agents
Obtén una lista paginada de todos los agentes en segundo plano del usuario autenticado.
# Listar modelos
Source: https://docs.cursor.com/es/background-agent/api/list-models
en/background-agent/api/openapi.yaml get /v0/models
Obtén una lista de modelos recomendados para agentes en segundo plano.
Si querés definir el modelo del agente en segundo plano al crearlo, podés usar este endpoint para ver una lista de modelos recomendados.
En ese caso, también te recomendamos ofrecer una opción "Auto", en la que no envíes un nombre de modelo al endpoint de creación y nosotros elegimos el modelo más adecuado.
# Listar repositorios de GitHub
Source: https://docs.cursor.com/es/background-agent/api/list-repositories
en/background-agent/api/openapi.yaml get /v0/repositories
Obtén una lista de repositorios de GitHub a los que tiene acceso el usuario autenticado.
**Este endpoint tiene límites de tasa muy estrictos.**
Limita las solicitudes a **1/usuario/minuto** y **30/usuario/hora**.
Esta solicitud puede tardar decenas de segundos en responder para usuarios con acceso a muchos repositorios.
Asegúrate de manejar correctamente cuando esta información no esté disponible.
# Descripción general
Source: https://docs.cursor.com/es/background-agent/api/overview
Crea y administra por programación agentes en segundo plano que trabajen en tus repositorios
# API de Background Agents
Beta
La API de Background Agents te permite crear y gestionar de forma programática agentes de codificación con IA que trabajan de manera autónoma en tus repositorios.
Podés usar la API para responder automáticamente al feedback de usuarios, corregir bugs, actualizar la documentación y mucho más.
La API de Background Agents está en beta, ¡nos encantaría tu feedback!
## Funcionalidades clave
* **Generación de código autónoma** - Crea agentes que entiendan tu prompt y hagan cambios en tu base de código
* **Integración con repositorios** - Trabaja directamente con repositorios de GitHub
* Prompts de seguimiento - Añade instrucciones adicionales a agentes en ejecución
* **Precios según uso** - Paga solo por los tokens que uses
* **Escalable** - Compatible con hasta 256 agentes activos por clave de API
## Inicio rápido
### 1. Obtén tu clave de API
**Ve** a [Cursor Dashboard → Integrations](https://cursor.com/dashboard?tab=integrations) para crear tu clave de API.
### 2. Empieza a usar la API
Todos los endpoints de la API son relativos a:
```
https://api.cursor.com
```
Consulta la [referencia de la API](/es/background-agent/api/launch-an-agent) para obtener una lista detallada de endpoints.
## Autenticación
Todas las solicitudes a la API requieren autenticación con un token Bearer:
```
Authorization: Bearer TU_CLAVE_DE_API
```
Las claves de API se crean en el [Cursor Dashboard](https://cursor.com/dashboard?tab=integrations). Las claves están asociadas a tu cuenta y te permiten crear y administrar agentes (según los límites de tu plan y el acceso a los repositorios).
## Precios
La API está actualmente en beta y tiene la misma tarifa que Background Agents. Los precios pueden cambiar a medida que escalemos el servicio. Consulta [Background Agent pricing](/es/account/pricing#background-agent).
## Próximos pasos
* Lee la [introducción general a Background Agents](/es/background-agent) para entender entornos, permisos y flujos de trabajo.
* Prueba Background Agents desde [web y móvil](/es/background-agent/web-and-mobile).
* Únete a la discusión en [Discord #background-agent](https://discord.gg/jfgpZtYpmb) o escribe a [background-agent-feedback@cursor.com](mailto:background-agent-feedback@cursor.com).
# Webhooks
Source: https://docs.cursor.com/es/background-agent/api/webhooks
Recibe notificaciones en tiempo real sobre cambios en el estado del agente en segundo plano
# Webhooks
Cuando creas un agente con una URL de webhook, Cursor enviará solicitudes HTTP POST para notificarte sobre cambios de estado. Actualmente, solo se admiten eventos `statusChange`, específicamente cuando un agente entra en estado `ERROR` o `FINISHED`.
## Verificación de webhooks
Para asegurarte de que las solicitudes de webhook provienen auténticamente de Cursor, verificá la firma incluida con cada solicitud:
### Encabezados
Cada solicitud de webhook incluye los siguientes encabezados:
* **`X-Webhook-Signature`** – Contiene la firma HMAC-SHA256 con el formato `sha256=`
* **`X-Webhook-ID`** – Un identificador único para esta entrega (útil para el logging)
* **`X-Webhook-Event`** – El tipo de evento (actualmente solo `statusChange`)
* **`User-Agent`** – Siempre establecido en `Cursor-Agent-Webhook/1.0`
### Verificación de firma
Para verificar la firma del webhook, calculá la firma esperada y comparala con la firma recibida:
```javascript theme={null}
const crypto = require('crypto');
function verifyWebhook(secret, rawBody, signature) {
const firmaEsperada = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return signature === expectedSignature;
}
```
```python theme={null}
import hmac
import hashlib
def verify_webhook(secret, raw_body, signature):
firma_esperada = 'sha256=' + hmac.new(
secret.encode(),
raw_body,
hashlib.sha256
).hexdigest()
return signature == expected_signature
```
Usa siempre el cuerpo sin procesar de la solicitud (antes de cualquier parsing) al calcular la firma.
## Formato del payload
El payload del webhook se envía como JSON con la siguiente estructura:
```json theme={null}
{
"event": "statusChange",
"timestamp": "2024-01-15T10:30:00Z",
"id": "bc_abc123",
"status": "FINISHED",
"source": {
"repository": "https://github.com/your-org/your-repo",
"ref": "main"
},
"target": {
"url": "https://cursor.com/agents?id=bc_abc123",
"branchName": "cursor/add-readme-1234",
"prUrl": "https://github.com/your-org/your-repo/pull/1234"
},
"summary": "Se agregó README.md con instrucciones de instalación"
}
```
Ten en cuenta que algunos campos son opcionales y solo se incluirán cuando estén disponibles.
## Mejores prácticas
* **Verifica las firmas** – Verifica siempre la firma del webhook para asegurarte de que la solicitud venga de Cursor
* **Maneja los reintentos** – Los webhooks pueden reintentarse si tu endpoint devuelve un código de estado de error
* **Responde rápido** – Devuelve un código de estado 2xx lo antes posible
* **Usa HTTPS** – Usa siempre URLs HTTPS para los endpoints de webhooks en producción
* **Almacena el payload sin procesar** – Guarda el payload del webhook sin procesar para depuración y verificación futuras
# Web y móvil
Source: https://docs.cursor.com/es/background-agent/web-and-mobile
Ejecuta agentes de código desde cualquier dispositivo con traspaso fluido al escritorio
## Descripción general
El agente de Cursor en la web lleva un potente asistente de código a cualquier dispositivo. Ya sea que estés con el teléfono mientras caminás o trabajando en el navegador, ahora podés arrancar agentes de código potentes que trabajan en segundo plano.
Cuando terminen, retomá su trabajo en Cursor, revisá y mergeá cambios, o compartí enlaces con tu equipo para colaborar.
Empezá en [cursor.com/agents](https://cursor.com/agents).
## Primeros pasos
### Configuración rápida
1. **Visita la app web**: Entra a [cursor.com/agents](https://cursor.com/agents) desde cualquier dispositivo
2. **Inicia sesión**: Accede con tu cuenta de Cursor
3. **Conecta GitHub**: Vincula tu cuenta de GitHub para acceder a los repositorios
4. **Inicia tu primer agente**: Escribe una tarea y mira cómo el agente se pone a trabajar
### Instalación en móvil
Para la mejor experiencia en móvil, instala Cursor como una app web progresiva (PWA):
* **iOS**: Abre [cursor.com/agents](https://cursor.com/agents) en Safari, toca el botón de compartir y luego “Add to Home Screen”
* **Android**: Abre la URL en Chrome, toca el menú y luego “Add to Home Screen” o “Install App”
Instalar como PWA ofrece una experiencia similar a una app nativa con: - Interfaz de pantalla completa - Arranques más rápidos - Ícono de la app en tu pantalla de inicio
## Trabajar en varios dispositivos
El Web and Mobile Agent está diseñado para funcionar con tu flujo de trabajo en el escritorio; haz clic en "Open in Cursor" para continuar el trabajo del agente en tu IDE.
### Colaboración en equipo
* **Acceso compartido**: Comparte enlaces con miembros del equipo para colaborar en ejecuciones del agente.
* **Proceso de revisión**: Los colaboradores pueden revisar diffs y dar feedback.
* **Gestión de pull requests**: Crea, revisa y fusiona pull requests directamente desde la interfaz web.
### Integración con Slack
Lanza agentes directamente desde Slack mencionando `@Cursor`, y, al iniciar agentes desde la web o el móvil, elige recibir notificaciones de Slack al finalizar.
Obtén más información sobre cómo configurar y usar la integración con Slack, incluyendo
cómo disparar agentes y recibir notificaciones.
## Precios
Los agentes web y móviles usan el mismo modelo de precios que los Agentes en Segundo Plano.
Obtén más información sobre los [precios de los Agentes en Segundo Plano](/es/account/pricing#background-agent).
## Solución de problemas
* Asegúrate de haber iniciado sesión y de tener conectada tu cuenta de GitHub. - Revisa
que tengas los permisos necesarios en el repositorio. - También necesitas
estar en una Prueba Pro o en un plan de pago con la facturación por uso habilitada. Para habilitar
la facturación por uso, ve a la pestaña de configuración de tu
[Dashboard](https://www.cursor.com/dashboard?tab=settings).
Intenta actualizar la página o borrar la caché de tu navegador. Asegúrate de usar
la misma cuenta en todos tus dispositivos.
Verifica que el administrador de tu espacio de trabajo haya instalado la app de Slack de Cursor y que
tengas los permisos necesarios.
# Bugbot
Source: https://docs.cursor.com/es/bugbot
Revisión de código con IA para pull requests
Bugbot revisa pull requests e identifica bugs, problemas de seguridad y de calidad de código.
Bugbot incluye un plan gratuito: cada usuario recibe una cantidad limitada de revisiones de PR gratis cada mes. Cuando alcanzas el límite, las revisiones se pausan hasta tu próximo ciclo de facturación. Podés actualizar en cualquier momento a una prueba Pro gratuita de 14 días para revisiones ilimitadas (sujeto a controles estándar contra abusos).
## Cómo funciona
Bugbot analiza los diffs de los PR y deja comentarios con explicaciones y sugerencias de corrección. Se ejecuta automáticamente en cada actualización del PR o manualmente cuando se activa.
* Ejecuta **revisiones automáticas** en cada actualización del PR
* **Disparo manual** comentando `cursor review` o `bugbot run` en cualquier PR
* Los enlaces **Fix in Cursor** abren issues directamente en Cursor
* Los enlaces **Fix in Web** abren issues directamente en [cursor.com/agents](https://cursor.com/agents)
## Configuración
Requiere acceso de admin en Cursor y acceso de admin en la organización de GitHub.
1. Ve a [cursor.com/dashboard](https://cursor.com/dashboard?tab=bugbot)
2. Entra a la pestaña Bugbot
3. Haz clic en `Connect GitHub` (o en `Manage Connections` si ya está conectado)
4. Sigue el flujo de instalación de GitHub
5. Vuelve al dashboard para habilitar Bugbot en repositorios específicos
## Configuración
### Configuración del repositorio
Activa o desactiva Bugbot por repositorio desde tu lista de instalaciones. Bugbot solo se ejecuta en PR que tú crees.
### Configuración personal
* Ejecutar **solo cuando se le mencione** comentando `cursor review` o `bugbot run`
* Ejecutar **solo una vez** por PR, omitiendo commits posteriores
### Configuración del repositorio
Los administradores del equipo pueden activar Bugbot por repositorio, configurar listas de permitidos/denegados para revisores y definir:
* Ejecutar **solo una vez** por PR y por instalación, omitiendo commits posteriores
* **Desactivar las revisiones en línea** para evitar que Bugbot deje comentarios directamente en las líneas de código
Bugbot se ejecuta para todas las personas que contribuyan en los repositorios habilitados, sin importar la pertenencia al equipo.
### Configuración personal
Los miembros del equipo pueden anular la configuración para sus propios PR:
* Ejecutar **solo cuando se le mencione** comentando `cursor review` o `bugbot run`
* Ejecutar **solo una vez** por PR, omitiendo commits posteriores
* **Habilitar revisiones en PR en borrador** para incluir pull requests en borrador en las revisiones automáticas
### Analítica
## Reglas
Crea archivos `.cursor/BUGBOT.md` para aportar contexto específico del proyecto en las revisiones. Bugbot siempre incluye el archivo raíz `.cursor/BUGBOT.md` y cualquier archivo adicional que encuentre al recorrer hacia arriba desde los archivos modificados.
```
project/
.cursor/BUGBOT.md # Siempre incluido (reglas a nivel de proyecto)
backend/
.cursor/BUGBOT.md # Incluido al revisar archivos del backend
api/
.cursor/BUGBOT.md # Incluido al revisar archivos del API
frontend/
.cursor/BUGBOT.md # Incluido al revisar archivos del frontend
```
```markdown theme={null}
# Guías para la revisión del proyecto
## Enfoques de seguridad
- Validar la entrada del usuario en los endpoints de la API
- Revisar vulnerabilidades de inyección SQL en las consultas a la base de datos
- Garantizar una autenticación adecuada en las rutas protegidas
## Patrones de arquitectura
- Usar inyección de dependencias para los servicios
- Seguir el patrón de repositorio para el acceso a datos
- Implementar un manejo de errores adecuado con clases de error personalizadas
## Problemas comunes
- Fugas de memoria en componentes de React (revisa la limpieza de useEffect)
- Falta de límites de error (error boundaries) en componentes de UI
- Convenciones de nombres inconsistentes (usa camelCase para las funciones)
```
## Precios
Bugbot ofrece dos planes: **Gratis** y **Pro**.
### Free tier
Cada usuario obtiene una cantidad limitada de revisiones de PR gratis cada mes. En equipos, cada miembro del equipo recibe sus propias revisiones gratis. Cuando llegás al límite, las revisiones se pausan hasta tu próximo ciclo de facturación. Podés pasar en cualquier momento a la prueba Pro gratuita de 14 días para tener revisiones ilimitadas.
### Plan Pro
### Tarifa fija
USD 40 al mes por revisiones ilimitadas de Bugbot en hasta 200 PR al mes en todos los repositorios.
### Primeros pasos
Suscribite desde la configuración de tu cuenta.
### Facturación por usuario
Los equipos pagan USD 40 por usuario por mes por revisiones ilimitadas.
Consideramos usuario a quien haya sido autor de PR revisados por Bugbot en un mes.
Todas las licencias se liberan al inicio de cada ciclo de facturación y se asignan por orden de llegada. Si un usuario no autoriza ningún PR revisado por Bugbot en un mes, el cupo puede ser usado por otra persona.
### Límites de cupos
Los admins del equipo pueden establecer un máximo de cupos de Bugbot por mes para controlar los costos.
### Primeros pasos
Suscribite desde el panel de tu equipo para habilitar la facturación.
### Medidas contra abusos
Para evitar abusos, tenemos un tope conjunto de 200 pull requests por mes por cada licencia de Bugbot. Si necesitás más de 200 pull requests por mes, contactanos en [hi@cursor.com](mailto:hi@cursor.com) y con gusto te ayudamos.
Por ejemplo, si tu equipo tiene 100 usuarios, tu organización inicialmente podrá revisar 20.000 pull requests por mes. Si alcanzan ese límite de forma natural, por favor escribinos y con gusto aumentamos el límite.
## Solución de problemas
Si Bugbot no está funcionando:
1. **Activa el modo detallado** añadiendo un comentario `cursor review verbose=true` o `bugbot run verbose=true` para obtener logs detallados y el ID de la solicitud
2. **Revisa los permisos** para verificar que Bugbot tenga acceso al repositorio
3. **Verifica la instalación** para confirmar que la app de GitHub esté instalada y habilitada
Incluye el ID de la solicitud del modo detallado al reportar problemas.
## Preguntas frecuentes
Sí, Bugbot cumple las mismas normas de privacidad que Cursor y procesa los datos de la misma forma que otras solicitudes de Cursor.
Cuando llegas a tu límite mensual del plan gratuito, las revisiones de Bugbot se pausan hasta tu siguiente ciclo de facturación. Puedes pasar a la prueba Pro gratuita de 14 días para obtener revisiones ilimitadas (sujetas a las protecciones estándar contra abuso).
```
```
# Code Review
Source: https://docs.cursor.com/es/cli/cookbook/code-review
Crea un flujo de trabajo de GitHub Actions que use Cursor CLI para revisar automáticamente los pull requests y ofrecer comentarios
Este tutorial te muestra cómo configurar el code review usando Cursor CLI en GitHub Actions. El flujo de trabajo analizará los pull requests, identificará problemas y publicará comentarios como respuestas.
Para la mayoría de usuarios, te recomendamos usar [Bugbot](/es/bugbot). Bugbot ofrece code review automatizado y gestionado sin necesidad de configuración. Este enfoque con la CLI es útil para explorar capacidades y para personalización avanzada.
```yaml cursor-code-review.yml theme={null}
name: Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
pull-requests: write
contents: read
issues: write
jobs:
code-review:
runs-on: ubuntu-latest
# Omitir la revisión de código automatizada para PR en borrador
if: github.event.pull_request.draft == false
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Perform automated code review
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BLOCKING_REVIEW: ${{ vars.BLOCKING_REVIEW || 'false' }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print 'Estás operando en un runner de GitHub Actions realizando una revisión de código automatizada. La CLI de gh está disponible y autenticada mediante GH_TOKEN. Puedes comentar en pull requests.
Contexto:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
- Blocking Review: ${{ env.BLOCKING_REVIEW }}
Objetivos:
1) Volver a revisar los comentarios existentes y responder resuelto cuando ya estén atendidos.
2) Revisar el diff actual del PR y señalar solo problemas claros y de alta severidad.
3) Dejar comentarios en línea muy breves (1‑2 frases) solo en las líneas modificadas y un breve resumen al final.
Procedimiento:
- Get existing comments: gh pr view --json comments
- Get diff: gh pr diff
- Get changed files with patches to compute inline positions: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --paginate --jq '.[] | {filename,patch}'
- Calcular anclajes exactos en línea para cada problema (ruta de archivo + posición en el diff). Los comentarios DEBEN colocarse en línea en la línea modificada del diff, no como comentarios de nivel superior.
- Detectar comentarios previos de nivel superior del tipo "sin problemas" escritos por este bot (coincidir cuerpos como: "✅ no issues", "No issues found", "LGTM").
- Si la ejecución ACTUAL encuentra problemas y existe cualquier comentario previo de "sin problemas":
- Preferir eliminarlos para evitar confusión:
- Try deleting top-level issue comments via: gh api -X DELETE repos/${{ github.repository }}/issues/comments/
- Si no es posible eliminarlos, minimízalos vía GraphQL (minimizeComment) o edítalos para anteponer "[Superseded by new findings]".
- Si no es posible ni eliminar ni minimizar, responde a ese comentario: "⚠️ Superseded: issues were found in newer commits".
- Si un problema reportado previamente parece estar corregido por cambios cercanos, responde: ✅ Este problema parece estar resuelto por los cambios recientes
- Analizar SOLO:
- Desreferencias de null/undefined
- Fugas de recursos (archivos o conexiones sin cerrar)
- Inyección (SQL/XSS)
- Concurrencia/condiciones de carrera
- Falta de manejo de errores en operaciones críticas
- Errores lógicos evidentes con comportamiento incorrecto
- Patrones claros anti‑rendimiento con impacto medible
- Vulnerabilidades de seguridad definitivas
- Evitar duplicados: omite si ya existe feedback similar en o cerca de las mismas líneas.
Reglas para comentar:
- Máximo 10 comentarios en línea en total; prioriza los problemas más críticos
- Un problema por comentario; colócalo exactamente en la línea modificada
- Todos los comentarios de problemas DEBEN ser en línea (anclados a un archivo y línea/posición en el diff del PR)
- Tono natural, específico y accionable; no menciones que es automatizado ni el nivel de confianza
- Usa emojis: 🚨 Crítico 🔒 Seguridad ⚡ Rendimiento ⚠️ Lógica ✅ Resuelto ✨ Mejora
Envío:
- Si NO hay problemas que reportar y ya existe un comentario de nivel superior indicando "sin problemas" (p. ej., "✅ no issues", "No issues found", "LGTM"), NO envíes otro comentario. Omite el envío para evitar redundancia.
- Si NO hay problemas que reportar y NO existe un comentario previo de "sin problemas", envía un comentario de resumen breve indicando que no hay problemas.
- Si HAY problemas que reportar y existe un comentario previo de "sin problemas", asegúrate de eliminar/minimizar/marcar como reemplazado el comentario previo antes de enviar la nueva revisión.
- Si HAY problemas que reportar, envía UNA revisión que contenga SOLO comentarios en línea más un resumen conciso opcional. Usa la API de GitHub Reviews para asegurar que los comentarios sean en línea:
- Build a JSON array of comments like: [{ "path": "", "position": , "body": "..." }]
- Submit via: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews -f event=COMMENT -f body="$SUMMARY" -f comments='[$COMMENTS_JSON]'
- NO uses: gh pr review --approve o --request-changes
Comportamiento de bloqueo:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
'
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Comprobando problemas críticos..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Se encontraron problemas críticos y la revisión bloqueante está habilitada. Fallando el flujo de trabajo."
exit 1
else
echo "✅ No se encontraron problemas bloqueantes."
fi
```
## Configura la autenticación
[Configura tu API key y los secretos del repositorio](/es/cli/github-actions#authentication) para autenticar Cursor CLI en GitHub Actions.
## Configura los permisos del agente
Crea un archivo de configuración para controlar qué acciones puede realizar el agente. Esto evita operaciones no deseadas, como hacer push de código o crear pull requests.
Crea `.cursor/cli.json` en la raíz de tu repositorio:
```json theme={null}
{
"permissions": {
"deny": [
"Shell(git push)",
"Shell(gh pr create)",
"Escribir(**)"
]
}
}
```
Esta configuración permite que el agente lea archivos y use la CLI de GitHub para comentarios, pero impide que haga cambios en tu repositorio. Consulta la [referencia de permisos](/es/cli/reference/permissions) para ver más opciones de configuración.
## Crea el flujo de trabajo de GitHub Actions
Ahora vamos a armar el flujo de trabajo paso a paso.
### Configura el disparador del flujo de trabajo
Crea `.github/workflows/cursor-code-review.yml` y configúralo para ejecutarse en pull requests:
```yaml theme={null}
name: Revisión de código de Cursor
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
```
### Revisa el repositorio
Agrega el paso de checkout para acceder al código del pull request:
```yaml theme={null}
- name: Checkout del repositorio
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
```
### Instala la CLI de Cursor
Agrega el paso de instalación de la CLI:
```yaml theme={null}
- name: Instalar Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
```
### Configura el agente de revisión
Antes de implementar el paso de revisión completo, entendamos la anatomía de nuestro prompt de revisión. Esta sección describe cómo queremos que se comporte el agente:
**Objetivo**:
Queremos que el agente revise el diff del PR actual y marque solo problemas claros y de alta severidad, luego deje comentarios en línea muy cortos (1-2 frases) solo en líneas modificadas, con un breve resumen al final. Esto mantiene una buena relación señal-ruido.
**Formato**:
Queremos comentarios breves y directos. Usamos emojis para facilitar el escaneo de los comentarios y queremos un resumen de alto nivel de la revisión completa al final.
**Envío**:
Cuando termine la revisión, queremos que el agente incluya un comentario corto basado en lo encontrado durante la revisión. El agente debe enviar una sola revisión que contenga comentarios en línea más un resumen conciso.
**Casos límite**:
Necesitamos manejar:
* Comentarios existentes resueltos: el agente debe marcarlos como listos cuando se aborden
* Evitar duplicados: el agente debe omitir comentar si ya existe feedback similar en o cerca de las mismas líneas
**Prompt final**:
El prompt completo combina todos estos requisitos de comportamiento para crear feedback enfocado y accionable
Ahora implementemos el paso del agente de revisión:
```yaml theme={null}
- name: Realizar revisión de código
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ github.token }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print "Estás operando en un runner de GitHub Actions realizando una revisión de código automatizada. La CLI de gh está disponible y autenticada mediante GH_TOKEN. Podés comentar en pull requests.
Contexto:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
Objetivos:
1) Volver a revisar los comentarios existentes y responder resuelto cuando estén atendidos
2) Revisar el diff actual del PR y señalar solo problemas claros y de alta severidad
3) Dejar comentarios en línea muy cortos (1-2 frases) solo en líneas modificadas y un resumen breve al final
Procedimiento:
- Obtener comentarios existentes: gh pr view --json comments
- Obtener diff: gh pr diff
- Si un problema reportado anteriormente parece solucionado por cambios cercanos, responder: ✅ Este problema parece estar resuelto por los cambios recientes
- Evitar duplicados: omitir si ya existe feedback similar en o cerca de las mismas líneas
Reglas para comentar:
- Máximo 10 comentarios en línea en total; priorizar los problemas más críticos
- Un problema por comentario; colocarlo en la línea exacta modificada
- Tono natural, específico y accionable; no mencionar automatización ni alta confianza
- Usar emojis: 🚨 Crítico 🔒 Seguridad ⚡ Rendimiento ⚠️ Lógica ✅ Resuelto ✨ Mejora
Envío:
- Enviar una sola revisión que contenga comentarios en línea más un resumen conciso
- Usar solo: gh pr review --comment
- No usar: gh pr review --approve o --request-changes"
```
```text theme={null}
.
├── .cursor/
│ └── cli.json
├── .github/
│ └── workflows/
│ └── cursor-code-review.yml
```
## Prueba tu reviewer
Crea un pull request de prueba para verificar que el flujo de trabajo funcione y que el agente publique comentarios de revisión con emojis y feedback.
## Próximos pasos
Ahora tienes un sistema de revisión de código automatizada en marcha. Considera estas mejoras:
* Configura flujos de trabajo adicionales para [corregir fallos de CI](/es/cli/cookbook/fix-ci)
* Configura distintos niveles de revisión para diferentes ramas
* Intégralo con el proceso de revisión de código existente de tu equipo
* Personaliza el comportamiento del agente para distintos tipos de archivos o directorios
Puedes configurar el flujo de trabajo para que falle si se encuentran problemas críticos, evitando que se fusione el pull request hasta que se aborden.
**Añadir comportamiento bloqueante al prompt**
Primero, actualiza el paso de tu agente de revisión para incluir la variable de entorno `BLOCKING_REVIEW` y añade este comportamiento bloqueante al prompt:
```
Comportamiento bloqueante:
- Si BLOCKING_REVIEW es true y se publicaron problemas 🚨 o 🔒: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- De lo contrario: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Establece siempre CRITICAL_ISSUES_FOUND al final
```
**Añadir el paso de verificación bloqueante**
Luego, añade este nuevo paso después del paso de revisión de código:
```yaml theme={null}
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
# Corregir fallos de CI
Source: https://docs.cursor.com/es/cli/cookbook/fix-ci
Corrige problemas de CI en un repositorio usando Cursor CLI en GitHub Actions
Corrige fallos de CI usando Cursor CLI en GitHub Actions. Este workflow analiza los fallos, aplica correcciones puntuales y crea una rama de fix con un enlace para crear un PR al instante.
Este workflow supervisa por nombre un workflow concreto. Actualiza la lista `workflows` para que coincida con el nombre real de tu workflow de CI.
```yaml auto-fix-ci.yml theme={null}
name: Fix CI Failures
on:
workflow_run:
workflows: [Test]
types: [completed]
permissions:
contents: write
pull-requests: write
actions: read
jobs:
attempt-fix:
if: >-
${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.name != 'Fix CI Failures' }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Fix CI failure
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: ci-fix
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- Workflow Run ID: ${{ github.event.workflow_run.id }}
- Workflow Run URL: ${{ github.event.workflow_run.html_url }}
- Fix Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end CI fix flow driven by the failing PR, creating a separate persistent fix branch and proposing a quick-create PR back into the original PR's branch.
# Requirements:
1) Identify the PR associated with the failed workflow run and determine its base and head branches. Let HEAD_REF be the PR's head branch (the contributor/origin branch).
2) Maintain a persistent fix branch for this PR head using the Fix Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
3) Attempt to resolve the CI failure by making minimal, targeted edits consistent with the repo's style. Keep changes scoped and safe.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the CI fix and includes an inline compare link to quick-create a PR.
# Inputs and conventions:
- Use `gh api`, `gh run view`, `gh pr view`, `gh pr diff`, `gh pr list`, `gh run download`, and git commands as needed to discover the failing PR and branches.
- Avoid duplicate comments; if a previous bot comment exists, update it instead of posting a new one.
- If no actionable fix is possible, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent fix branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above.
" --force --model "$MODEL" --output-format=text
```
# Auditoría de secretos
Source: https://docs.cursor.com/es/cli/cookbook/secret-audit
Audita los secretos de un repositorio usando Cursor CLI en GitHub Actions
Audita tu repo para detectar vulnerabilidades de seguridad y exposición de secretos usando Cursor CLI. Este workflow busca posibles secretos, detecta patrones de workflow riesgosos y propone correcciones de seguridad.
```yaml auto-secret-audit.yml theme={null}
name: Secrets Audit
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
actions: read
jobs:
secrets-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Scan and propose hardening
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: audit
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Hardening Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Perform a repository secrets exposure and workflow hardening audit on a schedule, and propose minimal safe fixes.
# Requirements:
1) Scan for potential secrets in tracked files and recent history; support allowlist patterns if present (e.g., .gitleaks.toml).
2) Detect risky workflow patterns: unpinned actions, overbroad permissions, unsafe pull_request_target usage, secrets in forked PR contexts, deprecated insecure commands, missing permissions blocks.
3) Maintain a persistent branch for this run using the Hardening Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) Propose minimal edits: redact literals where safe, add ignore rules, pin actions to SHA, reduce permissions, add guardrails to workflows, and add a SECURITY_LOG.md summarizing changes and remediation guidance.
5) Push to origin.
6) If there is at least one open PR in the repo, post or update a single natural-language comment (1–2 sentences) on the most recently updated open PR that briefly explains the hardening changes and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update an existing bot comment if present. If no changes or no open PRs, post nothing.
# Inputs and conventions:
- Use `gh` to list PRs and to post comments. Avoid duplicate comments.
# Deliverables when updates occur:
- Pushed commits to the persistent hardening branch for this run.
- A single natural-language PR comment with the compare link above (only if an open PR exists).
" --force --model "$MODEL" --output-format=text
```
# Traducir claves
Source: https://docs.cursor.com/es/cli/cookbook/translate-keys
Traduce claves de un repositorio usando Cursor CLI en GitHub Actions
Administra claves de traducción para internacionalización con Cursor CLI. Este workflow detecta claves i18n nuevas o modificadas en pull requests y completa las traducciones faltantes sin sobrescribir las existentes.
```yaml auto-translate-keys.yml theme={null}
name: Translate Keys
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
i18n:
if: ${{ !startsWith(github.head_ref, 'translate/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Propose i18n updates
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: translate
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- Head Ref: ${{ github.head_ref }}
- Translate Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Detect i18n keys added or changed in the PR and fill only missing locales in message files. Never overwrite existing translations.
# Requirements:
1) Determine changed keys by inspecting the PR diff (source files and messages files).
2) Compute missing keys per locale using the source/canonical locale as truth.
3) Add entries only for missing keys. Preserve all existing values untouched.
4) Validate JSON formatting and schemas.
5) Maintain a persistent translate branch for this PR head using the Translate Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
6) Post or update a single PR comment on the original PR written in natural language (1–2 sentences) that briefly explains what was updated and why, and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update a previous bot comment if present.
8) If no changes are necessary, make no commits and post no comment.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes.
# Deliverables when updates occur:
- Pushed commits to the persistent translate branch for this PR head.
- A single natural-language PR comment on the original PR with the compare link above.
" --force --model "$MODEL" --output-format=text
```
# Actualizar docs
Source: https://docs.cursor.com/es/cli/cookbook/update-docs
Actualiza las docs de un repositorio usando Cursor CLI en GitHub Actions
Actualiza las docs usando Cursor CLI en GitHub Actions. Dos enfoques: autonomía total del agente o flujo de trabajo determinista con modificaciones de archivos solo por parte del agente.
```yaml auto-update-docs.yml theme={null}
name: Actualizar docs
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout del repositorio
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Instalar Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configurar git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Actualizar docs
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Estás operando en un runner de GitHub Actions.
La GitHub CLI está disponible como `gh` y está autenticada con `GH_TOKEN`. Git está disponible. Tenés acceso de escritura al contenido del repositorio y podés comentar en pull requests, pero no debés crear ni editar PR.
# Contexto:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
- Docs Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Objetivo:
- Implementar un flujo de actualización de docs de extremo a extremo impulsado por cambios incrementales en el PR original.
# Requisitos:
1) Determinar qué cambió en el PR original y, si hubo múltiples pushes, calcular los diffs incrementales desde la última actualización de los docs.
2) Actualizar solo los docs relevantes basados en esos cambios incrementales.
3) Mantener la rama persistente de docs para esta head del PR usando el prefijo de rama de docs del Contexto. Creala si no existe; de lo contrario, actualizala y pusheá los cambios al origin.
4) No tenés permiso para crear PR. En su lugar, publicá o actualizá un único comentario en lenguaje natural en el PR (1–2 oraciones) que explique brevemente las actualizaciones de los docs e incluya un enlace de comparación inline para crear rápido un PR
# Entradas y convenciones:
- Usá `gh pr diff` y el historial de git para detectar cambios y derivar rangos incrementales desde la última actualización de los docs.
- No intentes crear ni editar PR directamente. Usá el formato de enlace de comparación anterior.
- Mantené los cambios al mínimo y consistentes con el estilo del repo. Si no hacen falta actualizaciones de docs, no hagas cambios ni publiques comentarios.
# Entregables cuando haya actualizaciones:
- Commits pusheados a la rama persistente de docs para esta head del PR.
- Un único comentario en lenguaje natural en el PR original que incluya el enlace de comparación inline anterior. Evitá publicar duplicados; actualizá un comentario previo del bot si existe.
" --force --model "$MODEL" --output-format=text
```
```yaml auto-update-docs-deterministic.yml theme={null}
name: Actualizar docs
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout del repositorio
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Instalar Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configurar git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Generar actualizaciones de docs (sin commit/push/comentario)
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Estás operando en un runner de GitHub Actions.
La CLI de GitHub está disponible como `gh` y autenticada con `GH_TOKEN`. Git está disponible.
IMPORTANTE: No crees ramas ni hagas commit, push o publiques comentarios en el PR. Solo modifica los archivos en el directorio de trabajo según sea necesario. Un paso posterior del workflow se encarga de publicar los cambios y comentar en el PR.
# Contexto:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
# Objetivo:
- Actualizar la documentación del repositorio según los cambios incrementales introducidos por este PR.
# Requisitos:
1) Determina qué cambió en el PR original (usa `gh pr diff` y el historial de git según sea necesario). Si existe una rama persistente de docs `${{ env.BRANCH_PREFIX }}/${{ github.head_ref }}`, podés usarla como referencia de solo lectura para entender actualizaciones previas.
2) Actualizá solo la documentación relevante en función de esos cambios. Mantené las ediciones mínimas y consistentes con el estilo del repositorio.
3) No hagas commit, push, crees ramas ni publiques comentarios en el PR. Dejá el árbol de trabajo solo con los archivos actualizados; un paso posterior publicará.
# Entradas y convenciones:
- Usá `gh pr diff` y el historial de git para detectar cambios y enfocar las ediciones de documentación en consecuencia.
- Si no son necesarias actualizaciones de documentación, no hagas cambios ni generes salida.
# Entregables cuando haya actualizaciones:
- Archivos de documentación modificados solo en el directorio de trabajo (sin commits/push/comentarios).
" --force --model "$MODEL" --output-format=text
- name: Publicar rama de docs
id: publish_docs
env:
BRANCH_PREFIX: docs
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
echo "changes_published=false" >> "$GITHUB_OUTPUT"
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
# Asegurate de que estemos en una rama local que podamos pushear
git fetch origin --prune
# Crear/cambiar a la rama persistente de docs, manteniendo los cambios actuales en el árbol de trabajo
git checkout -B "$DOCS_BRANCH"
# Preparar y detectar cambios
git add -A
if git diff --staged --quiet; then
echo "No hay cambios de docs para publicar. Omitiendo commit/push."
exit 0
fi
COMMIT_MSG="docs: update for PR #${PR_NUMBER} (${HEAD_REF} @ $(git rev-parse --short HEAD))"
git commit -m "$COMMIT_MSG"
git push --set-upstream origin "$DOCS_BRANCH"
echo "changes_published=true" >> "$GITHUB_OUTPUT"
- name: Publicar o actualizar comentario del PR
if: steps.publish_docs.outputs.changes_published == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
COMPARE_URL="https://github.com/${REPO}/compare/${BASE_REF}...${DOCS_BRANCH}?quick_pull=1&title=docs%3A+updates+for+PR+%23${PR_NUMBER}"
COMMENT_FILE="${RUNNER_TEMP}/auto-docs-comment.md"
{
echo "Cursor actualizó la rama de docs: \`${DOCS_BRANCH}\`"
echo "Ahora podés [ver el diff y crear rápidamente un PR para mergear estas actualizaciones de docs](${COMPARE_URL})."
echo
echo "_Este comentario se actualizará en ejecuciones posteriores a medida que cambie el PR._"
echo
echo ""
} > "$COMMENT_FILE"
# Si editar el último comentario del bot falla (gh más antiguo), recurrí a crear un comentario nuevo
if gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE" --edit-last; then
echo "Se actualizó el comentario existente del PR."
else
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "Se publicó un comentario nuevo en el PR."
fi
```
# GitHub Actions
Source: https://docs.cursor.com/es/cli/github-actions
Aprende a usar Cursor CLI en GitHub Actions y otros sistemas de integración continua
Usa Cursor CLI en GitHub Actions y otros sistemas CI/CD para automatizar tareas de desarrollo.
Mira nuestros ejemplos de cookbook para flujos de trabajo prácticos: [actualizar documentación](/es/cli/cookbook/update-docs) y [corregir problemas de CI](/es/cli/cookbook/fix-ci).
## Otros sistemas de CI
Usa Cursor CLI en cualquier sistema de CI/CD con:
* **Ejecución de scripts de shell** (bash, zsh, etc.)
* **Variables de entorno** para configurar la clave de API
* **Conexión a Internet** para acceder a la API de Cursor
## Niveles de autonomía
Elige el nivel de autonomía de tu agente:
### Enfoque de autonomía total
Dale al agente control completo sobre operaciones de Git, llamadas a APIs e interacciones externas. Configuración más simple; requiere más confianza.
**Ejemplo:** En nuestro cookbook [Update Documentation](/es/cli/cookbook/update-docs), el primer flujo de trabajo permite que el agente:
* Analice los cambios del PR
* Cree y administre ramas de Git
* Haga commits y haga push de cambios
* Publique comentarios en pull requests
* Maneje todos los escenarios de error
```yaml theme={null}
- name: Actualizar docs (autonomía total)
run: |
cursor-agent -p "Tienes acceso completo a git, la CLI de GitHub y a las operaciones de PR.
Ocúpate de todo el flujo de actualización de la documentación, incluidos los commits, los pushes y los comentarios en PR."
```
### Enfoque de autonomía restringida
Recomendamos usar este enfoque con **restricciones basadas en permisos** para flujos de trabajo de CI en producción. Te da lo mejor de ambos mundos: el agente puede manejar de forma inteligente análisis complejos y modificaciones de archivos, mientras que las operaciones críticas siguen siendo deterministas y auditables.
Limita las operaciones del agente y mueve los pasos críticos a etapas separadas del flujo de trabajo. Mejor control y previsibilidad.
**Ejemplo:** El segundo flujo de trabajo de este mismo cookbook restringe al agente únicamente a realizar modificaciones de archivos:
```yaml theme={null}
- name: Generar actualizaciones de docs (restringido)
run: |
cursor-agent -p "IMPORTANTE: NO crees ramas, no hagas commit ni push, ni publiques comentarios en PR.
Modifica únicamente los archivos en el directorio de trabajo. Un paso posterior del flujo se encarga de la publicación."
- name: Publicar rama de docs (determinista)
run: |
# Operaciones deterministas de git gestionadas por CI
git checkout -B "docs/${{ github.head_ref }}"
git add -A
git commit -m "docs: actualización para PR"
git push origin "docs/${{ github.head_ref }}"
- name: Publicar comentario en PR (determinista)
run: |
# Comentarios de PR deterministas gestionados por CI
gh pr comment ${{ github.event.pull_request.number }} --body "Docs actualizados"
```
### Restricciones basadas en permisos
Usa las [configuraciones de permisos](/es/cli/reference/permissions) para imponer restricciones a nivel de la CLI:
```json theme={null}
{
"permissions": {
"allow": [
"Read(**/*.md)",
"Write(docs/**/*)",
"Shell(grep)",
"Shell(find)"
],
"deny": [
"Shell(git)",
"Shell(gh)",
"Write(.env*)",
"Write(package.json)"
]
}
}
```
## Autenticación
### Genera tu clave de API
Primero, [genera una clave de API](/es/cli/reference/authentication#api-key-authentication) desde tu panel de Cursor.
### Configura los secretos del repositorio
Guarda tu clave de API de Cursor de forma segura en tu repositorio:
1. Ve a tu repositorio de GitHub
2. Haz clic en **Settings** → **Secrets and variables** → **Actions**
3. Haz clic en **New repository secret**
4. Ponle el nombre `CURSOR_API_KEY`
5. Pega tu clave de API como valor
6. Haz clic en **Add secret**
### Úsala en workflows
Configura tu variable de entorno `CURSOR_API_KEY`:
```yaml theme={null}
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
```
# Uso de la CLI en modo headless
Source: https://docs.cursor.com/es/cli/headless
Aprende a escribir scripts con la CLI de Cursor para análisis de código automatizado, generación y modificación
Usa la CLI de Cursor en scripts y flujos de automatización para tareas de análisis, generación y refactorización de código.
## Cómo funciona
Usa [print mode](/es/cli/using#non-interactive-mode) (`-p, --print`) para scripting y automatización no interactivos.
### Modificación de archivos en scripts
Combina `--print` con `--force` para modificar archivos desde scripts:
```bash theme={null}
# Habilita modificaciones de archivos en modo de impresión
cursor-agent -p --force "Refactoriza este código para usar sintaxis moderna de ES6+"
# Sin --force, los cambios solo se proponen; no se aplican
cursor-agent -p "Añade comentarios JSDoc a este archivo" # No modificará archivos
# Procesamiento por lotes con cambios reales en archivos
find src/ -name "*.js" | while read file; do
cursor-agent -p --force "Añade comentarios JSDoc detallados a $file"
done
```
La opción `--force` permite que el agente haga cambios directos en archivos sin pedir confirmación
## Configuración
Consulta [Instalación](/es/cli/installation) y [Autenticación](/es/cli/reference/authentication) para ver todos los detalles de configuración.
```bash theme={null}
# Instalar la CLI de Cursor
curl https://cursor.com/install -fsS | bash
# Configurar la clave de API para scripts
export CURSOR_API_KEY=tu_api_key_aquí
cursor-agent -p "Analiza este código"
```
## Scripts de ejemplo
Usa distintos formatos de salida según las necesidades de cada script. Consulta [Formato de salida](/es/cli/reference/output-format) para más detalles.
### Búsqueda en el código
Usa `--output-format text` para respuestas legibles:
```bash theme={null}
#!/bin/bash
# Pregunta simple sobre el código
cursor-agent -p --output-format text "¿Qué hace este código?"
```
### Revisión automática de código
Usa `--output-format json` para obtener un análisis estructurado:
```bash theme={null}
#!/bin/bash
# simple-code-review.sh - Script básico de revisión de código
echo "Iniciando la revisión de código..."
# Revisar cambios recientes
cursor-agent -p --force --output-format text \
"Revisa los cambios de código recientes y da feedback sobre:
- Calidad y legibilidad del código
- Posibles errores o problemas
- Consideraciones de seguridad
- Cumplimiento de buenas prácticas
Ofrece sugerencias específicas de mejora y escribe en review.txt"
if [ $? -eq 0 ]; then
echo "✅ Revisión de código completada correctamente"
else
echo "❌ Error en la revisión de código"
exit 1
fi
```
### Seguimiento del progreso en tiempo real
Usa `--output-format stream-json` para hacer seguimiento del progreso en tiempo real:
```bash theme={null}
#!/bin/bash
# stream-progress.sh - Seguimiento del progreso en tiempo real
echo "🚀 Iniciando el procesamiento del stream..."
# Seguimiento del progreso en tiempo real
accumulated_text=""
tool_count=0
start_time=$(date +%s)
cursor-agent -p --force --output-format stream-json \
"Analiza esta estructura del proyecto y crea un informe de resumen en analysis.txt" | \
while IFS= read -r line; do
type=$(echo "$line" | jq -r '.type // empty')
subtype=$(echo "$line" | jq -r '.subtype // empty')
case "$type" in
"system")
if [ "$subtype" = "init" ]; then
model=$(echo "$line" | jq -r '.model // "unknown"')
echo "🤖 Usando el modelo: $model"
fi
;;
"assistant")
# Acumular deltas de texto en streaming
content=$(echo "$line" | jq -r '.message.content[0].text // empty')
accumulated_text="$accumulated_text$content"
# Mostrar progreso en tiempo real
printf "\r📝 Generando: %d caracteres" ${#accumulated_text}
;;
"tool_call")
if [ "$subtype" = "started" ]; then
tool_count=$((tool_count + 1))
# Extraer información de la herramienta
if echo "$line" | jq -e '.tool_call.writeToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.writeToolCall.args.path // "unknown"')
echo -e "\n🔧 Herramienta #$tool_count: creando $path"
elif echo "$line" | jq -e '.tool_call.readToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.readToolCall.args.path // "unknown"')
echo -e "\n📖 Herramienta #$tool_count: leyendo $path"
fi
elif [ "$subtype" = "completed" ]; then
# Extraer y mostrar los resultados de la herramienta
if echo "$line" | jq -e '.tool_call.writeToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.linesCreated // 0')
size=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.fileSize // 0')
echo " ✅ Se crearon $lines líneas ($size bytes)"
elif echo "$line" | jq -e '.tool_call.readToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.readToolCall.result.success.totalLines // 0')
echo " ✅ Se leyeron $lines líneas"
fi
fi
;;
"result")
duration=$(echo "$line" | jq -r '.duration_ms // 0')
end_time=$(date +%s)
total_time=$((end_time - start_time))
echo -e "\n\n🎯 Completado en ${duration} ms (${total_time} s en total)"
echo "📊 Estadísticas finales: $tool_count herramientas, ${#accumulated_text} caracteres generados"
;;
esac
done
```
# Instalación
Source: https://docs.cursor.com/es/cli/installation
Instala y actualiza la CLI de Cursor
## Instalación
### macOS, Linux y Windows (WSL)
Instala la CLI de Cursor con un solo comando:
```bash theme={null}
curl https://cursor.com/install -fsS | bash
```
### Verificación
Después de la instalación, confirma que Cursor CLI esté funcionando correctamente:
```bash theme={null}
cursor-agent --version
```
## Configuración posterior a la instalación
1. **Añade \~/.local/bin a tu PATH:**
Para bash:
```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
Para zsh:
```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
2. **Empieza a usar Cursor Agent:**
```bash theme={null}
cursor-agent
```
La CLI de Cursor es compatible con servidores del [Model Context Protocol (MCP)](/es/context/mcp), lo que te permite conectar herramientas externas y fuentes de datos a `cursor-agent`. **MCP en la CLI usa la misma configuración que el editor**: cualquier servidor MCP que hayas configurado funcionará sin problemas en ambos.
¿Eres nuevo en MCP? Lee la guía completa sobre configuración, autenticación y servidores disponibles
## Comandos de CLI
Usa el comando `cursor-agent mcp` para administrar servidores MCP:
### Listar servidores configurados
Consulta todos los servidores MCP configurados y su estado actual:
```bash theme={null}
cursor-agent mcp list
```
Esto muestra:
* Nombres e identificadores de servidores
* Estado de la conexión (conectado/desconectado)
* Origen de la configuración (del proyecto o global)
* Método de transporte (stdio, HTTP, SSE)
### Listar herramientas disponibles
Ver las herramientas que proporciona un servidor MCP específico:
```bash theme={null}
cursor-agent mcp list-tools
```
Esto muestra:
* Nombres y descripciones de herramientas
* Parámetros obligatorios y opcionales
* Tipos de parámetros y restricciones
### Inicia sesión en el servidor MCP
Autentícate con un servidor MCP configurado en tu `mcp.json`:
```bash theme={null}
cursor-agent mcp login
```
### Deshabilitar el servidor MCP
Quita un servidor MCP de la lista local de aprobados:
```bash theme={null}
cursor-agent mcp disable
```
## Usar MCP con Agent
Una vez que tengas configurados los servidores MCP (consulta la [guía principal de MCP](/es/context/mcp) para la configuración), `cursor-agent` detecta y utiliza automáticamente las herramientas disponibles cuando sean relevantes para tus solicitudes.
```bash theme={null}
# Verifica qué servidores MCP están disponibles
cursor-agent mcp list
# Mira qué herramientas ofrece un servidor específico
cursor-agent mcp list-tools playwright
# Usa cursor-agent: emplea herramientas MCP automáticamente cuando conviene
cursor-agent --prompt "Navega a google.com y toma una captura de la página de búsqueda"
```
La CLI sigue la misma prioridad de configuración que el editor (proyecto → global → anidada) y detecta automáticamente las configuraciones en los directorios superiores.
## Relacionado
Guía completa de MCP: instalación, configuración y autenticación
Explora servidores MCP ya listos que puedes usar
# Cursor CLI
Source: https://docs.cursor.com/es/cli/overview
Empieza con Cursor CLI para programar en tu terminal
Cursor CLI te permite interactuar con agentes de IA directamente desde tu terminal para escribir, revisar y modificar código. Ya sea que prefieras una interfaz de terminal interactiva o automatización con salida imprimible para scripts y pipelines de CI, la CLI ofrece una potente asistencia para programar justo donde trabajas.
```bash theme={null}
# Instalación
curl https://cursor.com/install -fsS | bash
# Iniciar sesión interactiva
cursor-agent
```
Cursor CLI está en beta, ¡nos encantaría tu opinión!
### Modo interactivo
Inicia una sesión conversacional con el agente para describir tus objetivos, revisar los cambios propuestos y aprobar comandos:
```bash theme={null}
# Inicia una sesión interactiva
cursor-agent
# Empieza con un mensaje inicial
cursor-agent "refactoriza el módulo de auth para usar tokens JWT"
```
### Modo no interactivo
Usa el modo de impresión para escenarios no interactivos, como scripts, pipelines de CI o automatización:
```bash theme={null}
# Ejecuta con un prompt y un modelo específicos
cursor-agent -p "find and fix performance issues" --model "gpt-5"
# Úsalo con los cambios de git incluidos para revisión
cursor-agent -p "review these changes for security issues" --output-format text
```
### Sesiones
Retoma conversaciones anteriores para mantener el contexto a lo largo de varias interacciones:
```bash theme={null}
# Listar todos los chats anteriores
cursor-agent ls
# Reanudar la conversación más reciente
cursor-agent resume
# Reanudar una conversación específica
cursor-agent --resume="chat-id-here"
```
# Autenticación
Source: https://docs.cursor.com/es/cli/reference/authentication
Autentica Cursor CLI con inicio de sesión en el navegador o claves de API
Cursor CLI admite dos métodos de autenticación: inicio de sesión en el navegador (recomendado) y claves de API.
## Autenticación en el navegador (recomendado)
Usa el flujo del navegador para la forma más sencilla de autenticarte:
```bash theme={null}
# Inicia sesión usando el flujo del navegador
cursor-agent login
# Verifica el estado de la autenticación
cursor-agent status
# Cierra sesión y borra la autenticación almacenada
cursor-agent logout
```
El comando de inicio de sesión abrirá tu navegador predeterminado y te pedirá que inicies sesión con tu cuenta de Cursor. Una vez listo, tus credenciales se almacenarán de forma segura en tu equipo.
## Autenticación con clave de API
Para automatización, scripts o entornos CI/CD, usa la autenticación con clave de API:
### Paso 1: Genera una clave de API
Genera una clave de API en tu panel de Cursor en Integrations > User API Keys.
### Paso 2: Configura la clave de API
Podés proporcionar la clave de API de dos maneras:
**Opción 1: Variable de entorno (recomendado)**
```bash theme={null}
export CURSOR_API_KEY=your_api_key_here
cursor-agent "implementa la autenticación de usuarios"
```
**Opción 2: Indicador de la línea de comandos**
```bash theme={null}
cursor-agent --api-key your_api_key_here "implementar autenticación de usuario"
```
## Estado de autenticación
Consulta tu estado de autenticación actual:
```bash theme={null}
cursor-agent status
```
Este comando mostrará:
* Si estás autenticado
* La información de tu cuenta
* La configuración actual del endpoint
## Solución de problemas
* **Errores "Not authenticated":** Ejecuta `cursor-agent login` o asegúrate de que tu clave de API esté configurada correctamente
* **Errores de certificado SSL:** Usa la opción `--insecure` para entornos de desarrollo
* **Problemas con el endpoint:** Usa la opción `--endpoint` para especificar un endpoint de API personalizado
# Configuración
Source: https://docs.cursor.com/es/cli/reference/configuration
Referencia de configuración de la Agent CLI para cli-config.json
Configura la Agent CLI usando el archivo `cli-config.json`.
## Ubicación del archivo
| Tipo | Plataforma | Ruta |
| :------- | :---------- | :----------------------------------------- |
| Global | macOS/Linux | `~/.cursor/cli-config.json` |
| Global | Windows | `$env:USERPROFILE\.cursor\cli-config.json` |
| Proyecto | Todas | `/.cursor/cli.json` |
Solo los permisos pueden configurarse a nivel de proyecto. Todos los demás ajustes de la CLI deben configurarse globalmente.
Sobrescribir con variables de entorno:
* **`CURSOR_CONFIG_DIR`**: ruta de directorio personalizada
* **`XDG_CONFIG_HOME`** (Linux/BSD): usa `$XDG_CONFIG_HOME/cursor/cli-config.json`
## Esquema
### Campos obligatorios
| Campo | Tipo | Descripción |
| :------------------ | :-------- | :-------------------------------------------------------------------------------- |
| `version` | number | Versión del esquema de configuración (actual: `1`) |
| `editor.vimMode` | boolean | Activar keybindings de Vim (por defecto: `false`) |
| `permissions.allow` | string\[] | Operaciones permitidas (consulta [Permissions](/es/cli/reference/permissions)) |
| `permissions.deny` | string\[] | Operaciones no permitidas (consulta [Permissions](/es/cli/reference/permissions)) |
### Campos opcionales
| Campo | Tipo | Descripción |
| :----------------------- | :------ | :----------------------------------------------------- |
| `model` | object | Configuración del modelo seleccionado |
| `hasChangedDefaultModel` | boolean | Indicador de override del modelo gestionado por la CLI |
```json theme={null}
{
"version": 1,
"editor": { "vimMode": false },
"permissions": {
"allow": ["Shell(ls)", "Shell(echo)"],
"deny": ["Shell(rm)"]
}
}
```
Consulta [Permissions](/es/cli/reference/permissions) para conocer los tipos de permisos disponibles y ver ejemplos.
## Solución de problemas
**Errores de configuración**: Mueve el archivo a otro lado y reinicia:
```bash theme={null}
mv ~/.cursor/cli-config.json ~/.cursor/cli-config.json.bad
```
**Los cambios no persisten**: Asegúrate de que el JSON sea válido y de tener permisos de escritura. Algunos campos los gestiona la CLI y pueden sobrescribirse.
## Notas
* Formato JSON puro (sin comentarios)
* La CLI se autorrepara cuando faltan campos
* Los archivos dañados se respaldan como `.bad` y se vuelven a crear
* Las entradas de permisos deben coincidir exactamente con la cadena (consulta [Permisos](/es/cli/reference/permissions) para más detalles)
# Formato de salida
Source: https://docs.cursor.com/es/cli/reference/output-format
Esquema de salida para formatos de texto, JSON y stream-JSON
La CLI de Cursor Agent ofrece múltiples formatos de salida con la opción `--output-format` cuando se combina con `--print`. Estos formatos incluyen formatos estructurados para uso programático (`json`, `stream-json`) y un formato de texto simplificado para seguir el progreso de forma legible para humanos.
El `--output-format` predeterminado es `stream-json`. Esta opción solo es válida al imprimir (`--print`) o cuando se infiere el modo de impresión (stdout no TTY o stdin canalizado).
## Formato JSON
El formato de salida `json` emite un único objeto JSON (seguido de un salto de línea) cuando la ejecución se completa correctamente. No se emiten deltas ni eventos de herramientas; el texto se agrega en el resultado final.
En caso de error, el proceso termina con un código distinto de cero y escribe un mensaje de error en stderr. No se emite ningún objeto JSON bien formado en casos de error.
### Respuesta exitosa
Cuando se completa correctamente, la CLI imprime un objeto JSON con la siguiente estructura:
```json theme={null}
{
"type": "result",
"subtype": "success",
"is_error": false,
"duration_ms": 1234,
"duration_api_ms": 1234,
"result": "",
"session_id": "",
"request_id": ""
}
```
| Campo | Descripción |
| ----------------- | ----------------------------------------------------------------------------------------- |
| `type` | Siempre `"result"` para resultados del terminal |
| `subtype` | Siempre `"success"` para completaciones correctas |
| `is_error` | Siempre `false` para respuestas correctas |
| `duration_ms` | Tiempo total de ejecución en milisegundos |
| `duration_api_ms` | Tiempo de la solicitud a la API en milisegundos (actualmente igual a `duration_ms`) |
| `result` | Texto completo de la respuesta del asistente (concatenación de todos los deltas de texto) |
| `session_id` | Identificador único de la sesión |
| `request_id` | Identificador opcional de la solicitud (puede omitirse) |
## Formato JSON de streaming
El formato de salida `stream-json` emite JSON delimitado por saltos de línea (NDJSON). Cada línea contiene un único objeto JSON que representa un evento en tiempo real durante la ejecución.
El stream termina con un evento terminal `result` en caso de éxito. En caso de fallo, el proceso finaliza con un código distinto de cero y el stream puede terminar antes sin un evento terminal; se escribe un mensaje de error en stderr.
### Tipos de eventos
#### Inicialización del sistema
Emitido una vez al inicio de cada sesión:
```json theme={null}
{
"type": "system",
"subtype": "init",
"apiKeySource": "env|flag|login",
"cwd": "/ruta/absoluta",
"session_id": "",
"model": "",
"permissionMode": "predeterminado"
}
```
En el futuro, podrían añadirse a este evento campos como `tools` y `mcp_servers`.
#### Mensaje del usuario
Contiene el prompt que ingresó el usuario:
```json theme={null}
{
"type": "user",
"message": {
"role": "user",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
#### Delta de texto del assistant
Se emite varias veces mientras el assistant genera su respuesta. Estos eventos contienen fragmentos de texto incrementales:
```json theme={null}
{
"type": "assistant",
"message": {
"role": "assistant",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
Concatena todos los valores de `message.content[].text` en orden para reconstruir la respuesta completa del asistente.
#### Eventos de llamada a herramientas
Las llamadas a herramientas se registran con eventos de inicio y finalización:
**Inicio de llamada a herramienta:**
```json theme={null}
{
"type": "tool_call",
"subtype": "started",
"call_id": "",
"tool_call": {
"readToolCall": {
"args": { "path": "file.txt" }
}
},
"session_id": ""
}
```
**Llamada de herramienta completada:**
```json theme={null}
{
"type": "tool_call",
"subtype": "completed",
"call_id": "",
"tool_call": {
"readToolCall": {
"args": { "path": "file.txt" },
"result": {
"success": {
"content": "contenido del archivo...",
"isEmpty": false,
"exceededLimit": false,
"totalLines": 54,
"totalChars": 1254
}
}
}
},
"session_id": ""
}
```
#### Tipos de llamadas de herramienta
**Herramienta de lectura de archivos:**
* **Iniciada**: `tool_call.readToolCall.args` contiene `{ "path": "file.txt" }`
* **Completada**: `tool_call.readToolCall.result.success` incluye metadatos y contenido del archivo
**Herramienta de escritura de archivos:**
* **Iniciada**: `tool_call.writeToolCall.args` contiene `{ "path": "file.txt", "fileText": "content...", "toolCallId": "id" }`
* **Completada**: `tool_call.writeToolCall.result.success` incluye `{ "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }`
**Otras herramientas:**
* Puede usar la estructura `tool_call.function` con `{ "name": "tool_name", "arguments": "..." }`
#### Resultado del terminal
El evento final emitido al completarse correctamente:
```json theme={null}
{
"type": "result",
"subtype": "correcto",
"duration_ms": 1234,
"duration_api_ms": 1234,
"is_error": false,
"result": "",
"session_id": "",
"request_id": ""
}
```
### Secuencia de ejemplo
Aquí tienes una secuencia NDJSON representativa que muestra el flujo típico de eventos:
```json theme={null}
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Lee el README.md y crea un resumen"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Voy a "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"leer el archivo README.md"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Project\n\nThis is a sample project...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":" y crear un resumen"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"Voy a leer el archivo README.md y crear un resumen","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}
```
## Formato de texto
El formato de salida `text` ofrece un flujo simplificado y legible para humanos de las acciones del agente. En lugar de eventos JSON detallados, entrega descripciones de texto concisas sobre lo que el agente está haciendo en tiempo real.
Este formato sirve para monitorear el progreso del agente sin la carga de parsear datos estructurados, lo que lo hace ideal para logging, depuración o un seguimiento simple del progreso.
### Ejemplo de salida
```
Leyó un archivo
Editó un archivo
Ejecutó un comando en la terminal
Creó un archivo nuevo
```
Cada acción aparece en una nueva línea a medida que el agente la ejecuta, ofreciendo feedback inmediato sobre el progreso del agente en la tarea.
## Notas de implementación
* Cada evento se emite como una única línea terminada en `\n`
* Los eventos `thinking` se suprimen en modo impresión y no aparecen en ninguno de los formatos de salida
* Se pueden agregar campos con el tiempo de forma retrocompatible (los consumidores deben ignorar los campos desconocidos)
* El formato de flujo (stream) ofrece actualizaciones en tiempo real, mientras que el formato JSON espera a que finalice para mostrar los resultados
* Concatena todos los deltas del mensaje de `assistant` para reconstruir la respuesta completa
* Los IDs de llamadas a herramientas pueden usarse para correlacionar los eventos de inicio y finalización
* Los IDs de sesión se mantienen consistentes durante una única ejecución del agente
# Parámetros
Source: https://docs.cursor.com/es/cli/reference/parameters
Referencia completa de comandos del CLI de Cursor Agent
## Opciones globales
Las opciones globales se pueden usar con cualquier comando:
| Opción | Descripción |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `-v, --version` | Muestra la versión |
| `-a, --api-key ` | Clave de API para autenticación (también se puede usar la variable de entorno `CURSOR_API_KEY`) |
| `-p, --print` | Imprime las respuestas en la consola (para scripts o uso no interactivo). Tiene acceso a todas las herramientas, incluidas write y bash. |
| `--output-format ` | Formato de salida (solo funciona con `--print`): `text`, `json` o `stream-json` (predeterminado: `stream-json`) |
| `-b, --background` | Inicia en modo en segundo plano (abre el selector del compositor al iniciar) |
| `--fullscreen` | Activa el modo de pantalla completa |
| `--resume [chatId]` | Reanuda una sesión de chat |
| `-m, --model ` | Modelo a utilizar |
| `-f, --force` | Fuerza permitir comandos salvo que se denieguen explícitamente |
| `-h, --help` | Muestra la ayuda del comando |
## Comandos
| Comando | Descripción | Uso |
| ----------------- | ----------------------------------------------- | ---------------------------------------------- |
| `login` | Autentícate con Cursor | `cursor-agent login` |
| `logout` | Cierra sesión y borra la autenticación guardada | `cursor-agent logout` |
| `status` | Consulta el estado de autenticación | `cursor-agent status` |
| `mcp` | Administra servidores MCP | `cursor-agent mcp` |
| `update\|upgrade` | Actualiza Cursor Agent a la última versión | `cursor-agent update` o `cursor-agent upgrade` |
| `ls` | Reanuda una sesión de chat | `cursor-agent ls` |
| `resume` | Reanuda la última sesión de chat | `cursor-agent resume` |
| `help [command]` | Muestra ayuda para el comando | `cursor-agent help [command]` |
Cuando no se especifica un comando, Cursor Agent se inicia en modo de chat interactivo de forma predeterminada.
## MCP
Administra servidores MCP configurados para Cursor Agent.
| Subcomando | Descripción | Uso |
| ------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------ |
| `login ` | Autentícate con un servidor MCP configurado en `.cursor/mcp.json` | `cursor-agent mcp login ` |
| `list` | Lista los servidores MCP configurados y su estado | `cursor-agent mcp list` |
| `list-tools ` | Lista las herramientas disponibles y los nombres de sus argumentos para un MCP específico | `cursor-agent mcp list-tools ` |
Todos los comandos de MCP admiten `-h, --help` para ver ayuda específica de cada comando.
## Argumentos
Al iniciar en el modo chat (comportamiento predeterminado), podés proporcionar un prompt inicial:
**Argumentos:**
* `prompt` — Prompt inicial para el agente
## Obtener ayuda
Todos los comandos admiten la opción global `-h, --help` para mostrar la ayuda específica del comando.
# Permisos
Source: https://docs.cursor.com/es/cli/reference/permissions
Tipos de permisos para controlar el acceso del agente a archivos y comandos
Configura qué puede hacer el agente usando tokens de permisos en tu configuración de la CLI. Los permisos se definen en `~/.cursor/cli-config.json` (global) o `/.cursor/cli.json` (por proyecto).
## Tipos de permisos
### Comandos de shell
**Formato:** `Shell(commandBase)`
Controla el acceso a comandos de shell. `commandBase` es el primer token de la línea de comandos.
| Ejemplo | Descripción |
| ------------ | --------------------------------------------------------------------- |
| `Shell(ls)` | Permitir ejecutar comandos `ls` |
| `Shell(git)` | Permitir cualquier subcomando de `git` |
| `Shell(npm)` | Permitir comandos del gestor de paquetes npm |
| `Shell(rm)` | Denegar eliminaciones destructivas de archivos (comúnmente en `deny`) |
### Lecturas de archivos
**Formato:** `Read(pathOrGlob)`
Controla el acceso de lectura a archivos y directorios. Admite patrones glob.
| Ejemplo | Descripción |
| ------------------- | ------------------------------------------------------ |
| `Read(src/**/*.ts)` | Permitir leer archivos TypeScript en `src` |
| `Read(**/*.md)` | Permitir leer archivos markdown en cualquier ubicación |
| `Read(.env*)` | Denegar la lectura de archivos de entorno |
| `Read(/etc/passwd)` | Denegar la lectura de archivos del sistema |
### Escrituras de archivos
**Formato:** `Write(pathOrGlob)`
Controla el acceso de escritura a archivos y directorios. Admite patrones glob. Al usar en modo print, se requiere `--force` para escribir archivos.
| Ejemplo | Descripción |
| --------------------- | ------------------------------------------------------ |
| `Write(src/**)` | Permitir escribir en cualquier archivo dentro de `src` |
| `Write(package.json)` | Permitir modificar `package.json` |
| `Write(**/*.key)` | Denegar la escritura de archivos de claves privadas |
| `Write(**/.env*)` | Denegar la escritura de archivos de entorno |
## Configuración
Agrega permisos al objeto `permissions` en tu archivo de configuración de la CLI:
```json theme={null}
{
"permissions": {
"allow": [
"Shell(ls)",
"Shell(git)",
"Read(src/**/*.ts)",
"Write(package.json)"
],
"deny": [
"Shell(rm)",
"Read(.env*)",
"Write(**/*.key)"
]
}
}
```
## Coincidencia de patrones
* Los patrones glob usan los comodines `**`, `*` y `?`
* Las rutas relativas se limitan al espacio de trabajo actual
* Las rutas absolutas pueden apuntar a archivos fuera del proyecto
* Las reglas de denegación tienen prioridad sobre las reglas de permiso
# Comandos de barra
Source: https://docs.cursor.com/es/cli/reference/slash-commands
Acciones rápidas disponibles en sesiones de Cursor CLI
| Command | Description |
| --------------------- | ---------------------------------------------------------------------- |
| `/model ` | Configura o muestra los modelos |
| `/auto-run [state]` | Activa/desactiva auto-run (por defecto) o establece \[on\|off\|status] |
| `/new-chat` | Inicia una nueva sesión de chat |
| `/vim` | Activa/desactiva teclas de Vim |
| `/help [command]` | Muestra ayuda (/help \[cmd]) |
| `/feedback ` | Comparte feedback con el equipo |
| `/resume ` | Reanuda un chat anterior por nombre de carpeta |
| `/copy-req-id` | Copia el último ID de la solicitud |
| `/logout` | Cierra sesión en Cursor |
| `/quit` | Salir |
Los comandos se ejecutan en tu shell de inicio de sesión (`$SHELL`) con el directorio de trabajo y el entorno del CLI. Encadena comandos para ejecutarlos en otros directorios:
```bash theme={null}
cd subdir && npm test
```
## Salida
Salida del comando que muestra un encabezado con el código de salida, la visualización de stdout/stderr y controles de truncado
Las salidas extensas se truncan automáticamente y los procesos de larga ejecución expiran por tiempo de espera para mantener el rendimiento.
## Limitaciones
* Los comandos se agotan después de 30 segundos
* No se admiten procesos de larga ejecución, servidores ni prompts interactivos
* Usa comandos cortos y no interactivos para obtener mejores resultados
## Permisos
Los comandos se comprueban contra tus permisos y la configuración del equipo antes de ejecutarse. Consulta [Permisos](/es/cli/reference/permissions) para ver la configuración detallada.
Banner de decisión con opciones de aprobación: Ejecutar, Rechazar/Proponer, Añadir a la allowlist y Autoejecutar
Las políticas de administrador pueden bloquear ciertos comandos, y los comandos con redirección no pueden añadirse a la allowlist en línea.
## Guías de uso
Shell Mode funciona bien para verificar estados, hacer compilaciones rápidas, operar con archivos e inspeccionar el entorno.
Evita servidores de larga ejecución, aplicaciones interactivas y comandos que requieran entrada.
Cada comando se ejecuta de forma independiente; usa `cd && ...` para ejecutar comandos en otros directorios.
## Solución de problemas
* Si un comando se queda colgado, cancélalo con Ctrl+C y agrega flags no interactivos
* Cuando se te pidan permisos, apruébalos una vez o añade a la allowlist con Tab
* Si la salida se trunca, usa Ctrl+O para expandirla
* Para ejecutar en diferentes directorios, usa `cd && ...` ya que los cambios no persisten
* El modo Shell es compatible con zsh y bash según tu variable `$SHELL`
## Preguntas frecuentes
No. Cada comando se ejecuta de forma independiente. Usa `cd && ...` para ejecutar comandos en diferentes directorios.
No. Los comandos están limitados a 30 segundos y no es configurable.
Los permisos se gestionan desde la CLI y la configuración del equipo. Usa el banner de decisiones para agregar comandos a la allowlist.
Presiona Escape cuando el campo de entrada esté vacío, Backspace/Delete con la entrada vacía, o Ctrl+C para limpiar y salir.
# Usar Agent en la CLI
Source: https://docs.cursor.com/es/cli/using
Solicita, revisa e itera de forma efectiva con Cursor CLI
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Prompting
Se recomienda declarar la intención con claridad para obtener los mejores resultados. Por ejemplo, podés usar el prompt "do not write any code" para asegurarte de que el agente no modifique ningún archivo. Esto suele ser útil al planificar tareas antes de implementarlas.
El agente actualmente cuenta con herramientas para operaciones con archivos, búsqueda y ejecución de comandos de shell. Se están incorporando más herramientas, similares a las del agente del IDE.
## MCP
Agent es compatible con [MCP (Model Context Protocol)](/es/tools/mcp) para ampliar funcionalidades e integraciones. La CLI detecta automáticamente y respeta tu archivo de configuración `mcp.json`, habilitando los mismos servidores y herramientas MCP que configuraste para el IDE.
## Reglas
El agente de la CLI admite el mismo [sistema de reglas](/es/context/rules) que el IDE. Puedes crear reglas en el directorio `.cursor/rules` para darle contexto y guía al agente. Estas reglas se cargarán y aplicarán automáticamente según su configuración, lo que te permite personalizar el comportamiento del agente para distintas partes de tu proyecto o tipos de archivo específicos.
La CLI también lee `AGENTS.md` y `CLAUDE.md` en la raíz del proyecto (si están presentes) y los aplica como reglas junto con `.cursor/rules`.
## Trabajar con Agent
### Navegación
Podés acceder a mensajes anteriores con la flecha arriba (ArrowUp) y recorrerlos.
### Revisión
Revisá los cambios con Cmd+R. Presioná i para agregar instrucciones de seguimiento. Usá ArrowUp/ArrowDown para desplazarte y ArrowLeft/ArrowRight para cambiar de archivo.
### Seleccionar contexto
Seleccioná archivos y carpetas para incluir en el contexto con @. Liberá espacio en la ventana de contexto ejecutando `/compress`. Consultá [Resumen](/es/agent/chat/summarization) para más detalles.
## Historial
Continúa un hilo existente con `--resume [thread id]` para cargar el contexto previo.
Para reanudar la conversación más reciente, usa `cursor-agent resume`.
También podés ejecutar `cursor-agent ls` para ver una lista de conversaciones anteriores.
## Aprobación de comandos
Antes de ejecutar comandos en la terminal, la CLI te pedirá que apruebes (y) o rechaces (n) la ejecución.
## Modo no interactivo
Usa `-p` o `--print` para ejecutar Agent en modo no interactivo. Esto imprimirá la respuesta en la consola.
Con el modo no interactivo, puedes invocar Agent de forma no interactiva. Esto te permite integrarlo en scripts, pipelines de CI, etc.
Puedes combinarlo con `--output-format` para controlar el formato de la salida. Por ejemplo, usa `--output-format json` para obtener una salida estructurada que sea más fácil de analizar en scripts, o `--output-format text` para una salida de texto plano.
Cursor tiene acceso de escritura completo en modo no interactivo.
# Atajos de teclado
Source: https://docs.cursor.com/es/configuration/kbd
Atajos de teclado y combinaciones de teclas en Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Descripción general de los atajos de teclado en Cursor. Mira todos los atajos de teclado presionando Cmd R y luego Cmd S, o abriendo la paleta de comandos con Cmd Shift P y buscando `Keyboard Shortcuts`.
Aprende más sobre los atajos de teclado en Cursor usando [Key Bindings for VS Code](https://code.visualstudio.com/docs/getstarted/keybindings) como referencia base para los keybindings de Cursor.
Todos los keybindings de Cursor, incluidas las funciones específicas de Cursor, se pueden reasignar en la configuración de Keyboard Shortcuts.
## General
| Atajo | Acción |
| ---------------------- | ------------------------------------------------------------------- |
| Cmd I | Mostrar/ocultar panel lateral (a menos que esté asociado a un modo) |
| Cmd L | Mostrar/ocultar panel lateral (a menos que esté asociado a un modo) |
| Cmd E | Panel de control del agente en segundo plano |
| Cmd . | Menú de modos |
| Cmd / | Alternar entre modelos de IA |
| Cmd Shift J | Ajustes de Cursor |
| Cmd , | Ajustes generales |
| Cmd Shift P | Paleta de comandos |
## Chat
Atajos para la caja de entrada del chat.
| Shortcut | Action |
| ---------------------------------------------------- | ---------------------------------------------------------- |
| Return | Nudge (predeterminado) |
| Ctrl Return | Poner el mensaje en cola |
| Cmd Return when typing | Forzar envío del mensaje |
| Cmd Shift Backspace | Cancelar la generación |
| Cmd Shift L with code selected | Agregar el código seleccionado como contexto |
| Cmd V with code or log in clipboard | Agregar el contenido del portapapeles como contexto |
| Cmd Shift V with code or log in clipboard | Agregar el contenido del portapapeles a la caja de entrada |
| Cmd Return with suggested changes | Aceptar todos los cambios |
| Cmd Backspace | Rechazar todos los cambios |
| Tab | Pasar al siguiente mensaje |
| Shift Tab | Volver al mensaje anterior |
| Cmd Opt / | Alternar modelo |
| Cmd N / Cmd R | Nuevo chat |
| Cmd T | Nueva pestaña de chat |
| Cmd \[ | Chat anterior |
| Cmd ] | Siguiente chat |
| Cmd W | Cerrar chat |
| Escape | Quitar el foco del campo |
## Edición inline
| Atajo | Acción |
| ------------------------------ | -------------------------- |
| Cmd K | Abrir |
| Cmd Shift K | Alternar el foco del campo |
| Return | Enviar |
| Cmd Shift Backspace | Cancelar |
| Opt Return | Hacer una pregunta rápida |
## Selección de código y contexto
| Atajo | Acción |
| ----------------------------------------------------- | -------------------------------------------------- |
| @ | [símbolos @](/es/context/@-symbols/) |
| # | Archivos |
| / | Comandos rápidos |
| Cmd Shift L | Agregar selección al chat |
| Cmd Shift K | Agregar selección a Edit |
| Cmd L | Agregar selección a un chat nuevo |
| Cmd M | Alternar estrategias de lectura de archivos |
| Cmd → | Aceptar la siguiente palabra de la sugerencia |
| Cmd Return | Buscar en la base de código dentro del chat |
| Select code, Cmd C, Cmd V | Agregar código de referencia copiado como contexto |
| Select code, Cmd C, Cmd Shift V | Agregar código copiado como contexto de texto |
| Shortcut | Acción |
| --------------------- | ---------------------------------------- |
| Cmd K | Abrir la barra de solicitud del terminal |
| Cmd Return | Ejecutar el comando generado |
| Escape | Aceptar el comando |
# Comandos de shell
Source: https://docs.cursor.com/es/configuration/shell
Instala y usa los comandos de shell de Cursor
Cursor ofrece herramientas de línea de comandos para abrir archivos y carpetas desde tu terminal. Instala los comandos `cursor` y `code` para integrar Cursor en tu flujo de trabajo de desarrollo.
## Instalación de los comandos de la CLI
Instala los comandos de la CLI desde la Command Palette:
1. Abre la Command Palette (Cmd/Ctrl + P)
2. Escribe "Install" para filtrar los comandos de instalación
3. Selecciona y ejecuta `Install 'cursor' to shell`
4. Repite y selecciona `Install 'code' to shell`
Command Palette mostrando opciones de instalación de la CLI
## Uso de los comandos de la CLI
Después de la instalación, usa cualquiera de estos comandos para abrir archivos o carpetas en Cursor:
```bash theme={null}
# Usar el comando cursor
cursor ruta/al/archivo.js
cursor ruta/a/la/carpeta/
# Usar el comando code (compatible con VS Code)
code ruta/al/archivo.js
code ruta/a/la/carpeta/
```
## Opciones de comandos
Ambos comandos admiten estas opciones:
* Abrir un archivo: `cursor file.js`
* Abrir una carpeta: `cursor ./my-project`
* Abrir varios elementos: `cursor file1.js file2.js folder1/`
* Abrir en una nueva ventana: `cursor -n` o `cursor --new-window`
* Esperar a que se cierre la ventana: `cursor -w` o `cursor --wait`
## Preguntas frecuentes
Son idénticos. El comando `code` se incluye por compatibilidad con VS Code.
No. Instala uno o ambos, según prefieras.
Los comandos se añaden al archivo de configuración de la shell predeterminada de tu sistema (p. ej., `.bashrc`, `.zshrc` o `.config/fish/config.fish`).
# Temas
Source: https://docs.cursor.com/es/configuration/themes
Personaliza la apariencia de Cursor
Cursor admite temas claros y oscuros para tu entorno de desarrollo. Cursor hereda las capacidades de tematización de VS Code: usa cualquier tema de VS Code, crea temas personalizados e instala extensiones de temas desde el marketplace.
## Cambiar el tema
1. Abre la Paleta de comandos (Cmd/Ctrl + P)
2. Escribe "theme" para filtrar los comandos
3. Selecciona "Preferences: Color Theme"
4. Elige un tema
## Preguntas frecuentes
¡Sí! Cursor es compatible con los temas de VS Code. Instala cualquier tema del Marketplace de VS Code o copia tus archivos de temas personalizados.
Crea temas personalizados igual que en VS Code. Usa "Developer: Generate Color Theme From Current Settings" para partir de tu configuración actual, o sigue la guía de creación de temas de VS Code.
# @Code
Source: https://docs.cursor.com/es/context/@-symbols/@-code
Haz referencia a fragmentos de código específicos en Cursor usando @Code
Haz referencia a secciones específicas de código usando el símbolo `@Code`. Esto te da un control más granular que [`@Files & Folders`](/es/context/@-symbols/@-files-and-folders), permitiéndote seleccionar fragmentos de código precisos en lugar de archivos completos.
# @Cursor Rules
Source: https://docs.cursor.com/es/context/@-symbols/@-cursor-rules
Aplica reglas y pautas específicas del proyecto
El símbolo `@Cursor Rules` te da acceso a las [reglas del proyecto](/es/context/rules) y a las pautas que configuraste, para que puedas aplicarlas explícitamente a tu contexto.
# @Files & Folders
Source: https://docs.cursor.com/es/context/@-symbols/@-files-and-folders
Referencia archivos y carpetas como contexto en Chat y Inline Edit
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Archivos
Hace referencia a archivos completos en Chat e Inline Edit seleccionando `@Files & Folders` y luego el nombre del archivo para buscarlos. También podés arrastrar archivos desde la barra lateral directamente a Agent para agregarlos como contexto.
## Carpetas
Al hacer referencia a carpetas con `@Folders`, Cursor proporciona la ruta de la carpeta y un resumen de su contenido para ayudar a la IA a entender qué hay disponible.
Después de seleccionar una carpeta, escribe “/” para navegar a niveles más profundos y ver todas las subcarpetas.
### Contenido completo de la carpeta
Activa **Contenido completo de la carpeta** en la configuración. Cuando está activado, Cursor intenta incluir todos los archivos de la carpeta en el contexto.
Para carpetas grandes que exceden la ventana de contexto, aparece una vista de esquema con un tooltip que muestra cuántos archivos se incluyeron mientras Cursor gestiona el espacio de contexto disponible.
Usar contenido completo de carpeta con el [modo Max activado](/es/context/max-mode)
aumenta significativamente los costos de la solicitud, ya que se consumen más tokens de entrada.
## Gestión del contexto
Los archivos y carpetas grandes se condensan automáticamente para ajustarse a los límites de contexto. Consulta [condensación de archivos y carpetas](/es/agent/chats/summarization#file--folder-condensation) para más detalles.
# @Git
Source: https://docs.cursor.com/es/context/@-symbols/@-git
Consulta cambios de Git y diferencias entre ramas
* `@Commit`: Consulta los cambios del estado de trabajo actual respecto al último commit. Muestra todos los archivos modificados, agregados y eliminados que aún no se han confirmado.
* `@Branch`: Compara los cambios de tu rama actual con la rama main. Muestra todos los commits y cambios que están en tu rama pero no en main.
# @Link
Source: https://docs.cursor.com/es/context/@-symbols/@-link
Incluye contenido web pegando URLs
Cuando pegas una URL en Chat, Cursor la etiqueta automáticamente como `@Link` y obtiene el contenido para usarlo como contexto. Esto incluye compatibilidad con documentos PDF: Cursor extrae y analiza el texto de cualquier URL de PDF de acceso público.
## Desvincular
Para usar una URL como texto sin formato sin recuperar su contenido:
* Haz clic en el enlace con etiqueta y selecciona `Desvincular`
* O pega mientras mantienes presionado `Shift` para evitar el etiquetado automático
# @Linter Errors
Source: https://docs.cursor.com/es/context/@-symbols/@-linter-errors
Accede y consulta errores de linting en tu codebase
El símbolo `@Linter Errors` captura automáticamente y aporta contexto sobre errores y advertencias de linting del archivo activo. [Agent](/es/agent/overview) puede ver errores de lint por defecto.
Para que se vean los errores del linter, necesitas tener instalado y
configurado el language server adecuado para tu lenguaje de programación.
Cursor detecta y usa automáticamente los language servers instalados, pero
puede que necesites instalar extensiones o herramientas adicionales para
lenguajes específicos.
# @Past Chats
Source: https://docs.cursor.com/es/context/@-symbols/@-past-chats
Incluye chats del historial en versión resumida
When working on complex tasks in [Chat](/es/chat), you might need to reference context or decisions from previous conversations. The `@Past Chats` symbol includes summarized versions of previous chats as context.
Particularly useful when:
* You have a long Chat session with important context to reference
* You're starting a new related task and want continuity
* You want to share reasoning or decisions from a previous session
# @Recent Changes
Source: https://docs.cursor.com/es/context/@-symbols/@-recent-changes
Incluye código modificado recientemente como contexto
El símbolo `@Recent Changes` incluye cambios de código recientes como contexto en conversaciones con la IA.
* Los cambios se ordenan cronológicamente
* Da prioridad a los últimos 10 cambios
* Respeta la configuración de `.cursorignore`
# @Web
Source: https://docs.cursor.com/es/context/@-symbols/@-web
Buscar en la web información actualizada
Con `@Web`, Cursor busca en la web usando [exa.ai](https://exa.ai) para encontrar información al día y añadirla como contexto. También puede extraer contenido de archivos PDF a partir de enlaces directos.
La búsqueda en la web está deshabilitada de forma predeterminada. Actívala en Settings → Features → Web Search.
# Descripción general
Source: https://docs.cursor.com/es/context/@-symbols/overview
Referencia código, archivos y documentación usando símbolos @
Navega las sugerencias con las teclas de flecha. Pulsa `Enter` para seleccionar. Si la sugerencia es una categoría como `Files`, las sugerencias se filtrarán para mostrar los elementos más relevantes dentro de esa categoría.
Esta es la lista de todos los símbolos @ disponibles:
* [@Files](/es/context/@-symbols/@-files) - Hace referencia a archivos específicos de tu proyecto
* [@Folders](/es/context/@-symbols/@-folders) - Hace referencia a carpetas completas para aportar más contexto
* [@Code](/es/context/@-symbols/@-code) - Hace referencia a fragmentos de código o símbolos específicos de tu codebase
* [@Docs](/es/context/@-symbols/@-docs) - Accede a documentación y guías
* [@Git](/es/context/@-symbols/@-git) - Accede al historial y a los cambios de Git
* [@Past Chats](/es/context/@-symbols/@-past-chats) - Trabaja con sesiones del compositor resumidas
* [@Cursor Rules](/es/context/@-symbols/@-cursor-rules) - Trabaja con las reglas de Cursor
* [@Web](/es/context/@-symbols/@-web) - Hace referencia a recursos web externos y documentación
* [@Link (paste)](/es/context/@-symbols/@-link) - Crea enlaces a código o documentación específicos
* [@Recent Changes](/es/context/@-symbols/@-recent-changes) - Crea enlaces a código o documentación específicos
* [@Lint Errors](/es/context/@-symbols/@-lint-errors) - Hace referencia a errores de lint (solo [Chat](/es/chat/overview))
* [@Definitions](/es/context/@-symbols/@-definitions) - Busca definiciones de símbolos (solo [Inline Edit](/es/inline-edit/overview))
* [# Files](/es/context/@-symbols/pill-files) - Agrega archivos al contexto sin referenciarlos
* [/ Commands](/es/context/@-symbols/slash-commands) - Agrega archivos abiertos y activos al contexto
# #Files
Source: https://docs.cursor.com/es/context/@-symbols/pill-files
Selecciona archivos específicos usando el prefijo #
Usa `#` seguido del nombre de un archivo para centrarte en archivos específicos. Combínalo con `@` para un control de contexto más preciso.
# /command
Source: https://docs.cursor.com/es/context/@-symbols/slash-commands
Comandos rápidos para agregar archivos y controlar el contexto
El comando `/` te da acceso rápido a las pestañas abiertas del editor y te permite agregar varios archivos como contexto.
## Comandos
* **`/Reset Context`**: Restablece el contexto al estado predeterminado
* **`/Generate Cursor Rules`**: Genera reglas para que Cursor las siga
* **`/Disable Iterate on Lints`**: No intentará corregir errores y advertencias del linter
* **`/Add Open Files to Context`**: Incluye todas las pestañas del editor que están abiertas actualmente
* **`/Add Active Files to Context`**: Incluye todas las pestañas del editor actualmente visibles (útil con vistas divididas)
# Indexación del codebase
Source: https://docs.cursor.com/es/context/codebase-indexing
Cómo Cursor aprende tu codebase para entenderla mejor
Cursor indexa tu codebase calculando embeddings para cada archivo. Esto mejora las respuestas generadas por IA sobre tu código. Cuando abres un proyecto, Cursor empieza a indexar automáticamente. Los archivos nuevos se indexan de forma incremental.
Revisa el estado de la indexación en: `Cursor Settings` > `Indexing & Docs`
## Configuración
Cursor indexa todos los archivos excepto los que estén en [archivos de ignorados](/es/context/ignore-files) (p. ej., `.gitignore`, `.cursorignore`).
Haz clic en `Show Settings` para:
* Habilitar la indexación automática para repositorios nuevos
* Configurar qué archivos ignorar
[Ignorar archivos de contenido grandes](/es/context/ignore-files) mejora la
precisión de las respuestas.
### Ver archivos indexados
Para ver las rutas de los archivos indexados: `Cursor Settings` > `Indexing & Docs` > `View included files`
Esto abre un archivo `.txt` con el listado de todos los archivos indexados.
## Espacios de trabajo de múltiples raíces
Cursor admite [espacios de trabajo de múltiples raíces](https://code.visualstudio.com/docs/editor/workspaces#_multiroot-workspaces), lo que te permite trabajar con varias bases de código:
* Todas las bases de código se indexan automáticamente
* El contexto de cada base de código está disponible para la IA
* `.cursor/rules` funciona en todas las carpetas
## Búsqueda de PR
La búsqueda de PR te ayuda a entender la evolución de tu base de código al hacer que los cambios históricos sean consultables y accesibles con IA.
### Cómo funciona
Cursor **indexa automáticamente todos los PR mergeados** del historial de tu repositorio. Los resúmenes aparecen en los resultados de búsqueda semántica, con filtrado inteligente para priorizar los cambios recientes.
Agent puede **traer PR, commits, issues o ramas** al contexto usando `@[PR number]`, `@[commit hash]` o `@[branch name]`. Incluye comentarios de GitHub y revisiones de Bugbot cuando está conectado.
**Compatibilidad de la plataforma**: GitHub, GitHub Enterprise y Bitbucket. GitLab no está actualmente disponible.
Usuarios de GitHub Enterprise: La herramienta de fetch recurre a comandos de git debido a
limitaciones de autenticación de VSCode.
### Uso de la búsqueda de PR
Haz preguntas como "¿Cómo se implementan los servicios en otros PR?" y Agent traerá automáticamente PR relevantes al contexto para ofrecer respuestas completas basadas en el historial de tu repositorio.
## Preguntas frecuentes
Aún no existe una lista global. Revisa cada proyecto por separado abriéndolo en
Cursor y consultando la configuración de Codebase Indexing.
Elimina tu cuenta de Cursor desde Settings para borrar todas las bases de código indexadas.
Si no, elimina las bases de código individualmente desde la configuración de Codebase Indexing
de cada proyecto.
Las bases de código indexadas se eliminan tras 6 semanas de inactividad. Al reabrir el
proyecto, se vuelve a indexar.
No. Cursor crea embeddings sin almacenar nombres de archivo ni código fuente. Los nombres de archivo se ofuscan y los fragmentos de código se cifran.
Cuando Agent busca en la base de código, Cursor recupera los embeddings del servidor y descifra los fragmentos.
# Ignorar archivos
Source: https://docs.cursor.com/es/context/ignore-files
Control del acceso a archivos con .cursorignore y .cursorindexingignore
## Descripción general
Cursor lee e indexa el código de tu proyecto para habilitar sus funciones. Controla a qué directorios y archivos puede acceder Cursor usando un archivo `.cursorignore` en tu directorio raíz.
Cursor bloquea el acceso a los archivos listados en `.cursorignore` para:
* Indexación del código base
* Código accesible por [Tab](/es/tab/overview), [Agent](/es/agent/overview) y [Inline Edit](/es/inline-edit/overview)
* Código accesible mediante [referencias con el símbolo @](/es/context/@-symbols/overview)
Las llamadas a herramientas iniciadas por Agent, como la terminal y los servidores MCP, no pueden bloquear
el acceso al código gobernado por `.cursorignore`
## ¿Por qué ignorar archivos?
**Seguridad**: Restringe el acceso a claves de API, credenciales y secretos. Aunque Cursor bloquea los archivos ignorados, no se puede garantizar una protección total debido a la imprevisibilidad de los LLM.
**Rendimiento**: En bases de código grandes o monorepos, excluye partes irrelevantes para un indexado más rápido y una detección de archivos más precisa.
## Archivos globales de ignore
Configura patrones de ignore para todos los proyectos en la configuración de usuario y así excluir archivos sensibles sin tener que configurar cada proyecto por separado.
Los patrones predeterminados incluyen:
* Archivos de entorno: `**/.env`, `**/.env.*`
* Credenciales: `**/credentials.json`, `**/secrets.json`
* Claves: `**/*.key`, `**/*.pem`, `**/id_rsa`
## Configurar `.cursorignore`
Crea un archivo `.cursorignore` en tu directorio raíz usando la sintaxis de `.gitignore`.
### Ejemplos de patrones
```sh theme={null}
config.json # Archivo específico
dist/ # Directorio
*.log # Extensión de archivo
**/logs # Directorios anidados
!app/ # Quitar de la lista de ignorados (negación)
```
### Ignorar jerárquico
Activa `Cursor Settings` > `Features` > `Editor` > `Hierarchical Cursor Ignore` para buscar en los directorios superiores archivos `.cursorignore`.
**Notas**: Los comentarios empiezan con `#`. Los patrones posteriores reemplazan a los anteriores. Los patrones son relativos a la ubicación del archivo.
## Limita la indexación con `.cursorindexingignore`
Usa `.cursorindexingignore` para excluir archivos únicamente de la indexación. Estos archivos siguen estando disponibles para las funciones de IA, pero no aparecerán en las búsquedas del código.
## Archivos ignorados de forma predeterminada
Cursor ignora automáticamente los archivos de `.gitignore` y la lista de ignorados predeterminada de abajo. Podés anular esto con el prefijo `!` en `.cursorignore`.
Solo para indexación, estos archivos se ignoran además de los que estén en tu `.gitignore`, `.cursorignore` y `.cursorindexingignore`:
```sh theme={null}
package-lock.json
pnpm-lock.yaml
yarn.lock
composer.lock
Gemfile.lock
bun.lockb
.env*
.git/
.svn/
.hg/
*.lock
*.bak
*.tmp
*.bin
*.exe
*.dll
*.so
*.lockb
*.qwoff
*.isl
*.csv
*.pdf
*.doc
*.doc
*.xls
*.xlsx
*.ppt
*.pptx
*.odt
*.ods
*.odp
*.odg
*.odf
*.sxw
*.sxc
*.sxi
*.sxd
*.sdc
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tif
*.mp3
*.wav
*.wma
*.ogg
*.flac
*.aac
*.mp4
*.mov
*.wmv
*.flv
*.avi
*.zip
*.tar
*.gz
*.7z
*.rar
*.tgz
*.dmg
*.iso
*.cue
*.mdf
*.mds
*.vcd
*.toast
*.img
*.apk
*.msi
*.cab
*.tar.gz
*.tar.xz
*.tar.bz2
*.tar.lzma
*.tar.Z
*.tar.sz
*.lzma
*.ttf
*.otf
*.pak
*.woff
*.woff2
*.eot
*.webp
*.vsix
*.rmeta
*.rlib
*.parquet
*.svg
.egg-info/
.venv/
node_modules/
__pycache__/
.next/
.nuxt/
.cache/
.sass-cache/
.gradle/
.DS_Store/
.ipynb_checkpoints/
.pytest_cache/
.mypy_cache/
.tox/
.git/
.hg/
.svn/
.bzr/
.lock-wscript/
.Python/
.jupyter/
.history/
.yarn/
.yarn-cache/
.eslintcache/
.parcel-cache/
.cache-loader/
.nyc_output/
.node_repl_history/
.pnp.js/
.pnp/
```
### Limitaciones de los patrones de negación
Al usar patrones de negación (con el prefijo `!`), no podés volver a incluir un archivo si un directorio padre está excluido mediante `*`.
```sh theme={null}
# Ignora todos los archivos en la carpeta public
public/*
# ✅ Esto funciona, porque el archivo existe en el nivel superior
!public/index.html
# ❌ Esto no funciona: no se pueden volver a incluir archivos de directorios anidados
!public/assets/style.css
```
**Alternativa**: Excluí explícitamente los directorios anidados:
```sh theme={null}
public/assets/*
!public/assets/style.css # Este archivo ahora es accesible
```
Por rendimiento, no se recorren los directorios excluidos, así que los patrones sobre archivos dentro de ellos no surten efecto.
Esto coincide con la implementación de .gitignore para patrones de negación en directorios anidados. Para más detalles, consulta la [documentación oficial de Git sobre los patrones de gitignore](https://git-scm.com/docs/gitignore).
[Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) permite que Cursor se conecte con herramientas externas y fuentes de datos.
### ¿Por qué usar MCP?
MCP conecta Cursor con sistemas y datos externos. En lugar de explicar la estructura de tu proyecto una y otra vez, intégrate directamente con tus herramientas.
Escribe servidores MCP en cualquier lenguaje que pueda imprimir en `stdout` o exponer un endpoint HTTP: Python, JavaScript, Go, etc.
### Cómo funciona
Los servidores MCP exponen capacidades a través del protocolo, conectando Cursor con herramientas externas y fuentes de datos.
Cursor admite tres métodos de transporte:
| Transporte | Entorno de ejecución | Implementación | Usuarios | Entrada | Autenticación |
| :--------------------------------------------------------------- | :------------------- | :------------------------ | :-------------- | :--------------------- | :------------ |
| **`stdio`** | Local | Gestionado por Cursor | Un solo usuario | Comando de shell | Manual |
| **`SSE`** | Local/Remoto | Implementar como servidor | Varios usuarios | URL a un endpoint SSE | OAuth |
| **`Streamable HTTP`** | Local/Remoto | Implementar como servidor | Varios usuarios | URL a un endpoint HTTP | OAuth |
### Compatibilidad con el protocolo
Cursor admite estas capacidades del protocolo MCP:
| Función | Compatibilidad | Descripción |
| :-------------- | :------------- | :------------------------------------------------------------------------------------------------------- |
| **Tools** | Compatible | Funciones que el modelo de IA puede ejecutar |
| **Prompts** | Compatible | Mensajes y flujos de trabajo con plantillas para usuaries |
| **Resources** | Compatible | Fuentes de datos estructuradas que se pueden leer y consultar |
| **Roots** | Compatible | Consultas iniciadas por el servidor sobre los límites de URI o del sistema de archivos en los que operar |
| **Elicitation** | Compatible | Solicitudes iniciadas por el servidor para obtener información adicional de les usuaries |
## Instalación de servidores MCP
### Instalación con un clic
Instala servidores MCP de nuestra colección y autentícate con OAuth.
Explora los servidores MCP disponibles
Crea un botón “Add to Cursor”
### Uso de `mcp.json`
Configura servidores MCP personalizados con un archivo JSON:
```json CLI Server - Node.js theme={null}
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "mcp-server"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json CLI Server - Python theme={null}
{
"mcpServers": {
"server-name": {
"command": "python",
"args": ["mcp-server.py"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json Remote Server theme={null}
// Servidor MCP vía HTTP o SSE: se ejecuta de forma remota
{
"mcpServers": {
"server-name": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}
```
### Configuración del servidor STDIO
Para servidores STDIO (servidores locales de línea de comandos), configura estos campos en tu `mcp.json`:
| Campo | Requerido | Descripción | Ejemplos |
| :---------- | :-------- | :----------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- |
| **type** | Sí | Tipo de conexión del servidor | `"stdio"` |
| **command** | Sí | Comando para iniciar el ejecutable del servidor. Debe estar disponible en la variable PATH de tu sistema o incluir su ruta completa. | `"npx"`, `"node"`, `"python"`, `"docker"` |
| **args** | No | Lista de argumentos pasados al comando | `["server.py", "--port", "3000"]` |
| **env** | No | Variables de entorno para el servidor | `{"API_KEY": "${input:api-key}"}` |
| **envFile** | No | Ruta a un archivo de entorno para cargar más variables | `".env"`, `"${workspaceFolder}/.env"` |
### Uso de la API de extensión
Para registrar servidores MCP de forma programática, Cursor ofrece una API de extensión que permite una configuración dinámica sin modificar archivos `mcp.json`. Esto es especialmente útil en entornos empresariales y en flujos de configuración automatizados.
Aprende a registrar servidores MCP de forma programática usando `vscode.cursor.mcp.registerServer()`
### Ubicaciones de configuración
Crea `.cursor/mcp.json` en tu proyecto para herramientas específicas del proyecto.
Crea `~/.cursor/mcp.json` en tu directorio personal para tener las herramientas disponibles en cualquier lugar.
### Interpolación de configuración
Usa variables en los valores de `mcp.json`. Cursor resuelve variables en estos campos: `command`, `args`, `env`, `url` y `headers`.
Sintaxis admitida:
* `${env:NAME}` variables de entorno
* `${userHome}` ruta a tu carpeta personal
* `${workspaceFolder}` raíz del proyecto (la carpeta que contiene `.cursor/mcp.json`)
* `${workspaceFolderBasename}` nombre de la carpeta raíz del proyecto
* `${pathSeparator}` y `${/}` separador de rutas del sistema operativo
Ejemplos
```json theme={null}
{
"mcpServers": {
"local-server": {
"command": "python",
"args": ["${workspaceFolder}/tools/mcp_server.py"],
"env": {
"API_KEY": "${env:API_KEY}"
}
}
}
}
```
```json theme={null}
{
"mcpServers": {
"remote-server": {
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${env:MY_SERVICE_TOKEN}"
}
}
}
}
```
### Autenticación
Los servidores MCP usan variables de entorno para la autenticación. Pasa las claves de API y los tokens a través de la configuración.
Cursor admite OAuth para los servidores que lo requieran.
## Usar MCP en el chat
El Composer Agent utiliza automáticamente las herramientas MCP que aparecen en `Available Tools` cuando corresponde. Pide una herramienta específica por su nombre o describe lo que necesitas. Activa o desactiva herramientas desde Settings.
### Activar o desactivar herramientas
Activa o desactiva herramientas MCP directamente desde la interfaz del chat. Haz clic en el nombre de una herramienta en la lista para activarla o desactivarla. Las herramientas desactivadas no se cargarán en el contexto ni estarán disponibles para Agent.
### Aprobación de herramientas
De forma predeterminada, el agente solicita aprobación antes de usar herramientas MCP. Haz clic en la flecha junto al nombre de la herramienta para ver los argumentos.
#### Auto-run
Activa Auto-run para que Agent use las herramientas MCP sin pedir confirmación. Funciona como comandos de terminal. Lee más sobre la configuración de Auto-run [aquí](/es/agent/tools#auto-run).
### Respuesta de la herramienta
Cursor muestra la respuesta en el chat con vistas desplegables de los argumentos y las respuestas:
### Imágenes como contexto
Los servidores MCP pueden devolver imágenes —capturas de pantalla, diagramas, etc.—. Devuélvelas como cadenas codificadas en base64:
```js theme={null}
const RED_CIRCLE_BASE64 = "/9j/4AAQSkZJRgABAgEASABIAAD/2w...";
// ^ base64 completo omitido para mejorar la legibilidad
server.tool("generate_image", async (params) => {
return {
content: [
{
type: "image",
data: RED_CIRCLE_BASE64,
mimeType: "image/jpeg",
},
],
};
});
```
Consulta este [servidor de ejemplo](https://github.com/msfeldstein/mcp-test-servers/blob/main/src/image-server.js) para ver los detalles de implementación. Cursor adjunta las imágenes devueltas al chat. Si el modelo admite imágenes, las analiza.
## Consideraciones de seguridad
Al instalar servidores MCP, ten en cuenta estas prácticas de seguridad:
* **Verifica el origen**: Instala servidores MCP solo de desarrolladores y repositorios de confianza
* **Revisa los permisos**: Comprueba a qué datos y APIs tendrá acceso el servidor
* **Limita las claves de API**: Usa claves de API restringidas con los permisos mínimos necesarios
* **Audita el código**: Para integraciones críticas, revisa el código fuente del servidor
Recuerda que los servidores MCP pueden acceder a servicios externos y ejecutar código en tu nombre. Asegúrate de entender qué hace un servidor antes de instalarlo.
## Ejemplos del mundo real
Para ver ejemplos prácticos de MCP en acción, consulta nuestra [guía de desarrollo web](/es/guides/tutorials/web-development), donde mostramos cómo integrar Linear, Figma y herramientas del navegador en tu flujo de trabajo de desarrollo.
## Preguntas frecuentes
Los servidores MCP conectan Cursor con herramientas externas como Google Drive, Notion y
otros servicios para incorporar documentos y requisitos a tu flujo de trabajo de código.
{" "}
Revisa los logs de MCP así: 1. Abre el panel Output en Cursor (Cmd+Shift+U) 2. Selecciona "MCP Logs" en el menú desplegable 3. Busca errores de conexión, problemas de autenticación o caídas del servidor. Los logs muestran la inicialización del servidor, llamadas a herramientas y mensajes de error.
{" "}
¡Sí! Activa o desactiva servidores sin quitarlos: 1. Abre Settings (Cmd+Shift+J) 2. Ve a Features → Model Context Protocol 3. Haz clic en el interruptor junto a cualquier servidor para habilitar o deshabilitar. Los servidores deshabilitados no se cargan ni aparecen en el chat. Esto es útil para depurar o reducir el ruido de herramientas.
{" "}
Si un servidor MCP falla: - Cursor muestra un mensaje de error en el chat - La llamada a la herramienta se marca como fallida - Puedes reintentar la operación o revisar los logs para ver detalles - Otros servidores MCP siguen funcionando con normalidad. Cursor aísla las fallas de servidores para evitar que uno afecte a los demás.
{" "}
Para servidores basados en npm: 1. Quita el servidor desde Settings 2. Limpia la caché de npm: `npm cache clean --force` 3. Vuelve a agregar el servidor para obtener la versión más reciente. Para servidores personalizados, actualiza tus archivos locales y reinicia Cursor.
Sí, pero sigue las mejores prácticas de seguridad: - Usa variables de entorno para secretos; nunca los hardcodees - Ejecuta servidores sensibles localmente con transporte `stdio` - Limita los permisos de las API keys al mínimo necesario - Revisa el código del servidor antes de conectarlo a sistemas sensibles - Considera ejecutar los servidores en entornos aislados
# Memories
Source: https://docs.cursor.com/es/context/memories
Las Memories son reglas generadas automáticamente a partir de tus conversaciones en Chat. Estas Memories se limitan a tu proyecto y mantienen el contexto entre sesiones.
## Cómo se crean los recuerdos
1. **Observación con sidecar**: Cursor usa un enfoque de sidecar en el que otro modelo observa tus conversaciones y extrae automáticamente recuerdos relevantes. Esto ocurre de forma pasiva en segundo plano mientras trabajas. Los recuerdos generados en segundo plano requieren tu aprobación antes de guardarse, lo que garantiza confianza y control sobre lo que se recuerda.
2. **Llamadas a herramientas**: Agent puede crear recuerdos directamente mediante llamadas a herramientas cuando le pides explícitamente que recuerde algo o cuando detecta información importante que debería conservarse para sesiones futuras.
## Administrar memorias
Podés administrar las memorias desde Cursor Settings → Rules.
# Reglas
Source: https://docs.cursor.com/es/context/rules
Controla cómo se comporta el modelo Agent con instrucciones reutilizables y con alcance.
Las reglas proporcionan instrucciones a nivel de sistema para Agent e Inline Edit. Pensalas como contexto, preferencias o flujos de trabajo persistentes para tus proyectos.
Cursor admite cuatro tipos de reglas:
Almacenadas en `.cursor/rules`, con control de versiones y aplicadas al alcance de tu base de código.
Globales para tu entorno de Cursor. Definidas en la configuración y siempre aplicadas.
Instrucciones para Agent en formato Markdown. Alternativa simple a `.cursor/rules`.
Aún compatibles, pero obsoletas. Usá Project Rules en su lugar.
## Cómo funcionan las reglas
Los modelos de lenguaje grandes no retienen memoria entre completions. Las reglas proporcionan contexto persistente y reutilizable a nivel de prompt.
Cuando se aplican, los contenidos de las reglas se incluyen al inicio del contexto del modelo. Esto le da a la IA una guía coherente para generar código, interpretar ediciones o ayudar con flujos de trabajo.
Las reglas se aplican a [Chat](/es/chat/overview) y a [Inline Edit](/es/inline-edit/overview). Las reglas activas se muestran en la barra lateral del agente.
## Reglas del proyecto
Las reglas del proyecto se encuentran en `.cursor/rules`. Cada regla es un archivo y está bajo control de versiones. Pueden limitarse mediante patrones de ruta, invocarse manualmente o incluirse según su relevancia. Los subdirectorios pueden incluir su propio directorio `.cursor/rules` con alcance limitado a esa carpeta.
Usa las reglas del proyecto para:
* Codificar conocimiento específico del dominio sobre tu base de código
* Automatizar flujos de trabajo o plantillas específicos del proyecto
* Estandarizar decisiones de estilo o de arquitectura
### Anatomía de una regla
Cada archivo de regla está escrito en **MDC** (`.mdc`), un formato que admite metadatos y contenido. Controla cómo se aplican las reglas desde el menú desplegable de tipo, que modifica las propiedades `description`, `globs`, `alwaysApply`.
| Rule Type | Description |
| :--------------------------------------------- | :-------------------------------------------------------------------------------- |
| `Always` | Siempre incluida en el contexto del modelo |
| `Auto Attached` | Incluida cuando se referencian archivos que coinciden con un patrón glob |
| `Agent Requested` | Disponible para la IA, que decide si incluirla. Debe proporcionar una descripción |
| `Manual` | Solo se incluye cuando se menciona explícitamente usando `@ruleName` |
```
---
description: Plantilla de servicio RPC
globs:
alwaysApply: false
---
- Usa nuestro patrón interno de RPC al definir servicios
- Usa siempre snake_case para los nombres de los servicios.
@service-template.ts
```
### Reglas anidadas
Organiza las reglas colocándolas en directorios `.cursor/rules` a lo largo de tu proyecto. Las reglas anidadas se aplican automáticamente cuando se hace referencia a archivos dentro de su directorio.
```
project/
.cursor/rules/ # Reglas para todo el proyecto
backend/
server/
.cursor/rules/ # Reglas específicas del backend
frontend/
.cursor/rules/ # Reglas específicas del frontend
```
### Crear una regla
Crea reglas con el comando `New Cursor Rule` o desde `Cursor Settings > Rules`. Esto crea un nuevo archivo de regla en `.cursor/rules`. Desde la configuración puedes ver todas las reglas y su estado.
### Generar reglas
Genera reglas directamente en las conversaciones usando el comando `/Generate Cursor Rules`. Útil cuando ya definiste el comportamiento del agente y quieres reutilizarlo.
## Mejores prácticas
Las buenas reglas son concretas, accionables y bien acotadas.
* Mantén las reglas por debajo de 500 líneas
* Divide las reglas grandes en varias reglas componibles
* Proporciona ejemplos concretos o archivos de referencia
* Evita las indicaciones vagas. Escribe las reglas como documentación interna clara
* Reutiliza reglas cuando repitas prompts en el chat
## Ejemplos
Esta regla define estándares para componentes de frontend:
Al trabajar en el directorio de components:
* Usa siempre Tailwind para estilos
* Usa Framer Motion para animaciones
* Sigue las convenciones de nomenclatura de componentes
Esta regla aplica validación para endpoints de API:
En el directorio de API:
* Usa zod para toda la validación
* Define los tipos de retorno con esquemas de zod
* Exporta los tipos generados a partir de los esquemas
Esta regla proporciona una plantilla para servicios de Express:
Usa esta plantilla al crear un servicio de Express:
* Sigue los principios RESTful
* Incluye middleware de manejo de errores
* Configura un logging adecuado
@express-service-template.ts
Esta regla define la estructura de los componentes de React:
Los componentes de React deben seguir este esquema:
* Interfaz de Props al inicio
* Componente como export nombrado
* Estilos al final
@component-template.tsx
Esta regla automatiza el análisis de la app:
Cuando te pidan analizar la app:
1. Ejecuta el servidor de desarrollo con `npm run dev`
2. Obtén los logs de la consola
3. Sugiere mejoras de rendimiento
Esta regla ayuda a generar documentación:
Ayuda a redactar documentación:
* Extrayendo comentarios del código
* Analizando README.md
* Generando documentación en Markdown
Primero crea una propiedad con toggle en `@reactiveStorageTypes.ts`.
Añade el valor por defecto en `INIT_APPLICATION_USER_PERSISTENT_STORAGE` en `@reactiveStorageService.tsx`.
Para funciones beta, agrega el toggle en `@settingsBetaTab.tsx`; de lo contrario, agrégalo en `@settingsGeneralTab.tsx`. Los toggles se pueden añadir como `` para checkboxes generales. Revisa el resto del archivo para ver ejemplos.
```
{
vsContext.reactiveStorageService.setApplicationUserPersistentStorage(
'myNewProperty',
newVal
);
}}
/>
```
Para usarlo en la app, importa reactiveStorageService y usa la propiedad:
```
const flagIsEnabled = vsContext.reactiveStorageService.applicationUserPersistentStorage.myNewProperty
```
Hay muchos ejemplos disponibles de proveedores y frameworks. Las reglas aportadas por la comunidad se encuentran en colecciones y repositorios colaborativos en línea.
## AGENTS.md
`AGENTS.md` es un archivo markdown simple para definir instrucciones de agentes. Ponlo en la raíz de tu proyecto como alternativa a `.cursor/rules` para casos de uso sencillos.
A diferencia de las Reglas del proyecto, `AGENTS.md` es un archivo markdown sin metadatos ni configuraciones complejas. Es perfecto para proyectos que necesitan instrucciones simples y fáciles de leer, sin la sobrecarga de reglas estructuradas.
```markdown theme={null}
# Instrucciones del proyecto
## Estilo de código
- Usa TypeScript para todos los archivos nuevos
- Prefiere componentes funcionales en React
- Usa snake_case para las columnas de la base de datos
## Arquitectura
- Sigue el patrón de repositorio
- Mantén la lógica de negocio en las capas de servicio
```
## Reglas de usuario
Las reglas de usuario son preferencias globales definidas en **Cursor Settings → Rules** que se aplican a todos los proyectos. Son texto plano y van perfectas para establecer tu estilo de comunicación preferido o tus convenciones de código:
```
Respondé de forma concisa. Evitá la repetición innecesaria o el lenguaje de relleno.
```
## `.cursorrules` (Legacy)
El archivo `.cursorrules` en la raíz de tu proyecto sigue siendo compatible, pero se va a deprecar. Te recomendamos migrar a Project Rules para tener más control, flexibilidad y visibilidad.
## Preguntas frecuentes
Revisa el tipo de regla. Para `Agent Requested`, asegúrate de que haya una descripción definida. Para `Auto Attached`, asegúrate de que el patrón de archivos coincida con los archivos referenciados.
{" "}
Sí. Usa `@filename.ts` para incluir archivos en el contexto de tu regla.
{" "}
Sí, genera reglas del proyecto desde el chat usando el comando `/Generate Cursor Rules`.
Si Memories está habilitado, las memorias se generan automáticamente.
No. Las reglas solo se aplican a Agent y a Inline Edit.
# Conceptos
Source: https://docs.cursor.com/es/get-started/concepts
Conoce las funciones clave que hacen que Cursor sea tan potente
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Autocompletado de código que predice modificaciones de varias líneas. Presiona Tab para aceptar
sugerencias basadas en tu código actual y en los cambios recientes.
Instrucciones personalizadas que definen el comportamiento de la IA. Configurá estándares de código,
preferencias de frameworks y convenciones específicas del proyecto.
Almacenamiento persistente del contexto del proyecto y de las decisiones tomadas en conversaciones anteriores. Se usa automáticamente como referencia en interacciones futuras.
Empezar es fácil:
1. Ve a [cursor.com](https://cursor.com) y haz clic en “Download”
2. Ejecuta el instalador cuando termine de descargarse
3. Abre Cursor cuando finalice la instalación
¿Necesitas una versión específica? Encuentra todas las plataformas y métodos de instalación en
[cursor.com/downloads](https://cursor.com/downloads)
## Configuración inicial
Cuando abras Cursor por primera vez, te vamos a guiar por una configuración rápida:
* Elegí atajos de teclado que te resulten familiares
* Elegí un tema que te guste
* Configurá tus preferencias del terminal
Podés volver al asistente de configuración en cualquier momento presionando Cmd Shift P{" "}
y buscando `Cursor: Start Onboarding`.
Leé más sobre [Atajos de teclado](/es/kbd), [Temas](/es/settings/themes) y [Comandos de shell](/es/settings/shell)
Ver atajos de teclado
Elegir un tema en Cursor
Instalar comandos de shell
## ¿Vienes de otro editor?
Si ya usas otro editor de código, te lo ponemos fácil para cambiarte:
Importa directamente la configuración de VS Code
Guías de migración para JetBrains, Eclipse, Neovim y Sublime
Pronto habrá más guías de migración.
## Compatibilidad con idiomas
Cursor funciona con todos los lenguajes de programación principales. Aquí van algunos populares con soporte de IA mejorado:
}
arrow
/>
}
arrow
/>
}
arrow
/>
}
arrow
/>
Podés agregar soporte para más lenguajes mediante extensiones, igual que en VS Code.
## Crear tu cuenta
Aunque Cursor funciona sin una cuenta, registrarte desbloquea todas las funciones de IA:
1. Se te pedirá que te registres durante la configuración, o puedes hacerlo después en Settings (Cmd Shift J)
2. Una vez que te registres, administra tu cuenta en [cursor.com/dashboard](https://cursor.com/dashboard)
## Cómo funciona la indexación del código
Cuando abres un proyecto, Cursor empieza a aprender sobre tu código. A esto se le llama “indexación” y es lo que hace que las sugerencias de la IA sean precisas.
* La indexación empieza automáticamente cuando abres un proyecto
* Tarda entre 1 y 15 minutos según el tamaño de tu proyecto
* Cuanto más aprende Cursor sobre tu código, más inteligentes se vuelven sus sugerencias
* Los equipos pueden compartir índices entre sí para ahorrar tiempo
* Puedes revisar el progreso de la indexación en Settings (Cmd Shift J) → Indexing & Docs
¿Quieres saber más? Consulta [cómo funciona la indexación](/es/context/codebase-indexing)
## Próximos pasos
Ahora que instalaste Cursor, ya estás listo para probar la programación con IA:
* Sigue nuestra [guía de inicio rápido](/es/get-started/quickstart) para aprender lo básico en 5 minutos
* Lee sobre [conceptos clave](/es/get-started/concepts) para entender cómo funciona Cursor
* [Explora las guías](/es/guides) para descubrir qué puedes crear con Cursor
* Si te topas con problemas, [pide ayuda](/es/troubleshooting/common-issues) en nuestra guía de solución de problemas
* [Únete a nuestra comunidad](https://cursor.com/community) para conectarte con otros usuarios de Cursor
# Guía rápida
Source: https://docs.cursor.com/es/get-started/quickstart
Comenzá con Cursor en 5 minutos
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Esta guía rápida te llevará por un proyecto usando las funciones principales de Cursor. Al final, ya estarás familiarizado con Tab, Inline Edit y Agent.
## Abre un proyecto en Cursor
Usa un proyecto existente o clona nuestro ejemplo:
1. Asegúrate de tener git instalado
2. Clona el proyecto de ejemplo:
```bash theme={null}
git clone git@github.com:voxelize/voxelize.git && \
cd voxelize && \
cursor .
```
1. Abre Cursor
2. Abre una carpeta de proyecto con Cmd O o `cursor `
Vamos a mostrarlo con el proyecto de ejemplo, pero puedes usar cualquier proyecto que tengas en local.
## Autocomplete con [Tab](/es/kbd#tab)
Tab es el modelo de autocompletado que entrenamos internamente. Es una gran forma de empezar con el código asistido por IA si no estás acostumbrado. Con Tab, podés:
* Autocompletar **múltiples líneas y bloques** de código
* Saltar **dentro** y **entre** archivos a la siguiente sugerencia de autocompletado
1. Empezá a escribir el comienzo de una función:
```javascript theme={null}
function calculate
```
2. Las sugerencias de Tab aparecen automáticamente
3. Presioná Tab para aceptar la sugerencia
4. Cursor sugiere parámetros y cuerpos de funciones
## [Edición en línea](/es/inline-edit) de una selección
1. Selecciona la función que acabas de crear
2. Presiona Cmd K
3. Escribe "make this function calculate Fibonacci numbers"
4. Presiona Return para aplicar los cambios
5. Cursor agrega imports y documentación
## Chatea con [Agent](/es/agent)
1. Abre el panel de chat (Cmd I)
2. Di: "Add tests for this function and run them"
3. Agent creará un archivo de pruebas, escribirá casos de prueba y los ejecutará por ti
## Bonus
Funciones avanzadas:
1. Abre el panel de control de Background Agent (Cmd E)
2. Pide: "Find and fix a bug in this project"
3. [Background Agent](/es/background-agent) hará lo siguiente:
* Crear una máquina virtual (VM) remota
* Explorar tu proyecto
* Detectar errores
* Proponer correcciones
Revisa y aplica los cambios.
{" "}
1. Abre la paleta de comandos (Cmd Shift P) 2. Busca: "New Cursor
Rule" 3. Ponle un nombre (p. ej., `style-guide`) 4. Selecciona el tipo de regla "Always" 5. Define
tu estilo: `Prefer using camelCase for variable names`
1. Visita nuestro [directorio de MCP](https://docs.cursor.com/tools)
2. Elige una herramienta
3. Haz clic en "Install"
Los servidores también se pueden instalar manualmente:
1. Abre Cursor Settings (Cmd Shift J)
2. Ve a "Tools & Integrations"
3. Haz clic en "New MCP Server"
## Próximos pasos
Explora estas guías para aprender más:
Proporciona un buen contexto para obtener mejores resultados
Elige el modelo adecuado para tu tarea
Aprende todos los [conceptos de Cursor](/es/get-started/concepts) y ¡empieza a crear!
# Ciencia de datos
Source: https://docs.cursor.com/es/guides/advanced/datascience
Aprende a configurar Cursor para flujos de trabajo de ciencia de datos, incluidos Python, R y SQL, con notebooks, entornos remotos y análisis con IA
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor ofrece herramientas integradas para el desarrollo de ciencia de datos mediante entornos reproducibles, compatibilidad con notebooks y asistencia de código impulsada por IA. Esta guía cubre patrones esenciales de configuración para flujos de trabajo en Python, R y SQL.
## Desarrollo con notebooks
Para obtener compatibilidad completa con notebooks, descarga la extensión Jupyter (id: ms-toolsai.jupyter), publicada por ms-toolsai.
Cursor es compatible con archivos `.ipynb` y `.py` con ejecución de celdas integrada. Tab, Inline Edit y Agents
funcionan en notebooks, igual que en otros archivos de código.
Funciones clave:
* La **ejecución de celdas en línea** corre código directamente en la interfaz del editor
* **Tab, Inline Edit y Agent** entienden bibliotecas de ciencia de datos como pandas, NumPy, scikit-learn y comandos mágicos de SQL
## Integración de bases de datos
Puedes integrar bases de datos con Cursor de dos formas principales: servidores MCP y extensiones.
* **Servidores MCP** permiten que tus agentes se conecten a tus bases de datos
* **Extensiones** integran tu IDE en general con tus bases de datos
### Vía MCP
Los servidores MCP permiten que tu agente haga consultas directamente a tu base de datos. Esto le permite decidir consultar tu base de datos, escribir la consulta adecuada, ejecutar el comando y analizar los resultados, todo como parte de una tarea en curso.
Por ejemplo, puedes conectar una base de datos de Postgres a tu instancia de Cursor agregando la siguiente [configuración de MCP](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) a Cursor:
```json theme={null}
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mibase"
]
}
}
}
```
Para más información sobre MCP, consulta nuestra [documentación de MCP](/es/tools/mcp).
### Mediante extensiones
Instala extensiones específicas para bases de datos (PostgreSQL, BigQuery, SQLite, Snowflake) para ejecutar consultas directamente desde el editor. Esto evita cambiar de contexto entre herramientas y habilita la asistencia de IA para optimizar consultas.
```sql theme={null}
-- Cursor sugiere índices, funciones de ventana y optimizaciones de consultas
SELECT
user_id,
event_type,
COUNT(*) AS total_eventos,
RANK() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) AS ranking_frecuencia
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id, event_type;
```
Usa Agents para analizar consultas lentas, sugerir mejoras de rendimiento o generar código de visualización para los resultados de las consultas. Cursor entiende el contexto de SQL y puede recomendar tipos de gráficos adecuados según la estructura de tus datos.
## Visualización de datos
La asistencia de IA de Cursor se extiende a bibliotecas de visualización de datos como Matplotlib, Plotly y Seaborn. El agente puede generar código para visualización de datos, ayudándote a explorar datos rápida y fácilmente, mientras crea un artefacto replicable y compartible.
```python theme={null}
import plotly.express as px
import pandas as pd
# La IA sugiere tipos de gráficos relevantes según las columnas del conjunto de datos
df = pd.read_csv('sales_data.csv')
fig = px.scatter(df, x='advertising_spend', y='revenue',
color='region', size='customer_count',
title='Ingresos vs gasto en publicidad por región')
fig.show()
```
## Preguntas frecuentes
**¿Puedo usar notebooks de Jupyter existentes?**
Sí, Cursor abre archivos `.ipynb` con ejecución completa de celdas y compatibilidad con completado por IA.
**¿Cómo manejo datasets grandes que no caben en memoria?**
Usa bibliotecas de computación distribuida como Dask o conéctate a clústeres de Spark mediante conexiones Remote-SSH a máquinas más potentes.
**¿Cursor admite archivos R y SQL?**
Sí, Cursor ofrece asistencia con IA y resaltado de sintaxis para scripts de R (`.R`) y archivos SQL (`.sql`).
**¿Cuál es la forma recomendada de compartir entornos de desarrollo?**
Haz commit de la carpeta `.devcontainer` al control de versiones. Los miembros del equipo pueden reconstruir el entorno automáticamente al abrir el proyecto.
**¿Cómo depuro pipelines de procesamiento de datos?**
Usa el depurador integrado de Cursor con puntos de interrupción en scripts de Python, o aprovecha Agent para analizar y explicar transformaciones de datos complejas paso a paso.
## Reproducibilidad del entorno
### Contenedores de desarrollo
Los contenedores de desarrollo te ayudan a garantizar entornos de ejecución y dependencias consistentes entre los miembros del equipo y los entornos de despliegue. Pueden eliminar errores específicos del entorno y reducir el tiempo de onboarding de nuevos miembros del equipo.
Para usar un contenedor de desarrollo, empieza creando una carpeta `.devcontainer` en la raíz de tu repositorio. Luego crea un archivo `devcontainer.json`, un `Dockerfile` y un `requirements.txt`.
```json theme={null}
// .devcontainer/devcontainer.json
{
"name": "ds-env",
"build": { "dockerfile": "Dockerfile" },
"features": {
"ghcr.io/devcontainers/features/python:1": { "version": "3.11" }
},
"postCreateCommand": "pip install -r requirements.txt"
}
```
```dockerfile theme={null}
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/python:3.11
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install -r requirements.txt
```
```txt theme={null}
# requirements.txt
pandas==2.3.0
numpy
# agrega otras dependencias que necesites para tu proyecto
```
Cursor detectará automáticamente el devcontainer y te pedirá volver a abrir tu proyecto dentro de un contenedor. También podés reabrirlo manualmente en un contenedor usando la Command Palette (Cmd+Shift+P) y buscando `Reopen in Container`.
Los contenedores de desarrollo ofrecen varias ventajas:
* **Aislamiento de dependencias** evita conflictos entre proyectos
* **Compilaciones reproducibles** garantizan un comportamiento consistente entre entornos de desarrollo y producción
* **Onboarding simplificado** permite que nuevos miembros del equipo empiecen de inmediato sin configuración manual
### Desarrollo remoto con SSH
Cuando tu trabajo requiera recursos de cómputo adicionales, GPUs o acceso a datasets privados, conectate a máquinas remotas manteniendo tu entorno de desarrollo local.
1. Aprovisioná una instancia en la nube o accedé a un servidor on‑premises con los recursos necesarios
2. Cloná tu repositorio en la máquina remota, incluyendo la configuración `.devcontainer`
3. Conectate mediante Cursor: Cmd+Shift+P → "Remote-SSH: Connect to Host"
Este enfoque mantiene un tooling consistente mientras escala los recursos de cómputo según sea necesario. La misma configuración del contenedor de desarrollo funciona tanto en entornos locales como remotos.
# Large Codebases
Source: https://docs.cursor.com/es/guides/advanced/large-codebases
Cómo trabajar con bases de código grandes en Cursor
Trabajar con bases de código grandes introduce un conjunto distinto de desafíos frente a los proyectos más pequeños. A partir de nuestra experiencia escalando la base de código de Cursor y de los aprendizajes de clientes que gestionan bases masivas, descubrimos patrones útiles para manejar la complejidad creciente.
En esta guía, vamos a recorrer algunas de las técnicas que nos han resultado útiles para bases de código grandes.
```mermaid theme={null}
flowchart LR
A[Comprender la base de código] --> B[Definir resultado / Diff]
B --> C[Planificar cambios]
C --> D[Implementar cambios]
D --> A
```
# Usa Chat para ponerte al día rápidamente con código que no conoces
Recorrer una base de código grande, sobre todo si es nueva para ti, puede ser todo un reto. A menudo haces grep, buscas y haces clic por todas partes para dar con las partes específicas que necesitas. Con [Chat](/es/chat/overview), puedes empezar a hacer preguntas para encontrar lo que buscas y obtener una explicación detallada de cómo funciona.
Aquí pedimos ayuda para encontrar detalles de implementación del indexado de la base de código en Cursor, e incluso solicitamos algunos ejemplos para que sea más fácil de entender.
# Escribe reglas para el conocimiento específico del dominio
Si estuvieras incorporando a un nuevo colaborador a tu base de código, ¿qué contexto le darías para asegurarte de que pueda empezar a hacer contribuciones significativas?
Tu respuesta a esta pregunta probablemente sea información valiosa para que Cursor también la entienda. En cada organización o proyecto hay conocimiento latente que puede no estar completamente reflejado en tu documentación. Usar reglas de forma efectiva es la mejor manera de asegurarte de que Cursor tenga el panorama completo.
Por ejemplo, si estás escribiendo instrucciones sobre cómo implementar una nueva funcionalidad o servicio, considera escribir una regla breve para documentarlo para la posteridad.
```mdc Plantilla theme={null}
---
description: Agrega un nuevo servicio de frontend de VSCode
---
1. **Definición de la interfaz:**
- Define una nueva interfaz de servicio con `createDecorator` y asegúrate de incluir `_serviceBrand` para evitar errores.
2. **Implementación del servicio:**
- Implementa el servicio en un nuevo archivo de TypeScript, extiende `Disposable` y regístralo como singleton con `registerSingleton`.
3. **Contribución del servicio:**
- Crea un archivo de contribución para importar y cargar el servicio y regístralo en el punto de entrada principal.
4. **Integración en el contexto:**
- Actualiza el contexto para incluir el nuevo servicio y permitir su acceso en toda la aplicación.
```
Si hay patrones de formato comunes que quieres que Cursor respete, considera autoadjuntar reglas basadas en patrones glob.
```mdc Formato theme={null}
---
globs: *.ts
---
- Usa bun como gestor de paquetes. Consulta [package.json](mdc:backend/reddit-eval-tool/package.json) para ver los scripts
- Usa kebab-case para los nombres de archivos
- Usa camelCase para los nombres de funciones y variables
- Usa UPPERCASE_SNAKE_CASE para las constantes codificadas de forma fija
- Prefiere `function foo()` en lugar de `const foo = () =>`
- Usa `Array` en lugar de `T[]`
- Usa exportaciones con nombre en lugar de exportaciones por defecto, p. ej. (`export const variable ...`, `export function `)
```
# Mantente cerca del proceso de creación del plan
Para cambios más grandes, dedicar más reflexión de lo habitual para crear un plan preciso y bien acotado puede mejorar significativamente los resultados de Cursor.
Si ves que no estás obteniendo el resultado que quieres tras algunas variaciones del mismo prompt, considera tomar perspectiva y crear un plan más detallado desde cero, como si estuvieras redactando un PRD para un compañero. A menudo **lo difícil es decidir qué** cambio se debe hacer, una tarea muy adecuada para las personas. Con las instrucciones correctas, podemos delegar algunas partes de la implementación a Cursor.
Una forma de usar la IA para fortalecer el proceso de creación del plan es usar el modo Ask. Para crear un plan, activa el modo Ask en Cursor y vuelca cualquier contexto que tengas de tus sistemas de gestión de proyectos, documentación interna o ideas sueltas. Piensa en qué archivos y dependencias tienes en el código base que ya sabes que quieres incluir. Puede ser un archivo que contenga fragmentos de código con los que quieras integrarte o, quizá, una carpeta completa.
Aquí tienes un ejemplo de prompt:
```mdc Indicaciones de planificación theme={null}
- crea un plan sobre cómo deberíamos implementar una nueva feature (igual que @existingfeature.ts)
- hazme preguntas (máx. 3) si algo no está claro
- asegúrate de buscar en el codebase
@Chats anteriores (mis prompts de exploración previos)
aquí tienes más contexto de [project management tool]:
[descripción del ticket pegada]
```
Le estamos pidiendo al modelo que elabore un plan y reúna contexto haciendo preguntas a la persona, referenciando cualquier prompt de exploración anterior y también las descripciones del ticket. Se recomienda usar un modelo de razonamiento como `claude-3.7-sonnet`, `gemini-2.5-pro` u `o3`, ya que pueden comprender la intención del cambio y sintetizar un plan de manera más efectiva.
A partir de esto, podés ir formulando el plan de manera iterativa con la ayuda de Cursor antes de iniciar la implementación.
```mermaid theme={null}
flowchart LR
A[Contexto] -- Consulta --> B[Plan]
B -- Agente --> C[Implementación]
```
# Elige la herramienta adecuada para la tarea
Una de las habilidades más importantes para usar Cursor de forma efectiva es elegir la herramienta adecuada para la tarea. Piensa en lo que quieres lograr y elige el enfoque que te mantenga en flow.
| **Tool** | **Use case** | **Strength** | **Limitation** |
| :------------------------------------------ | :----------------------------- | :-------------------------------------------------- | :---------------------------------- |
| **[Tab](/es/tab/overview)** | Cambios rápidos y manuales | Control total, muy rápido | Un solo archivo |
| **[Inline Edit](/es/inline-edit/overview)** | Cambios acotados en un archivo | Ediciones focalizadas | Un solo archivo |
| **[Chat](/es/chat/overview)** | Cambios grandes multiarchivo | Reúne contexto automáticamente, ediciones profundas | Más lento, dependiente del contexto |
Cada herramienta tiene su punto ideal:
* Tab es tu opción para ediciones rápidas cuando quieres ir al volante
* Inline Edit brilla cuando necesitas hacer cambios puntuales en una sección específica del código
* Chat es perfecto para esos cambios más grandes donde necesitas que Cursor entienda el contexto más amplio
Cuando uses el modo Chat (que puede sentirse un poco más lento pero es increíblemente potente), ayúdalo dándole buen contexto. Usa [@files](/es/context/@-symbols/@-files) para señalar código similar que quieras emular, o [@folder](/es/context/@-symbols/@-folders) para darle un mejor entendimiento de la estructura de tu proyecto. Y no tengas miedo de dividir cambios más grandes en partes más pequeñas: empezar chats nuevos ayuda a mantener todo enfocado y eficiente.
# Conclusiones
* Acota los cambios y no intentes hacer demasiado de una vez
* Incluye el contexto relevante cuando puedas
* Usa Chat, Inline Edit y Tab para lo que mejor se les da
* Crea chats nuevos con frecuencia
* Planifica con [Ask mode](/es/chat/ask) e implementa con [Agent mode](/es/chat/agent)
# Trabajar con la documentación
Source: https://docs.cursor.com/es/guides/advanced/working-with-documentation
Cómo sacar el máximo partido a la documentación en Cursor mediante indicaciones, fuentes externas y contexto interno
export const ChatInput = ({content = []}) => {
const renderContent = () => {
return content.map((item, index) => {
if (item.type === 'mention') {
return
{item.text}
;
}
return item.text;
});
};
return <>
La documentación proporciona contexto actualizado y preciso. Sin ella, los modelos usan datos de entrenamiento obsoletos o incompletos. La documentación ayuda a los modelos a entender cosas como:
* APIs y parámetros vigentes
* Mejores prácticas
* Convenciones de la organización
* Terminología del dominio
Y mucho más. Sigue leyendo para aprender a usar la documentación directamente en Cursor sin tener que cambiar de contexto.
## Límite de conocimiento del modelo
Los modelos de lenguaje grandes se entrenan con datos hasta un punto específico en el tiempo, llamado "límite de conocimiento". Esto implica:
* Es posible que las actualizaciones recientes de bibliotecas no estén reflejadas
* Es probable que frameworks o herramientas nuevos no sean conocidos
* Los cambios de API posteriores a la fecha de corte no se contemplan
* Las buenas prácticas pueden haber evolucionado desde el entrenamiento
Por ejemplo, si el límite de conocimiento de un modelo es a inicios de 2024, no conocerá funciones lanzadas a finales de 2024, incluso en frameworks populares.
# ¿Qué herramienta debería usar?
Usa este árbol de decisión para determinar rápidamente el mejor enfoque para tus necesidades de documentación:
```mermaid theme={null}
flowchart TD
A[¿Qué información necesitas?] --> B[Frameworks/bibliotecas públicas]
A --> C[Conocimiento reciente de la comunidad/solución de problemas]
A --> D[Información interna de la empresa]
B --> E[¿Necesitas documentación oficial?]
E -->|Yes| F[Usa @Docs Referencias de API, guías, buenas prácticas]
E -->|No| G[Usa @Web Tutoriales de la comunidad, comparativas]
C --> H[Usa @Web Publicaciones recientes, issues de GitHub]
D --> I[¿Hay integraciones MCP existentes disponibles?]
I -->|Yes| J[Usa el MCP existente Confluence, Google Drive, etc.]
I -->|No| K[Crea un MCP personalizado APIs internas, sistemas propietarios]
style F fill:#e1f5fe
style G fill:#e8f5e8
style H fill:#e8f5e8
style J fill:#fff3e0
style K fill:#fce4ec
```
## Modelo mental
| Herramienta | Modelo mental |
| ----------- | -------------------------------------------- |
| **`@Docs`** | Como navegar y leer la documentación oficial |
| **`@Web`** | Como buscar soluciones en internet |
| **MCP** | Como acceder a tu documentación interna |
# Documentación pública
La documentación externa abarca información pública sobre la que los modelos pueden tener un conocimiento limitado o desactualizado. Cursor ofrece dos formas principales de acceder a esta información.
## Uso de @Docs
`@Docs` conecta Cursor con la documentación oficial de herramientas y frameworks populares. Úsalo cuando necesites información actual y autorizada sobre:
* **Referencias de API**: Firmas de funciones, parámetros, tipos de retorno
* **Guías de introducción**: Configuración, ajustes, uso básico
* **Mejores prácticas**: Patrones recomendados por la fuente oficial
* **Depuración específica de frameworks**: Guías oficiales de solución de problemas
## Uso de @Web
`@Web` busca en la web información actual, entradas de blog y discusiones de la comunidad. Úsalo cuando necesites:
* **Tutoriales recientes**: contenido y ejemplos generados por la comunidad
* **Comparaciones**: artículos que comparan diferentes enfoques
* **Novedades recientes**: actualizaciones o anuncios muy recientes
* **Múltiples perspectivas**: distintos enfoques para resolver problemas
# Documentación interna
La documentación interna incluye información específica de tu organización que los modelos de IA nunca han visto durante su entrenamiento. Esto puede incluir:
* **APIs internas**: Servicios y microservicios personalizados
* **Estándares de la empresa**: Convenciones de codificación, patrones de arquitectura
* **Sistemas propietarios**: Herramientas, bases de datos y flujos de trabajo personalizados
* **Conocimiento del dominio**: Lógica de negocio, requisitos de cumplimiento normativo
## Acceder a documentación interna con MCP
Model Context Protocol (MCP) proporciona una forma estandarizada de incorporar tu documentación y sistemas privados en Cursor. MCP actúa como una capa ligera entre Cursor y tus recursos internos.
**Por qué MCP importa:**
* Los modelos no pueden adivinar tus convenciones internas
* La documentación de las APIs de servicios personalizados no está disponible públicamente
* La lógica de negocio y el conocimiento del dominio son exclusivos de tu organización
* Los requisitos de cumplimiento y seguridad varían según la empresa
### Integraciones comunes de MCP
| Integración | Acceso | Ejemplos |
| ---------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **Confluence** | Espacios de Confluence de la empresa | Documentación de arquitectura, especificaciones de API para servicios internos, estándares y guías de codificación, documentación de procesos |
| **Google Drive** | Documentos y carpetas compartidos | Documentos de especificación, notas de reuniones y registros de decisiones, documentos de diseño y requisitos, bases de conocimiento del equipo |
| **Notion** | Bases de datos y páginas del workspace | Documentación de proyectos, wikis de equipo, bases de conocimiento, requisitos de producto, especificaciones técnicas |
| **Custom** | Sistemas y bases de datos internos | APIs propietarias, sistemas de documentación heredados, bases de conocimiento personalizadas, herramientas y flujos de trabajo especializados |
#### Soluciones personalizadas
Para necesidades específicas, puedes crear servidores MCP personalizados que:
* Hagan scraping de sitios web o portales internos
* Se conecten a bases de datos propietarias
* Accedan a sistemas de documentación personalizados
* Extraigan información de wikis internos o bases de conocimiento
Si creas un servidor MCP personalizado, también puedes exponer herramientas para que Cursor actualice la documentación
Ejemplo de servidor MCP personalizado para hacer scraping de documentación interna:
```javascript TypeScript theme={null}
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import TurndownService from "turndown";
// Create an MCP server for scraping internal docs
const server = new McpServer({
name: "internal-docs",
version: "1.0.0"
});
const turndownService = new TurndownService();
// Add tool to scrape internal documentation
server.tool("get_doc",
{ url: z.string() },
async ({ url }) => {
try {
const response = await fetch(url);
const html = await response.text();
// Convert HTML to markdown
const markdown = turndownService.turndown(html);
return {
content: [{ type: "text", text: markdown }]
};
} catch (error) {
return {
content: [{ type: "text", text: `Error scraping ${url}: ${error.message}` }]
};
}
}
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);
```
```python Python theme={null}
# server.py
import os
import asyncio
from mcp.server.fastmcp import FastMCP
import aiohttp
from markdownify import markdownify as md
# Create an MCP server for scraping internal docs
mcp = FastMCP("internal-docs")
@mcp.tool()
async def get_doc(url: str) -> dict:
"""Scrape internal documentation from a URL"""
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
html = await response.text()
# Convert HTML to markdown
markdown = md(html)
return {
"content": [{"type": "text", "text": markdown}]
}
except Exception as error:
return {
"content": [{"type": "text", "text": f"Error scraping {url}: {str(error)}"}]
}
```
# Mantener la documentación actualizada
La documentación se queda obsoleta rápido. Cursor puede ayudarte a mantenerla al día y útil, generándola y actualizándola a partir de tu código real y de tus conversaciones de desarrollo.
## Desde código existente
Usa Cursor para generar documentación directamente desde tu código:
## Desde sesiones de chat
Tus conversaciones con Cursor contienen información valiosa que puede convertirse en documentación.
**Después de resolver un problema complejo:**
**Después de tomar decisiones de arquitectura:**
**Después de sesiones de depuración:**
## Puntos clave
* Usar la documentación como contexto hace que Cursor sea más preciso y esté al día
* Usa `@Docs` para la documentación oficial y `@Web` para el conocimiento de la comunidad
* MCP conecta Cursor con tus sistemas internos
* Genera documentación a partir del código y las conversaciones para mantener el conocimiento actualizado
* Combina documentación externa e interna para una comprensión completa
# Java
Source: https://docs.cursor.com/es/guides/languages/java
Configura el desarrollo en Java con el JDK, extensiones y herramientas de build
Esta guía te ayuda a configurar Cursor para desarrollar en Java: preparar el JDK, instalar extensiones necesarias, depurar, ejecutar aplicaciones Java e integrar herramientas de build como Maven y Gradle. También cubre funciones de flujo de trabajo similares a IntelliJ o VS Code.
Antes de empezar, asegúrate de tener Cursor instalado y actualizado a la última versión.
## Configurar Java para Cursor
### Instalación de Java
Antes de configurar Cursor, necesitas tener Java instalado en tu equipo.
Cursor no incluye un compilador de Java, así que necesitas instalar un JDK si
aún no lo tienes.
Descarga e instala un JDK (p. ej., OpenJDK, Oracle JDK, Microsoft Build of
OpenJDK).
Configura JAVA\_HOME y agrega JAVA\_HOME\bin a tu PATH.
Instala con Homebrew (`brew install openjdk`) o descarga un instalador.
Asegúrate de que JAVA\_HOME apunte al JDK instalado.
Usa tu gestor de paquetes (`sudo apt install openjdk-17-jdk` o equivalente)
o instala con SDKMAN.
Para comprobar la instalación, ejecuta:
```bash theme={null}
java -version
javac -version
```
Si Cursor no detecta tu JDK, configúralo manualmente en settings.json:
```json theme={null}
{
"java.jdt.ls.java.home": "/path/to/jdk",
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/path/to/jdk-17",
"default": true
}
]
}
```
Reinicia Cursor para aplicar los cambios.
### Configuración de Cursor
Cursor es compatible con extensiones de VS Code. Instala las siguientes manualmente:
Incluye soporte para el lenguaje Java, depurador, ejecutor de pruebas, soporte para Maven y
administrador de proyectos
Esencial para trabajar con el sistema de compilación Gradle
Requisito para el desarrollo con Spring Boot
Necesario para el desarrollo de aplicaciones en Kotlin
### Configurar herramientas de compilación
#### Maven
Asegúrate de que Maven esté instalado (`mvn -version`). Instálalo desde [maven.apache.org](https://maven.apache.org/download.cgi) si es necesario:
1. Descarga el archivo binario
2. Extráelo en la ubicación deseada
3. Configura la variable de entorno MAVEN\_HOME al directorio extraído
4. Agrega %MAVEN\_HOME%\bin (Windows) o \$MAVEN\_HOME/bin (Unix) al PATH
#### Gradle
Asegúrate de que Gradle esté instalado (`gradle -version`). Instálalo desde [gradle.org](https://gradle.org/install/) si es necesario:
1. Descarga la distribución binaria
2. Extráela en la ubicación deseada
3. Configura la variable de entorno GRADLE\_HOME al directorio extraído
4. Agrega %GRADLE\_HOME%\bin (Windows) o \$GRADLE\_HOME/bin (Unix) al PATH
Como alternativa, usa el Gradle Wrapper, que descargará y usará automáticamente la versión correcta de Gradle:
## Ejecución y depuración
Ahora que ya está todo listo, es momento de ejecutar y depurar tu código Java.
Según lo que necesites, podés usar los siguientes métodos:
Hacé clic en el enlace "Run" que aparece sobre cualquier método main para ejecutar
tu programa rápidamente
Abrí el panel lateral "Run and Debug" y usá el botón "Run" para iniciar tu
aplicación
Ejecutá desde la línea de comandos usando Maven o Gradle
Iniciá aplicaciones Spring Boot directamente desde la extensión "Spring Boot Dashboard"
## Flujo de trabajo de Java x Cursor
Las funciones con IA de Cursor pueden mejorar significativamente tu flujo de trabajo de desarrollo en Java. Aquí tienes algunas formas de aprovechar las capacidades de Cursor específicamente para Java:
Completado inteligente para métodos, firmas y boilerplate de Java como
getters/setters.
Implementa patrones de diseño, refactoriza código o genera clases con
la herencia adecuada.
Ediciones rápidas en línea en métodos, corrige errores o genera pruebas unitarias sin
romper el flujo.
Obtén ayuda con conceptos de Java, depura excepciones o comprende características de
frameworks.
### Flujos de trabajo de ejemplo
1. **Generar boilerplate de Java**\
Usa [Tab completion](/es/tab/overview) para generar rápidamente constructores, getters/setters, métodos equals/hashCode y otros patrones repetitivos de Java.
2. **Depurar excepciones complejas de Java**\
Cuando te encuentres con un stack trace críptico de Java, selecciónalo y usa [Ask](/es/chat/overview) para explicar la causa raíz y sugerir posibles soluciones.
3. **Refactorizar código legado de Java**\
Usa [Agent mode](/es/chat/agent) para modernizar código antiguo de Java: convierte clases anónimas en lambdas, actualiza a nuevas características del lenguaje Java o implementa patrones de diseño.
4. **Desarrollo con frameworks**\
Agrega tu documentación al contexto de Cursor con @docs y genera código específico del framework en todo Cursor.
# JavaScript & TypeScript
Source: https://docs.cursor.com/es/guides/languages/javascript
Desarrollo de JavaScript y TypeScript con soporte para frameworks
¡Bienvenido al desarrollo de JavaScript y TypeScript en Cursor! El editor ofrece soporte excepcional para el desarrollo en JS/TS a través de su ecosistema de extensiones. Esto es lo que necesitas saber para sacarle el máximo partido a Cursor.
## Extensiones esenciales
Aunque Cursor funciona muy bien con cualquier extensión que prefieras, recomendamos estas si apenas estás empezando:
* **ESLint** - Necesario para las funciones de corrección de lint con IA de Cursor
* **JavaScript and TypeScript Language Features** - Compatibilidad de lenguaje e IntelliSense mejoradas
* **Path Intellisense** - Autocompletado inteligente de rutas de archivos
## Funciones de Cursor
Cursor potencia tu flujo de trabajo en JavaScript/TypeScript con:
* **Tab Completions**: autocompletados con contexto que entienden la estructura de tu proyecto
* **Automatic Imports**: Tab puede importar bibliotecas automáticamente en cuanto las usas
* **Inline Editing**: usa `CMD+K` en cualquier línea para editar con sintaxis perfecta
* **Composer Guidance**: planifica y edita tu código en múltiples archivos con el Composer
### Inteligencia de frameworks con @Docs
La función @Docs de Cursor te permite potenciar tu desarrollo en JavaScript agregando fuentes de documentación personalizadas que la IA puede consultar. Agrega documentación de MDN, Node.js o tu framework favorito para obtener sugerencias de código más precisas y con más contexto.
Descubre cómo agregar y gestionar fuentes de documentación personalizadas en Cursor.
### Resolución automática de lint
Una de las funciones destacadas de Cursor es su integración fluida con extensiones de linters.
Asegúrate de tener configurado un linter, como ESLint, y habilita la opción "Iterate on Lints".
Luego, cuando uses el modo Agent en Composer, una vez que la IA haya intentado responder tu consulta y haya realizado cambios en el código, leerá automáticamente la salida del linter e intentará corregir cualquier error de lint que quizá no haya detectado.
## Compatibilidad con frameworks
Cursor funciona sin problemas con los principales frameworks y librerías de JavaScript, como:
### React & Next.js
* Soporte completo para JSX/TSX con sugerencias inteligentes de componentes
* Inteligencia para server components y rutas de API en Next.js
* Recomendado: extensión [**React Developer Tools**](cursor:extension/msjsdiag.vscode-react-native)
### Vue.js
* Soporte de sintaxis de plantillas con integración de Volar
* Autocompletado de componentes y comprobación de tipos
* Recomendado: [**Vue Language Features**](cursor:extension/vue.volar)
### Angular
* Validación de plantillas y soporte para decoradores de TypeScript
* Generación de componentes y servicios
* Recomendado: [**Angular Language Service**](cursor:extension/Angular.ng-template)
### Svelte
* Resaltado de sintaxis de componentes y sugerencias inteligentes
* Sugerencias para sentencias reactivas y stores
* Recomendado: [**Svelte for VS Code**](cursor:extension/svelte.svelte-vscode)
### Frameworks de backend (Express/NestJS)
* Inteligencia para rutas y middleware
* Soporte para decoradores de TypeScript en NestJS
* Integración con herramientas de prueba de APIs
Recuerda: las funciones de IA de Cursor funcionan bien con todos estos frameworks, entienden sus patrones y mejores prácticas para ofrecer sugerencias relevantes. La IA puede ayudarte con todo, desde la creación de componentes hasta refactorizaciones complejas, respetando los patrones existentes de tu proyecto.
# Python
Source: https://docs.cursor.com/es/guides/languages/python
Configura el desarrollo en Python con extensiones y herramientas de linting
Esta guía se inspiró mucho en [Jack Fields](https://x.com/OrdinaryInds)
y su
[artículo](https://medium.com/ordinaryindustries/the-ultimate-vs-code-setup-for-python-538026b34d94)
sobre cómo configurar VS Code para desarrollar en Python. Échale un vistazo a su artículo para
más detalles.
## Requisitos previos
Antes de empezar, asegúrate de tener:
* [Python](https://python.org) instalado (se recomienda 3.8 o superior)
* [Git](https://git-scm.com/) para control de versiones
* Cursor instalado y actualizado a la última versión
## Extensiones esenciales
Las siguientes extensiones configuran Cursor para que quede completamente equipado para el desarrollo en Python. Te ofrecen resaltado de sintaxis, linting, depuración y pruebas unitarias.
Compatibilidad básica del lenguaje por parte de Microsoft
Servidor de lenguaje para Python, rápido
Capacidades de depuración mejoradas
Linter y formateador para Python
### Herramientas avanzadas para Python
Aunque las extensiones anteriores han sido las más populares para el desarrollo en Python en Cursor, también agregamos algunas adicionales que pueden ayudarte a sacarle el máximo partido a tu desarrollo en Python.
#### `uv` - Gestor de entornos de Python
[uv](https://github.com/astral-sh/uv) es un gestor moderno de paquetes de Python que puede usarse para crear y administrar entornos virtuales, además de reemplazar pip como gestor de paquetes predeterminado.
Para instalar uv, ejecuta el siguiente comando en tu terminal:
```bash theme={null}
pip install uv
```
#### `ruff` - Linter y formateador de Python
[Ruff](https://docs.astral.sh/ruff/) es un linter y formateador moderno para Python que podés usar para detectar errores de programación, hacer cumplir estándares de código y sugerir refactorizaciones. Podés usarlo junto con Black para el formateo del código.
Para instalar Ruff, ejecutá el siguiente comando en tu terminal:
```bash theme={null}
pip install ruff
```
## Configuración de Cursor
### 1. Intérprete de Python
Configura tu intérprete de Python en Cursor:
1. Abre la paleta de comandos (Cmd/Ctrl + Shift + P)
2. Busca "Python: Select Interpreter"
3. Elige tu intérprete de Python (o el entorno virtual si estás usando uno)
### 2. Formateo de código
Configura el formateo automático de código con Black:
Black es un formateador que aplica automáticamente un estilo consistente a tu código.
No requiere configuración y está ampliamente adoptado en la comunidad de Python.
Para instalar Black, ejecuta el siguiente comando en tu terminal:
```bash theme={null}
pip install black
```
Luego, configura Cursor para usar Black como formateador de código, agregando lo siguiente a tu archivo `settings.json`:
```json theme={null}
{
"python.formatting.provider": "black",
"editor.formatOnSave": true,
"python.formatting.blackArgs": ["--line-length", "88"]
}
```
### 3. Linting
Podemos usar PyLint para detectar errores de programación, hacer cumplir los estándares de código y sugerir refactorizaciones.
Para instalar PyLint, ejecuta el siguiente comando en tu terminal:
```bash theme={null}
pip install pylint
```
```json theme={null}
{
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.lintOnSave": true
}
```
### 4. Comprobación de tipos
Además del linting, podemos usar MyPy para verificar errores de tipo.
Para instalar MyPy, ejecuta el siguiente comando en tu terminal:
```bash theme={null}
pip install mypy
```
```json theme={null}
{
"python.linting.mypyEnabled": true
}
```
## Depuración
Cursor ofrece potentes funciones de depuración para Python:
1. Colocá puntos de interrupción haciendo clic en el gutter
2. Usá el panel Debug (Cmd/Ctrl + Shift + D)
3. Configurá `launch.json` para definir configuraciones de depuración personalizadas
## Funciones recomendadas
Sugerencias de código inteligentes que entienden lo que haces
Explora y comprende el código mediante conversaciones naturales
Resuelve tareas de desarrollo complejas con ayuda de IA
Trae contexto de sistemas de terceros
Importa módulos automáticamente mientras programas
Cursor revisa tu código constantemente con IA
## Compatibilidad con frameworks
Cursor funciona a la perfección con los frameworks más populares de Python:
* **Frameworks web**: Django, Flask, FastAPI
* **Ciencia de datos**: Jupyter, NumPy, Pandas
* **Aprendizaje automático**: TensorFlow, PyTorch, scikit-learn
* **Pruebas**: pytest, unittest
* **API**: requests, aiohttp
* **Bases de datos**: SQLAlchemy, psycopg2
# iOS y macOS (Swift)
Source: https://docs.cursor.com/es/guides/languages/swift
Integra Cursor con Xcode para desarrollo en Swift
¡Bienvenido al desarrollo de Swift en Cursor! Ya sea que estés creando apps para iOS, aplicaciones para macOS o proyectos de Swift del lado del servidor, te tenemos cubierto. Esta guía te ayudará a configurar tu entorno de Swift en Cursor, empezando por lo básico y pasando a funciones más avanzadas.
## Flujo de trabajo básico
La forma más sencilla de usar Cursor con Swift es tratarlo como tu editor de código principal y seguir usando Xcode para compilar y ejecutar tus apps. Vas a obtener funciones geniales como:
* Autocompletado inteligente de código
* Asistencia de código con IA (prueba [CMD+K](/es/inline-edit/overview) en cualquier línea)
* Acceso rápido a la documentación con [@Docs](/es/context/@-symbols/@-docs)
* Resaltado de sintaxis
* Navegación básica de código
Cuando necesites compilar o ejecutar tu app, simplemente cambia a Xcode. Este flujo de trabajo es perfecto para desarrolladores que quieren aprovechar las capacidades de IA de Cursor mientras se quedan con las herramientas conocidas de Xcode para depuración y distribución.
### Recarga en caliente
Cuando usas workspaces o proyectos de Xcode (en lugar de abrir una carpeta directamente en Xcode), Xcode a menudo puede ignorar cambios en tus archivos que se hicieron en Cursor, o fuera de Xcode en general.
Aunque puedes abrir la carpeta en Xcode para resolver esto, puede que necesites usar un proyecto para tu flujo de trabajo de desarrollo en Swift.
Una gran solución es usar [Inject](https://github.com/krzysztofzablocki/Inject), una librería de recarga en caliente para Swift que permite que tu app haga “hot reload” y se actualice en cuanto detecta cambios, en tiempo real. Esto no sufre los efectos secundarios del problema de los workspaces/proyectos de Xcode y te permite hacer cambios en Cursor y verlos reflejados en tu app al instante.
Aprende más sobre Inject y cómo usarlo en tus proyectos Swift.
## Desarrollo avanzado con Swift
Esta sección de la guía está muy inspirada en [Thomas
Ricouard](https://x.com/Dimillian) y su
[artículo](https://dimillian.medium.com/how-to-use-cursor-for-ios-development-54b912c23941)
sobre cómo usar Cursor para desarrollo en iOS. Échale un ojo a su artículo para más
detalles y síguelo para más contenido sobre Swift.
Si quieres tener solo un editor abierto a la vez y evitar cambiar entre Xcode y Cursor, puedes usar una extensión como [Sweetpad](https://sweetpad.hyzyla.dev/) para integrar Cursor directamente con el sistema de compilación de Xcode.
Sweetpad es una extensión potente que te permite compilar, ejecutar y depurar tus proyectos Swift directamente en Cursor, sin renunciar a las funcionalidades de Xcode.
Para empezar con Sweetpad, aún necesitas tener Xcode instalado en tu Mac: es la base del desarrollo con Swift. Puedes descargar Xcode desde la [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835). Una vez que tengas Xcode configurado, vamos a potenciar tu experiencia de desarrollo en Cursor con algunas herramientas esenciales.
Abre tu terminal y ejecuta:
```bash theme={null}
# Compila tus proyectos sin tener Xcode abierto
brew install xcode-build-server
# Da un formateo limpio a la salida del comando `xcodebuild` en la terminal de Cursor
brew install xcbeautify
# Permite un formateo avanzado y características del lenguaje
brew install swiftformat
```
A continuación, instalá la extensión [Swift Language Support](cursor:extension/chrisatwindsurf.swift-vscode) en Cursor. Te va a dar resaltado de sintaxis y funciones básicas del lenguaje listas para usar.
Después, instalemos la extensión [Sweetpad](https://sweetpad.hyzyla.dev/) para integrar Cursor con Xcode. Sweetpad envuelve varios atajos alrededor de la CLI `xcodebuild` (y mucho más), y te permite escanear tus targets, elegir el destino, compilar y ejecutar tu app igual que en Xcode. Además, configura tu proyecto para Xcode Build Server para que tengas todas las funciones mencionadas arriba.
### Uso de Sweetpad
Una vez que tengas Sweetpad instalado y un proyecto Swift abierto en Cursor, primero deberías ejecutar el comando `Sweetpad: Generate Build Server Config`. Esto va a generar un archivo `buildServer.json` en la raíz de tu proyecto que permite que Xcode Build Server funcione con tu proyecto.
Luego, desde el Command Palette o la barra lateral de Sweetpad, podés seleccionar el target que querés compilar y ejecutar.
{" "}
Necesitás compilar tu proyecto una vez para habilitar el autocompletado, ir a la definición
y otras funciones del lenguaje.{" "}
También podés presionar F5 para compilar y ejecutar tu proyecto con el depurador; quizá necesites crear primero una configuración de lanzamiento, pero simplemente seleccioná Sweetpad de la lista cuando se te indique.
Como con muchas extensiones en Cursor, podés vincular varios comandos de Sweetpad a atajos de teclado para hacer tu flujo de trabajo aún más eficiente.
Para aprender más sobre Sweetpad, mirá estos recursos:
Sitio oficial de Sweetpad con funciones e instrucciones de instalación
Guía completa que cubre configuración, uso y funciones avanzadas
# JetBrains
Source: https://docs.cursor.com/es/guides/migration/jetbrains
Migra de los IDE de JetBrains a Cursor con herramientas familiares
Cursor ofrece una experiencia de programación moderna con IA que puede reemplazar tus IDE de JetBrains. Aunque el cambio pueda sentirse distinto al principio, la base de Cursor en VS Code ofrece funciones potentes y amplias opciones de personalización.
## Componentes del editor
### Extensiones
Los IDE de JetBrains son herramientas geniales, ya que vienen preconfigurados para los lenguajes y frameworks para los que están pensados.
Cursor es diferente: como un lienzo en blanco desde el principio, podés personalizarlo a tu gusto, sin estar limitado por los lenguajes y frameworks para los que el IDE fue pensado.
Cursor tiene acceso a un vasto ecosistema de extensiones, y casi todas las funcionalidades (¡y más!) que ofrecen los IDE de JetBrains se pueden recrear mediante estas extensiones.
Mirá algunas de estas extensiones populares a continuación:
Extensión SSH
Gestioná múltiples proyectos
Integración de Git mejorada
Rastreá cambios locales de archivos
Resaltado de errores en línea
Linting de código
Formateo de código
Rastreá TODO y FIXME
### Atajos de teclado
Cursor tiene un gestor de atajos de teclado incorporado que te permite mapear tus atajos favoritos a acciones.
Con esta extensión, podés traer casi todos los atajos de los IDE de JetBrains directamente a Cursor.
Asegurate de leer la documentación de la extensión para aprender cómo configurarla a tu gusto:
Instalá esta extensión para traer los atajos de los IDE de JetBrains a Cursor.
Atajos comunes que difieren:
* Find Action: ⌘/Ctrl+Shift+P (vs. ⌘/Ctrl+Shift+A)
* Quick Fix: ⌘/Ctrl+. (vs. Alt+Enter)
* Go to File: ⌘/Ctrl+P (vs. ⌘/Ctrl+Shift+N)
### Temas
Recreá la apariencia y la sensación de tus IDE favoritos de JetBrains en Cursor con estos temas de la comunidad.
Elegí entre el tema estándar Darcula o seleccioná un tema que coincida con el resaltado de sintaxis de tus herramientas de JetBrains.
Experimentá el clásico tema oscuro Darcula de JetBrains
Obtené los íconos de archivos y carpetas de JetBrains que ya conocés
### Fuente
Para completar tu experiencia al estilo JetBrains, podés usar la fuente oficial JetBrains Mono:
1. Descargá e instalá la fuente JetBrains Mono en tu sistema:
2. Reiniciá Cursor después de instalar la fuente
3. Abrí Settings en Cursor (⌘/Ctrl + ,)
4. Buscá "Font Family"
5. Configurá la familia tipográfica en `'JetBrains Mono'`
Para una mejor experiencia, también podés habilitar las ligaduras tipográficas configurando "editor.fontLigatures": true en tus ajustes.
## Migración específica del IDE
A muchxs usuarixs les encantaban los IDE de JetBrains por su soporte listo para usar para los lenguajes y frameworks para los que fueron diseñados. Cursor es diferente: como un lienzo en blanco desde el inicio, podés personalizarlo a tu gusto, sin estar limitadx por los lenguajes y frameworks para los que el IDE fue pensado.
Cursor ya tiene acceso al ecosistema de extensiones de VS Code, y casi toda la funcionalidad (¡y más!) que ofrecen los IDE de JetBrains se puede recrear mediante estas extensiones.
Echale un vistazo a las siguientes extensiones sugeridas para cada IDE de JetBrains.
### IntelliJ IDEA (Java)
Funcionalidades básicas del lenguaje Java
Soporte de depuración para Java
Ejecutá y depurá tests de Java
Soporte para Maven
Herramientas de gestión de proyectos
Diferencias clave:
* Las configuraciones de Build/Run se gestionan mediante launch.json
* Herramientas de Spring Boot disponibles a través de la extensión ["Spring Boot Extension Pack"](cursor:extension/vmware.vscode-boot-dev-pack)
* Soporte para Gradle mediante la extensión ["Gradle for Java"](cursor:extension/vscjava.vscode-gradle)
### PyCharm (Python)
Soporte básico para Python
Chequeo de tipos rápido
Soporte para notebooks
Formateador y linter de Python
Diferencias clave:
* Entornos virtuales gestionados desde la paleta de comandos
* Configuraciones de depuración en launch.json
* Gestión de dependencias con requirements.txt o Poetry
### WebStorm (JavaScript/TypeScript)
Últimas funcionalidades del lenguaje
Desarrollo con React
Soporte para Vue.js
Desarrollo con Angular
La mayoría de las funcionalidades de WebStorm están integradas en Cursor/VS Code, incluidas:
* Vista de scripts de npm
* Depuración
* Integración con Git
* Soporte para TypeScript
### PhpStorm (PHP)
Servidor de lenguaje para PHP
Integración con Xdebug
Inteligencia de código
Herramientas de documentación
Diferencias clave:
* Configuración de Xdebug mediante launch.json
* Integración con Composer vía terminal
* Herramientas de base de datos a través de la extensión ["SQLTools"](cursor:extension/mtxr.sqltools)
### Rider (.NET)
Compatibilidad básica con C#
Entorno de desarrollo C# de código abierto
Complemento de JetBrains para C#
Gestión del SDK de .NET
Diferencias clave:
* Explorador de soluciones a través del explorador de archivos
* Gestión de paquetes NuGet mediante CLI o extensiones
* Integración del runner de tests a través del explorador de tests
### GoLand (Go)
Extensión oficial de Go
Diferencias clave:
* Instalación de herramientas de Go solicitada automáticamente
* Depuración mediante launch.json
* Gestión de paquetes integrada con go.mod
## Consejos para una transición fluida
Presiona ⌘/Ctrl + Shift + P para buscar comandos
Aprovecha las funciones de IA de Cursor para autocompletar y refactorizar código
Ajusta tu settings.json para un flujo de trabajo óptimo
Usa el terminal integrado para operaciones en la línea de comandos
Explora el Marketplace de VS Code para herramientas adicionales
Recuerda que, aunque algunos flujos de trabajo pueden ser diferentes, Cursor ofrece potentes funciones de programación asistida por IA que pueden aumentar tu productividad más allá de las capacidades de los IDE tradicionales.
# VS Code
Source: https://docs.cursor.com/es/guides/migration/vscode
Importa la configuración y las extensiones de VS Code con un clic
Cursor se basa en la base de código de VS Code, lo que nos permite enfocarnos en ofrecer la mejor experiencia de programación con IA mientras mantenemos un entorno de edición familiar. Esto hace que sea fácil migrar tu configuración de VS Code a Cursor.
## Migración de perfil
### Importación con un clic
Así puedes traer toda tu configuración de VS Code en un solo clic:
1. Abre la configuración de Cursor (⌘/Ctrl + Shift + J)
2. Ve a General > Account
3. En "VS Code Import", haz clic en el botón Import
Esto transferirá tus:
* Extensiones
* Temas
* Configuraciones
* Atajos de teclado
### Migración manual del perfil
Si estás cambiando de máquina o quieres más control sobre tu configuración, puedes migrar tu perfil manualmente.
#### Exportar un perfil
1. En tu instancia de VS Code, abre la Command Palette (⌘/Ctrl + Shift + P)
2. Busca "Preferences: Open Profiles (UI)"
3. Encuentra el perfil que quieres exportar en la barra lateral izquierda
4. Haz clic en el menú de 3 puntos y selecciona "Export Profile"
5. Elige exportarlo a tu equipo local o a un GitHub Gist
#### Importar un perfil
1. En tu instancia de Cursor, abre la Command Palette (⌘/Ctrl + Shift + P)
2. Busca "Preferences: Open Profiles (UI)"
3. Haz clic en el menú desplegable junto a "New Profile" y luego en "Import Profile"
4. Pega la URL del GitHub Gist o elige "Select File" para subir un archivo local
5. Haz clic en "Import" en la parte inferior del cuadro de diálogo para guardar el perfil
6. Por último, en la barra lateral, elige el nuevo perfil y haz clic en el ícono de check para activarlo
## Configuración e interfaz
### Menús de configuración
Accedé desde la Command Palette (⌘/Ctrl + Shift{" "}
* P), luego escribí "Cursor Settings"
Accedé desde la Command Palette (⌘/Ctrl + Shift{" "}
* P), luego escribí "Preferences: Open Settings (UI)"
### Actualizaciones de versión
Regularmente rebasemos Cursor sobre la última versión de VS Code para mantenernos al día
con las funciones y correcciones. Para garantizar la estabilidad, Cursor suele usar versiones
de VS Code ligeramente anteriores.
### Orientación de la Activity Bar
La pusimos horizontal para optimizar el espacio de la interfaz de chat con IA. Si la preferís vertical:
1. Abrí la Command Palette (⌘/Ctrl + Shift + P)
2. Buscá "Preferences: Open Settings (UI)"
3. Buscá `workbench.activityBar.orientation`
4. Configurá el valor en `vertical`
5. Reiniciá Cursor
# Diagramas de arquitectura
Source: https://docs.cursor.com/es/guides/tutorials/architectural-diagrams
Aprende a generar diagramas de arquitectura con Mermaid para visualizar la estructura del sistema y el flujo de datos
Los diagramas de arquitectura te ayudan a entender cómo funciona tu sistema. Podés usarlos para explorar la lógica, seguir el recorrido de los datos y comunicar la estructura. Cursor permite generar estos diagramas directamente con herramientas como Mermaid, así que podés pasar de código a visual en solo unos pocos prompts.
## Por qué importan los diagramas
Los diagramas aclaran cómo fluye la información y cómo interactúan los componentes. Son útiles cuando:
* Quieres entender el control de flujo en tu base de código
* Necesitas trazar el linaje de datos desde la entrada hasta la salida
* Estás incorporando a otras personas o documentando tu sistema
También son muy útiles para depurar y hacer preguntas más inteligentes. Las visualizaciones te ayudan (a ti y al modelo) a ver el panorama completo.
## Dos dimensiones a considerar
Hay varias maneras de enfocarlo:
* **Propósito**: ¿estás mapeando la lógica, el flujo de datos, la infraestructura u otra cosa?
* **Formato**: ¿quieres algo rápido (como un diagrama de Mermaid) o algo formal (como UML)?
## Cómo hacer prompts
Empieza con un objetivo claro. Aquí tienes algunas formas comunes de preguntar:
* **Control de flujo**: "Muéstrame cómo pasan las solicitudes del controlador a la base de datos."
* **Trazabilidad de datos**: "Sigue esta variable desde donde entra hasta donde termina."
* **Estructura**: "Dame una vista a nivel de componentes de este servicio."
Puedes incluir puntos de inicio y fin, o pedirle a Cursor que encuentre la ruta completa.
## Trabajar con Mermaid
Mermaid es fácil de aprender y se renderiza directamente en Markdown (con la extensión adecuada). Cursor puede generar diagramas como:
* `flowchart` para lógica y secuencias
* `sequenceDiagram` para interacciones
* `classDiagram` para estructuras de objetos
* `graph TD` para mapas direccionales simples
```mermaid theme={null}
sequenceDiagram
participant User
participant Server
participant Database
User->>Server: Enviar formulario
Server->>Database: Guardar registro
Database-->>Server: Correcto
Server-->>User: Confirmación
```
Puedes instalar la [extensión Mermaid](https://marketplace.cursorapi.com/items?itemName=bierner.markdown-mermaid) para obtener una vista previa de los diagramas.
1. Ve a la pestaña Extensions
2. Busca Mermaid
3. Instálala
## Estrategia de diagramas
Empieza en pequeño. No intentes mapear todo de una.
* Elige una función, ruta o proceso
* Pídele a Cursor que diagrame esa parte usando Mermaid
* Cuando tengas varias, pídele que las combine
Esto sigue el **modelo C4**: empiezas en un nivel bajo (código o componentes) y vas subiendo hacia vistas de mayor nivel.
### Flujo recomendado
1. Empieza con un diagrama detallado y de bajo nivel
2. Resúmelo en una vista de nivel intermedio
3. Repite hasta llegar al nivel de abstracción que quieres
4. Pídele a Cursor que los fusione en un solo diagrama o mapa del sistema
```mermaid theme={null}
graph TD
subgraph Nivel 1: Componentes de bajo nivel
A1[AuthService] --> A2[TokenValidator]
A1 --> A3[UserDB]
B1[PaymentService] --> B2[BillingEngine]
B1 --> B3[InvoiceDB]
end
subgraph Nivel 2: Sistemas de nivel intermedio
A[Sistema de usuarios] --> A1
B[Sistema de facturación] --> B1
end
subgraph Nivel 3: Aplicación de alto nivel
App[Aplicación principal] --> A
App --> B
end
```
## Conclusiones
* Usa diagramas para entender el flujo, la lógica y los datos
* Empieza con prompts pequeños y ve ampliando tu diagrama desde ahí
* Mermaid es el formato más fácil de usar en Cursor
* Empieza a bajo nivel y ve abstrayendo hacia arriba, igual que en el modelo C4
* Cursor puede ayudarte a generar, refinar y combinar diagramas con facilidad
# Cómo crear un servidor MCP
Source: https://docs.cursor.com/es/guides/tutorials/building-mcp-server
Aprende a crear un servidor del Model Context Protocol (MCP) con integración de PostgreSQL para Cursor
## Introducción
Los servidores MCP te permiten conectar fuentes de datos personalizadas y hacerlas disponibles para usarlas dentro de Cursor. Esto es especialmente útil cuando necesitás contexto de lugares como navegadores, bases de datos o registros de errores y del sistema. Configurar un servidor MCP es sencillo y, con Cursor, podés hacerlo rápido.
En esta guía, vamos a ver cómo crear un servidor MCP para Postgres. Nuestro objetivo es habilitar que Cursor ejecute consultas SQL directamente contra una base de datos Postgres y exponer los esquemas de tablas de forma estructurada.
Este tutorial está diseñado para enseñar los fundamentos de cómo crear servidores MCP.
```mermaid theme={null}
graph LR
A[Usuario en Cursor] --> B[Cursor]
B <--> C["Servidor MCP (stdio)"]
C <--> D[(Base de datos de Postgres)]
subgraph Máquina local
B
C
end
class B cursor
class C mcp
class D db
```
## ¿Qué es un servidor MCP?
Un [servidor MCP](/es/context/mcp) es un proceso que se comunica con Cursor y proporciona acceso a datos o acciones externas. Se puede implementar de varias maneras, pero aquí usaremos el método más simple: un servidor que se ejecuta localmente en tu computadora sobre [stdio](https://en.wikipedia.org/wiki/Standard_streams) (flujos estándar de entrada/salida). Esto evita consideraciones de seguridad complicadas y nos permite enfocarnos en la lógica de MCP en sí.
Uno de los casos de uso más comunes de MCP es el acceso a bases de datos. Al crear dashboards, ejecutar análisis o crear migraciones, a menudo es necesario consultar e inspeccionar una base de datos. Nuestro servidor MCP de Postgres admitirá dos capacidades fundamentales: ejecutar consultas arbitrarias y listar los esquemas de tablas.
Aunque ambas tareas podrían realizarse con SQL puro, MCP ofrece funciones que las hacen más potentes y, en general, más útiles. Las herramientas proporcionan una forma de exponer acciones como ejecutar consultas, mientras que los recursos nos permiten compartir contexto estandarizado, como la información de esquemas. Más adelante en esta guía también veremos prompts, que habilitan flujos de trabajo más avanzados.
Bajo el capó, usaremos el paquete npm postgres para ejecutar sentencias SQL contra la base de datos. El SDK de MCP actuará como un contenedor alrededor de estas llamadas, permitiéndonos integrar la funcionalidad de Postgres sin fricciones en Cursor.
## Cómo crear el servidor MCP
El primer paso para crear el servidor es configurar un proyecto nuevo. Vamos a empezar creando una carpeta nueva e inicializando un proyecto de Bun
```bash theme={null}
> mkdir postgres-mcp-server
> Bun init
```
Desde aquí, vamos a seleccionar el proyecto `Blank`. Una vez que nuestro boilerplate esté configurado, necesitamos instalar las dependencias necesarias. `zod` es necesario para definir esquemas de i/o en el SDK de MCP
```bash theme={null}
bun add postgres @modelcontextprotocol/sdk zod
```
Desde aquí, iremos a los repositorios de cada una de las librerías y obtendremos el enlace al contenido sin procesar de los respectivos archivos README. Usaremos esos como contexto al construir el servidor
* `postgres`
* Repo: [https://github.com/porsager/postgres](https://github.com/porsager/postgres),
* README: [https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md](https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md)
* `@modelcontextprotocol/sdk`:
* Repo: [https://github.com/modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)
* README: [https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md](https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md)
Ahora definiremos cómo queremos que se comporte el servidor. Para hacerlo, crearemos un `spec.md` y escribiremos los objetivos generales
```markdown theme={null}
# Especificación
- Permitir definir DATABASE_URL mediante la configuración de entorno de MCP
- Consultar datos de Postgres a través de la herramienta
- De forma predeterminada, en modo solo lectura
- Permitir operaciones de escritura estableciendo la variable de entorno `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Acceder a las tablas como `resources`
- Usar Zod para las definiciones de esquema
```
Como puedes ver, es una especificación bastante ligera. Siéntete libre de agregar más detalles según sea necesario. Junto con los enlaces del README, construiremos el prompt final.
```markdown theme={null}
Lee lo siguiente y sigue @spec.md para entender lo que queremos. Todas las dependencias necesarias están instaladas
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
```
Con estos tres componentes listos (la especificación, la documentación del SDK de MCP y la documentación de la biblioteca de Postgres), podemos usar Cursor para crear el scaffolding de la implementación del servidor. Cursor nos va a ayudar a encajar las piezas, generando el código que conecta el SDK de MCP con Postgres.
Después de varios idas y vueltas con los prompts, ya tenemos una primera versión del servidor MCP funcionando. Para probarla, podemos usar el [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector)
```bash theme={null}
npx @modelcontextprotocol/inspector bun run index.ts
```
## Probar el servidor MCP
Una vez completada la implementación inicial, podemos probarla con el MCP Inspector. El inspector permite ver qué expone el servidor y verificar que las herramientas y los recursos se comporten como se espera. También conviene confirmar que las consultas se ejecutan y que la información del esquema se devuelve correctamente.
Cuando todo se vea bien, podemos conectar el servidor a Cursor y probarlo en un entorno real. En ese punto, Cursor podrá usar el servidor MCP de Postgres como si fuera una capacidad integrada, permitiéndonos consultar e inspeccionar la base de datos directamente.
## Próximos pasos
Ejecutar el servidor MCP localmente por stdio es un gran punto de partida, pero los equipos a menudo necesitan acceso compartido a la misma base de datos a través de su servidor MCP. En esos casos, desplegar el servidor MCP como un servicio HTTP centralizado se vuelve necesario.
Un servidor MCP desplegado ofrece varias ventajas frente a instancias individuales por stdio:
* **Acceso compartido a la base de datos:** Varias personas del equipo pueden consultar la misma instancia de base de datos desde Cursor
* **Configuración centralizada:** Las actualizaciones del esquema y los cambios de permisos se gestionan en un solo lugar
* **Seguridad mejorada:** Se pueden implementar autenticación, limitación de solicitudes y controles de acceso adecuados
* **Observabilidad:** Los patrones de uso y las métricas de rendimiento se pueden monitorear en todo el equipo
Para lograrlo, cambiarías el método de transporte de stdio a HTTP.
Aunque no cubriremos toda la configuración, aquí tienes un buen prompt inicial que puedes darle a Cursor
```
Basándote en el servidor MCP existente, crea un archivo nuevo que implemente el protocolo HTTP.
Mueve la lógica compartida a mcp-core y asigna un nombre a cada implementación de transporte (mcp-server-stdio, mcp-server-http)
@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
```
Los resultados finales pueden verse aquí: [pg-mcp-server](https://github.com/ericzakariasson/pg-mcp-server)
```mermaid theme={null}
graph LR
subgraph Team_Network_or_Cloud["VPC"]
SVC["Servidor MCP (transporte HTTP)"] <--> DB[(Base de datos Postgres)]
end
Dev1["Dev 1 en Cursor"] -->|HTTP| SVC
Dev2["Dev 2 en Cursor"] -->|HTTP| SVC
Dev3["Dev 3 en Cursor"] -->|HTTP| SVC
subgraph SVC_Internals["Internals"]
direction TB
T1["Auth y ACL"]
T2["Rate limiting y logging"]
T3["Tool: query"]
T4["Resource: table_schemas"]
T5["Prompts"]
T1 --> T2 --> T3
T3 --> T4
T3 --> T5
end
SVC --> SVC_Internals
class SVC svc
class DB db
class T1,T2,T3,T4,T5 internals
class Dev1,Dev2,Dev3 dev
```
# Desarrollo web
Source: https://docs.cursor.com/es/guides/tutorials/web-development
Cómo configurar Cursor para el desarrollo web
export const McpInstallButtonPrimary = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
El desarrollo web implica iteraciones rápidas y ciclos de feedback ajustados entre Cursor y herramientas externas como Figma o el navegador. En Cursor, hemos dado con flujos de trabajo que acortan este ciclo. Definir bien el alcance de las tareas, reutilizar componentes y apoyarse en sistemas de diseño ayuda a mantener todo rápido y consistente.
Esta guía explica cómo configurar Cursor para potenciar el desarrollo web y acortar el ciclo de feedback.
```mermaid theme={null}
graph LR
A[Proyecto] --> B[Diseño]
B --> C[Código]
C -- Pruebas --> D[Verificación]
D -- Retroalimentación --> C
```
# Empieza a orquestar en Cursor
**Chat** va genial para poner en marcha cambios. Cuando las piezas principales ya están, pasar a **Inline Edit** y **Tab** te ayuda a mantener el flow.
Después de configurar Cursor, vas a poder orquestar flujos de trabajo entre distintas herramientas. Aquí tienes una demo de lo que se puede hacer: un juego de la serpiente creado combinando Linear, Figma y herramientas del navegador. Aunque los proyectos reales suelen ser más complejos, este ejemplo muestra el potencial de estos flujos de trabajo integrados.
# Conecta tus herramientas de gestión de proyectos
Podés integrar Cursor en tu software de gestión de proyectos existente usando distintas herramientas. En esta guía, vamos a ver cómo integrar Linear con su servidor MCP.
### Instalación
O agregá manualmente el servidor MCP de Linear en `mcp.json`:
```jsx theme={null}
{
"mcpServers": {
"Linear": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.linear.app/sse"
]
}
}
}
```
Then:
1. Asegúrate de habilitar Linear desde la configuración de MCP
2. Se abrirá el navegador web y se te pedirá que autorices con Linear
Debido al estado actual de MCP, la configuración puede requerir varios intentos.
Si la integración no está funcionando, intenta “Reload” del servidor desde la configuración de Cursor.
### Usar Linear en Cursor
Los servidores MCP de Linear exponen distintas herramientas que Cursor puede usar para leer y gestionar incidencias. Ve a la configuración de MCP y localiza el servidor de Linear para ver la lista de todas las herramientas. Para verificar, prueba este prompt en Chat:
```jsx theme={null}
lista todos los issues relacionados con este proyecto
```
Debería devolver una lista de incidencias si la integración está configurada correctamente.
# Importá tus diseños de Figma
Los diseños y los mockups son fundamentales para el desarrollo web. Con el servidor MCP oficial para Figma, podés acceder directamente a los archivos de diseño y trabajar con ellos en Cursor. Para empezar, seguí las instrucciones de configuración en [Figma Dev Mode MCP Server](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
### Instalación
Podés hacer clic en el botón de abajo para instalar el servidor MCP.
O agregalo manualmente a tu `mcp.json`:
```jsx theme={null}
{
"mcpServers": {
"Figma": {
"url": "http://127.0.0.1:3845/sse"
}
}
}
```
### Uso
El servidor expone varias herramientas que podés usar en tus prompts. Por ejemplo, probá pedir los diseños de la selección actual en Figma. Leé más en la [documentación](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
# Mantén coherente el scaffolding de tu código
Probablemente ya tengas código existente, un sistema de diseño o convenciones establecidas que quieres reutilizar. Al trabajar con modelos, es útil hacer referencia a patrones que ya están en tu codebase, como menús desplegables u otros componentes comunes.
Trabajando nosotros mismos en una codebase web grande, hemos descubierto que el código declarativo funciona especialmente bien, en particular con React y JSX.
Si tienes un sistema de diseño, puedes ayudar al agente a descubrirlo proporcionando una regla para ese sistema. Aquí tienes un archivo `ui-components.mdc` donde intentamos aplicar la reutilización de componentes siempre que sea posible:
```mdc components.mdc theme={null}
---
description: Implementar diseños y construir la UI
---
- reutiliza componentes de UI existentes de `/src/components/ui`. estos son los primitivos con los que podemos construir
- crea nuevos componentes orquestando componentes de UI si no encuentras ninguno existente que resuelva el problema
- pregúntale a la persona cómo quiere proceder cuando falten componentes o diseños
```
A medida que tu biblioteca de componentes crezca, ve añadiendo nuevas reglas según corresponda. Cuando las reglas sean demasiadas, plantéate dividirlas en categorías más específicas, como “aplicar solo cuando se trabaje con entradas de usuario”.
# Dale a Cursor acceso al navegador
Para ampliar las capacidades de Cursor, podés configurar el servidor MCP de Browser Tools, que ofrece acceso a los registros de la consola y a las solicitudes de red. Una vez configurado, podés verificar tus cambios monitoreando la salida de la consola y la actividad de la red. Esta configuración ayuda a garantizar que tu implementación coincida con tu intención. Seguí las instrucciones acá para configurar el servidor MCP: [https://browsertools.agentdesk.ai/installation](https://browsertools.agentdesk.ai/installation)
Estamos trabajando para que sea más fácil integrarlo de forma nativa en Cursor.
# Conclusiones
* Los ciclos de feedback rápidos son esenciales en el desarrollo web. Usá Cursor junto con herramientas como Figma, Linear y el navegador para moverte rápido y mantener el flow.
* Los servidores MCP te permiten integrar sistemas externos directamente en Cursor, reduciendo el cambio de contexto y mejorando la ejecución de tareas.
* Reutilizar componentes y sistemas de diseño ayuda al modelo a producir código y resultados más limpios y consistentes.
* Tareas claras y bien acotadas llevan a mejores resultados. Sé intencional con cómo pedís y qué pedís.
* Si no estás obteniendo buenos resultados, intentá ajustar:
* **Instrucciones:** Usá reglas, prompts y dale acceso a más contexto, por ejemplo, con servidores MCP.
* **Sistemas:** Patrones, abstracciones y claridad facilitan que el modelo entienda, ayude y trabaje de forma más autónoma.
* Podés extender el contexto del modelo incluyendo info de runtime como logs de consola, requests de red y datos de elementos de UI.
* No todo tiene que estar automatizado. Si tu sistema se vuelve demasiado complejo, volvé a ediciones más quirúrgicas con Tab e Inline Edit.
* Cursor es más potente cuando es copiloto, no piloto automático. Usalo para mejorar, no para reemplazar, tu propia toma de decisiones.
# Working with Context
Source: https://docs.cursor.com/es/guides/working-with-context
Cómo trabajar con el contexto en Cursor
Primero, ¿qué es una ventana de contexto? ¿Y cómo se relaciona con programar de forma efectiva con Cursor?
Tomando un poco de perspectiva, un modelo de lenguaje grande (LLM) es un modelo de inteligencia artificial entrenado para predecir y generar texto aprendiendo patrones a partir de conjuntos de datos masivos. Impulsa herramientas como Cursor al entender tu entrada y sugerir código o texto según lo que ha visto antes.
Los tokens son las entradas y salidas de estos modelos. Son fragmentos de texto, a menudo una parte de una palabra, que un LLM procesa uno por uno. Los modelos no leen oraciones completas de una vez; predicen el siguiente token en función de los anteriores.
Para ver cómo se tokeniza un texto, puedes usar un tokenizador como [este](https://tiktokenizer.vercel.app/).
# ¿Qué es el contexto?
Cuando generamos una sugerencia de código en Cursor, “contexto” se refiere a la información que se le proporciona al modelo (en forma de “tokens de entrada”) y que el modelo usa para predecir la información siguiente (en forma de “tokens de salida”).
Hay dos tipos de contexto:
1. **Contexto de intención** define lo que el usuario quiere obtener del modelo. Por ejemplo, un system prompt normalmente sirve como instrucciones de alto nivel sobre cómo el usuario quiere que el modelo se comporte. La mayor parte del “prompting” que se hace en Cursor es contexto de intención. “Cambia ese botón de azul a verde” es un ejemplo de intención declarada; es prescriptivo.
2. **Contexto de estado** describe el estado del mundo actual. Proporcionar a Cursor mensajes de error, registros de consola, imágenes y fragmentos de código son ejemplos de contexto relacionado con el estado. Es descriptivo, no prescriptivo.
Juntos, estos dos tipos de contexto trabajan en armonía al describir el estado actual y el estado futuro deseado, lo que permite a Cursor hacer sugerencias de código útiles.
```mermaid theme={null}
flowchart LR
A["Intención (lo que quieres)"] --> C[Modelo]
B["Estado (lo que es cierto)"] --> C
C -- Predice --> D["Acción (lo que hace)"]
```
# Proporcionar contexto en Cursor
Cuanto más contexto relevante le des a un modelo, más útil será. Si no se proporciona suficiente contexto en Cursor, el modelo intentará resolver la tarea sin la información necesaria. Esto suele resultar en:
1. Alucinaciones donde el modelo intenta hacer pattern matching (cuando no hay un patrón), lo que provoca resultados inesperados. Esto puede suceder con frecuencia en modelos como `claude-3.5-sonnet` cuando no reciben suficiente contexto.
2. El Agent intentando reunir contexto por su cuenta buscando en el código, leyendo archivos y llamando a herramientas. Un modelo con strong thinking (como `claude-3.7-sonnet`) puede llegar bastante lejos con esta estrategia, y proporcionar el contexto inicial correcto marcará la trayectoria.
La buena noticia es que Cursor está construido con conciencia contextual en su núcleo y está diseñado para requerir una intervención mínima por parte del usuario. Cursor extrae automáticamente las partes de tu base de código que el modelo estima relevantes, como el archivo actual, patrones semánticamente similares en otros archivos y otra información de tu sesión.
Aun así, hay mucho contexto del que se puede tirar, así que especificar manualmente el contexto que sabes que es relevante para la tarea es una forma útil de orientar a los modelos en la dirección correcta.
## Símbolo @
La forma más fácil de aportar contexto explícito es con el símbolo @. Van genial cuando sabes exactamente qué archivo, carpeta, sitio web u otro elemento de contexto quieres incluir. Cuanto más específico puedas ser, mejor. Aquí tienes un desglose de cómo ser más preciso con el contexto:
| Símbolo | Ejemplo | Caso de uso | Desventaja |
| --------- | -------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| `@code` | `@LRUCachedFunction` | Sabes qué función, constante o símbolo es relevante para el resultado que estás generando | Requiere conocer muy bien la base de código |
| `@file` | `cache.ts` | Sabes qué archivo debe leerse o editarse, pero no exactamente en qué parte del archivo | Puede incluir mucho contexto irrelevante para la tarea en cuestión según el tamaño |
| `@folder` | `utils/` | Todo o la mayoría de los archivos de una carpeta son relevantes | Puede incluir mucho contexto irrelevante para la tarea en cuestión |
## Reglas
Pensá en las reglas como una memoria a largo plazo a la que querés que vos u otros miembros de tu equipo puedan acceder. Capturar contexto específico del dominio —incluidos flujos de trabajo, formatos y otras convenciones— es un excelente punto de partida para redactar reglas.
También podés generar reglas a partir de conversaciones existentes usando `/Generate Cursor Rules`. Si tuviste una conversación larga, con mucho ida y vuelta y muchos prompts, probablemente haya directrices útiles o reglas generales que quieras reutilizar después.
## MCP
[Model Context Protocol](https://modelcontextprotocol.io/introduction) es una capa de extensibilidad donde podés darle a Cursor capacidades para ejecutar acciones e incorporar contexto externo.
Según tu entorno de desarrollo, quizá quieras aprovechar distintos tipos de servidores, pero dos categorías que vimos especialmente útiles son:
* **Documentación interna**: p. ej., Notion, Confluence, Google Docs
* **Gestión de proyectos**: p. ej., Linear, Jira
Si ya tenés herramientas para acceder a contexto y ejecutar acciones mediante una API, podés construir un servidor MCP para eso. Acá hay una guía breve sobre cómo crear [servidores MCP](https://modelcontextprotocol.io/tutorials/building-mcp-with-llms).
## Auto-recolección de contexto
Un patrón potente que muchxs usuarios están adoptando es dejar que el Agent escriba herramientas efímeras que luego pueda ejecutar para reunir más contexto. Esto es especialmente efectivo en flujos con humano en el bucle (human-in-the-loop) donde revisas el código antes de que se ejecute.
Por ejemplo, añadir sentencias de depuración a tu código, ejecutarlo y dejar que el modelo inspeccione la salida le da acceso a contexto dinámico que no podría inferir de forma estática.
En Python, puedes hacer esto pidiéndole al Agent que:
1. Añada print("debugging: ...") en partes relevantes del código
2. Ejecute el código o las pruebas usando la terminal
El Agent leerá la salida de la terminal y decidirá qué hacer después. La idea central es darle al Agent acceso al comportamiento real en tiempo de ejecución, no solo al código estático.
# Conclusiones
* El contexto es la base de una codificación con IA efectiva y está compuesto por la intención (lo que querés) y el estado (lo que existe). Incluir ambos ayuda a Cursor a hacer predicciones precisas.
* Usá contexto quirúrgico con símbolos @ (@code, @file, @folder) para guiar a Cursor con precisión, en vez de depender solo de la recolección automática de contexto.
* Capturá el conocimiento repetible en reglas para reutilizarlo a nivel de equipo y ampliá las capacidades de Cursor con Model Context Protocol para conectar sistemas externos.
* Un contexto insuficiente lleva a alucinaciones o ineficiencia, mientras que demasiado contexto irrelevante diluye la señal. Encontrá el equilibrio adecuado para obtener resultados óptimos.
# Edición inline
Source: https://docs.cursor.com/es/inline-edit/overview
Edita y pregunta con Edición inline (Cmd/Ctrl+K) en Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Inline Edit te permite editar código o hacer preguntas directamente en tu editor con Cmd+K, lo que abre un campo de entrada donde el código que selecciones y tus instrucciones forman tu solicitud.
## Modos
### Editar selección
Con código seleccionado, Cmd+K edita ese código específico según tus instrucciones.
Sin selección, Cursor genera código nuevo en la posición del cursor. La IA incluye el código circundante relevante como contexto. Por ejemplo, activarlo sobre el nombre de una función incluye la función completa.
### Pregunta rápida
Presiona Opt+Return en el editor en línea para hacer preguntas sobre el código seleccionado.
Después de obtener una respuesta, escribe "do it" u otra frase similar para convertir la sugerencia en código. Esto te permite explorar ideas antes de implementarlas.
### Ediciones de archivo completo
Para cambios en todo el archivo, usa Cmd+Shift+Return. Este modo permite cambios de gran alcance manteniendo el control.
### Enviar al chat
Para ediciones en múltiples archivos o funciones avanzadas, usa Cmd+L para enviar el código seleccionado a [Chat](/es/agent/modes#agent). Esto ofrece edición en múltiples archivos, explicaciones detalladas y capacidades avanzadas de IA.
## Instrucciones de seguimiento
Después de cada edición, afina los resultados añadiendo instrucciones y presionando Return. La IA aplicará los cambios según tu feedback.
Cursor genera mensajes de commit a partir de los cambios en stage.
1. Pon en stage los archivos que quieras commitear
2. Abrí la pestaña de Git en la barra lateral
3. Hacé clic en el ícono de brillo (✨) junto al campo del mensaje de commit
Los mensajes generados usan los cambios en stage y el historial de Git del repositorio. Si usás convenciones como [Conventional Commits](https://www.conventionalcommits.org/), los mensajes siguen el mismo patrón.
### Agregar atajo
Para asignarlo a un atajo de teclado:
1. Andá a Atajos de Teclado (Cmd+R Cmd+S o Cmd+Shift+P y buscá "Open Keyboard Shortcuts (JSON)")
2. Agregá este binding para Cmd+M:
```json theme={null}
{
"key": "cmd+m",
"command": "cursor.generateGitCommitMessage"
}
```
3. Guardá
No podés personalizar la generación del mensaje de commit. Cursor se adapta a tu estilo de commits.
## Resolver conflictos con IA
Cuando se producen conflictos de merge, Cursor Agent puede ayudar a resolverlos al comprender ambos lados del conflicto y proponer una resolución.
### Cómo usarlo
1. Cuando se produzca un conflicto de merge, verás los marcadores de conflicto en tu archivo
2. Haz clic en el botón **Resolve in Chat** que aparece en la interfaz del conflicto de merge
3. Agent analizará ambas versiones y sugerirá una resolución
4. Revisa los cambios propuestos y aplícalos
# GitHub
Source: https://docs.cursor.com/es/integrations/github
App oficial de Cursor para GitHub para agentes en segundo plano
[Background Agents](/es/background-agent) y [Bugbot](/es/bugbot) necesitan la app de GitHub de Cursor para clonar repositorios y enviar cambios.
## Instalación
1. Ve a [Integrations in Dashboard](https://cursor.com/dashboard?tab=integrations)
2. Haz clic en **Connect** junto a GitHub
3. Elige entre **All repositories** o **Selected repositories**
Para desconectar tu cuenta de GitHub, vuelve al panel de integraciones y haz clic en **Disconnect Account**.
## Usar Agent en GitHub
La integración con GitHub habilita flujos de trabajo de agentes en segundo plano directamente desde pull requests e issues. Podés activar un agente para leer el contexto, aplicar correcciones y hacer push de commits comentando `@cursor [prompt]` en cualquier PR o issue.
Si tenés [Bugbot](/es/bugbot) habilitado, podés comentar `@cursor fix` para leer la corrección sugerida por Bugbot y activar un agente en segundo plano que resuelva el problema.
## Permisos
La app de GitHub requiere permisos específicos para trabajar con agentes en segundo plano:
| Permiso | Propósito |
| ------------------------- | -------------------------------------------------------------------------- |
| **Acceso al repositorio** | Clonar tu código y crear ramas de trabajo |
| **Pull requests** | Crear PR con cambios del agente para tu revisión |
| **Issues** | Hacer seguimiento de errores y tareas que los agentes descubren o corrigen |
| **Checks and statuses** | Informar sobre la calidad del código y los resultados de las pruebas |
| **Actions and workflows** | Supervisar pipelines de CI/CD y el estado del despliegue |
Todos los permisos siguen el principio de mínimo privilegio necesario para la funcionalidad de los agentes en segundo plano.
## Configuración de la lista de IP permitidas
Si tu organización usa la función de lista de IP permitidas de GitHub para restringir el acceso a tus repositorios, primero tienes que contactar al soporte para habilitar esta funcionalidad para tu equipo.
### Contactar al soporte
Antes de configurar las listas de IP permitidas, contacta a [hi@cursor.com](mailto:hi@cursor.com) para habilitar esta función para tu equipo. Esto es obligatorio para ambos métodos de configuración a continuación.
### Habilitar la configuración de la lista de IP permitidas para las GitHub Apps instaladas (recomendado)
La app de GitHub de Cursor ya tiene la lista de IP preconfigurada. Puedes habilitar la lista de permitidos para las apps instaladas y heredar automáticamente esta lista. Este es el **enfoque recomendado**, ya que nos permite actualizar la lista y tu organización recibe las actualizaciones automáticamente.
Para habilitar esto:
1. Ve a la configuración de Seguridad de tu organización
2. Ve a la configuración de la lista de IP permitidas
3. Marca **"Allow access by GitHub Apps"**
Para ver instrucciones detalladas, consulta la [documentación de GitHub](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#allowing-access-by-github-apps).
### Agregar IP directamente a tu lista de permitidos
Si tu organización usa listas de permitidos definidas por un IdP en GitHub o por algún motivo no puede usar la lista preconfigurada, puedes agregar manualmente las direcciones IP:
```
184.73.225.134
3.209.66.12
52.44.113.131
```
La lista de direcciones IP puede cambiar esporádicamente. A los equipos que usan listas de permitidos de IP se les avisará con anticipación antes de agregar o quitar direcciones IP.
## Solución de problemas
* Instala la app de GitHub con acceso al repositorio
* Revisa los permisos del repositorio para repos privados
* Verifica los permisos de tu cuenta de GitHub
* Dale a la app acceso de escritura a los pull requests
* Revisa las reglas de protección de ramas
* Reinstala si la instalación de la app venció
* Revisa si está instalada a nivel de organización
* Reinstala desde [github.com/apps/cursor](https://github.com/apps/cursor)
* Contacta al soporte si la instalación está dañada
# Linear
Source: https://docs.cursor.com/es/integrations/linear
Trabaja con Background Agents desde Linear
Usa [Background Agents](/es/background-agent) directamente desde Linear delegando tareas a Cursor o mencionando `@Cursor` en los comentarios.
## Empezá
### Instalación
Tenés que ser admin de Cursor para conectar la integración con Linear. Otras configuraciones del equipo están disponibles para miembros que no son admins.
1. Andá a [Integraciones de Cursor](https://www.cursor.com/en/dashboard?tab=integrations)
2. Hacé clic en *Connect* junto a Linear
3. Conectá tu workspace de Linear y seleccioná el team
4. Hacé clic en *Authorize*
5. Completá cualquier configuración pendiente del Background Agent en Cursor:
* Conectá GitHub y seleccioná el repositorio predeterminado
* Activá el pricing basado en uso
* Confirmá la configuración de privacidad
### Vinculación de cuenta
En el primer uso se te pide vincular las cuentas entre Cursor y Linear. Se requiere la conexión a GitHub para crear PR.
## Cómo usar
Delegá issues a Cursor o mencioná `@Cursor` en los comentarios. Cursor analiza los issues y filtra automáticamente el trabajo que no es de desarrollo.
### Delegar issues
1. Abrí el issue en Linear
2. Hacé clic en el campo de asignación
3. Seleccioná "Cursor"
### Mencionar a Cursor
Mencioná `@Cursor` en un comentario para asignar un nuevo agente o dar instrucciones adicionales, por ejemplo: `@Cursor, solucioná el bug de autenticación descrito arriba`.
## Flujo de trabajo
Los Background Agents muestran el estado en tiempo real en Linear y crean PR automáticamente cuando finalizan. Seguí el progreso en el [dashboard de Cursor](https://www.cursor.com/dashboard?tab=background-agents).
### Instrucciones de seguimiento
Podés responder en la sesión del agente y se enviará como un seguimiento al propio agente. Simplemente mencioná `@Cursor` en un comentario de Linear para darle indicaciones adicionales a un Background Agent en ejecución.
## Configuración
Configurá los ajustes de Background Agents desde [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
| Setting | Location | Description |
| :--------------------- | :--------------- | :------------------------------------------------------------------------- |
| **Default Repository** | Cursor Dashboard | Repositorio principal cuando no hay un repositorio de proyecto configurado |
| **Default Model** | Cursor Dashboard | Modelo de IA para Background Agents |
| **Base Branch** | Cursor Dashboard | Rama desde la que crear PR (normalmente `main` o `develop`) |
### Opciones de configuración
Podés configurar el comportamiento de Background Agents usando varios métodos:
**Descripción del issue o comentarios**: Usá la sintaxis `[key=value]`, por ejemplo:
* `@cursor please fix [repo=anysphere/everysphere]`
* `@cursor implement feature [model=claude-3.5-sonnet] [branch=feature-branch]`
**Etiquetas del issue**: Usá una estructura de etiquetas padre-hijo donde la etiqueta padre es la clave de configuración y la etiqueta hija es el valor.
**Etiquetas del proyecto**: Misma estructura padre-hijo que las etiquetas del issue, aplicada a nivel de proyecto.
Claves de configuración admitidas:
* `repo`: Especificá el repositorio de destino (p. ej., `owner/repository`)
* `branch`: Especificá la rama base para la creación del PR
* `model`: Especificá el modelo de IA a usar
### Selección de repositorio
Cursor determina en qué repositorio trabajar usando este orden de prioridad:
1. **Descripción/comentarios del issue**: Sintaxis `[repo=owner/repository]` en el texto del issue o comentarios
2. **Etiquetas del issue**: Etiquetas de repositorio asociadas al issue específico de Linear
3. **Etiquetas del proyecto**: Etiquetas de repositorio asociadas al proyecto de Linear
4. **Repositorio predeterminado**: Repositorio especificado en la configuración del dashboard de Cursor
#### Configuración de etiquetas de repositorio
Para crear etiquetas de repositorio en Linear:
1. Andá a **Settings** en tu espacio de trabajo de Linear
2. Hacé clic en **Labels**
3. Hacé clic en **New group**
4. Nombrá el grupo "repo" (no distingue mayúsculas/minúsculas; debe ser exactamente "repo", no "Repository" ni otras variaciones)
5. Dentro de ese grupo, creá etiquetas para cada repositorio usando el formato `owner/repo`
Después podés asignar estas etiquetas a issues o proyectos para especificar en qué repositorio debería trabajar el Background Agent.
{/* ### Getting help
Check [agent activity](https://www.cursor.com/dashboard?tab=background-agents) and include request IDs when contacting support.
## Feedback
Share feedback through Linear comments or your Cursor dashboard support channels. */}
# Slack
Source: https://docs.cursor.com/es/integrations/slack
Trabajá con agentes en segundo plano desde Slack
export const SlackThread = ({messages = []}) => {
const MessageWithMentions = ({text}) => {
const parts = text.split(/(@\w+)/g);
return <>
{parts.map((part, index) => {
if (part.startsWith('@')) {
return
{part}
;
}
return {part};
})}
>;
};
return
;
};
Con la integración de Cursor para Slack, podés usar [Background Agents](/es/background-agent) para trabajar en tus tareas directamente desde Slack mencionando junto con un prompt.
## Empezá
### Instalación
1. Andá a [Cursor integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Hacé clic en *Connect* junto a Slack o andá a la [installation page](https://cursor.com/api/install-slack-app) desde acá
3. Se te va a pedir que instales la app de Cursor para Slack en tu workspace.
4. Después de instalar en Slack, vas a ser redirigido a Cursor para finalizar la configuración
1. Conectá GitHub (si todavía no está conectado) y elegí un repositorio predeterminado
2. Activá el pricing basado en uso
3. Confirmá la configuración de privacidad
5. Empezá a usar Background Agents en Slack mencionando
## Cómo usar
Mencioná a y pasale tu prompt. Esto cubre la mayoría de los casos de uso, pero también podés usar los comandos de abajo para personalizar tu agente.
Por ejemplo, mencioná directamente en la conversación, o usá comandos específicos como para apuntar a un repositorio en particular.
### Comandos
Ejecutá para ver una lista de comandos actualizada.
| Command | Description |
| :---------------------------------------------------------- | :----------------------------------------------------------------------------------------------- |
| | Inicia un Background Agent. En hilos con agentes existentes, agrega instrucciones de seguimiento |
| | Configurá los valores predeterminados y el repositorio predeterminado del canal |
| | Usá opciones avanzadas: `branch`, `model`, `repo` |
| | Forzá la creación de un agente nuevo en un hilo |
| | Mostrá tus agentes en ejecución |
#### Opciones
Personalizá el comportamiento del Background Agent con estas opciones:
| Option | Description | Example |
| :------- | :------------------------------------------------ | :---------------- |
| `branch` | Especificá la rama base | `branch=main` |
| `model` | Elegí el modelo de IA | `model=o3` |
| `repo` | Apuntá a un repositorio específico | `repo=owner/repo` |
| `autopr` | Habilitá/deshabilitá la creación automática de PR | `autopr=false` |
##### Formatos de sintaxis
Podés usar las opciones de varias maneras:
1. **Formato con corchetes**
2. **Formato inline**
##### Precedencia de opciones
Al combinar opciones:
* Los valores explícitos sobrescriben los predeterminados
* Los valores posteriores sobrescriben a los anteriores si están duplicados
* Las opciones inline tienen prioridad sobre los valores predeterminados del modal de configuración
El bot analiza opciones desde cualquier parte del mensaje, permitiendo escribir comandos de forma natural.
#### Uso del contexto del hilo
Los Background Agents entienden y usan el contexto de las discusiones existentes en el hilo. Es útil cuando tu equipo está discutiendo un problema y querés que el agente implemente la solución basada en esa conversación.
Los Background Agents leen el hilo completo para obtener contexto cuando se invocan,
entendiendo e implementando soluciones basadas en la discusión del equipo.
#### Cuándo usar comandos forzados
**¿Cuándo necesito ?**
En hilos con agentes existentes, agrega instrucciones de seguimiento (solo funciona si sos el dueño del agente). Usá para lanzar un agente aparte.
**¿Cuándo necesito `Add follow-up` (desde el menú contextual)?**
Usá el menú contextual (⋯) en la respuesta de un agente para dar instrucciones de seguimiento. Es útil cuando hay varios agentes en un hilo y necesitás especificar a cuál darle seguimiento.
### Actualizaciones de estado y handoff
Cuando se ejecuta el Background Agent, primero vas a ver la opción *Open in Cursor*.
Cuando Background Agent termina, recibes una notificación en Slack y la opción de ver el PR creado en GitHub.
### Administración de agentes
Para ver todos los agentes en ejecución, ejecuta .
Gestiona los Background Agents usando el menú contextual haciendo clic en los tres puntos (⋯) en cualquier mensaje del agente.
Opciones disponibles:
* **Add follow-up**: agregar instrucciones a un agente existente
* **Delete**: detener y archivar el Background Agent
* **View request ID**: ver el ID de solicitud único para solucionar problemas (inclúyelo al contactar con soporte)
* **Give feedback**: enviar comentarios sobre el rendimiento del agente
## Configuración
Administra la configuración predeterminada y las opciones de privacidad desde [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
### Configuración
#### Modelo predeterminado
Se usa cuando no se especifica explícitamente un modelo con . Consulta la [configuración](https://www.cursor.com/dashboard?tab=background-agents) para ver las opciones disponibles.
#### Repositorio predeterminado
Se usa cuando no se especifica un repositorio. Usa estos formatos:
* `https://github.com/org/repository`
* `org/repository`
Si haces referencia a un repositorio que no existe, parecerá que no tienes
acceso. Esto se muestra en el mensaje de error cuando Background Agent no logra iniciarse.
#### Rama base
Rama inicial para Background Agent. Déjalo en blanco para usar la rama predeterminada del repositorio (normalmente `main`)
### Configuración del canal
Configura valores predeterminados a nivel de canal usando . Estas configuraciones son por equipo y sustituyen tus valores predeterminados personales para ese canal.
Es especialmente útil cuando:
* Distintos canales trabajan en diferentes repositorios
* Los equipos quieren configuraciones coherentes para todos los miembros
* Quieres evitar especificar el repositorio en cada comando
Para configurar la configuración del canal:
1. Ejecuta en el canal deseado
2. Establece el repositorio predeterminado para ese canal
3. Todos los miembros del equipo que usen Background Agents en ese canal usarán estos valores predeterminados
La configuración del canal tiene prioridad sobre los valores predeterminados personales, pero puede sobrescribirse
con opciones explícitas como{" "}
### Privacidad
Los Background Agents admiten el Modo de Privacidad.
Lee más sobre el [Modo de Privacidad](https://www.cursor.com/privacy-overview) o administra tu [configuración de privacidad](https://www.cursor.com/dashboard?tab=background-agents).
El Modo de Privacidad (Legacy) no es compatible. Los Background Agents requieren
almacenamiento temporal de código mientras se ejecutan.
#### Mostrar resumen del agente
Muestra resúmenes del agente e imágenes de diferencias. Puede contener rutas de archivos o fragmentos de código. Se puede activar/desactivar.
#### Mostrar resumen del agente en canales externos
Para Slack Connect con otros espacios de trabajo o canales con miembros externos como invitados, elige si quieres mostrar resúmenes del agente en canales externos.
## Permisos
Cursor solicita estos permisos de Slack para que los Background Agents funcionen en tu espacio de trabajo:
| Permission | Description |
| :------------------ | :------------------------------------------------------------------------------------------------------------- |
| `app_mentions:read` | Detecta @mentions para iniciar Background Agents y responder a solicitudes |
| `channels:history` | Lee mensajes anteriores en hilos para aportar contexto al agregar instrucciones de seguimiento |
| `channels:join` | Se une automáticamente a canales públicos cuando lo invitan o lo solicitan |
| `channels:read` | Accede a metadatos de canales (IDs y nombres) para publicar respuestas y actualizaciones |
| `chat:write` | Envía actualizaciones de estado, notificaciones de finalización y enlaces a PR cuando los agentes terminan |
| `files:read` | Descarga archivos compartidos (logs, capturas de pantalla, ejemplos de código) para aportar contexto adicional |
| `files:write` | Sube resúmenes visuales de los cambios del agente para una revisión rápida |
| `groups:history` | Lee mensajes anteriores en canales privados para contexto en conversaciones de varios turnos |
| `groups:read` | Accede a metadatos de canales privados para publicar respuestas y mantener el flujo de la conversación |
| `im:history` | Accede al historial de mensajes directos para contexto en conversaciones continuadas |
| `im:read` | Lee metadatos de MD para identificar participantes y mantener el encadenamiento correcto |
| `im:write` | Inicia mensajes directos para notificaciones privadas o comunicación individual |
| `mpim:history` | Accede al historial de MD grupales para conversaciones con múltiples participantes |
| `mpim:read` | Lee metadatos de MD grupales para dirigirse a los participantes y asegurar una entrega adecuada |
| `reactions:read` | Observa reacciones de emoji para feedback del usuario y señales de estado |
| `reactions:write` | Agrega reacciones de emoji para marcar el estado: ⏳ en ejecución, ✅ completado, ❌ con error |
| `team:read` | Identifica detalles del espacio de trabajo para separar instalaciones y aplicar configuraciones |
| `users:read` | Asocia usuarios de Slack con cuentas de Cursor para permisos y acceso seguro |
;
};
Cursor es compatible con todos los modelos de vanguardia para programación de todos los principales proveedores.
## Precios de modelos
Los [planes](/es/account/pricing) de Cursor incluyen uso a las tarifas del API de modelos. Por ejemplo, los \$20 de uso incluido en el plan Pro se consumirán según el modelo que elijas y su precio.
En el editor se muestran los límites de uso según tu consumo actual. Para ver todas las tarifas del API de modelos, consulta la documentación del proveedor:
* [Precios de OpenAI](https://openai.com/api/pricing/)
* [Precios de Anthropic](https://www.anthropic.com/pricing#api)
* [Precios de Google Gemini](https://ai.google.dev/gemini-api/docs/pricing)
* [Precios de xAI](https://docs.x.ai/docs/models)
## Auto
Al activar Auto, Cursor elige el modelo premium más adecuado para la tarea en curso y con la mayor confiabilidad según la demanda actual. Esta función puede detectar una caída en el rendimiento de salida y cambiar de modelo automáticamente para solucionarlo.
## Ventanas de contexto
Una [ventana de contexto](/es/guides/working-with-context) es el máximo rango de tokens (texto y código) que un LLM puede considerar a la vez, incluyendo tanto el prompt de entrada como la salida generada por el modelo.
Cada chat en Cursor mantiene su propia ventana de contexto. Cuantos más prompts, archivos adjuntos y respuestas se incluyan en una sesión, más grande se vuelve la ventana de contexto.
Aprende más sobre [cómo trabajar con el contexto](/es/guides/working-with-context) en Cursor.
## Max Mode
Normalmente, Cursor usa una ventana de contexto de 200k tokens (\~15.000 líneas de código). Max Mode amplía la ventana de contexto al máximo disponible para unos cuantos modelos. Esto será un poco más lento y más costoso. Es especialmente relevante para Gemini 2.5 Flash, Gemini 2.5 Pro, GPT 4.1 y Grok 4, que tienen ventanas de contexto superiores a 200k.
## Preguntas frecuentes
Los modelos se alojan en infraestructura ubicada en EE. UU. por el proveedor del modelo, un socio de confianza o directamente por Cursor.
Cuando el Modo de privacidad está activado, ni Cursor ni los proveedores de modelos almacenan tus datos. Todos los datos se eliminan después de cada solicitud. Para más detalles, consulta nuestras páginas de [Privacidad](/es/account/privacy), [Política de privacidad](https://cursor.com/privacy) y [Seguridad](https://cursor.com/security).
# API Keys
Source: https://docs.cursor.com/es/settings/api-keys
Usa tu propio proveedor de LLM
Usa tus propias claves de API para enviar mensajes de IA ilimitados por tu cuenta. Cuando lo configures, Cursor usará tus claves de API para llamar directamente a los proveedores de LLM.
Para usar tu clave de API, ve a `Cursor Settings` > `Models` y escribe tus claves de API. Haz clic en **Verify**. Una vez validada, tu clave de API quedará habilitada.
Las claves de API personalizadas solo funcionan con modelos de chat estándar. Las funciones que requieren modelos especializados (como Tab Completion) seguirán usando los modelos integrados de Cursor.
## Proveedores compatibles
* **OpenAI** - Solo modelos de chat estándar, sin razonamiento. El selector de modelos mostrará los modelos de OpenAI disponibles.
* **Anthropic** - Todos los modelos de Claude disponibles a través de la API de Anthropic.
* **Google** - Modelos Gemini disponibles a través de la API de Google AI.
* **Azure OpenAI** - Modelos implementados en tu instancia de Azure OpenAI Service.
* **AWS Bedrock** - Usa claves de acceso de AWS, claves secretas o roles de IAM. Funciona con los modelos disponibles en tu configuración de Bedrock.
Se genera un ID externo único tras validar tu rol de IAM de Bedrock, que puedes añadir a la política de confianza de tu rol de IAM para mayor seguridad.
## Preguntas frecuentes
Tu clave de API no se almacena, pero se envía a nuestro servidor con cada solicitud. Todas las solicitudes pasan por nuestro backend para el ensamblado final del prompt.
# Tab
Source: https://docs.cursor.com/es/tab/overview
Autocompletado con ediciones multilínea, sugerencias entre archivos y completado de código con reconocimiento de contexto
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Tab es un modelo especializado de Cursor para autocompletado. Cuanto más lo uses, mejor se vuelve, porque incorporás intención al aceptar sugerencias con Tab o rechazarlas con Escape. Con Tab, podés:
* Modificar varias líneas a la vez
* Agregar sentencias de import cuando falten
* Saltar dentro de un archivo y entre archivos para hacer ediciones coordinadas
* Obtener sugerencias basadas en cambios recientes, errores del linter y ediciones aceptadas
## Sugerencias
Al agregar texto, las completions aparecen como texto fantasma semitransparente. Al modificar código existente, se muestran como un popup de diff a la derecha de tu línea actual.
Acepta sugerencias con Tab, recházalas con Escape o acepta palabra por palabra con Cmd+Arrow Right. Sigue escribiendo o presiona Escape para ocultar las sugerencias.
### Saltar en el archivo
Tab predice tu próximo punto de edición en el archivo y sugiere saltos. Después de aceptar una edición, presiona Tab otra vez para saltar a la siguiente ubicación.
### Saltar entre archivos
Tab predice ediciones con contexto entre archivos. Aparece una ventana de portal en la parte inferior cuando se sugiere un salto entre archivos.
### Autoimport
En TypeScript y Python, Tab agrega automáticamente sentencias de import cuando faltan. Usa un método de otro archivo y Tab sugiere el import. Al aceptar, lo agrega sin interrumpir tu flujo.
Si el autoimport no funciona:
* Asegúrate de que tu proyecto tenga el language server o las extensiones correctas
* Prueba con Cmd . para verificar si el import aparece en *Quick Fix*
### Tab en Peek
Tab funciona en las vistas de peek de *Go to Definition* o *Go to Type Definition*. Útil para modificar firmas de funciones y arreglar call sites.
En Vim, úsalo con `gd` para saltar a definiciones, modificar y resolver referencias en un solo flujo.
### Aceptaciones parciales
Acepta una palabra a la vez con Cmd Right, o configura tu keybinding con `editor.action.inlineSuggest.acceptNextWord`. Actívalo en: `Cursor Settings` → `Tab`.
## Configuración
| Configuración | Descripción |
| :--------------------------------- | :------------------------------------------------------------------------------------ |
| **Cursor Tab** | Sugerencias contextuales y multilínea cerca del cursor basadas en ediciones recientes |
| **Aceptaciones parciales** | Acepta la siguiente palabra de una sugerencia con Cmd Right |
| **Sugerencias al comentar** | Habilita Tab dentro de bloques de comentarios |
| **Sugerencias solo de espacio** | Permite ediciones que solo afectan al formato |
| **Imports** | Habilita el auto-import para TypeScript |
| **Auto Import para Python (beta)** | Habilita el auto-import para proyectos de Python |
### Conmutación
Usa la barra de estado (abajo a la derecha) para:
* **Snooze**: desactiva temporalmente Tab por un tiempo determinado
* **Desactivar globalmente**: desactiva Tab para todos los archivos
* **Desactivar por extensiones**: desactiva Tab para extensiones de archivo específicas (p. ej., Markdown o JSON)
## Preguntas frecuentes
Desactiva Tab en comentarios yendo a `Cursor Settings` → `Tab Completion` y desmarcando **Trigger in comments**.
Reasigna las acciones de aceptar y rechazar sugerencias a cualquier tecla usando `Accept Cursor Tab Suggestions` en `Keyboard Shortcuts`.
Cursor incluye una parte del código relevante en la ventana de contexto. El contexto se cifra y se envía a nuestro backend. Nuestro backend lo descifra y lo lee de forma segura. Luego, el modelo de Cursor Tab predice una sugerencia de código y la devuelve al cliente para mostrarla en el editor.
# Desarrolladores
Source: https://docs.cursor.com/es/tools/developers
Genera enlaces de instalación para Tools y servidores MCP
export const McpInstallLinkGenerator = () => {
const [config, setConfig] = useState("");
const [error, setError] = useState("");
const [showOverlay, setShowOverlay] = useState(null);
const [extractedServerName, setExtractedServerName] = useState("");
const debounceTimerRef = useRef(null);
useEffect(() => {
return () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
};
}, []);
const handleConfigChange = e => {
const configValue = e.target.value;
setConfig(configValue);
setError("");
setExtractedServerName("");
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
if (configValue.trim()) {
debounceTimerRef.current = setTimeout(() => {
validateConfigWithValue(configValue);
}, 500);
}
};
const handleBlur = () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
debounceTimerRef.current = null;
}
if (config.trim()) {
validateConfig();
}
};
const validateConfig = () => {
return validateConfigWithValue(config);
};
const validateConfigWithValue = configValue => {
try {
if (!configValue.trim()) {
setError("");
setExtractedServerName("");
return false;
}
const parsedConfig = JSON.parse(configValue);
if (typeof parsedConfig !== 'object' || parsedConfig === null) {
throw new Error("Config must be a JSON object");
}
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
if (!serverName) {
throw new Error("No server configuration found");
}
const serverConfig = configToUse[serverName];
if (typeof serverConfig !== 'object' || serverConfig === null) {
throw new Error("Server config must be an object");
}
if (!serverConfig.command && !serverConfig.url) {
throw new Error("Server config must have either 'command' or 'url' property");
}
if (serverConfig.command && typeof serverConfig.command !== 'string') {
throw new Error("'command' must be a string");
}
if (serverConfig.url && typeof serverConfig.url !== 'string') {
throw new Error("'url' must be a string");
}
if (serverConfig.args && !Array.isArray(serverConfig.args)) {
throw new Error("'args' must be an array");
}
if (serverConfig.env && (typeof serverConfig.env !== 'object' || serverConfig.env === null)) {
throw new Error("'env' must be an object");
}
setError("");
setExtractedServerName(serverName);
return true;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
setExtractedServerName("");
return false;
}
};
const INSTALL_BUTTON_IMAGE_URL = {
DARK: "https://cursor.com/deeplink/mcp-install-dark.svg",
LIGHT: "https://cursor.com/deeplink/mcp-install-light.svg"
};
const generateDeepLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
const protocol = window.location.hostname === 'localhost' ? 'cursor-dev' : 'cursor';
return `${protocol}://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(safeBase64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const generateWebLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
return `https://cursor.com/en/install-mcp?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(base64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const copyDeepLink = () => {
const link = generateDeepLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('link');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyWebLink = () => {
const link = generateWebLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('weblink');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyHtmlLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const htmlLink = ``;
navigator.clipboard.writeText(htmlLink);
setShowOverlay(theme.toLowerCase());
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyMarkdownLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const markdownLink = `[](${link})`;
navigator.clipboard.writeText(markdownLink);
setShowOverlay(`${theme.toLowerCase()}-md`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyJsxLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const jsxLink = ``;
navigator.clipboard.writeText(jsxLink);
setShowOverlay(`${theme.toLowerCase()}-jsx`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
return
{error &&
{error}
}
{extractedServerName.length > 0 ?
{extractedServerName}
: No server detected}
{showOverlay === 'link' &&
Copied
}
{showOverlay === 'weblink' &&
Copied
}
{showOverlay === 'dark-md' &&
Copied
}
{showOverlay === 'light-md' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark' &&
Copied
}
{showOverlay === 'light' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark-jsx' &&
Copied
}
{showOverlay === 'light-jsx' &&
Copied
}
Click to copy. Paste in JSX components
;
};
# Servidores MCP
Podés instalar servidores MCP con deeplinks de Cursor. Usan el mismo formato que [`mcp.json`](/es/context/model-context-protocol.mdx), con un nombre y una configuración de transporte.
Enlaces de instalación:
```
cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$CONFIG_BASE64
```
| Componente | Descripción |
| :-------------------------- | :-------------------------------------------------------------------- |
| `cursor://` | Esquema de protocolo |
| `anysphere.cursor-deeplink` | Manejador de deep link |
| `/mcp/install` | Ruta |
| `name` | Parámetro de consulta para el nombre del servidor |
| `config` | Parámetro de consulta para la configuración JSON codificada en Base64 |
## Generar enlace de instalación
1. Obtén el nombre y la configuración JSON del servidor
2. Aplica `JSON.stringify` a la configuración y luego codíficala en base64
3. Reemplaza `$NAME` y `$BASE64_ENCODED_CONFIG` por el nombre y la configuración codificada
Herramienta para generar enlaces:
## Ejemplo
Prueba este JSON en el generador de enlaces para instalar MCP:
```json Configuración de un único servidor MCP theme={null}
{
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mibd"
]
}
}
```
Result:
Seguimiento de incidencias y gestión de proyectos para equipos de desarrollo.
GitHub
Plataforma de control de versiones y desarrollo en equipo.
Playwright
Pruebas end-to-end en el navegador.
Sentry
Seguimiento de errores y monitorización del rendimiento.
DuckDB
Base de datos OLAP SQL en proceso para análisis local.
Vercel
Gestiona proyectos y deployments en Vercel.
GitLab
Plataforma DevSecOps para código, CI/CD y seguridad.
Atlassian
Herramientas de gestión de proyectos y colaboración, incluidas Jira y Confluence.
PostHog
Analítica, monitoreo de errores y flags de funcionalidades.
Stripe
APIs para procesar pagos.
PayPal
APIs de pagos.
dbt Labs
dbt CLI, capa semántica y Discovery API.
Browserbase
Sesiones de navegador sin cabeza para agentes.
Netlify
Crea y publica proyectos web.
Shopify
Herramientas para el desarrollo de apps de Shopify.
snyk
Análisis de vulnerabilidades en tu código.
Zapier
Automatizá los flujos de trabajo entre apps.
Heroku
Administra tus apps y recursos de Heroku.
Hugging Face
Accede al Hub de Hugging Face y a los servidores MCP de Gradio.
Wix
Crea y gestiona sitios en Wix.
Semgrep
Escanea el código en busca de vulnerabilidades de seguridad.
Plaid
Accede a datos de cuentas financieras.
Mercado Pago
Accedé a la documentación de Mercado Pago.
"}}}} />
LaunchDarkly
Feature flags como servicio.
Context7
Documentación de código al día.
Documentación de AWS
Accede a la documentación de AWS, haz búsquedas y recibe recomendaciones.
Endor Labs
Información sobre riesgos de seguridad en el código.
InstantDB
Consulta y gestiona InstantDB.
Tinybird
APIs de analítica en tiempo real.
MongoDB
Gestiona datos y despliegues de MongoDB.
Neon
Administra Neon Postgres.
SonarQube
Analiza código con SonarQube.
Socket
Analiza y protege tus dependencias.
Select Star
Catálogo de datos, trazabilidad y contexto.
Pipedream
Conecta con APIs y flujos de trabajo.
/"}}} />
Auth0
Gestiona los recursos de Auth0.
MS Learn Docs
Busca en la documentación de Microsoft.
Mercado Libre
Accede a la documentación de Mercado Libre.
Honeycomb
Consulta datos de observabilidad y SLO.
PagerDuty
Gestiona incidentes y alertas.
Graphite
Crea y administra PR apiladas.
Railway
Despliega apps, bases de datos y servicios.
Postman
Colaboración y test de API.
Este es un conjunto seleccionado de herramientas MCP para desarrolladores, de proveedores oficiales.
Si tu empresa o herramienta ofrece un servidor MCP oficial y quieres que se
incluya, por favor{" "}
crea un PR o un issue en GitHub
{" "}
y lo revisaremos para su inclusión.
# Problemas comunes
Source: https://docs.cursor.com/es/troubleshooting/common-issues
Soluciones para problemas habituales y preguntas frecuentes
A continuación encontrarás problemas comunes y sus soluciones.
### Problemas de red
Primero, verifica tu conectividad de red. Ve a `Cursor Settings` > `Network` y haz clic en `Run Diagnostics`. Esto probará tu conexión con los servidores de Cursor y ayudará a identificar cualquier problema de red que pueda estar afectando las funciones de IA, las actualizaciones u otras funcionalidades en línea.
Cursor depende de HTTP/2 para las funciones de IA porque maneja las respuestas en streaming de forma eficiente. Si tu red no admite HTTP/2, podrías experimentar fallos de indexación y problemas con las funciones de IA.
Esto puede ocurrir en redes corporativas, VPN o al usar proxies como Zscaler.
Para solucionarlo, habilita la conmutación a HTTP/1.1 en la configuración de la app (no en la configuración de Cursor): presiona `CMD/CTRL + ,`, busca `HTTP/2` y activa `Disable HTTP/2`. Esto fuerza el uso de HTTP/1.1 y resuelve el problema.
Planeamos añadir detección y conmutación automáticas.
### Problemas de recursos (CPU, RAM, etc.)
Un uso elevado de CPU o RAM puede ralentizar tu equipo o activar advertencias de recursos.
Aunque los repos grandes requieren más recursos, el consumo alto normalmente se debe a extensiones o a problemas de configuración.
Si ves una advertencia de poca RAM en **macOS**, ten en cuenta que hay un bug para algunos usuarios que puede mostrar valores totalmente incorrectos. Si te pasa, abre Activity Monitor y mira la pestaña "Memory" para ver el uso correcto de memoria.
Si estás experimentando un uso alto de CPU o RAM, prueba estos pasos:
Las extensiones pueden afectar el rendimiento.
El Extension Monitor muestra el consumo de recursos de todas tus extensiones instaladas y las integradas.
Activa el monitor de extensiones desde `Settings` > `Application` > `Experimental` y habilita `Extension Monitor: Enabled`. Se te pedirá reiniciar Cursor.
Ábrelo: `Cmd/Ctrl + Shift + P` → `Developer: Open Extension Monitor`.
Cursor ejecuta tus extensiones en uno o más **extension hosts**. Por lo general, la mayoría de tus extensiones se ejecutan en el mismo extension host, lo que significa que una extensión que consuma mucho tiempo de CPU puede asfixiar a sus extensiones vecinas.
El Extension Monitor muestra:
* Cada proceso de larga duración lanzado por una extensión (solo macOS y Linux).
* **% Ext Host**: El porcentaje del tiempo total del extension host consumido por esa extensión. Ayuda a identificar qué extensiones usan más tiempo en relación con las demás.
* **Max Blocking**: El bloqueo continuo más largo de ejecución de una extensión, por intervalo de monitoreo.
* **% CPU**:
* Para extensiones: El porcentaje del uso total de CPU atribuido al código de la extensión.
* Para procesos: El porcentaje del uso total de CPU atribuido al proceso lanzado (solo macOS y Linux).
* **Memory**:
* Para extensiones: La cantidad de memoria de heap de JS utilizada por el código de la extensión (no incluye asignaciones externas).
* Para procesos: La cantidad de memoria del sistema utilizada por el proceso lanzado (solo macOS y Linux).
También puedes probar ejecutando `cursor --disable-extensions` desde la línea de comandos. Si el rendimiento mejora, vuelve a habilitar las extensiones una por una para identificar las problemáticas.
Prueba Extension Bisect para identificar extensiones problemáticas. Lee más [aquí](https://code.visualstudio.com/blogs/2021/02/16/extension-bisect#_welcome-extension-bisect). Nota: esto funciona mejor para problemas inmediatos, no para degradación gradual del rendimiento.
El Process Explorer muestra qué procesos consumen recursos.
Ábrelo: Command Palette (`Cmd/Ctrl + Shift + P`) → `Developer: Open Process Explorer`.
Revisa los procesos:
* **`extensionHost`**: Problemas relacionados con extensiones
* **`ptyHost`**: Consumo de recursos del terminal
El Process Explorer muestra cada terminal y sus comandos en ejecución para diagnóstico.
Para otros procesos con alto uso, repórtalo en el [foro](https://forum.cursor.com/).
Usa las herramientas de monitoreo de tu sistema operativo para determinar si el problema es específico de Cursor o de todo el sistema.
Si los problemas persisten, prueba una instalación mínima de Cursor.
## Preguntas frecuentes generales
Las actualizaciones se lanzan de forma escalonada: a algunos usuarios aleatorios les llegan primero. Deberías recibirla en unos días.
Usa `Sign Out of GitHub` desde la paleta de comandos `Ctrl/⌘ + Shift + P`.
GitHub Codespaces todavía no es compatible.
No se admite SSH a máquinas Mac o Windows. Para otros problemas, repórtalo en el [foro](https://forum.cursor.com/) con logs.
Si ves "SSH is only supported in Microsoft versions of VS Code":
1. Desinstala Remote-SSH:
* Abre la vista de Extensiones (`Ctrl + Shift + X`)
* Busca "Remote-SSH"
* Haz clic en el ícono de engranaje → "Uninstall"
2. Instala Anysphere Remote SSH:
* Abre el marketplace de Cursor
* Busca "SSH"
* Instala la extensión Anysphere Remote SSH
3. Después de la instalación:
* Cierra todas las instancias de VS Code con conexiones SSH activas
* Reinicia Cursor
* Vuelve a conectarte por SSH
Verifica que tu configuración y claves SSH estén configuradas correctamente.
Cursor Tab e Inline Edit usan HTTP/2 para menor latencia y uso de recursos. Algunos proxys corporativos (p. ej., Zscaler) bloquean HTTP/2. Solución: establece `"cursor.general.disableHttp2": true` en Ajustes (`Cmd/Ctrl + ,`, busca `http2`).
Cierra sesión y vuelve a iniciarla desde Cursor Settings.
Suscriptores Pro: haz clic en `Manage Subscription` en el [Dashboard](https://cursor.com/dashboard) para ver tu fecha de renovación.
Usuarios gratuitos: revisa la fecha de tu primer correo de Cursor. El uso se restablece mensualmente a partir de esa fecha.
El poco espacio en disco puede hacer que Cursor borre datos históricos durante las actualizaciones. Para evitarlo:
1. Mantén suficiente espacio libre en disco antes de actualizar
2. Limpia regularmente archivos del sistema que no necesites
3. Haz una copia de seguridad de conversaciones importantes antes de actualizar
Sigue [esta guía](https://code.visualstudio.com/docs/setup/uninstall). Reemplaza "VS Code" o "Code" por "Cursor", y ".vscode" por ".cursor".
Haz clic en `Delete Account` en el [Dashboard](https://cursor.com/dashboard). Esto elimina permanentemente tu cuenta y todos los datos asociados.
Ejecuta `cursor` en tu terminal. Si falta el comando:
1. Abre la paleta de comandos `⌘⇧P`
2. Escribe `install command`
3. Selecciona `Install 'cursor' command` (opcionalmente instala el comando `code` para reemplazar el de VS Code)
Si al hacer clic en Sign In te redirige a cursor.com pero no inicia sesión, desactiva tu firewall o antivirus; pueden estar bloqueando el proceso de inicio de sesión.
Debido al aumento reciente de uso indebido de nuestro sistema, es posible que tu solicitud haya sido bloqueada como medida de seguridad. Así puedes resolverlo:
Primero, revisa tu VPN. Si estás usando una, intenta apagarla, ya que las VPN a veces activan nuestros sistemas de seguridad.
Si eso no lo resuelve, puedes probar:
* Crear un nuevo chat
* Esperar un poco e intentarlo más tarde
* Crear una cuenta nueva usando autenticación con Google o GitHub
* Pasarte a Cursor Pro
# Obtener un ID de solicitud
Source: https://docs.cursor.com/es/troubleshooting/request-reporting
Encuentra IDs de solicitud para soporte técnico
Cuando el equipo de Cursor investiga un problema técnico, es posible que te pidamos un “ID de solicitud”.
## ¿Qué es un ID de petición?
Un ID de petición identifica de manera única cada petición a Cursor en nuestros sistemas internos.
Ejemplo de formato: `8f2a5b91-4d3e-47c6-9f12-5e8d94ca7d23`
## ¿Cómo encuentro un ID de solicitud?
Los ID de solicitud están limitados cuando el Modo de Privacidad está activado. Desactivá el Modo de Privacidad al reportar problemas.
Nota: En el plan Business, el Modo de Privacidad está activado de forma predeterminada por el administrador de la organización.
### Obtener tu ID de solicitud actual
Para reportar un problema con tu conversación actual o reciente:
Con la conversación abierta en la barra lateral de Chat, abrí el menú de contexto (arriba a la derecha) y seleccioná `Copy Request ID`.
Enviá el ID de solicitud copiado por el foro o por email, según se solicite.
### Obtener un ID de solicitud de una acción anterior
Recuperá ID de solicitud anteriores usando el comando `Report AI Action`:
1. Abrí la paleta de comandos `⌘⇧P`
2. Escribí `Report AI Action`
3. Seleccioná la opción `Report AI Action`
Esto muestra tus acciones recientes de IA en Chat, CMD+K y Apply.
Seleccioná la acción haciendo coincidir su hora y característica. Copiá el ID de solicitud y enviánoslo.
# Guía de solución de problemas
Source: https://docs.cursor.com/es/troubleshooting/troubleshooting-guide
Pasos para solucionar problemas y reportar errores
Los problemas de Cursor pueden deberse a extensiones, datos de la app o fallas del sistema. Prueba estos pasos de solución de problemas.
Pasos para reportar un problema al equipo de Cursor
## Solución de problemas
Primero verifica si Cursor puede conectarse a sus servicios.
**Ejecuta diagnósticos de red:** Ve a `Cursor Settings` > `Network` y haz clic en `Run Diagnostics`. Esto prueba tu conexión con los servidores de Cursor e identifica problemas de red que afecten las funciones de IA, las actualizaciones u otras funcionalidades en línea.
Si los diagnósticos detectan problemas de conectividad, revisa la configuración del firewall, el proxy o las restricciones de red que puedan estar bloqueando el acceso de Cursor.
Para problemas con extensiones:
**Desactiva temporalmente todas las extensiones:** Ejecuta `cursor --disable-extensions` desde la línea de comandos. Si el problema se resuelve, vuelve a habilitarlas una por una para identificar cuál causa el fallo.
**Restablece los datos de la extensión:** Desinstala y vuelve a instalar las extensiones problemáticas para restablecer sus datos almacenados. Revisa si hay configuración de la extensión que persista tras la reinstalación.
Esto elimina tus datos de la app, incluidas extensiones, temas, snippets y datos relacionados con la instalación. Exporta tu perfil primero para conservarlos.
Cursor guarda datos de la app fuera de la aplicación para poder restaurarlos entre actualizaciones y reinstalaciones.
Para borrar los datos de la app:
**Windows:** Ejecuta estos comandos en el Símbolo del sistema:
```txt theme={null}
rd /s /q "%USERPROFILE%\AppData\Local\Programs\Cursor"
rd /s /q "%USERPROFILE%\AppData\Local\Cursor"
rd /s /q "%USERPROFILE%\AppData\Roaming\Cursor"
del /f /q "%USERPROFILE%\.cursor*"
rd /s /q "%USERPROFILE%\.cursor"
```
**MacOS:** Ejecuta `sudo rm -rf ~/Library/Application\ Support/Cursor` y `rm -f ~/.cursor.json` en Terminal.
**Linux:** Ejecuta `rm -rf ~/.cursor ~/.config/Cursor/` en Terminal.
Para desinstalar Cursor:
Busca "Add or Remove Programs" en el menú Inicio, encuentra "Cursor" y haz clic en "Uninstall".
Abre la carpeta Applications, haz clic derecho en "Cursor" y selecciona "Move to Trash".
**Para paquetes .deb:** `sudo apt remove cursor`
**Para paquetes .rpm:** `sudo dnf remove cursor` o `sudo yum remove cursor`
**Para AppImage:** Elimina el archivo Cursor.appimage de su ubicación.
Reinstala desde la [página de descargas](https://www.cursor.com/downloads). Si no borras los datos de la app, Cursor se restaurará a su estado anterior. De lo contrario, obtendrás una instalación limpia.
## Reportar un problema
Si estos pasos no te ayudan, repórtalo en el [foro](https://forum.cursor.com/).
Reporta un bug o problema en el foro de Cursor
Para resolverlo más rápido, proporciona:
Toma una captura de pantalla y oculta la información sensible.
Documenta los pasos exactos para reproducir el problema.
Obtén la información del sistema desde:
`Cursor` > `Help` > `About`
Haz clic para ver nuestra guía sobre cómo recopilar IDs de solicitud
Revisa la consola de desarrollador:
`Developer: Toggle Developer Tools`
Accede a los registros:
`Developer: Open Logs Folder`
# Bienvenido
Source: https://docs.cursor.com/es/welcome
Conoce Cursor y cómo empezar
Cursor es un editor de código con IA que entiende tu repositorio y te ayuda a programar más rápido con lenguaje natural. Solo describe lo que quieres construir o cambiar y Cursor generará el código por ti.
Descarga, instala y ponte a crear con Cursor en minutos
Mantente al día con las últimas funciones y mejoras
Usa Cursor en tu terminal
Comprende los conceptos y funciones clave que impulsan Cursor
Explora los modelos de IA disponibles y cómo elegir el adecuado
Aprende buenas prácticas y flujos de trabajo para distintos casos de uso
Consigue Cursor para tu computadora
Para consultas técnicas y para compartir experiencias, visita nuestro foro
Para preguntas sobre cuenta y facturación, escribe a nuestro equipo de soporte
# Sécurité de l’agent
Source: https://docs.cursor.com/fr/account/agent-security
Considérations de sécurité pour l’utilisation de Cursor Agent
Les attaques par injection de prompt, les hallucinations de l’IA et d’autres problèmes peuvent amener une IA à se comporter de manière inattendue et potentiellement malveillante. Pendant qu’on continue de travailler à résoudre l’injection de prompt à un niveau plus fondamental, notre protection principale dans les produits Cursor repose sur des garde-fous autour de ce qu’un agent peut faire, notamment l’exigence, activée par défaut, d’une approbation manuelle pour les actions sensibles. L’objectif de ce document est d’expliquer ces garde-fous et ce à quoi tu peux t’attendre.
Tous les contrôles et comportements ci-dessous correspondent à nos paramètres par défaut et recommandés.
## Appels d’outils first‑party
Cursor est livré avec des outils qui permettent à l’agent d’aider nos utilisateurs à écrire du code. Ceux‑ci incluent la lecture de fichiers, les modifications, l’exécution de commandes dans le terminal, la recherche de documentation sur le web, et d’autres.
Les outils de lecture ne nécessitent pas d’approbation (c.-à-d. lecture de fichiers, recherche dans le code). Les utilisateurs peuvent utiliser [.cursorignore](/fr/context/ignore-files) pour empêcher l’agent d’accéder à des fichiers spécifiques, mais sinon les lectures sont généralement autorisées sans approbation. Pour les actions présentant un risque d’exfiltration de données sensibles, nous exigeons une approbation explicite.
La modification de fichiers dans l’espace de travail actuel ne nécessite pas d’approbation explicite, avec quelques exceptions. Quand un agent modifie des fichiers, ils sont immédiatement enregistrés sur le disque. Nous recommandons d’exécuter Cursor dans des espaces de travail sous contrôle de version, afin que le contenu des fichiers puisse être rétabli à tout moment. Nous exigeons une approbation explicite avant de modifier des fichiers qui changent la configuration de notre IDE/CLI, comme le fichier de paramètres de l’éditeur pour l’espace de travail. Cependant, les utilisateurs dont l’application se recharge automatiquement à la modification de fichiers doivent savoir que les changements de l’agent peuvent déclencher une exécution automatique avant qu’ils aient eu la chance de les revoir.
Toute commande de terminal suggérée par les agents nécessite une approbation par défaut. Nous recommandons que les utilisateurs relisent chaque commande avant que l’agent ne l’exécute. Les utilisateurs qui acceptent le risque peuvent choisir d’autoriser l’agent à exécuter toutes les commandes sans approbation. Nous incluons une fonctionnalité d’[allowlist](/fr/agent/tools) dans Cursor, mais nous ne la considérons pas comme un contrôle de sécurité. Certains utilisateurs choisissent d’autoriser des commandes spécifiques, mais c’est un système best effort et des contournements restent possibles. Nous ne recommandons pas « Run Everything », qui contourne toute allowlist configurée.
## Appels d’outils tiers
Cursor permet de connecter des outils externes via le [MCP](/fr/context/mcp). Toutes les connexions MCP tierces doivent être explicitement approuvées par l’utilisateur. Une fois qu’un utilisateur a approuvé un MCP, par défaut chaque appel d’outil suggéré en mode Agent pour chaque intégration MCP externe doit être explicitement approuvé avant exécution.
## Requêtes réseau
Des requêtes réseau peuvent être utilisées par un attaquant pour exfiltrer des données. À l’heure actuelle, nous ne prenons pas en charge d’outils propriétaires effectuant des requêtes réseau en dehors d’un ensemble très restreint d’hôtes (par ex. GitHub), de la récupération explicite de liens, ni de la recherche web qu’avec un nombre limité de fournisseurs. Les requêtes réseau arbitraires des agents sont bloquées avec les paramètres par défaut.
## Confiance de l’espace de travail
L’IDE Cursor prend en charge la fonctionnalité standard de [confiance de l’espace de travail](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust), qui est désactivée par défaut. À l’ouverture d’un nouvel espace de travail, une invite te propose de choisir entre le mode normal ou le mode restreint. Le mode restreint désactive l’IA et d’autres fonctionnalités pour lesquelles les gens utilisent généralement Cursor. On recommande d’utiliser d’autres outils, comme un éditeur de texte simple, pour travailler avec des dépôts auxquels tu ne fais pas confiance.
Tu peux activer la confiance de l’espace de travail dans tes paramètres en suivant ces étapes :
1. Ouvre ton fichier user settings.json
2. Ajoute la configuration suivante :
```json theme={null}
"security.workspace.trust.enabled": true
```
Ce paramètre peut aussi être imposé à l’échelle de l’organisation via des solutions de Mobile Device Management (MDM).
## Divulgation responsable
Si tu penses avoir trouvé une vulnérabilité dans Cursor, suis le guide sur notre page GitHub Security et dépose ton rapport là-bas. Si tu peux pas utiliser GitHub, écris-nous aussi à [security@cursor.com](mailto:security@cursor.com).
On s’engage à accuser réception des signalements de vulnérabilité sous 5 jours ouvrables et à les traiter dès qu’on le peut. On publiera les résultats sous forme d’avis de sécurité sur notre page GitHub Security. Les incidents critiques seront communiqués à la fois sur la page GitHub Security et par e‑mail à tous les utilisateurs.
# Facturation
Source: https://docs.cursor.com/fr/account/billing
Gestion des abonnements, remboursements et factures Cursor
### Comment accéder aux paramètres de facturation ?
Accède au portail de facturation via le [dashboard](https://cursor.com/dashboard) en cliquant sur « Billing » dans ton dashboard. Ça ouvre un portail sécurisé pour toutes les tâches de facturation.
### Quels sont les cycles de facturation de Cursor ?
Les cycles de facturation sont mensuels ou annuels, à partir de la date de ton abonnement. Les comptes Teams sont facturés par siège avec une facturation au prorata pour les nouveaux membres.
### Comment fonctionnent les sièges pour les comptes Teams ?
Les comptes Teams facturent par siège (un par membre de l’équipe). Quand tu ajoutes des membres en cours de cycle, tu es facturé uniquement pour leur temps restant. Si un membre a utilisé des crédits et est retiré, son siège reste occupé jusqu’à la fin du cycle de facturation — aucun remboursement au prorata n’est accordé. Les admins d’équipe peuvent gérer les sièges via le dashboard.
### Puis-je basculer entre la facturation mensuelle et annuelle ?
Oui ! Voici comment faire :
**Pro plan**
1. Va sur le [dashboard](https://cursor.com/dashboard) Cursor
2. Clique sur « Billing and Invoices » dans la barre latérale gauche pour accéder à la page de facturation
3. Clique sur « Manage subscription »
4. Clique sur « Update subscription »
5. Sélectionne « Yearly » ou « Monthly », puis clique sur « Continue »
**Teams plan**
1. Va sur le [dashboard](https://cursor.com/dashboard) Cursor
2. Clique sur « Billing and Invoices » dans la barre latérale gauche pour accéder à la page de facturation
3. Clique sur le bouton « Upgrade Now » pour passer à la facturation annuelle
Tu peux seulement passer de la facturation mensuelle à annuelle en self-serve. Pour passer de annuelle à mensuelle, contacte-nous à
[hi@cursor.com](mailto:hi@cursor.com).
### Où puis-je trouver mes factures ?
Retrouve tout l’historique de facturation dans le portail de facturation. Consulte et télécharge les factures actuelles et passées.
### Puis-je recevoir automatiquement mes factures par email ?
Les factures doivent être téléchargées manuellement depuis le portail de facturation. On développe l’envoi automatique des factures par email. Tu pourras t’y inscrire dès que ce sera disponible.
### Comment mettre à jour mes informations de facturation ?
Mets à jour le mode de paiement, le nom de l’entreprise, l’adresse et les informations fiscales via le portail de facturation. On utilise Stripe pour des transactions sécurisées. Les modifications n’affectent que les factures futures, on ne peut pas modifier les factures historiques.
### Comment annuler mon abonnement ?
Annule ton abonnement via la page Billing and Invoices en cliquant sur « Manage Subscription », puis sur le bouton « Cancel subscription ». L’accès continue jusqu’à la fin de ta période de facturation en cours.
### J’ai d’autres problèmes de facturation. Comment obtenir de l’aide ?
Pour les questions de facturation non couvertes ici, envoie un email à [hi@cursor.com](mailto:hi@cursor.com) depuis l’adresse liée à ton compte. Merci d’inclure les détails de ton compte et tes préoccupations.
# Tarification
Source: https://docs.cursor.com/fr/account/pricing
Offres Cursor et leurs tarifs
Tu peux essayer Cursor gratuitement ou choisir une offre individuelle ou une offre équipe.
## Individuel
Tous les forfaits individuels incluent :
* Complétions d’onglets illimitées
* Limites d’utilisation de l’agent étendues sur tous les modèles
* Accès à Bugbot
* Accès aux agents en arrière-plan
Chaque forfait inclut une utilisation facturée aux [tarifs de l’API](/fr/models#model-pricing) d’inférence des modèles :
* Pro inclut 20 \$ d’utilisation d’agent via l’API + utilisation bonus supplémentaire
* Pro Plus inclut 70 \$ d’utilisation d’agent via l’API + utilisation bonus supplémentaire
* Ultra inclut 400 \$ d’utilisation d’agent via l’API + utilisation bonus supplémentaire
On travaille dur pour offrir une capacité bonus supplémentaire au-delà de l’utilisation incluse garantie. Comme les différents modèles ont des coûts d’API différents, ton choix de modèle affecte la sortie en tokens et la vitesse à laquelle ton utilisation incluse est consommée. Tu peux consulter l’utilisation et la répartition des tokens sur [ton tableau de bord](https://cursor.com/dashboard?tab=usage). Des notifications de limite s’affichent régulièrement dans l’éditeur.
### De quel volume d’utilisation ai-je besoin ?
D’après nos données d’utilisation, tu peux t’attendre aux niveaux suivants :
* **Utilisateurs quotidiens de Tab** : Toujours sous 20 \$
* **Utilisateurs Agent occasionnels** : Souvent dans les 20 \$ inclus
* **Utilisateurs Agent au quotidien** : En général 60–100 \$/mo d’utilisation totale
* **Power users (agents multiples/automatisation)** : Souvent 200 \$+/mo d’utilisation totale
Selon nos données d’utilisation, les limites correspondent à peu près à ce qui suit pour un *utilisateur médian* :
* Pro : \~225 requêtes Sonnet 4, \~550 requêtes Gemini, ou \~500 requêtes GPT 5
* Pro+ : \~675 requêtes Sonnet 4, \~1 650 requêtes Gemini, ou \~1 500 requêtes GPT 5
* Ultra : \~4 500 requêtes Sonnet 4, \~11 000 requêtes Gemini, ou \~10 000 requêtes GPT 5
### Que se passe-t-il quand j’atteins ma limite ?
Quand tu dépasses ton quota mensuel inclus, tu recevras une notification dans l’éditeur et tu pourras choisir de :
* **Ajouter de l’usage à la demande** : continuer à utiliser Cursor aux mêmes tarifs API avec une facturation à l’usage
* **Mettre à niveau ton forfait** : passer à un palier supérieur pour bénéficier de plus d’usage inclus
L’usage à la demande est facturé mensuellement aux mêmes tarifs que ton usage inclus. Les requêtes ne sont jamais dégradées en qualité ni en vitesse.
## Teams
Il existe deux offres d’équipe : Teams (40 \$ par utilisateur et par mois) et Enterprise (personnalisée).
Les offres Teams incluent des fonctionnalités supplémentaires comme :
* Application du mode confidentialité
* Tableau de bord admin avec statistiques d’utilisation
* Facturation d’équipe centralisée
* SSO SAML/OIDC
On recommande Teams à tout client à l’aise avec l’auto-gestion. On recommande [Enterprise](/fr/contact-sales) aux clients qui ont besoin d’un support prioritaire, d’une utilisation mutualisée, de facturation, de SCIM ou de contrôles de sécurité avancés.
En savoir plus sur la [tarification Teams](/fr/account/teams/pricing).
## Auto
Activer Auto permet à Cursor de choisir le modèle premium le mieux adapté à la tâche en cours et le plus fiable selon la demande actuelle. Cette fonctionnalité peut détecter une dégradation des performances de sortie et basculer automatiquement de modèle pour y remédier.
On a beaucoup investi dans la qualité et les performances globales d’Auto. À partir de ton prochain renouvellement de facturation après le 15 septembre, Auto consommera au tarif API suivant.
* **Entrée + écriture en cache** : 1,25 \$ par 1 M de tokens
* **Sortie** : 6,00 \$ par 1 M de tokens
* **Lecture en cache** : 0,25 \$ par 1 M de tokens
L’éditeur et le tableau de bord afficheront ta consommation, Auto inclus. Si tu préfères sélectionner un modèle directement, la consommation est facturée au prix API catalogue de ce modèle.
## Mode Max
Certains modèles peuvent utiliser le [Mode Max](/fr/models#max-mode), ce qui permet un raisonnement plus long et des fenêtres de contexte plus vastes, jusqu’à 1 M de tokens. Même si la plupart des tâches de code n’ont pas besoin du Mode Max, il peut être utile pour des requêtes plus complexes, surtout avec de gros fichiers ou de larges bases de code. Utiliser le Mode Max consommera davantage de ressources. Tu peux voir toutes les requêtes et la répartition des tokens sur [ton tableau de bord](https://cursor.com/dashboard?tab=usage).
## Bugbot
Bugbot est un produit distinct des abonnements Cursor et a son propre plan tarifaire.
* **Pro** (40 \$/mois) : relectures illimitées sur jusqu’à 200 PR/mois, accès illimité à Cursor Ask, intégration avec Cursor pour corriger les bugs, et accès à Bugbot Rules
* **Teams** (40 \$/utilisateur/mois) : relectures de code illimitées sur toutes les PR, accès illimité à Cursor Ask, utilisation mutualisée pour ton équipe, et règles et réglages avancés
* **Enterprise** (Sur mesure) : tout ce qui est inclus dans Teams, plus analyses et rapports avancés, support prioritaire et gestion de compte
En savoir plus sur la [tarification de Bugbot](https://cursor.com/bugbot#pricing).
## Agent en arrière-plan
Les agents en arrière-plan sont facturés au tarif API du [modèle](/fr/models) sélectionné. On te demandera de définir une limite de dépenses pour les agents en arrière-plan quand tu commenceras à les utiliser.
Le calcul (compute) sur machine virtuelle (VM) pour les agents en arrière-plan sera facturé ultérieurement.
# API Admin
Source: https://docs.cursor.com/fr/account/teams/admin-api
Accède aux métriques d’équipe, aux données d’usage et aux informations de dépenses via l’API
L’API Admin te permet d’accéder par programmation aux données de ton équipe, y compris les infos membres, les métriques d’usage et les détails de dépenses. Crée des tableaux de bord personnalisés, des outils de monitoring, ou intègre-la à tes workflows existants.
L’API en est à sa première version. On étend les capacités selon les retours — dis-nous quels endpoints il te faut !
## Authentification
Toutes les requêtes à l’API nécessitent une authentification au moyen d’une clé API. Seuls les administrateurs de l’équipe peuvent créer et gérer des clés API.
Les clés API sont liées à l’organisation, visibles par tous les administrateurs, et ne sont pas affectées par l’état du compte du créateur initial.
### Créer une clé API
1. Va sur **cursor.com/dashboard** → onglet **Settings** → **Cursor Admin API Keys**
2. Clique sur **Create New API Key**
3. Donne à ta clé un nom explicite (p. ex. « Usage Dashboard Integration »)
4. Copie la clé générée tout de suite — tu ne la verras plus après
Format : `key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
### Utiliser ta clé API
Utilise ta clé API comme nom d’utilisateur dans l’authentification basique :
**Utiliser curl avec une authentification basique :**
```bash theme={null}
curl https://api.cursor.com/{route} -u CLÉ_API:
```
**Ou définis directement l’en-tête Authorization :**
```bash theme={null}
Authorization : Basic {base64_encode('API_KEY:')}
```
## URL de base
Tous les points de terminaison de l’API utilisent :
```
https://api.cursor.com
```
## Points de terminaison
### Obtenir les membres de l’équipe
Récupère tous les membres de l’équipe et leurs informations.
```
GET /teams/members
```
#### Réponse
Renvoie un tableau d’objets représentant des membres de l’équipe :
```typescript theme={null}
{
teamMembers: {
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
}[];
}
```
#### Exemple de réponse
```json theme={null}
{
"teamMembers": [
{
"name": "Alex",
"email": "developer@company.com",
"role": "membre"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "propriétaire"
}
]
}
```
#### Exemple de demande
```bash theme={null}
curl -X GET https://api.cursor.com/teams/members \
-u TA_CLÉ_API:
```
### Obtenir les données d'utilisation quotidiennes
Récupère des métriques d'utilisation quotidiennes détaillées pour ton équipe sur une plage de dates. Fournit des informations sur les modifications de code, l'utilisation de l'assistance IA et les taux d'acceptation.
```
POST /teams/daily-usage-data
```
#### Corps de la requête
| Paramètre | Type | Obligatoire | Description |
| :---------- | :----- | :---------- | :--------------------------------------------- |
| `startDate` | number | Oui | Date de début en millisecondes depuis l'époque |
| `endDate` | number | Oui | Date de fin en millisecondes depuis l'époque |
Récupère les informations de dépenses pour le mois calendaire en cours, avec recherche, tri et pagination.
```
POST /teams/spend
```
#### Corps de la requête
| Paramètre | Type | Obligatoire | Description |
| :-------------- | :----- | :---------- | :-------------------------------------------------------- |
| `searchTerm` | string | Non | Recherche dans les noms d’utilisateur et les e-mails |
| `sortBy` | string | Non | Trier par : `amount`, `date`, `user`. Par défaut : `date` |
| `sortDirection` | string | Non | Ordre de tri : `asc`, `desc`. Par défaut : `desc` |
| `page` | number | Non | Numéro de page (indexé à partir de 1). Par défaut : `1` |
| `pageSize` | number | Non | Résultats par page |
| Champ | Description |
| :------------------------- | :------------------------------------------------ |
| `spendCents` | Dépense totale en centimes |
| `fastPremiumRequests` | Requêtes du modèle premium rapide |
| `name` | Nom du membre |
| `email` | E-mail du membre |
| `role` | Rôle dans l’équipe |
| `hardLimitOverrideDollars` | Dérogation personnalisée à la limite de dépense |
| `subscriptionCycleStart` | Début du cycle d’abonnement (millisecondes epoch) |
| `totalMembers` | Nombre total de membres de l’équipe |
| `totalPages` | Nombre total de pages |
**Données de dépenses de base :**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Rechercher un utilisateur précis avec pagination :**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"searchTerm": "alex@company.com",
"page": 2,
"pageSize": 25
}'
```
### Obtenir les données d’événements d’usage
Récupère des événements d’usage détaillés pour ton équipe avec des options complètes de filtrage, de recherche et de pagination. Cet endpoint fournit des informations granulaires sur les appels API individuels, l’usage des modèles, la consommation de jetons et les coûts.
```
POST /teams/filtered-usage-events
```
#### Corps de la requête
| Paramètre | Type | Requis | Description |
| :---------- | :----- | :----- | :------------------------------------------------------ |
| `startDate` | number | Non | Date de début en millisecondes depuis l’époque (epoch) |
| `endDate` | number | Non | Date de fin en millisecondes depuis l’époque (epoch) |
| `userId` | number | Non | Filtrer par ID utilisateur spécifique |
| `page` | number | Non | Numéro de page (indexé à partir de 1). Par défaut : `1` |
| `pageSize` | number | Non | Nombre de résultats par page. Par défaut : `10` |
| `email` | string | Non | Filtrer par adresse e-mail de l’utilisateur |
| Champ | Description |
| :---------------------- | :--------------------------------------------------------------------------------- |
| `totalUsageEventsCount` | Nombre total d’événements d’utilisation correspondant à la requête |
| `pagination` | Métadonnées de pagination pour naviguer dans les résultats |
| `timestamp` | Horodatage de l’événement en millisecondes Unix (epoch) |
| `model` | Modèle d’IA utilisé pour la requête |
| `kind` | Catégorie d’utilisation (p. ex. « Usage-based », « Included in Business ») |
| `maxMode` | Indique si le mode max était activé |
| `requestsCosts` | Coût en unités de requête |
| `isTokenBasedCall` | true lorsque l’événement est facturé comme un événement à l’usage |
| `tokenUsage` | Détail de la consommation de jetons (disponible lorsque isTokenBasedCall est true) |
| `isFreeBugbot` | Indique s’il s’agissait d’une utilisation gratuite de bugbot |
| `userEmail` | E-mail de l’utilisateur ayant effectué la requête |
| `period` | Intervalle de dates des données interrogées |
**Récupérer tous les événements d’utilisation avec la pagination par défaut :**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Filtrer par plage de dates et par utilisateur spécifique :**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
```
**Récupérer les événements d’usage d’un utilisateur spécifique avec une pagination personnalisée :**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": 12345,
"page": 2,
"pageSize": 50
}'
```
### Définir la limite de dépenses par utilisateur
Définis des limites de dépenses pour chaque membre de l'équipe. Ça te permet de contrôler combien chaque utilisateur peut dépenser pour l'utilisation de l'IA au sein de ton équipe.
```
POST /teams/user-spend-limit
```
**Limitation du débit :** 60 requêtes par minute et par équipe
#### Corps de la requête
| Paramètre | Type | Obligatoire | Description |
| :------------------ | :----- | :---------- | :-------------------------------------------------------------------- |
| `userEmail` | string | Oui | Adresse e-mail du membre de l'équipe |
| `spendLimitDollars` | number | Oui | Plafond de dépenses en dollars (entier uniquement, pas de décimales). |
* L'utilisateur doit déjà faire partie de ton équipe
* Seules les valeurs entières sont acceptées (aucun montant décimal)
* Définir `spendLimitDollars` sur 0 fixe la limite à 0 \$
#### Réponse
Retourne une réponse normalisée indiquant un succès ou un échec :
```typescript theme={null}
{
outcome: 'success' | 'error';
message: string;
}
```
#### Exemples de réponses
**Limite définie avec succès :**
```json theme={null}
{
"outcome": "succès",
"message": "Limite de dépenses définie à 100 $ pour l’utilisateur developer@company.com"
}
```
**Réponse d’erreur :**
```json theme={null}
{
"outcome": "error",
"message": "Format d’e-mail invalide"
}
```
#### Exemples de requêtes
**Définir une limite de dépenses :**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/user-spend-limit \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userEmail": "developer@company.com",
"spendLimitDollars": 100
}'
```
### API des listes de blocage de dépôts
Ajoute des dépôts et des motifs pour empêcher l’indexation de certains fichiers ou répertoires, ou leur utilisation comme contexte pour ton équipe.
#### Obtenir les listes de blocage des dépôts de l'équipe
Récupère toutes les listes de blocage de dépôts configurées pour ton équipe.
```
GET /settings/repo-blocklists/repos
```
##### Réponse
Renvoie un tableau d’objets de liste de blocage de dépôt :
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
```bash theme={null}
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u TA_CLE_API:
```
#### Upsert des listes de blocage de dépôts
Remplace les listes de blocage de dépôts existantes pour les dépôts fournis.
*Remarque : cet endpoint ne remplacera que les patterns pour les dépôts fournis. Tous les autres dépôts ne seront pas affectés.*
```
POST /settings/repo-blocklists/repos/upsert
```
##### Corps de la requête
| Paramètre | Type | Requis | Description |
| --------- | ----- | ------ | --------------------------------------- |
| repos | array | Oui | Tableau d’objets de blocklist de dépôts |
Chaque objet de dépôt doit contenir :
| Champ | Type | Requis | Description |
| -------- | --------- | ------ | --------------------------------------------------------------------- |
| url | string | Oui | URL du dépôt à ajouter à la blocklist |
| patterns | string\[] | Oui | Tableau de modèles de fichiers à bloquer (motifs glob pris en charge) |
##### Réponse
Renvoie la liste mise à jour des blocklists de dépôts :
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
Modèles courants de liste de blocage :
* `*` - Bloquer tout le dépôt
* `*.env` - Bloquer tous les fichiers .env
* `config/*` - Bloquer tous les fichiers du répertoire config
* `**/*.secret` - Bloquer tous les fichiers .secret dans n’importe quel sous-répertoire
* `src/api/keys.ts` - Bloquer un fichier spécifique
# API de suivi de code par IA
Source: https://docs.cursor.com/fr/account/teams/ai-code-tracking-api
Accède aux analytics de code générées par l’IA pour les dépôts de ton équipe
Accède aux analytics de code générées par l’IA pour les dépôts de ton équipe. Ça inclut l’usage de l’IA par commit ainsi que le détail des modifications d’IA acceptées.
L’API est en première release. On étend les capacités selon les retours — dis-nous quels endpoints tu veux !
* **Disponibilité**: Réservée aux équipes Enterprise
* **Statut**: Alpha (la structure des réponses et les champs peuvent changer)
## Authentification
Toutes les requêtes à l’API nécessitent une authentification avec une clé d’API. Cette API utilise le même mécanisme d’authentification de l’Admin API que les autres endpoints.
Pour des instructions détaillées sur l’authentification, vois [Admin API authentication](/fr/account/teams/admin-api#authentication).
## URL de base
Toutes les routes de l’API utilisent :
```
https://api.cursor.com
```
## Limites de débit
* 5 requêtes par minute et par équipe, par endpoint
## Paramètres de requête
Tous les endpoints ci-dessous acceptent les mêmes paramètres via la chaîne de requête :
| Paramètre | Type | Requis | Description | |
| :---------- | :----- | :----- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `startDate` | string | date | Non | Chaîne de date ISO, le littéral "now", ou des jours relatifs comme "7d" (équivaut à maintenant - 7 jours). Par défaut : maintenant - 7 jours |
| `endDate` | string | date | Non | Chaîne de date ISO, le littéral "now", ou des jours relatifs comme "0d". Par défaut : maintenant |
| `page` | number | Non | Numéro de page (indexé à partir de 1). Par défaut : 1 | |
| `pageSize` | number | Non | Résultats par page. Par défaut : 100, max : 1000 | |
| `user` | string | Non | Filtre optionnel par un seul utilisateur. Accepte une adresse e-mail (p. ex. [developer@company.com](mailto:developer@company.com)), un ID encodé (p. ex. user\_abc123...), ou un ID numérique (p. ex. 42) | |
Les réponses renvoient userId comme ID externe encodé avec le préfixe user\_. C’est stable pour une consommation via l’API.
## Sémantique et calcul des métriques
* **Sources** : "TAB" correspond aux complétions en ligne acceptées ; "COMPOSER" correspond aux diffs acceptés depuis Composer
* **Métriques de lignes** : tabLinesAdded/Deleted et composerLinesAdded/Deleted sont comptées séparément ; nonAiLinesAdded/Deleted sont calculées comme max(0, totalLines - AI lines)
* **Mode confidentialité** : S’il est activé côté client, certaines métadonnées (comme fileName) peuvent être omises
* **Infos de branche** : isPrimaryBranch vaut true lorsque la branche actuelle est la branche par défaut du dépôt ; peut être undefined si les infos du dépôt ne sont pas disponibles
Tu peux parcourir ce fichier pour comprendre comment les commits et les modifications sont détectés et signalés.
## Endpoints
### Récupérer les métriques de commits IA (JSON, paginées)
Récupère des métriques agrégées par commit attribuant les lignes à TAB, COMPOSER et au non-IA.
```
GET /analytics/ai-code/commits
```
**Demande simple :**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/commits?startDate=7d&endDate=now&page=1&pageSize=100" \
-u TA_CLÉ_API:
```
**Filtrer par utilisateur (e-mail) :**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/commits?startDate=2025-06-01T00:00:00Z&endDate=now&user=developer@company.com" \
-u TA_CLEF_API:
```
### Télécharger les métriques de commits IA (CSV, streaming)
Télécharge les métriques de commits au format CSV pour des extractions de données volumineuses.
```
GET /analytics/ai-code/commits.csv
```
#### Réponse
En-têtes :
* Content-Type: text/csv; charset=utf-8
#### Colonnes CSV
| Colonne | Type | Description |
| :----------------------- | :------ | :----------------------------------------------- |
| `commit_hash` | string | Hash de commit Git |
| `user_id` | string | ID utilisateur encodé |
| `user_email` | string | Adresse e-mail de l’utilisateur |
| `repo_name` | string | Nom du dépôt |
| `branch_name` | string | Nom de la branche |
| `is_primary_branch` | boolean | Indique s’il s’agit de la branche par défaut |
| `total_lines_added` | number | Nombre total de lignes ajoutées dans le commit |
| `total_lines_deleted` | number | Nombre total de lignes supprimées dans le commit |
| `tab_lines_added` | number | Lignes ajoutées via les complétions Tab |
| `tab_lines_deleted` | number | Lignes supprimées via les complétions Tab |
| `composer_lines_added` | number | Lignes ajoutées via Composer |
| `composer_lines_deleted` | number | Lignes supprimées via Composer |
| `non_ai_lines_added` | number | Lignes non IA ajoutées |
| `non_ai_lines_deleted` | number | Lignes non IA supprimées |
| `message` | string | Message de commit |
| `commit_ts` | string | Horodatage du commit (format ISO) |
| `created_at` | string | Horodatage d’ingestion (format ISO) |
#### Exemple de sortie CSV
```csv theme={null}
commit_hash,user_id,user_email,repo_name,branch_name,is_primary_branch,total_lines_added,total_lines_deleted,tab_lines_added,tab_lines_deleted,composer_lines_added,composer_lines_deleted,non_ai_lines_added,non_ai_lines_deleted,message,commit_ts,created_at
a1b2c3d4,user_3k9x8q...,developer@company.com,company/repo,main,true,120,30,50,10,40,5,30,15,"Refactorisation : extraction du client d’analytics",2025-07-30T14:12:03.000Z,2025-07-30T14:12:30.000Z
e5f6g7h8,user_3k9x8q...,developer@company.com,company/repo,feature-branch,false,85,15,30,5,25,3,30,7,"Ajout de la gestion des erreurs",2025-07-30T13:45:21.000Z,2025-07-30T13:45:45.000Z
```
### Obtenir des métriques sur les changements de code IA (JSON, paginées)
Récupère des changements IA acceptés à un niveau granulaire, regroupés par changeId déterministe. Utile pour analyser les événements IA acceptés indépendamment des commits.
```
GET /analytics/ai-code/changes
```
**Demande de base :**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?startDate=14d&endDate=now&page=1&pageSize=200" \
-u VOTRE_CLÉ_API:
```
**Filtrer par utilisateur (ID encodé) :**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?user=user_3k9x8q..." \
-u TA_CLÉ_API:
```
**Filtrer par utilisateur (e-mail) :**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?user=developer@company.com" \
-u VOTRE_CLE_API:
```
### Télécharger les métriques de modifications de code IA (CSV, streaming)
Télécharge les métriques de modifications au format CSV pour de larges extractions de données.
```
GET /analytics/ai-code/changes.csv
```
#### Réponse
En-têtes :
* Content-Type: text/csv; charset=utf-8
#### Colonnes CSV
| Colonne | Type | Description |
| :-------------------- | :----- | :---------------------------------------------------- |
| `change_id` | string | ID déterministe de la modification |
| `user_id` | string | ID utilisateur encodé |
| `user_email` | string | Adresse e-mail de l’utilisateur |
| `source` | string | Origine de la modification par l’IA (TAB ou COMPOSER) |
| `model` | string | Modèle d’IA utilisé |
| `total_lines_added` | number | Nombre total de lignes ajoutées |
| `total_lines_deleted` | number | Nombre total de lignes supprimées |
| `created_at` | string | Horodatage d’ingestion (format ISO) |
| `metadata_json` | string | Tableau de métadonnées sérialisé en JSON |
#### Notes
* metadata\_json est un tableau de métadonnées sérialisé en JSON (peut omettre fileName en mode confidentialité)
* Lors de la lecture du CSV, pense à parser les champs entre guillemets
* Utilise le paramètre `user` pour filtrer rapidement un utilisateur donné sur tous les endpoints
* Pour de larges extractions de données, privilégie les endpoints CSV — ils diffusent côté serveur par pages de 10 000 enregistrements
* `isPrimaryBranch` peut être indéfini si le client n’a pas pu déterminer la branche par défaut
* `commitTs` est l’horodatage du commit ; `createdAt` est l’heure d’ingestion sur nos serveurs
* Certains champs peuvent être absents lorsque le mode confidentialité est activé côté client
## Journal des modifications
* **Version alpha** : Premiers endpoints pour les commits et les modifications. Les formats de réponse pourront évoluer en fonction des retours
# Analytics
Source: https://docs.cursor.com/fr/account/teams/analytics
Suivre l’usage de l’équipe et les métriques d’activité
Les admins d’équipe peuvent suivre les métriques depuis le [dashboard](/fr/account/teams/dashboard).
### Utilisation totale
Consulte les métriques agrégées de ton équipe, dont le nombre total d’onglets et les requêtes premium. Pour les équipes de moins de 30 jours, les métriques reflètent l’usage depuis la création, y compris l’activité avant l’arrivée des membres.
### Par utilisateur actif
Consulte les métriques moyennes par utilisateur actif : onglets acceptés, lignes de code et requêtes premium.
### Activité des utilisateurs
Suis les utilisateurs actifs hebdomadaires et mensuels.
## En-têtes du rapport d’analytics
Quand tu exportes des données d’analytics depuis le tableau de bord, le rapport inclut des métriques détaillées sur le comportement des utilisateurs et l’utilisation des fonctionnalités. Voici ce que signifie chaque en-tête :
### Informations utilisateur
La date à laquelle les données d’analytics ont été enregistrées (p. ex., 2024-01-15T04:30:00.000Z)
Identifiant unique de chaque utilisateur dans le système
Adresse e-mail de l’utilisateur associée à son compte
Indique si l’utilisateur était actif à cette date
### Métriques de code généré par l’IA
Nombre total de lignes de code suggérées par la fonctionnalité de chat IA
Nombre total de lignes de code suggérées pour suppression par le chat IA
Lignes suggérées par l’IA que l’utilisateur a acceptées et ajoutées à son code
Suppressions suggérées par l’IA que l’utilisateur a acceptées
### Métriques d’utilisation des fonctionnalités
Nombre de fois où un utilisateur a appliqué des modifications générées par l’IA depuis le chat
Nombre de fois où un utilisateur a accepté des suggestions de l’IA
Nombre de fois où un utilisateur a rejeté des suggestions de l’IA
Nombre de fois où des onglets de suggestions IA ont été affichés à l’utilisateur
Onglets de suggestions IA acceptés par l’utilisateur
### Métriques par type de requête
Requêtes effectuées via la fonctionnalité composer/edit (Cmd+K, modifications inline)
Requêtes de chat où les utilisateurs posent des questions à l’IA
Requêtes envoyées aux agents IA (assistants IA spécialisés)
Nombre de fois où la palette de commandes Cmd+K (ou Ctrl+K) a été utilisée
### Métriques d’abonnement et d’API
Requêtes à l’IA couvertes par l’abonnement de l’utilisateur
Requêtes effectuées avec des clés d’API pour un accès programmatique
Requêtes comptabilisées pour la facturation à l’usage
### Fonctionnalités supplémentaires
Nombre de fois où la fonctionnalité IA de détection/correction de bugs a été utilisée
### Informations de configuration
Modèle d’IA le plus utilisé par l’utilisateur (p. ex., GPT-4, Claude)
Extension de fichier la plus utilisée lors de l’application des suggestions de l’IA (p. ex., .ts,
.py, .java)
Extension de fichier la plus utilisée avec les fonctionnalités de complétion par tabulation
Version de l’éditeur Cursor utilisée
### Métriques calculées
Le rapport inclut aussi des données traitées qui aident à comprendre la contribution de l’IA au code :
* Total des lignes ajoutées/supprimées : comptage brut de toutes les modifications de code
* Lignes ajoutées/supprimées acceptées : lignes issues de suggestions de l’IA et acceptées
* Requêtes du composer : requêtes effectuées via la fonctionnalité de composer inline
* Requêtes de chat : requêtes effectuées via l’interface de chat
Toutes les valeurs numériques valent 0 par défaut si absentes, les valeurs booléennes valent
false par défaut, et les chaînes de caractères valent par défaut des chaînes vides. Les métriques
sont agrégées par utilisateur à la journée.
# Analytics V2
Source: https://docs.cursor.com/fr/account/teams/analyticsV2
Suivi avancé des indicateurs d’utilisation et d’activité de l’équipe
On prépare une V2 de notre infrastructure d’analytics. Ça inclut une refonte de la façon dont on suit différents indicateurs.
À partir du **1er septembre 2025**, et pour les utilisateurs sur **Cursor version 1.5**, les analytics utiliseront notre infrastructure V2. Les versions précédentes sous-comptaient plusieurs indicateurs, notamment :
* Total Accepted Lines of Code
* Total Suggested Lines of Code
* Total Tabs Accepted
Reste à l’écoute, on continue d’investir dans les analytics et de sortir de nouvelles fonctionnalités dans ce domaine.
# Dashboard
Source: https://docs.cursor.com/fr/account/teams/dashboard
Gère la facturation, l’usage et les paramètres d’équipe depuis ton dashboard
Le dashboard te permet d’accéder à la facturation, de configurer une tarification basée sur l’usage et de gérer ton équipe.
## Aperçu
Obtiens un résumé rapide de l’activité de ton équipe, des statistiques d’utilisation et des modifications récentes. La page d’aperçu offre une vue d’ensemble instantanée de ton espace de travail.
## Paramètres
Configure les préférences et la sécurité à l’échelle de l’équipe. La page Paramètres comprend :
## Paramètres Teams & Enterprise
Gère les préférences de partage de données pour ton équipe. Configure une politique de non-conservation des données avec les fournisseurs d’IA (OpenAI, Anthropic, Google Vertex AI, xAI Grok) et applique des règles de confidentialité à l’échelle de l’équipe.
{" "}
Active la tarification à l’usage et fixe des plafonds de dépenses. Configure des limites de dépenses mensuelles pour l’équipe et, en option, par utilisateur. Choisis si seuls les admins peuvent
modifier ces paramètres.
{" "}
Configure des rôles IAM AWS Bedrock pour une intégration cloud sécurisée.
{" "}
Configure l’authentification SSO pour les équipes Enterprise afin de simplifier l’accès utilisateur et
d’améliorer la sécurité.
{" "}
Crée et gère des clés API pour un accès programmatique aux fonctionnalités d’admin de Cursor.
{" "}
Surveille et gère les sessions utilisateur actives au sein de ton équipe.
Crée et gère des codes d’invitation pour ajouter de nouveaux membres à l’équipe.
Accède aux endpoints REST de l’API Cursor pour une intégration programmatique. Tous les endpoints de l’API sont disponibles sur les offres Team et Enterprise, à l’exception de l’[API AI Code Tracking](/fr/docs/account/teams/ai-code-tracking-api) qui nécessite une offre Enterprise.
## Paramètres réservés à l’Enterprise
{" "}
Choisis quels modèles d’IA sont disponibles pour les membres de l’équipe. Défini des restrictions sur
des modèles spécifiques ou des niveaux de modèles pour gérer les coûts et garantir une utilisation appropriée
dans toute ton organisation.
{" "}
Configure les paramètres d’exécution automatique des commandes pour Cursor version 0.49 et
supérieures. Contrôle quelles commandes peuvent s’exécuter automatiquement et définis des règles de sécurité
pour l’exécution du code.
Empêche l’accès à certains dépôts pour des raisons de sécurité ou de conformité.
{" "}
Configure les paramètres du Model Context Protocol pour Cursor version 0.51 et supérieures.
Gère la façon dont les modèles accèdent au contexte et le traitent depuis ton
environnement de développement.
{" "}
Configure des modèles d’exclusion pour les fichiers et dossiers dans Cursor version 0.50 et
supérieures. Contrôle quels fichiers et dossiers sont exclus de l’analyse
et des suggestions de l’IA.
Protège le répertoire .cursor contre les accès non autorisés à partir de la version 0.51 et supérieures. Assure que les fichiers sensibles de configuration et de cache restent protégés.
Accède à des analyses détaillées du code généré par l’IA pour les dépôts de ton équipe. Récupère des métriques d’utilisation de l’IA par commit et des modifications acceptées issues de l’IA, de façon granulaire, via des endpoints d’API REST. Nécessite l’offre Enterprise. Plus d’informations [ici](/fr/account/teams/ai-code-tracking-api).
**SCIM** (System for Cross-domain Identity Management) est aussi
disponible pour les offres Enterprise. Consulte notre [documentation SCIM](/fr/account/teams/scim) pour les instructions de configuration.
## Membres
Gère les membres de ton équipe, invite de nouveaux utilisateurs et contrôle les autorisations d’accès. Définis des autorisations par rôle et suis l’activité des membres.
## Intégrations
{" "}
Connecte Cursor à tes outils et services préférés. Configure des intégrations avec des systèmes de contrôle de version, des outils de gestion de projet et d'autres services pour développeurs.
## Agents en arrière-plan
{" "}
Surveille et gère les agents en arrière-plan qui s’exécutent dans ton espace de travail. Consulte l’état des agents, les journaux et l’utilisation des ressources.
## Bugbot
Accède à des fonctionnalités automatisées de détection et de correction de bugs. Bugbot t’aide à identifier et à résoudre automatiquement les problèmes courants dans ton codebase.
## Gestion d’Active Directory
Pour les équipes entreprise, gère l’authentification et les accès des utilisateurs via l’intégration à Active Directory. Configure le SSO et le provisioning des utilisateurs.
## Utilisation
Suis des métriques d’utilisation détaillées, y compris les requêtes IA, l’utilisation des modèles et la consommation de ressources. Surveille l’utilisation au sein des membres de l’équipe et des projets.
## Facturation & Factures
Gère ton abonnement, mets à jour tes moyens de paiement et accède à l’historique de facturation. Télécharge des factures et gère les paramètres de tarification à l’usage.
# Paramètres Enterprise
Source: https://docs.cursor.com/fr/account/teams/enterprise-settings
Gère de façon centralisée les paramètres de Cursor pour ton organisation
# Paramètres d’entreprise
Tu peux gérer de façon centralisée certaines fonctionnalités de Cursor via des solutions de gestion d’appareils pour t’assurer qu’il répond aux besoins de ton organisation. Quand tu définis une règle Cursor, sa valeur remplace le paramètre Cursor correspondant sur les appareils des utilisateurs.
Éditeur de paramètres indiquant que le paramètre « Extensions : autorisées » est géré par l’organisation.
Cursor propose actuellement des règles pour contrôler les fonctionnalités suivantes administrées par les équipes IT :
| Règle | Description | Paramètre Cursor | Disponible depuis |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------ | ----------------- |
| AllowedExtensions | Contrôle quelles extensions peuvent être installées. | extensions.allowed | 1.2 |
| AllowedTeamId | Contrôle quels IDs d’équipe sont autorisés à se connecter. Les utilisateurs avec des IDs d’équipe non autorisés sont déconnectés de force. | cursorAuth.allowedTeamId | 1.3 |
## Configurer les extensions autorisées
Le paramètre Cursor `extensions.allowed` contrôle quelles extensions peuvent être installées. Ce paramètre accepte un objet JSON dont les clés sont des noms d’éditeurs et les valeurs des booléens indiquant si les extensions de cet éditeur sont autorisées.
Par exemple, définir `extensions.allowed` sur `{"anysphere": true, "github": true}` autorise les extensions des éditeurs Anysphere et GitHub, tandis que le définir sur `{"anysphere": false}` bloque les extensions d’Anysphere.
Pour gérer de façon centralisée les extensions autorisées pour ton organisation, configure la stratégie `AllowedExtensions` via ta solution de gestion des appareils. Cette stratégie remplace le paramètre `extensions.allowed` sur les appareils des utilisateurs. La valeur de cette stratégie est une chaîne JSON qui définit les éditeurs autorisés.
Si tu veux en savoir plus sur les extensions dans Cursor, consulte la documentation des extensions.
## Configurer les IDs d’équipe autorisés
Le paramètre Cursor `cursorAuth.allowedTeamId` détermine quels IDs d’équipe sont autorisés à se connecter à Cursor. Ce paramètre accepte une liste d’IDs d’équipe, séparés par des virgules, qui sont autorisés à accéder.
Par exemple, définir `cursorAuth.allowedTeamId` sur `"1,3,7"` permet aux utilisateurs appartenant à ces IDs d’équipe spécifiques de se connecter.
Quand un utilisateur essaie de se connecter avec un ID d’équipe qui n’est pas dans la liste autorisée :
* Il est immédiatement déconnecté de force
* Un message d’erreur s’affiche
* L’application bloque toute nouvelle tentative d’authentification jusqu’à l’utilisation d’un ID d’équipe valide
Pour gérer de manière centralisée les IDs d’équipe autorisés pour ton organisation, configure la stratégie `AllowedTeamId` via ta solution de gestion des appareils. Cette stratégie remplace le paramètre `cursorAuth.allowedTeamId` sur les appareils des utilisateurs. La valeur de cette stratégie est une chaîne contenant la liste, séparée par des virgules, des IDs d’équipe autorisés.
## Stratégie de groupe sur Windows
Cursor prend en charge la stratégie de groupe basée sur le Registre Windows. Lorsque les définitions de stratégie sont installées, les admins peuvent utiliser l’Éditeur de stratégie de groupe locale pour gérer les valeurs de stratégie.
Pour ajouter une stratégie :
1. Copie les fichiers ADMX et ADML de stratégie depuis `AppData\Local\Programs\cursor\policies`.
2. Colle le fichier ADMX dans le répertoire `C:\Windows\PolicyDefinitions`, et le fichier ADML dans le répertoire `C:\Windows\PolicyDefinitions\\`.
3. Redémarre l’Éditeur de stratégie de groupe locale.
4. Définit les valeurs de stratégie appropriées (p. ex. `{"anysphere": true, "github": true}` pour la stratégie `AllowedExtensions`) dans l’Éditeur de stratégie de groupe locale.
Les stratégies peuvent être définies à la fois au niveau Ordinateur et au niveau Utilisateur. Si les deux sont définies, le niveau Ordinateur a la priorité. Lorsqu’une valeur de stratégie est définie, elle remplace la valeur du paramètre Cursor configurée à n’importe quel niveau (par défaut, utilisateur, espace de travail, etc.).
## Profils de configuration sur macOS
Les profils de configuration gèrent les paramètres sur les appareils macOS. Un profil est un fichier XML avec des paires clé/valeur correspondant aux stratégies disponibles. Ces profils peuvent être déployés via des solutions de gestion des appareils mobiles (MDM) ou installés manuellement.
Un exemple de fichier `.mobileconfig` pour macOS est présenté ci-dessous :
```
PayloadContentPayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92.J6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadTypecom.todesktop.230313mzl4w4u92PayloadUUIDJ6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadVersion1AllowedExtensions{"anysphere":true}AllowedTeamId1,2PayloadDescriptionThis profile manages Cursor.PayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92PayloadOrganizationAnyspherePayloadTypeConfigurationPayloadUUIDF2C1A7B3-9D4E-4B2C-8E1F-7A6C5D4B3E2FPayloadVersion1TargetDeviceType5
```
### Stratégies de type chaîne
L’exemple ci-dessous illustre la configuration de la stratégie `AllowedExtensions`. La valeur de la stratégie est vide dans le fichier d’exemple (aucune extension n’est autorisée).
```
ExtensionsAutorisées
```
Ajoute la chaîne JSON appropriée qui définit ta politique entre les balises ``.
```
AllowedExtensions{"anysphere": true, "github": true}
```
Pour la règle `AllowedTeamId`, ajoute la liste des IDs d’équipe séparés par des virgules :
```
AllowedTeamId1,3,7
```
**Important :** Le fichier `.mobileconfig` fourni initialise **toutes** les stratégies disponibles dans cette version de Cursor. Supprime toutes celles dont t’as pas besoin.
Si tu n’édites pas ou ne supprimes pas une stratégie dans l’exemple `.mobileconfig`, elle sera appliquée avec sa valeur par défaut (restrictive).
Installe manuellement un profil de configuration en double-cliquant sur le fichier `.mobileconfig` dans le Finder, puis active-le dans Réglages Système sous **Général** > **Gestion des appareils**. Supprimer le profil depuis Réglages Système retirera les stratégies de Cursor.
Pour en savoir plus sur les profils de configuration, consulte la documentation d’Apple.
## Politiques supplémentaires
L’objectif est d’élever les réglages actuels de Cursor au rang de politiques et de s’aligner étroitement sur les réglages existants, afin que la nomenclature et le comportement restent cohérents. Si tu veux proposer davantage de politiques, ouvre une issue sur le dépôt GitHub de Cursor. L’équipe déterminera s’il existe déjà un réglage correspondant pour ce comportement ou s’il faut créer un nouveau réglage pour contrôler le comportement souhaité.
## Foire aux questions
### Cursor prend-il en charge les profils de configuration sous Linux ?
La prise en charge de Linux n’est pas prévue sur la feuille de route. Si t’es intéressé par les profils de configuration sous Linux, ouvre une issue sur le dépôt GitHub de Cursor et partage les détails de ton cas d’usage.
# Membres et rôles
Source: https://docs.cursor.com/fr/account/teams/members
Gérer les membres et les rôles de l’équipe
Les équipes Cursor ont trois rôles :
## Rôles
Les **Membres** sont le rôle par défaut avec accès aux fonctionnalités Pro de Cursor.
* Accès complet aux fonctionnalités Pro de Cursor
* Pas d’accès aux paramètres de facturation ni au tableau de bord d’admin
* Peuvent voir leur propre utilisation et leur budget restant basé sur l’utilisation
Les **Admins** gèrent la gestion d’équipe et les paramètres de sécurité.
* Accès complet aux fonctionnalités Pro
* Ajout/suppression de membres, modification des rôles, configuration du SSO
* Configuration de la tarification à l’usage et des plafonds de dépenses
* Accès aux analyses d’équipe
Les **Admins non payants** gèrent des équipes sans occuper de place payante — idéal pour le personnel IT ou finance qui n’a pas besoin d’accéder à Cursor.
* Non facturés, pas de fonctionnalités Pro
* Même périmètre administratif que les Admins
Les Admins non payants nécessitent au moins un utilisateur payant dans l’équipe.
## Comparaison des rôles
| Fonctionnalité | Membre | Admin | Admin non payant |
| -------------------------------------- | :----: | :---: | :--------------: |
| Utiliser les fonctionnalités de Cursor | ✓ | ✓ | |
| Inviter des membres | ✓ | ✓ | ✓ |
| Retirer des membres | | ✓ | ✓ |
| Modifier le rôle d’un utilisateur | | ✓ | ✓ |
| Tableau de bord Admin | | ✓ | ✓ |
| Configurer le SSO/la sécurité | | ✓ | ✓ |
| Gérer la facturation | | ✓ | ✓ |
| Consulter les analytics | | ✓ | ✓ |
| Gérer les accès | | ✓ | ✓ |
| Définir les contrôles d’utilisation | | ✓ | ✓ |
| Nécessite une licence payante | ✓ | ✓ | |
## Gérer les membres
Tous les membres de l'équipe peuvent inviter d'autres personnes. Pour l’instant, on ne restreint pas les invitations.
### Ajouter un membre
Ajoute des membres de trois façons :
1. **Invitation par e-mail**
* Clique sur `Invite Members`
* Saisis des adresses e-mail
* Les utilisateurs reçoivent une invitation par e-mail
2. **Lien d'invitation**
* Clique sur `Invite Members`
* Copie `Invite Link`
* Partage le lien avec les membres de l'équipe
3. **SSO**
* Configure le SSO dans le [tableau de bord d’admin](/fr/account/teams/sso)
* Les utilisateurs rejoignent automatiquement en se connectant avec leur e-mail SSO
Les liens d'invitation expirent très tard — toute personne ayant le lien peut rejoindre.
Révoque-les ou utilise le [SSO](/fr/account/teams/sso)
### Retirer un membre
Les admins peuvent retirer des membres à tout moment via le menu contextuel → "Remove". Si un membre a utilisé des crédits, son siège reste occupé jusqu'à la fin du cycle de facturation.
### Changer le rôle
Les admins peuvent changer le rôle d'autres membres en cliquant sur le menu contextuel puis sur l'option "Change role".
Il doit toujours y avoir au moins un Admin et au moins un membre payant dans l'équipe.
## Sécurité & SSO
Le Single Sign-On (SSO) SAML 2.0 est dispo sur les offres Team. Fonctionnalités clés :
* Configurer des connexions SSO ([en savoir plus](/fr/account/teams/sso))
* Mettre en place la vérification de domaine
* Inscription automatique des utilisateurs
* Options d’application du SSO
* Intégration avec un fournisseur d’identité (Okta, etc.)
La vérification de domaine est requise pour activer le SSO.
## Contrôles d’utilisation
Accède aux paramètres d’utilisation pour :
* Activer la tarification à l’usage
* Activer pour les modèles premium
* Limiter les modifications aux admins
* Définir des plafonds de dépense mensuels
* Suivre l’utilisation à l’échelle de l’équipe
## Facturation
Quand tu ajoutes des membres à l’équipe :
* Chaque membre ou admin occupe une place facturable (voir [tarifs](https://cursor.com/pricing))
* Les nouveaux membres sont facturés au prorata du temps restant dans la période de facturation
* Les places d’admin non payées ne sont pas comptabilisées
Les ajouts en cours de mois ne facturent que les jours utilisés. Quand tu retires des membres qui ont utilisé des crédits, leur place reste occupée jusqu’à la fin du cycle de facturation — aucun remboursement au prorata n’est accordé.
Les changements de rôle (p. ex. Admin vers Admin non payé) ajustent la facturation à partir de la date du changement. Choisis une facturation mensuelle ou annuelle.
Le renouvellement mensuel/annuel a lieu à ta date d’inscription initiale, quels que soient les changements de membres.
### Passer à la facturation annuelle
Économise **20 %** en passant du mensuel à l’annuel :
1. Va sur le [Dashboard](https://cursor.com/dashboard)
2. Dans la section Compte, clique sur « Advanced » puis « Upgrade to yearly billing »
Tu peux uniquement passer du mensuel à l’annuel via le dashboard. Pour passer de
l’annuel au mensuel, contacte [hi@cursor.com](mailto:hi@cursor.com).
# SCIM
Source: https://docs.cursor.com/fr/account/teams/scim
Configurer l’approvisionnement SCIM pour la gestion automatisée des utilisateurs et des groupes
## Aperçu
Le provisionnement SCIM 2.0 gère automatiquement les membres de ton équipe et les groupes d’annuaire via ton fournisseur d’identité. Disponible sur les offres Enterprise avec SSO activé.
Tableau de bord des paramètres SCIM affichant la configuration de gestion d’Active Directory
## Prérequis
* Abonnement Cursor Enterprise
* Le SSO doit être configuré au préalable — **SCIM nécessite une connexion SSO active**
* Accès admin à ton fournisseur d’identité (Okta, Azure AD, etc.)
* Accès admin à ton organisation Cursor
## Comment ça marche
### Provisioning des utilisateurs
Les utilisateurs sont automatiquement ajoutés à Cursor quand ils sont affectés à l’application SCIM dans ton fournisseur d’identité. Quand ils sont désaffectés, ils sont supprimés. Les changements se synchronisent en temps réel.
### Groupes d’annuaire
Les groupes d’annuaire et leurs membres se synchronisent depuis ton fournisseur d’identité. La gestion des groupes et des utilisateurs doit se faire via ton fournisseur d’identité — Cursor affiche ces infos en lecture seule.
### Gestion des dépenses
Définis des limites de dépenses par utilisateur pour chaque groupe d’annuaire. Les limites des groupes d’annuaire priment sur les limites au niveau de l’équipe. Les utilisateurs appartenant à plusieurs groupes reçoivent la limite de dépenses la plus élevée applicable.
## Configuration
SCIM nécessite que le SSO soit configuré en premier. Si t’as pas encore configuré le SSO,
suis le [guide de configuration du SSO](/fr/account/teams/sso) avant de continuer.
Va sur
[cursor.com/dashboard?tab=active-directory](https://www.cursor.com/dashboard?tab=active-directory)
avec un compte admin, ou ouvre les paramètres de ton dashboard et sélectionne l’onglet
« Active Directory Management ».
Une fois le SSO vérifié, tu verras un lien pour une configuration SCIM pas à pas. Clique
dessus pour lancer l’assistant de configuration.
Dans ton fournisseur d’identité : - Crée ou configure ton application SCIM - Utilise
l’endpoint SCIM et le token fournis par Cursor - Active le provisioning des utilisateurs et la synchronisation des groupes - Teste la connexion
De retour sur la page Active Directory Management de Cursor : - Consulte tes groupes d’annuaire synchronisés - Défini des limites de dépenses par utilisateur pour des groupes spécifiques si nécessaire -
Vérifie quelles limites s’appliquent aux utilisateurs appartenant à plusieurs groupes
### Configuration du fournisseur d’identité
Pour des instructions de configuration spécifiques au fournisseur :
Instructions de configuration pour Okta, Azure AD, Google Workspace et plus encore.
## Gestion des utilisateurs et des groupes
Toute la gestion des utilisateurs et des groupes doit être effectuée via ton fournisseur d'identité.
Les modifications effectuées dans ton fournisseur d'identité se synchronisent automatiquement avec Cursor, mais
tu ne peux pas modifier les utilisateurs ou les groupes directement dans Cursor.
### Gestion des utilisateurs
* Ajoute des utilisateurs en les assignant à ton application SCIM dans ton fournisseur d'identité
* Supprime des utilisateurs en les retirant de l'application SCIM
* Les modifications du profil utilisateur (nom, e-mail) se synchronisent automatiquement depuis ton fournisseur d'identité
### Gestion des groupes
* Les groupes de l'annuaire sont automatiquement synchronisés depuis ton fournisseur d'identité
* Les changements d'appartenance aux groupes sont pris en compte en temps réel
* Utilise les groupes pour organiser les utilisateurs et définir différents plafonds de dépenses
### Plafonds de dépenses
* Définit des plafonds par utilisateur différents pour chaque groupe de l'annuaire
* Les utilisateurs héritent du plafond de dépenses le plus élevé parmi leurs groupes
* Les plafonds de groupe remplacent le plafond par utilisateur par défaut au niveau de l'équipe
## FAQ
### Pourquoi la gestion SCIM n’apparaît-elle pas dans mon tableau de bord ?
Assure-toi que le SSO est correctement configuré et opérationnel avant de configurer SCIM. SCIM nécessite une connexion SSO active pour fonctionner.
### Pourquoi les utilisateurs ne se synchronisent-ils pas ?
Vérifie que les utilisateurs sont affectés à l’application SCIM dans ton fournisseur d’identité. Les utilisateurs doivent être explicitement affectés pour apparaître dans Cursor.
### Pourquoi les groupes n’apparaissent-ils pas ?
Vérifie que l’approvisionnement des groupes par push est activé dans les paramètres SCIM de ton fournisseur d’identité. La synchronisation des groupes doit être configurée séparément de celle des utilisateurs.
### Pourquoi les limites de dépenses ne s’appliquent-elles pas ?
Confirme que les utilisateurs sont correctement affectés aux groupes attendus dans ton fournisseur d’identité. L’appartenance à un groupe détermine quelles limites de dépenses s’appliquent.
### Puis-je gérer les utilisateurs et les groupes SCIM directement dans Cursor ?
Non. Toute la gestion des utilisateurs et des groupes doit se faire via ton fournisseur d’identité. Cursor affiche ces informations en lecture seule.
### À quelle vitesse les modifications se synchronisent-elles ?
Les modifications effectuées dans ton fournisseur d’identité se synchronisent avec Cursor en temps réel. Il peut y avoir un léger délai pour les opérations en masse de grande taille.
# Bien démarrer
Source: https://docs.cursor.com/fr/account/teams/setup
Créer et configurer une équipe Cursor
## Cursor pour les équipes
Cursor marche aussi bien pour les personnes solo que pour les équipes. L’offre Teams propose des outils pour les organisations : SSO, gestion d’équipe, contrôles d’accès et analytics d’utilisation.
## Créer une équipe
Crée une équipe en suivant ces étapes :
Pour créer une équipe, suis ces étapes :
1. **Nouveaux utilisateurs** : rends-toi sur [cursor.com/team/new-team](https://cursor.com/team/new-team) pour créer un nouveau compte et une équipe
2. **Utilisateurs existants** : va sur ton [dashboard](/fr/account/dashboard) et clique sur « Upgrade to Teams »
Choisis un nom d’équipe et un cycle de facturation
Invite des membres de l’équipe. Le nombre d’utilisateurs est calculé au prorata : tu ne paies que pour la période où ils font partie de l’équipe.
Active le [SSO](/fr/account/teams/sso) pour plus de sécurité et un onboarding automatisé.
## FAQ
Cursor utilise HTTP/2 par défaut. Certains proxies et VPN le bloquent.
Active l’option de repli en HTTP/1.1 dans les paramètres pour utiliser HTTP/1.1 à la place.
Cursor facture par utilisateur actif, pas par siège. Ajoute ou retire des utilisateurs à tout moment — les nouveaux membres sont facturés au prorata pour le temps restant. Si un utilisateur retiré a utilisé des crédits, son siège reste occupé jusqu’à la fin du cycle de facturation.
Ta date de renouvellement ne change pas.
Définis-toi comme [Unpaid Admin](/fr/account/teams/members) pour gérer sans licence.
Les équipes doivent avoir au moins un membre payant. Tu peux faire la configuration, inviter un membre, puis changer ton rôle avant la facturation.
Les liens de téléchargement pour toutes les plateformes sont dispo sur [cursor.com/downloads](https://cursor.com/downloads).
Instructions MDM :
* [Omnissa Workspace ONE](https://docs.omnissa.com/bundle/MobileApplicationManagementVSaaS/page/DeployInternalApplications.html) (anciennement VMware)
* [Microsoft Intune (Windows)](https://learn.microsoft.com/en-us/mem/intune-service/apps/apps-win32-app-management)
* [Microsoft Intune (Mac)](https://learn.microsoft.com/en-us/mem/intune-service/apps/lob-apps-macos-dmg)
* [Kandji MDM](https://support.kandji.io/kb/custom-apps-overview)
# SSO
Source: https://docs.cursor.com/fr/account/teams/sso
Configure l’authentification unique pour ton équipe
## Vue d’ensemble
Le SSO SAML 2.0 est disponible sans frais supplémentaires sur les plans Business. Utilise ton fournisseur d’identité (IdP) existant pour authentifier les membres de ton équipe sans créer de comptes Cursor séparés.
## Prérequis
* Forfait Cursor Team
* Accès admin à ton fournisseur d’identité (p. ex. Okta)
* Accès admin à ton organisation Cursor
## Étapes de configuration
Va sur [cursor.com/dashboard?tab=settings](https://www.cursor.com/dashboard?tab=settings) avec un compte admin.
Repère la section « Single Sign-On (SSO) » et déplie-la.
Clique sur le bouton « SSO Provider Connection settings » pour démarrer la config SSO et suis l’assistant.
Dans ton fournisseur d’identité (p. ex. Okta) :
* Crée une nouvelle application SAML
* Configure les paramètres SAML en utilisant les informations de Cursor
* Mets en place le provisioning Just-in-Time (JIT)
Vérifie le domaine de tes utilisateurs dans Cursor en cliquant sur le bouton « Domain verification settings ».
### Guides de configuration des fournisseurs d’identité
Pour des instructions de configuration propres à chaque fournisseur :
Instructions de configuration pour Okta, Azure AD, Google Workspace et plus encore.
## Paramètres supplémentaires
* Gère l’application du SSO depuis le tableau de bord admin
* Les nouveaux utilisateurs sont inscrits automatiquement lorsqu’ils se connectent via SSO
* Gère les utilisateurs depuis ton fournisseur d’identité
## Dépannage
Si tu rencontres des problèmes :
* Vérifie que le domaine est validé dans Cursor
* Assure-toi que les attributs SAML sont correctement mis en correspondance
* Vérifie que le SSO est activé dans le tableau de bord admin
* Assure la correspondance des prénoms et noms entre le fournisseur d’identité et Cursor
* Consulte les guides spécifiques au fournisseur ci-dessus
* Contacte [hi@cursor.com](mailto:hi@cursor.com) si le problème persiste
# Accès aux mises à jour
Source: https://docs.cursor.com/fr/account/update-access
Choisis à quelle fréquence tu reçois des mises à jour
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor propose deux canaux de mise à jour.
Le canal de mise à jour par défaut avec des versions testées.
* Versions stables
* Corrections de bugs issues des tests préversion
* Par défaut pour tous les utilisateurs
* Seule option pour les utilisateurs d’équipe
Les comptes Team et Business utilisent le mode Default.
Versions préversion avec de nouvelles fonctionnalités.
Les versions Early Access peuvent comporter des bugs ou des problèmes de stabilité.
* Accès aux fonctionnalités en cours de développement
* Peut contenir des bugs
* Non disponible pour les comptes d’équipe
## Changer de canal de mise à jour
1. **Ouvre les paramètres** : Appuie sur Cmd+Shift+J
2. **Va dans Beta** : Sélectionne Beta dans la barre latérale
3. **Sélectionne le canal** : Choisis Default ou Early Access
Signale les problèmes liés à Early Access sur le [forum](https://forum.cursor.com).
# Apply
Source: https://docs.cursor.com/fr/agent/apply
Découvre comment appliquer, accepter ou refuser des suggestions de code depuis le chat avec Apply
## Comment fonctionne Apply
Apply est un modèle Cursor spécialisé qui prend le code généré par le chat et l’intègre dans tes fichiers. Il traite les blocs de code issus des conversations et applique les modifications à ton codebase.
Apply ne génère pas de code lui-même. Le modèle de chat génère le code, et Apply se charge de l’intégration dans les fichiers existants. Il peut traiter des modifications sur plusieurs fichiers et de grands codebases.
## Appliquer des blocs de code
Pour appliquer une suggestion de bloc de code, appuie sur le bouton lecture en haut à droite du bloc.
# Points de contrôle
Source: https://docs.cursor.com/fr/agent/chat/checkpoints
Enregistrer et restaurer des états antérieurs après des changements de l’Agent
Les points de contrôle sont des instantanés automatiques des changements de l’Agent dans ta base de code. Ils te permettent d’annuler les modifications de l’Agent si besoin.
## Restauration des checkpoints
Deux façons de restaurer :
1. **Depuis la zone de saisie** : clique sur le bouton `Restore Checkpoint` sur les requêtes précédentes
2. **Depuis un message** : clique sur le bouton + en survolant un message
Les checkpoints ne remplacent pas le contrôle de version. Utilise Git pour conserver un historique permanent.
## Comment ça fonctionne
* Stockés localement, séparément de Git
* Ne suivent que les changements de l’Agent (pas les modifications manuelles)
* Nettoyés automatiquement
Les modifications manuelles ne sont pas suivies. Utilise les checkpoints uniquement pour les changements de l’Agent.
## FAQ
Non. Ils sont distincts de l’historique Git.
{" "}
Pendant la session en cours et l’historique récent. Nettoyage automatique.
Non. Cursor les crée automatiquement.
{" "}
# Commandes
Source: https://docs.cursor.com/fr/agent/chat/commands
Définir des commandes pour des flux de travail réutilisables
Les commandes personnalisées te permettent de créer des workflows réutilisables, déclenchables avec un simple préfixe « / » dans la zone de saisie du chat. Elles aident à standardiser les processus au sein de ton équipe et rendent les tâches courantes plus efficaces.
Les commandes sont actuellement en bêta. La fonctionnalité et la syntaxe peuvent évoluer au fur et à mesure que nous les améliorons.
## Comment fonctionnent les commandes
Les commandes sont définies comme de simples fichiers Markdown et peuvent être stockées à deux emplacements :
1. **Commandes de projet** : stockées dans le répertoire `.cursor/commands` de ton projet
2. **Commandes globales** : stockées dans le répertoire `~/.cursor/commands` de ton dossier personnel
Quand tu tapes `/` dans le champ de saisie du chat, Cursor détecte et affiche automatiquement les commandes disponibles dans les deux répertoires, ce qui les rend instantanément accessibles dans tout ton workflow.
## Créer des commandes
1. Crée un répertoire `.cursor/commands` à la racine de ton projet
2. Ajoute des fichiers `.md` avec des noms explicites (p. ex. `review-code.md`, `write-tests.md`)
3. Écris du contenu Markdown simple décrivant ce que la commande doit faire
4. Les commandes s’afficheront automatiquement dans le chat quand tu tapes `/`
Voici un exemple de la structure que pourrait avoir ton répertoire de commandes :
```
.cursor/
└── commands/
├── traiter-les-commentaires-des-PR-GitHub.md
├── liste-de-contrôle-revue-de-code.md
├── créer-une-PR.md
├── revue-rapide-des-diffs-existants.md
├── onboard-un-nouveau-développeur.md
├── exécuter-tous-les-tests-et-corriger.md
├── audit-de-sécurité.md
└── configurer-une-nouvelle-fonctionnalité.md
```
## Exemples
Essaie ces commandes dans tes projets pour te faire une idée de leur fonctionnement.
```markdown theme={null}
# Checklist de revue de code
## Vue d’ensemble
Checklist complète pour mener des revues de code approfondies afin de garantir la qualité, la sécurité et la maintenabilité.
## Catégories de revue
### Fonctionnalité
- [ ] Le code fait ce qu’il est censé faire
- [ ] Les cas limites sont correctement gérés
- [ ] La gestion des erreurs est appropriée
- [ ] Pas de bugs évidents ni d’erreurs logiques
### Qualité du code
- [ ] Le code est lisible et bien structuré
- [ ] Les fonctions sont courtes et ciblées
- [ ] Les noms de variables sont explicites
- [ ] Pas de duplication de code
- [ ] Respecte les conventions du projet
### Sécurité
- [ ] Pas de vulnérabilités de sécurité évidentes
- [ ] La validation des entrées est en place
- [ ] Les données sensibles sont correctement traitées
- [ ] Pas de secrets codés en dur
```
```markdown theme={null}
# Audit de sécurité
## Vue d’ensemble
Revue de sécurité complète pour identifier et corriger les vulnérabilités dans la base de code.
## Étapes
1. **Audit des dépendances**
- Vérifier les vulnérabilités connues
- Mettre à jour les paquets obsolètes
- Passer en revue les dépendances tierces
2. **Revue de la sécurité du code**
- Rechercher les vulnérabilités courantes
- Passer en revue l’authentification et l’autorisation
- Auditer les pratiques de gestion des données
3. **Sécurité de l’infrastructure**
- Passer en revue les variables d’environnement
- Vérifier les contrôles d’accès
- Auditer la sécurité réseau
## Liste de vérification de sécurité
- [ ] Dépendances à jour et sécurisées
- [ ] Aucun secret en dur dans le code
- [ ] Validation des entrées mise en œuvre
- [ ] Authentification sécurisée
- [ ] Autorisation correctement configurée
```
```markdown theme={null}
# Configurer une nouvelle fonctionnalité
## Vue d’ensemble
Mettre en place une nouvelle fonctionnalité de façon systématique, de la planification initiale jusqu’à la structure d’implémentation.
## Étapes
1. **Définir les exigences**
- Clarifier le périmètre et les objectifs de la fonctionnalité
- Identifier les user stories et les critères d’acceptation
- Planifier l’approche technique
2. **Créer une branche de fonctionnalité**
- Partir de main/develop
- Configurer l’environnement de développement local
- Configurer toute nouvelle dépendance
3. **Concevoir l’architecture**
- Concevoir les modèles de données et les API
- Planifier les composants UI et les flux
- Définir la stratégie de test
## Liste de contrôle de configuration de la fonctionnalité
- [ ] Exigences documentées
- [ ] User stories rédigées
- [ ] Approche technique définie
- [ ] Branche de fonctionnalité créée
- [ ] Environnement de développement prêt
```
```markdown theme={null}
# Créer une PR
## Vue d’ensemble
Créer une pull request bien structurée avec une description claire, des labels et des reviewers.
## Étapes
1. **Préparer la branche**
- S’assurer que toutes les modifications sont commitées
- Pousser la branche vers le dépôt distant
- Vérifier que la branche est à jour avec main
2. **Rédiger la description de la PR**
- Résumer clairement les changements
- Inclure le contexte et la motivation
- Lister toute modification cassante
- Ajouter des captures d’écran si l’UI change
3. **Configurer la PR**
- Créer la PR avec un titre descriptif
- Ajouter les labels appropriés
- Assigner des reviewers
- Lier les issues associées
## Modèle de PR
- [ ] Fonctionnalité A
- [ ] Correction de bug B
- [ ] Les tests unitaires passent
- [ ] Tests manuels terminés
```
```markdown theme={null}
# Exécuter tous les tests et corriger les échecs
## Vue d’ensemble
Exécuter l’ensemble de la suite de tests et corriger systématiquement tous les échecs afin de garantir la qualité et la fonctionnalité du code.
## Étapes
1. **Exécuter la suite de tests**
- Exécuter tous les tests du projet
- Capturer la sortie et identifier les échecs
- Vérifier les tests unitaires et d’intégration
2. **Analyser les échecs**
- Catégoriser par type : instables, cassés, nouveaux échecs
- Prioriser les correctifs selon l’impact
- Vérifier si les échecs sont liés aux changements récents
3. **Corriger les problèmes de manière systématique**
- Commencer par les échecs les plus critiques
- Corriger un problème à la fois
- Relancer les tests après chaque correctif
```
```markdown theme={null}
# Intégrer un·e nouveau·elle développeur·euse
## Vue d’ensemble
Processus d’onboarding complet pour permettre à un·e nouveau·elle développeur·euse d’être opérationnel·le rapidement.
## Étapes
1. **Configuration de l’environnement**
- Installer les outils requis
- Configurer l’environnement de développement
- Configurer l’IDE et les extensions
- Configurer Git et les clés SSH
2. **Prise en main du projet**
- Passer en revue la structure du projet
- Comprendre l’architecture
- Lire la documentation principale
- Configurer la base de données locale
## Checklist d’onboarding
- [ ] Environnement de développement prêt
- [ ] Tous les tests passent
- [ ] Peut exécuter l’application en local
- [ ] Base de données configurée et fonctionnelle
- [ ] Première PR soumise
```
# Compact
Source: https://docs.cursor.com/fr/agent/chat/compact
Gagne de la place dans le chat avec l’interface du mode compact
Le mode compact propose une interface de chat épurée en réduisant le bruit visuel et en maximisant l’espace disponible pour les conversations.
## Aperçu
Une fois activé, le mode compact transforme l’interface de chat en :
* **Masquant les icônes** pour une apparence plus épurée et minimaliste
* **Repliant automatiquement les diffs** pour réduire le bruit visuel
* **Repliant automatiquement le champ de saisie** pour maximiser l’espace de conversation
Ce réglage est particulièrement utile sur les petits écrans ou quand tu préfères une expérience de chat focalisée et sans distractions.
## Avant/après
### Mode par défaut
### Mode compact
## Activer le mode compact
Pour activer le mode compact :
1. Ouvre les paramètres de Cursor
2. Va dans **Chat**
3. Active **Mode compact**
L’interface se met à jour instantanément avec une vue épurée, te laissant plus d’espace pour te concentrer sur tes conversations.
# Dupliquer
Source: https://docs.cursor.com/fr/agent/chat/duplicate
Crée des branches à partir de n'importe quel point d'une conversation
Duplique ou crée un fork de chats pour explorer des pistes alternatives sans perdre ta conversation actuelle.
## Comment dupliquer
1. Trouve l’endroit où tu veux créer une branche
2. Clique sur les trois points du message
3. Sélectionne « Duplicate Chat »
## Ce qui se passe
* Le contexte jusqu’à ce point est conservé
* La conversation d’origine reste inchangée
* Les deux discussions conservent des historiques séparés
# Export
Source: https://docs.cursor.com/fr/agent/chat/export
Exporter des chats au format Markdown
Exporte les chats d’Agent en fichiers Markdown pour les partager ou les documenter.
## Ce qui est exporté
* Tous les messages et les réponses
* Blocs de code avec surlignage syntaxique
* Références de fichiers et contexte
* Déroulé chronologique de la conversation
* Clique sur l’icône Historique dans le panneau latéral Agent
* Appuie sur Opt Cmd '
## Gérer les chats
* **Modifier les titres** : Clique pour renommer
* **Supprimer** : Supprime les chats inutiles
* **Ouvrir** : Clique pour afficher toute la conversation
L’historique des chats est stocké localement dans une base de données SQLite sur ta machine.
Pour conserver les chats, [exporte-les](/fr/agent/chats/export) au format Markdown.
## Agents en arrière-plan
Les conversations des agents en arrière-plan n’apparaissent pas dans l’historique habituel, elles sont stockées dans une base de données distante. Utilise Cmd E pour les afficher.
## Référencer des discussions passées
Utilise [@Past Chats](/fr/context/@-symbols/@-past-chats) pour ajouter du contexte de conversations précédentes à ton chat actuel.
# Synthèse
Source: https://docs.cursor.com/fr/agent/chat/summarization
Gestion du contexte pour les longues conversations de chat
## Résumé des messages
À mesure que les conversations s’allongent, Cursor résume automatiquement et gère le contexte pour que tes chats restent efficaces. Découvre comment utiliser le menu contextuel et comment les fichiers sont condensés pour tenir dans les fenêtres de contexte du modèle.
### Utiliser la commande /summarize
Tu peux lancer manuellement un résumé avec la commande `/summarize` dans le chat. Cette commande aide à gérer le contexte quand les conversations deviennent trop longues, te permettant de continuer à travailler efficacement sans perdre d’informations importantes.
Pour aller plus loin sur le fonctionnement du contexte dans Cursor, consulte notre guide [Working with
Context](/fr/guides/working-with-context).
### Comment fonctionne la synthèse
Quand les conversations s’allongent, elles finissent par dépasser la limite de la fenêtre de contexte du modèle :
User
Cursor
User
Limite de la fenêtre de contexte
Cursor
User
Cursor
Pour gérer ça, Cursor résume les anciens messages pour faire de la place aux nouvelles discussions.
Limite de la fenêtre de contexte
Messages synthétisés
Cursor
User
Cursor
## Condensation des fichiers et des dossiers
Tandis que le résumé de chat gère les longues conversations, Cursor utilise une autre stratégie pour traiter les fichiers et dossiers volumineux : la **condensation intelligente**. Quand tu ajoutes des fichiers à ta conversation, Cursor détermine la meilleure façon de les présenter en fonction de leur taille et de l’espace de contexte disponible.
Voici les différents états possibles pour un fichier ou un dossier :
### Condensé
Quand des fichiers ou des dossiers sont trop volumineux pour tenir dans la fenêtre de contexte, Cursor les condense automatiquement. Le condensé expose au modèle les éléments structurants clés comme les signatures de fonctions, les classes et les méthodes. Depuis cette vue condensée, le modèle peut choisir d’agrandir des fichiers précis si besoin. Cette approche optimise l’usage de la fenêtre de contexte disponible.
### Fortement condensé
Quand un nom de fichier apparaît avec la mention « Fortement condensé », le fichier est trop volumineux pour être inclus en entier, même sous forme condensée. Seul le nom du fichier sera affiché au modèle.
Appuie sur Cmd+T pour créer de nouveaux onglets. Chaque onglet conserve séparément l’historique de conversation, le contexte et le modèle sélectionné.
Pour des workflows parallèles, essaie [Background Agents](/fr/background-agents)
## Gérer les onglets
* Crée de nouveaux onglets avec Cmd+T. Chaque onglet démarre une nouvelle conversation et conserve son propre contexte.
* Passe d’un onglet à l’autre en cliquant sur leur en-tête ou en utilisant Ctrl+Tab pour les parcourir.
* Les titres des onglets sont générés automatiquement après le premier message, mais tu peux les renommer en faisant un clic droit sur l’en-tête de l’onglet.
Utilise une tâche par onglet, fournis des descriptions initiales claires et ferme les
onglets terminés pour garder ton espace de travail organisé.
Le mode par défaut pour les tâches de codage complexes. Agent explore ta base de code de manière autonome, modifie plusieurs fichiers, exécute des commandes et corrige les erreurs pour répondre à tes demandes.
## Ask
Mode lecture seule pour apprendre et explorer. Ask parcourt ton code et fournit des réponses sans rien modifier — parfait pour comprendre le code avant d’y toucher.
## Personnalisé
Crée tes propres modes avec des combinaisons d’outils et des instructions spécifiques. Combine les capacités pour les adapter à ton workflow.
Les modes personnalisés sont en bêta. Active-les dans `Cursor Settings` → `Chat` → `Custom
Modes`
### Exemples
**Outils :** All Search\
**Instructions :** Explique les concepts en profondeur et pose des questions pour clarifier
{" "}
**Outils :** Edit & Reapply **Instructions :** Améliore la structure du code sans
ajouter de nouvelles fonctionnalités
{" "}
**Outils :** Codebase, Read file, Terminal **Instructions :** Crée des plans d’implémentation détaillés dans `plan.md`
**Outils :** All Search, Terminal, Edit & Reapply\
**Instructions :** Analyse les problèmes en profondeur avant de proposer des correctifs
## Changer de mode
* Utilise le sélecteur de mode (menu déroulant) dans Agent
* Appuie sur Cmd+. pour basculer rapidement
* Configure des raccourcis clavier dans les [réglages](#settings)
## Paramètres
Tous les modes partagent des options de configuration communes :
| Paramètre | Description |
| :----------------- | :----------------------------------------- |
| Modèle | Choisir le modèle d’IA à utiliser |
| Raccourcis clavier | Définir des raccourcis pour passer de mode |
Paramètres propres à chaque mode :
| Mode | Paramètres | Description |
| :--------- | :-------------------------------- | :-------------------------------------------------------------------- |
| **Agent** | Exécution auto et correction auto | Exécuter automatiquement les commandes et corriger les erreurs |
| **Ask** | Recherche dans le codebase | Trouver automatiquement les fichiers pertinents |
| **Custom** | Sélection d’outils & instructions | Configurer les [outils](/fr/agent/tools) et des prompts personnalisés |
Choisis entre Agent, Ask, ou crée des modes personnalisés. Chaque mode offre
des fonctionnalités et des outils différents pour s’adapter à ton workflow.
Agent s’appuie sur des outils pour chercher, modifier et exécuter des commandes. De la recherche sémantique dans le code à l’exécution dans le terminal, ces outils permettent d’accomplir des tâches de façon autonome.
Examine les changements avant de les accepter. L’interface de revue affiche les ajouts
et les suppressions avec un code couleur pour garder le contrôle sur les modifications.
Des captures automatiques suivent les modifications de l’Agent. Restaure un état précédent si
les changements ne fonctionnent pas comme prévu, ou pour essayer d’autres approches.
Agent exécute des commandes dans le terminal, suit la sortie et gère les
processus en plusieurs étapes. Configure l’exécution auto pour les workflows de confiance ou demande
une confirmation pour plus de sécurité.
Accède aux conversations précédentes avec Opt Cmd '. Passe en revue
les discussions passées, suis tes sessions de code et retrouve le contexte des
échanges antérieurs.
Exporte des conversations au format Markdown. Partage des solutions avec ton équipe,
documente des décisions ou crée des bases de connaissances à partir de sessions de code.
Définis des instructions personnalisées pour le comportement d’Agent. Les règles aident à maintenir
les normes de code, à faire respecter des patterns, et à personnaliser la façon dont Agent t’aide sur
ton projet.
# Planification
Source: https://docs.cursor.com/fr/agent/planning
Comment Agent planifie et gère des tâches complexes avec des tâches à faire et la mise en file d’attente
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Agent peut anticiper et gérer des tâches complexes grâce à des listes de tâches structurées et à la mise en file d’attente des messages, ce qui rend les tâches de longue haleine plus faciles à comprendre et à suivre.
## To-dos de l’Agent
Agent peut découper des tâches longues en étapes gérables avec des dépendances et créer un plan structuré qui se met à jour au fur et à mesure de l’avancement.
### Comment ça marche
* Agent génère automatiquement des listes de to-dos pour les tâches complexes
* Chaque élément peut dépendre d’autres tâches
* La liste se met à jour en temps réel à mesure que le travail progresse
* Les tâches terminées sont automatiquement cochées
### Visibilité
* Les to-dos apparaissent dans l’interface de chat
* Si l’intégration [Slack](/fr/slack) est configurée, les to-dos y sont visibles aussi
* Tu peux consulter le découpage complet de la tâche à tout moment
Pour une meilleure planification, décris clairement ton objectif final. Agent créera des
découpages de tâches plus précis quand il comprend l’ensemble du périmètre.
La planification et les to-dos ne sont pas pris en charge pour le mode auto pour le moment.
## Messages en file d'attente
Mets en file d'attente des messages de suivi pendant qu'Agent travaille sur la tâche en cours. Tes instructions attendent leur tour et s'exécutent automatiquement dès qu'elles sont prêtes.
### Utiliser la file d'attente
1. Pendant qu'Agent travaille, tape ta prochaine instruction
2. Appuie sur Ctrl+Enter pour l’ajouter à la file d’attente
3. Les messages apparaissent dans l’ordre sous la tâche active
4. Réorganise les messages en file d’attente en cliquant sur la flèche
5. Agent les traite séquentiellement après avoir terminé
### Outrepasser la file d'attente
Pour mettre ton message en file d’attente au lieu d’utiliser la messagerie par défaut, utilise Ctrl+Enter. Pour envoyer un message immédiatement sans le mettre en file d’attente, utilise Cmd+Enter. Cela force l’envoi de ton message, en contournant la file d’attente pour l’exécuter tout de suite.
## Messagerie par défaut
Par défaut, les messages sont envoyés aussi vite que possible et apparaissent généralement juste après qu’Agent a terminé un appel d’outil. Ça offre l’expérience la plus réactive.
### Comment fonctionne la messagerie par défaut
* Ton message est ajouté au dernier message de l’utilisateur dans le chat
* Les messages se rattachent généralement aux résultats d’outil et s’envoient immédiatement dès qu’ils sont prêts
* Ça crée un flux de conversation plus naturel sans interrompre le travail en cours d’Agent
* Par défaut, ça se produit quand tu appuies sur Entrée pendant qu’Agent travaille
# Diffs & Review
Source: https://docs.cursor.com/fr/agent/review
Examiner et gérer les modifications de code générées par l’agent IA
Quand Agent génère des modifications de code, elles s’affichent dans une interface de revue qui montre ajouts et suppressions avec des lignes colorées. Ça te permet d’examiner et de contrôler quelles modifications sont appliquées à ton codebase.
L’interface de revue affiche les modifications de code dans un format diff familier :
## Diffs
| Type | Signification | Exemple |
| :---------------- | :------------------------ | :---------------------------------------------------------------------------------------------------- |
| **Added lines** | Ajouts de code | + const newVariable = 'hello'; |
| **Deleted lines** | Suppressions de code | - const oldVariable = 'goodbye'; |
| **Context lines** | Code de contexte inchangé | function example() {} |
## Revue
Une fois la génération terminée, tu verras une invite pour passer en revue tous les changements avant de continuer. Ça te donne un aperçu de ce qui va être modifié.
### Fichier par fichier
Une barre de revue flottante apparaît en bas de ton écran, te permettant de :
* **Accepter** ou **rejeter** les changements pour le fichier en cours
* Passer au **fichier suivant** avec des changements en attente
### Acceptation sélective
Pour un contrôle fin :
* Pour accepter la plupart des changements : rejette les lignes indésirables, puis clique sur **Tout accepter**
* Pour rejeter la plupart des changements : accepte les lignes souhaitées, puis clique sur **Tout rejeter**
## Passer en revue les modifications
À la fin de la réponse de l’agent, clique sur le bouton **Review changes** pour afficher le diff complet des modifications.
# Terminal
Source: https://docs.cursor.com/fr/agent/terminal
Exécuter automatiquement des commandes du terminal dans le cadre des opérations de l’agent
L’agent exécute des commandes dans le terminal natif de Cursor en conservant l’historique. Clique sur Skip pour envoyer Ctrl+C et interrompre les commandes.
## Dépannage
Certains thèmes de shell (par exemple Powerlevel9k/Powerlevel10k) peuvent perturber
l’affichage du terminal intégré. Si la sortie de ta commande paraît tronquée ou
mal mise en forme, désactive le thème ou passe à une invite plus simple pendant l’exécution d’Agent.
### Désactiver les invites lourdes pour les sessions Agent
Utilise la variable d’environnement `CURSOR_AGENT` dans ta config shell pour détecter quand
Agent tourne et ignorer l’initialisation des invites/thèmes sophistiqués.
```zsh theme={null}
# ~/.zshrc — désactiver Powerlevel10k lorsque Cursor Agent est en cours d’exécution
if [[ -n "$CURSOR_AGENT" ]]; then
# Ignorer l’initialisation du thème pour une meilleure compatibilité
else
[[ -r ~/.p10k.zsh ]] && source ~/.p10k.zsh
fi
```
```bash theme={null}
# ~/.bashrc — revenir à une invite simple dans les sessions Agent
if [[ -n "$CURSOR_AGENT" ]]; then
PS1='\u@\h \W \$ '
fi
```
# Outils
Source: https://docs.cursor.com/fr/agent/tools
Outils disponibles pour les agents pour rechercher, modifier et exécuter du code
La liste de tous les outils disponibles pour les modes de l’[Agent](/fr/agent/overview), que tu peux activer ou désactiver lorsque tu crées tes propres [modes personnalisés](/fr/agent/modes#custom).
Il n’y a aucune limite au nombre d’appels d’outils que l’Agent peut effectuer pendant une tâche. L’Agent continuera d’utiliser les outils nécessaires pour accomplir ta demande.
## Recherche
Outils pour explorer ta base de code et le web afin de trouver des infos pertinentes.
Lit jusqu’à 250 lignes (750 en mode max) d’un fichier.
Lit la structure d’un répertoire sans lire le contenu des fichiers.
Effectue des recherches sémantiques dans ta [base de code
indexée](/fr/context/codebase-indexing).
Cherche des mots-clés ou des motifs exacts dans les fichiers.
Trouve des fichiers par nom via une correspondance approximative (fuzzy matching).
Génère des requêtes et effectue des recherches sur le web.
Récupère des [règles](/fr/context/rules) spécifiques selon le type et la description.
## Modification
Outils pour apporter des modifications ciblées à tes fichiers et à ton codebase.
Suggère des modifications aux fichiers et [applique](/fr/agent/apply) ces modifications automatiquement.
Supprime des fichiers de façon autonome (désactivable dans les paramètres).
## Exécution
Le chat peut interagir avec ton terminal.
Exécute des commandes dans le terminal et surveille la sortie.
Par défaut, Cursor utilise le premier profil de terminal disponible.
Pour définir ton profil de terminal préféré :
1. Ouvre la palette de commandes (`Cmd/Ctrl+Shift+P`)
2. Recherche « Terminal : Select Default Profile »
3. Choisis le profil que tu veux
## MCP
Chat peut utiliser des serveurs MCP configurés pour interagir avec des services externes, comme des bases de données ou des API tierces.
Active ou désactive les serveurs MCP disponibles. Respecte la configuration d’exécution automatique.
En savoir plus sur le [Model Context Protocol](/fr/context/model-context-protocol) et explore les serveurs disponibles dans l’[annuaire MCP](/fr/tools).
## Options avancées
Appliquer automatiquement les modifications sans confirmation manuelle.
Exécuter automatiquement les commandes du terminal et accepter les modifications. Pratique pour lancer des suites de tests et vérifier les changements.
Configurer des listes autorisées pour spécifier quels outils peuvent s’exécuter automatiquement. Les listes autorisées renforcent la sécurité en définissant explicitement les opérations permises.
Corriger automatiquement les erreurs et avertissements du linter lorsqu’Agent les rencontre.
# Agents en arrière-plan
Source: https://docs.cursor.com/fr/background-agent
Agents distants asynchrones dans Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Avec les background agents, lance des agents asynchrones qui éditent et exécutent du code dans un environnement distant. Consulte leur état, envoie des relances ou reprends la main à tout moment.
## Comment l'utiliser
Tu peux accéder aux background agents de deux façons :
1. **Barre latérale des background agents** : utilise l'onglet des background agents dans la barre latérale native de Cursor pour voir tous les background agents associés à ton compte, rechercher des agents existants et en démarrer de nouveaux.
2. **Mode background agent** : appuie sur Cmd E pour activer le mode background agent dans l’UI.
Après avoir soumis un prompt, sélectionne ton agent dans la liste pour voir l’état et entrer dans la machine.
Les background agents nécessitent une conservation des données de l’ordre de quelques jours.
## Configuration
Par défaut, les agents d’arrière-plan s’exécutent dans une machine Ubuntu isolée. Ils ont accès à Internet et peuvent installer des packages.
#### Connexion à GitHub
Les agents en arrière-plan clonent ton repo depuis GitHub et bossent sur une branche dédiée, puis poussent vers ton repo pour un handoff facile.
Accorde des droits en lecture/écriture à ton repo (et à tous les repos ou sous-modules dépendants). On prendra en charge d’autres fournisseurs (GitLab, Bitbucket, etc.) à l’avenir.
##### Configuration de la liste d’autorisation IP
Si ton organisation utilise la fonctionnalité de liste d’autorisation IP de GitHub, tu dois configurer l’accès pour les agents en arrière-plan. Consulte la [documentation d’intégration GitHub](/fr/integrations/github#ip-allow-list-configuration) pour des instructions de configuration complètes, y compris les coordonnées et les adresses IP.
#### Configuration de l’environnement de base
Pour les cas avancés, configure l’environnement toi‑même. Ouvre une instance d’IDE connectée à la machine distante. Prépare ta machine, installe les outils et packages, puis prends un snapshot. Configure les paramètres d’exécution :
* La commande d’installation s’exécute avant le démarrage d’un agent et installe les dépendances d’exécution. Ça peut vouloir dire lancer `npm install` ou `bazel build`.
* Les terminaux exécutent des processus en arrière‑plan pendant que l’agent travaille — par exemple démarrer un serveur web ou compiler des fichiers protobuf.
Pour les cas les plus avancés, utilise un Dockerfile pour configurer la machine. Le Dockerfile te permet d’installer des dépendances au niveau système : versions spécifiques de compilateurs, débogueurs, ou changement de l’image OS de base. Ne fais pas de `COPY` de tout le projet — on gère l’espace de travail et on récupère le commit correct. Gère quand même l’installation des dépendances dans le script d’installation.
Saisis les secrets requis pour ton environnement de dev — ils sont stockés chiffrés au repos (via KMS) dans notre base de données et fournis dans l’environnement de l’agent en arrière‑plan.
La configuration de la machine se trouve dans `.cursor/environment.json`, qui peut être commit dans ton repo (recommandé) ou stocké en privé. Le flux de configuration te guide pour créer `environment.json`.
#### Commandes de maintenance
Lors de la configuration d’une nouvelle machine, on part de l’environnement de base, puis on exécute la commande `install` depuis ton `environment.json`. C’est la commande qu’un·e dev lancerait en changeant de branche — pour installer toutes les nouvelles dépendances.
Pour la plupart, la commande `install` est `npm install` ou `bazel build`.
Pour garantir un démarrage rapide, on met en cache l’état du disque après l’exécution de la commande `install`. Conçois-la pour pouvoir l’exécuter plusieurs fois. Seul l’état du disque persiste après la commande `install` — les processus démarrés ici ne seront pas en cours d’exécution quand l’agent démarrera.
#### Commandes de démarrage
Après avoir exécuté `install`, la machine démarre, on lance la commande `start`, puis on démarre les `terminals`. Ça lance les processus qui doivent rester actifs quand l’agent s’exécute.
La commande `start` peut souvent être sautée. Utilise-la si ton environnement de dev dépend de Docker — mets `sudo service docker start` dans la commande `start`.
Les `terminals` servent pour le code de l’app. Ces terminaux tournent dans une session `tmux` accessible pour toi et pour l’agent. Par exemple, beaucoup de dépôts de sites web mettent `npm run watch` comme terminal.
#### La spécification de `environment.json`
Le fichier `environment.json` peut ressembler à :
```json theme={null}
{
"snapshot": "RÉCUPÉRÉ_DEPUIS_LES_PARAMÈTRES",
"install": "npm install",
"terminals": [
{
"name": "Exécuter Next.js",
"command": "npm run dev"
}
]
}
```
Formellement, la spec est [définie ici](https://www.cursor.com/schemas/environment.schema.json).
## Modèles
Seuls les modèles compatibles avec le [mode Max](/fr/context/max-mode) sont disponibles pour les agents en arrière-plan.
## Tarifs
En savoir plus sur les [tarifs de Background Agent](/fr/account/pricing#background-agent).
## Sécurité
Les Background Agents sont disponibles en mode confidentialité. On n’entraîne jamais nos modèles sur ton code et on ne conserve ton code que pour exécuter l’agent. [En savoir plus sur le mode confidentialité](https://www.cursor.com/privacy-overview).
Ce que tu dois savoir :
1. Accorde des droits lecture/écriture à notre application GitHub pour les dépôts que tu veux modifier. On s’en sert pour cloner le dépôt et faire des changements.
2. Ton code s’exécute dans notre infrastructure AWS, dans des VM isolées, et reste stocké sur les disques des VM tant que l’agent est actif.
3. L’agent a accès à internet.
4. L’agent exécute automatiquement toutes les commandes du terminal, ce qui lui permet d’itérer sur les tests. Ça diffère de l’agent au premier plan, qui demande l’approbation de l’utilisateur pour chaque commande. L’exécution automatique introduit un risque d’exfiltration de données : des attaquants peuvent lancer des attaques par injection de prompt et tromper l’agent pour qu’il téléverse du code vers des sites malveillants. Voir [l’explication d’OpenAI sur les risques d’injection de prompt pour les agents en arrière-plan](https://platform.openai.com/docs/codex/agent-network#risks-of-agent-internet-access).
5. Si le mode confidentialité est désactivé, on collecte les prompts et les environnements de dev pour améliorer le produit.
6. Si tu désactives le mode confidentialité au démarrage d’un agent en arrière-plan puis que tu l’actives pendant son exécution, l’agent continue avec le mode confidentialité désactivé jusqu’à la fin.
## Paramètres du tableau de bord
Les admins de l’espace de travail peuvent configurer des paramètres supplémentaires depuis l’onglet Background Agents du tableau de bord.
### Paramètres par défaut
* **Modèle par défaut** – le modèle utilisé lorsqu’une exécution n’en précise pas. Choisis n’importe quel modèle compatible avec Max Mode.
* **Dépôt par défaut** – s’il est vide, les agents te demanderont de choisir un dépôt. Renseigner un dépôt ici permet de passer cette étape.
* **Branche de base** – la branche à partir de laquelle les agents créent un fork lors de la création des pull requests. Laisse vide pour utiliser la branche par défaut du dépôt.
### Paramètres de sécurité
Toutes les options de sécurité nécessitent des privilèges d’admin.
* **Restrictions utilisateur** – choisis *Aucune* (tous les membres peuvent lancer des agents en arrière-plan) ou *Liste autorisée*. Quand *Liste autorisée* est activé, tu définis précisément quels équipiers peuvent créer des agents.
* **Relances d’équipe** – lorsqu’il est activé, n’importe qui dans l’espace de travail peut ajouter des messages de suivi à un agent lancé par quelqu’un d’autre. Désactive-le pour limiter les suivis au propriétaire de l’agent et aux admins.
* **Afficher le résumé de l’agent** – détermine si Cursor affiche les images de diff de fichiers et les extraits de code de l’agent. Désactive-le si tu préfères ne pas exposer les chemins de fichiers ou du code dans la barre latérale.
* **Afficher le résumé de l’agent dans les canaux externes** – étend le réglage précédent à Slack ou à tout canal externe que tu as connecté.
Les modifications sont enregistrées instantanément et s’appliquent immédiatement aux nouveaux agents.
# Ajouter un suivi
Source: https://docs.cursor.com/fr/background-agent/api/add-followup
en/background-agent/api/openapi.yaml post /v0/agents/{id}/followup
Envoyer une instruction supplémentaire à un agent d’arrière-plan en cours d’exécution.
# Conversation de l’agent
Source: https://docs.cursor.com/fr/background-agent/api/agent-conversation
en/background-agent/api/openapi.yaml get /v0/agents/{id}/conversation
Récupère l’historique de conversation d’un agent en arrière-plan.
Si l’agent en arrière-plan a été supprimé, tu ne peux pas accéder à la conversation.
# Statut de l’agent
Source: https://docs.cursor.com/fr/background-agent/api/agent-status
en/background-agent/api/openapi.yaml get /v0/agents/{id}
Récupère l’état actuel et les résultats d’un agent en arrière-plan spécifique.
# Infos sur la clé API
Source: https://docs.cursor.com/fr/background-agent/api/api-key-info
en/background-agent/api/openapi.yaml get /v0/me
Récupérer les métadonnées de la clé API utilisée pour l’authentification.
# Supprimer un agent
Source: https://docs.cursor.com/fr/background-agent/api/delete-agent
en/background-agent/api/openapi.yaml delete /v0/agents/{id}
Supprimer définitivement un agent d’arrière-plan et ses ressources associées.
# Lancer un agent
Source: https://docs.cursor.com/fr/background-agent/api/launch-an-agent
en/background-agent/api/openapi.yaml post /v0/agents
Lance un nouvel agent en arrière-plan pour travailler sur ton dépôt.
# Liste des agents
Source: https://docs.cursor.com/fr/background-agent/api/list-agents
en/background-agent/api/openapi.yaml get /v0/agents
Récupère la liste paginée de tous les agents en arrière-plan de l’utilisateur authentifié.
# Liste des modèles
Source: https://docs.cursor.com/fr/background-agent/api/list-models
en/background-agent/api/openapi.yaml get /v0/models
Récupère une liste de modèles recommandés pour les agents en arrière-plan.
Si tu veux définir le modèle de l’agent en arrière-plan lors de sa création, tu peux utiliser cet endpoint pour consulter la liste des modèles recommandés.
Dans ce cas, on te recommande aussi de proposer une option « Auto » : tu n’indiques pas de nom de modèle à l’endpoint de création, et on sélectionne le modèle le plus adapté.
# Lister les dépôts GitHub
Source: https://docs.cursor.com/fr/background-agent/api/list-repositories
en/background-agent/api/openapi.yaml get /v0/repositories
Récupère la liste des dépôts GitHub accessibles à l'utilisateur authentifié.
**Cet endpoint a des limites de taux très strictes.**
Limite les requêtes à **1 / utilisateur / minute** et **30 / utilisateur / heure**.
Cette requête peut prendre plusieurs dizaines de secondes pour les utilisateurs ayant accès à de nombreux dépôts.
Assure-toi de gérer correctement le cas où cette information n'est pas disponible.
# Aperçu
Source: https://docs.cursor.com/fr/background-agent/api/overview
Crée et gère par programmation des agents en arrière-plan qui travaillent sur tes dépôts
# API des Background Agents
Bêta
L'API des Background Agents te permet de créer et de gérer par code des agents de programmation alimentés par l’IA, qui travaillent de façon autonome sur tes dépôts.
Tu peux utiliser l’API pour répondre automatiquement aux retours utilisateurs, corriger des bugs, mettre à jour la doc, et bien plus encore !
L’API des Background Agents est actuellement en bêta, on adorerait avoir ton retour !
## Fonctionnalités clés
* **Génération de code autonome** - Crée des agents qui comprennent ton prompt et apportent des modifications à ton codebase
* **Intégration aux dépôts** - Travaille directement avec des dépôts GitHub
* Prompts de suivi - Ajoute des instructions supplémentaires aux agents en cours d’exécution
* **Tarification à l’usage** - Ne paie que pour les tokens que tu utilises
* **Scalabilité** - Prise en charge de jusqu’à 256 agents actifs par clé d’API
## Démarrage rapide
### 1. Récupère ta clé d’API
**Va** sur [Cursor Dashboard → Integrations](https://cursor.com/dashboard?tab=integrations) pour créer ta clé d’API.
### 2. Commence à utiliser l’API
Tous les points de terminaison de l’API sont relatifs à :
```
https://api.cursor.com
```
Consulte la [référence de l’API](/fr/background-agent/api/launch-an-agent) pour la liste détaillée des points de terminaison.
## Authentification
Toutes les requêtes à l’API nécessitent une authentification avec un jeton Bearer :
```
Authorization: Bearer VOTRE_CLEF_API
```
Les clés API sont créées dans le [tableau de bord Cursor](https://cursor.com/dashboard?tab=integrations). Elles sont propres à ton compte et te permettent de créer et de gérer des agents (dans les limites de ton abonnement et selon les accès à tes dépôts).
## Tarification
L’API est actuellement en bêta avec la même tarification que les Background Agents. Les prix peuvent évoluer à mesure qu’on fait monter le service en charge. Voir la [tarification des Background Agents](/fr/account/pricing#background-agent).
## Prochaines étapes
* Lis la [présentation de Background Agents](/fr/background-agent) pour comprendre les environnements, les autorisations et les workflows.
* Essaie Background Agents sur le [web et mobile](/fr/background-agent/web-and-mobile).
* Rejoins la discussion sur [Discord #background-agent](https://discord.gg/jfgpZtYpmb) ou envoie un e-mail à [background-agent-feedback@cursor.com](mailto:background-agent-feedback@cursor.com).
# Webhooks
Source: https://docs.cursor.com/fr/background-agent/api/webhooks
Recevoir des notifications en temps réel sur les changements d’état de l’agent en arrière-plan
# Webhooks
Quand tu crées un agent avec une URL de webhook, Cursor envoie des requêtes HTTP POST pour te notifier des changements d’état. Pour l’instant, seuls les événements `statusChange` sont pris en charge, notamment quand un agent passe en état `ERROR` ou `FINISHED`.
## Vérification du webhook
Pour t’assurer que les requêtes de webhook proviennent bien de Cursor, vérifie la signature incluse avec chaque requête :
### En-têtes
Chaque requête de webhook inclut les en-têtes suivants :
* **`X-Webhook-Signature`** – Contient la signature HMAC-SHA256 au format `sha256=`
* **`X-Webhook-ID`** – Un identifiant unique pour cette livraison (utile pour les logs)
* **`X-Webhook-Event`** – Le type d’événement (actuellement uniquement `statusChange`)
* **`User-Agent`** – Toujours défini sur `Cursor-Agent-Webhook/1.0`
### Vérification de la signature
Pour vérifier la signature du webhook, calcule la signature attendue et compare-la à la signature reçue :
```javascript theme={null}
const crypto = require('crypto');
function verifyWebhook(secret, rawBody, signature) {
const expectedSignature = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return signature === expectedSignature;
}
```
```python theme={null}
import hmac
import hashlib
def verify_webhook(secret, raw_body, signature):
signature_attendue = 'sha256=' + hmac.new(
secret.encode(),
raw_body,
hashlib.sha256
).hexdigest()
return signature == expected_signature
```
Utilise toujours le corps brut de la requête (avant toute analyse) pour calculer la signature.
## Format de la charge utile
La charge utile du webhook est envoyée au format JSON avec la structure suivante :
```json theme={null}
{
"event": "statusChange",
"timestamp": "2024-01-15T10:30:00Z",
"id": "bc_abc123",
"status": "FINISHED",
"source": {
"repository": "https://github.com/your-org/your-repo",
"ref": "main"
},
"target": {
"url": "https://cursor.com/agents?id=bc_abc123",
"branchName": "cursor/add-readme-1234",
"prUrl": "https://github.com/your-org/your-repo/pull/1234"
},
"summary": "Ajout de README.md avec des instructions d’installation"
}
```
Note que certains champs sont facultatifs et ne seront inclus que s’ils sont disponibles.
## Bonnes pratiques
* **Vérifie les signatures** – Vérifie toujours la signature du webhook pour t’assurer que la requête vient de Cursor
* **Gère les retentatives** – Les webhooks peuvent être renvoyés si ton endpoint renvoie un code d’erreur
* **Réponds rapidement** – Renvoie un code de statut 2xx dès que possible
* **Utilise HTTPS** – Utilise toujours des URL HTTPS pour les endpoints de webhook en production
* **Stocke les payloads bruts** – Stocke le payload brut du webhook pour le débogage et de futures vérifications
# Web & Mobile
Source: https://docs.cursor.com/fr/background-agent/web-and-mobile
Lance des agents de code depuis n’importe quel appareil, avec un passage fluide vers le desktop
## Aperçu
L’agent de Cursor sur le web apporte un assistant de code puissant sur tous tes appareils. Que tu sois sur ton téléphone pendant une balade ou en train de bosser dans ton navigateur, tu peux maintenant lancer des agents de code performants qui tournent en arrière-plan.
Quand ils ont terminé, récupère leur travail dans Cursor, passe en revue et fusionne les modifications, ou partage des liens avec ton équipe pour collaborer.
Commence sur [cursor.com/agents](https://cursor.com/agents).
## Prise en main
### Configuration rapide
1. **Va sur l’app web** : Ouvre [cursor.com/agents](https://cursor.com/agents) depuis n’importe quel appareil
2. **Connecte-toi** : Connecte-toi avec ton compte Cursor
3. **Connecte GitHub** : Associe ton compte GitHub pour accéder aux dépôts
4. **Lance ton premier agent** : Saisis une tâche et regarde l’agent se mettre au travail
### Installation mobile
Pour une meilleure expérience mobile, installe Cursor en tant que Progressive Web App (PWA) :
* **iOS** : Ouvre [cursor.com/agents](https://cursor.com/agents) dans Safari, appuie sur le bouton de partage, puis « Ajouter à l’écran d’accueil »
* **Android** : Ouvre l’URL dans Chrome, appuie sur le menu, puis « Ajouter à l’écran d’accueil » ou « Installer l’app »
Installer en PWA offre une expérience proche d’une app native avec : - Interface en plein écran
* Démarrage plus rapide - Icône d’app sur ton écran d’accueil
## Travailler sur plusieurs appareils
Le Web and Mobile Agent est conçu pour s’intégrer à ton workflow sur desktop ; clique sur « Open in Cursor » pour poursuivre le travail de l’agent dans ton IDE.
### Collaboration en équipe
* **Accès partagé** : Partage des liens avec les membres de ton équipe pour collaborer sur les exécutions de l’agent.
* **Processus de revue** : Les collaborateurs peuvent passer en revue les diffs et donner leur feedback.
* **Gestion des pull requests** : Crée, review et fusionne des pull requests directement depuis l’interface web.
### Intégration Slack
Déclenche des agents directement depuis Slack en mentionnant `@Cursor`, et, lorsque tu lances des agents depuis le web ou le mobile, choisis de recevoir des notifications Slack à la fin de l’exécution.
En savoir plus sur la configuration et l’utilisation de l’intégration Slack, y compris
le déclenchement d’agents et la réception de notifications.
## Tarification
Les agents web et mobiles utilisent le même modèle de tarification que les Background Agents.
En savoir plus sur la [tarification des Background Agents](/fr/account/pricing#background-agent).
## Dépannage
* Assure-toi d’être connecté et d’avoir associé ton compte GitHub. - Vérifie
que tu as les autorisations nécessaires sur le dépôt. - Tu dois aussi être sur
un essai Pro ou un abonnement payant avec la tarification à l’usage activée.
Pour activer la tarification à l’usage, va dans l’onglet paramètres de ton
[Dashboard](https://www.cursor.com/dashboard?tab=settings).
Essaie d’actualiser la page ou de vider le cache de ton navigateur. Assure-toi
d’utiliser le même compte sur tous tes appareils.
Vérifie que l’admin de ton espace de travail a installé l’app Slack de
Cursor et que tu as les autorisations adéquates.
# Bugbot
Source: https://docs.cursor.com/fr/bugbot
Revue de code IA pour les pull requests
Bugbot passe en revue les pull requests et repère les bugs, les failles de sécurité et les problèmes de qualité du code.
Bugbot inclut une offre gratuite : chaque utilisateur a droit à un nombre limité de revues de PR gratuites chaque mois. Quand tu atteins la limite, les revues sont mises en pause jusqu’à ton prochain cycle de facturation. Tu peux passer à tout moment à un essai Pro gratuit de 14 jours pour des revues illimitées (avec les garde‑fous anti‑abus standard).
## Comment ça marche
Bugbot analyse les diffs de PR et laisse des commentaires avec des explications et des propositions de correction. Il s’exécute automatiquement à chaque mise à jour de PR ou manuellement quand tu le déclenches.
* Lance des **revues automatiques** à chaque mise à jour de PR
* **Déclenchement manuel** en commentant `cursor review` ou `bugbot run` sur n’importe quelle PR
* Les liens **Fix in Cursor** ouvrent les tickets directement dans Cursor
* Les liens **Fix in Web** ouvrent les tickets directement sur [cursor.com/agents](https://cursor.com/agents)
## Configuration
Nécessite des droits admin sur Cursor et sur l’org GitHub.
1. Va sur [cursor.com/dashboard](https://cursor.com/dashboard?tab=bugbot)
2. Ouvre l’onglet Bugbot
3. Clique sur `Connect GitHub` (ou `Manage Connections` si tu es déjà connecté·e)
4. Suis le processus d’installation GitHub
5. Reviens sur le dashboard pour activer Bugbot sur des dépôts spécifiques
## Configuration
### Paramètres du dépôt
Active ou désactive Bugbot par dépôt depuis ta liste d’installations. Bugbot ne s’exécute que sur les PR que tu ouvres.
### Paramètres personnels
* S’exécuter **uniquement quand il est mentionné** en commentant `cursor review` ou `bugbot run`
* S’exécuter **une seule fois** par PR, en ignorant les commits suivants
### Paramètres du dépôt
Les admins d’équipe peuvent activer Bugbot par dépôt, configurer des listes d’autorisation/interdiction pour les reviewers et définir :
* S’exécuter **une seule fois** par PR et par installation, en ignorant les commits suivants
* **Désactiver les revues en ligne** pour empêcher Bugbot de laisser des commentaires directement sur les lignes de code
Bugbot s’exécute pour tous les contributeurs des dépôts activés, quelle que soit leur appartenance à l’équipe.
### Paramètres personnels
Les membres de l’équipe peuvent surcharger les paramètres pour leurs propres PR :
* S’exécuter **uniquement quand il est mentionné** en commentant `cursor review` ou `bugbot run`
* S’exécuter **une seule fois** par PR, en ignorant les commits suivants
* **Activer les revues sur les PR en draft** pour inclure les pull requests en brouillon dans les revues automatiques
### Analytics
## Règles
Crée des fichiers `.cursor/BUGBOT.md` pour fournir un contexte spécifique au projet lors des revues. Bugbot inclut toujours le fichier racine `.cursor/BUGBOT.md` ainsi que tous les fichiers supplémentaires trouvés en remontant l’arborescence à partir des fichiers modifiés.
```
project/
.cursor/BUGBOT.md # Toujours inclus (règles globales au projet)
backend/
.cursor/BUGBOT.md # Inclus lors de la revue des fichiers backend
api/
.cursor/BUGBOT.md # Inclus lors de la revue des fichiers API
frontend/
.cursor/BUGBOT.md # Inclus lors de la revue des fichiers frontend
```
```markdown theme={null}
# Directives pour la revue de projet
## Points clés de sécurité
- Valider les entrées utilisateur dans les endpoints d’API
- Vérifier les vulnérabilités d’injection SQL dans les requêtes de base de données
- Garantir une authentification correcte sur les routes protégées
## Modèles d’architecture
- Utiliser l’injection de dépendances pour les services
- Suivre le pattern Repository pour l’accès aux données
- Mettre en place une gestion des erreurs robuste avec des classes d’erreurs personnalisées
## Problèmes fréquents
- Fuites de mémoire dans les composants React (vérifier le nettoyage de useEffect)
- Absence de Error Boundaries dans les composants UI
- Conventions de nommage incohérentes (utiliser le camelCase pour les fonctions)
```
## Tarifs
Bugbot propose deux offres : **Gratuit** et **Pro**.
### Offre gratuite
Chaque utilisateur a droit à un nombre limité de revues de PR gratuites chaque mois. Pour les équipes, chaque membre bénéficie de ses propres revues gratuites. Quand tu atteins la limite, les revues sont mises en pause jusqu’à ton prochain cycle de facturation. Tu peux passer à tout moment à l’essai Pro gratuit de 14 jours pour des revues illimitées.
### Offre Pro
### Forfait fixe
40 \$ par mois pour des revues Bugbot illimitées sur jusqu’à 200 PR par mois, tous dépôts confondus.
### Pour commencer
Abonne-toi depuis les paramètres de ton compte.
### Facturation par utilisateur
Les équipes paient 40 \$ par utilisateur et par mois pour des revues illimitées.
On considère comme utilisateur toute personne ayant créé des PR examinées par Bugbot au cours d’un mois.
Toutes les licences sont libérées au début de chaque cycle de facturation et sont attribuées selon le principe du premier arrivé, premier servi. Si un utilisateur ne crée aucune PR examinée par Bugbot au cours d’un mois, la place peut être utilisée par quelqu’un d’autre.
### Limites de places
Les admins d’équipe peuvent définir un nombre maximal de places Bugbot par mois pour maîtriser les coûts.
### Pour commencer
Abonne-toi depuis le tableau de bord de ton équipe pour activer la facturation.
### Garde-fous contre les abus
Pour prévenir les abus, nous appliquons un plafond mutualisé de 200 pull requests par mois pour chaque licence Bugbot. Si tu as besoin de plus de 200 pull requests par mois, contacte-nous à [hi@cursor.com](mailto:hi@cursor.com) et on se fera un plaisir de t’aider.
Par exemple, si ton équipe compte 100 utilisateurs, ton organisation pourra initialement examiner 20 000 pull requests par mois. Si tu atteins cette limite naturellement, contacte-nous et on sera ravis d’augmenter le plafond.
## Dépannage
Si Bugbot ne fonctionne pas :
1. **Active le mode verbeux** en laissant un commentaire `cursor review verbose=true` ou `bugbot run verbose=true` pour obtenir des logs détaillés et l’ID de requête
2. **Vérifie les autorisations** pour t’assurer que Bugbot a accès au dépôt
3. **Vérifie l’installation** pour confirmer que l’application GitHub est installée et activée
Inclue l’ID de requête obtenu en mode verbeux quand tu signales un problème.
## FAQ
Oui, Bugbot respecte les mêmes exigences de confidentialité que Cursor et traite les données de manière identique aux autres requêtes Cursor.
Quand t’atteins ta limite mensuelle du palier gratuit, les revues Bugbot sont mises en pause jusqu’à ton prochain cycle de facturation. Tu peux passer à l’essai Pro gratuit de 14 jours pour des revues illimitées (avec les garde-fous standard contre les abus).
```
```
# Revue de code
Source: https://docs.cursor.com/fr/cli/cookbook/code-review
Crée un workflow GitHub Actions qui utilise Cursor CLI pour examiner automatiquement les pull requests et fournir des commentaires
Ce tutoriel te montre comment configurer une revue de code avec Cursor CLI dans GitHub Actions. Le workflow analysera les pull requests, identifiera les problèmes et publiera des commentaires.
Pour la plupart des utilisateurs, on recommande plutôt d’utiliser [Bugbot](/fr/bugbot). Bugbot propose une revue de code automatisée gérée, sans aucune configuration. Cette approche via la CLI est utile pour explorer les capacités et pour des personnalisations avancées.
```yaml cursor-code-review.yml theme={null}
name: Revue de code
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
pull-requests: write
contents: read
issues: write
jobs:
code-review:
runs-on: ubuntu-latest
# Ignorer la revue de code automatisée pour les PR en brouillon
if: github.event.pull_request.draft == false
steps:
- name: Récupérer le dépôt
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Installer le CLI Cursor
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configurer l’identité Git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Effectuer une revue de code automatisée
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BLOCKING_REVIEW: ${{ vars.BLOCKING_REVIEW || 'false' }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print 'Tu tournes dans un runner GitHub Actions qui effectue une revue de code automatisée. Le CLI gh est disponible et authentifié via GH_TOKEN. Tu peux commenter les pull requests.
Contexte :
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
- Blocking Review: ${{ env.BLOCKING_REVIEW }}
Objectifs :
1) Revérifie les commentaires de revue existants et réponds resolved quand c’est traité.
2) Passe en revue le diff actuel de la PR et ne signale que les problèmes clairs et à haute gravité.
3) Laisse des commentaires en ligne très courts (1–2 phrases) uniquement sur les lignes modifiées, plus un bref résumé à la fin.
Procédure :
- Récupérer les commentaires existants : gh pr view --json comments
- Récupérer le diff : gh pr diff
- Récupérer les fichiers modifiés avec leurs patchs pour calculer les positions en ligne : gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --paginate --jq '.[] | {filename,patch}'
- Calculer des ancres en ligne exactes pour chaque problème (chemin de fichier + position dans le diff). Les commentaires DOIVENT être placés en ligne sur la ligne modifiée du diff, pas en commentaires de niveau supérieur.
- Détecter les commentaires précédents de niveau supérieur de type « no issues » rédigés par ce bot (correspondances de corps comme : "✅ no issues", "No issues found", "LGTM").
- Si l’exécution ACTUELLE trouve des problèmes et que des commentaires « no issues » existent :
- Privilégier leur suppression pour éviter toute confusion :
- Tenter de supprimer les commentaires de niveau supérieur via : gh api -X DELETE repos/${{ github.repository }}/issues/comments/
- Si la suppression n’est pas possible, les minimiser via GraphQL (minimizeComment) ou les éditer pour préfixer "[Superseded by new findings]".
- Si ni la suppression ni la minimisation n’est possible, répondre à ce commentaire : "⚠️ Superseded: issues were found in newer commits".
- Si un problème signalé précédemment semble corrigé par des changements proches, répondre : ✅ This issue appears to be resolved by the recent changes
- Analyser UNIQUEMENT :
- Déréférencements de null/undefined
- Fuites de ressources (fichiers ou connexions non fermés)
- Injections (SQL/XSS)
- Problèmes de concurrence/conditions de course
- Absence de gestion d’erreurs pour des opérations critiques
- Erreurs logiques évidentes avec comportement incorrect
- Anti‑patterns de performance clairs avec impact mesurable
- Vulnérabilités de sécurité avérées
- Éviter les doublons : ignorer si un retour similaire existe déjà sur ou près des mêmes lignes.
Règles de commentaire :
- Maximum 10 commentaires en ligne au total ; prioriser les problèmes les plus critiques
- Un problème par commentaire ; placer le commentaire exactement sur la ligne modifiée
- Tous les commentaires de problème DOIVENT être en ligne (ancrés à un fichier et à une ligne/position dans le diff de la PR)
- Ton naturel, spécifique et actionnable ; ne mentionne pas l’automatisation ni le niveau de confiance
- Utiliser des émojis : 🚨 Critique 🔒 Sécurité ⚡ Performance ⚠️ Logique ✅ Résolu ✨ Amélioration
Soumission :
- S’il n’y a AUCUN problème à signaler et qu’un commentaire de niveau supérieur indiquant "no issues" existe déjà (p. ex., "✅ no issues", "No issues found", "LGTM"), ne soumets PAS un autre commentaire. Passe la soumission pour éviter la redondance.
- S’il n’y a AUCUN problème à signaler et qu’AUCUN commentaire « no issues » antérieur n’existe, soumets un bref commentaire récapitulatif indiquant qu’il n’y a pas de problème.
- S’IL Y A des problèmes à signaler et qu’un commentaire « no issues » antérieur existe, assure-toi que ce commentaire est supprimé/minimisé/marqué comme remplacé avant de soumettre la nouvelle revue.
- S’IL Y A des problèmes à signaler, soumets UNE revue contenant UNIQUEMENT des commentaires en ligne, plus un corps de résumé concis optionnel. Utilise l’API GitHub Reviews pour garantir que les commentaires sont en ligne :
- Build a JSON array of comments like: [{ "path": "", "position": , "body": "..." }]
- Submit via: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews -f event=COMMENT -f body="$SUMMARY" -f comments='[$COMMENTS_JSON]'
- NE PAS utiliser : gh pr review --approve ou --request-changes
Comportement bloquant :
- Si BLOCKING_REVIEW est true et que des problèmes 🚨 ou 🔒 ont été postés : echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Sinon : echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Toujours définir CRITICAL_ISSUES_FOUND à la fin
'
- name: Vérifier les résultats de la revue bloquante
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Vérification des problèmes critiques..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Des problèmes critiques ont été trouvés et la revue bloquante est activée. Échec du workflow."
exit 1
else
echo "✅ Aucun problème bloquant trouvé."
fi
```
## Configurer l’authentification
[Configure ta clé d’API et les secrets du dépôt](/fr/cli/github-actions#authentication) pour authentifier Cursor CLI dans GitHub Actions.
## Configurer les autorisations de l’agent
Crée un fichier de configuration pour contrôler les actions que l’agent peut effectuer. Ça évite des opérations non intentionnelles comme pousser du code ou créer des pull requests.
Crée `.cursor/cli.json` à la racine de ton dépôt :
```json theme={null}
{
"permissions": {
"interdire": [
"Shell(git push)",
"Shell(gh pr create)",
"Write(**)"
]
}
}
```
Cette configuration permet à l’agent de lire des fichiers et d’utiliser l’outil en ligne de commande GitHub (CLI) pour les commentaires, mais l’empêche d’apporter des modifications à ton dépôt. Consulte la [référence des autorisations](/fr/cli/reference/permissions) pour davantage d’options de configuration.
## Créer le workflow GitHub Actions
Construisons maintenant le workflow étape par étape.
### Configurer le déclencheur du workflow
Crée le fichier `.github/workflows/cursor-code-review.yml` et configure-le pour s’exécuter sur les pull requests :
```yaml theme={null}
name: Revue de code Cursor
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
```
### Récupère le dépôt
Ajoute l’étape de checkout pour accéder au code de la pull request :
```yaml theme={null}
- name: Récupérer le dépôt
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
```
Avant d’implémenter l’étape de review complète, on va décortiquer l’anatomie de notre prompt de review. Cette section explique comment on veut que l’agent se comporte :
**Objectif** :
On veut que l’agent analyse le diff du PR actuel et ne signale que les problèmes clairs et à forte gravité, puis laisse de très courts commentaires inline (1–2 phrases) uniquement sur les lignes modifiées, avec un bref récap à la fin. Ça maintient un bon ratio signal/bruit.
**Format** :
On veut des commentaires courts et directs. On utilise des émojis pour faciliter le scan des commentaires, et on veut un récapitulatif global de la review complète à la fin.
**Soumission** :
Quand la review est terminée, on veut que l’agent ajoute un court commentaire basé sur ce qui a été trouvé pendant la review. L’agent doit soumettre une seule review contenant des commentaires inline plus un résumé concis.
**Cas limites** :
On doit gérer :
* Commentaires existants résolus : l’agent doit les marquer comme terminés quand ils ont été adressés
* Éviter les doublons : l’agent doit s’abstenir de commenter si un retour similaire existe déjà sur ou près des mêmes lignes
**Prompt final** :
Le prompt complet combine toutes ces exigences de comportement pour produire un feedback ciblé et exploitable
Maintenant, implémentons l’étape de l’agent de review :
```yaml theme={null}
- name: Effectuer une revue de code
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ github.token }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print "Tu es en train d’exécuter un job GitHub Actions pour une revue de code automatisée. L’interface de ligne de commande gh est disponible et authentifiée via GH_TOKEN. Tu peux commenter les pull requests.
Contexte :
- Référentiel : ${{ github.repository }}
- Numéro de PR : ${{ github.event.pull_request.number }}
- SHA de tête de la PR : ${{ github.event.pull_request.head.sha }}
- SHA de base de la PR : ${{ github.event.pull_request.base.sha }}
Objectifs :
1) Revoir les commentaires existants et répondre « Résolu » lorsqu’ils ont été pris en compte
2) Examiner le diff actuel de la PR et ne relever que les problèmes évidents et de gravité élevée
3) Laisser des commentaires en ligne très courts (1 à 2 phrases) uniquement sur les lignes modifiées, puis un bref résumé à la fin
Procédure :
- Récupérer les commentaires existants : gh pr view --json comments
- Récupérer le diff : gh pr diff
- Si un problème signalé précédemment semble corrigé par des changements proches, répondre : ✅ Ce problème semble avoir été résolu par les changements récents
- Éviter les doublons : ignorer si un retour similaire existe déjà sur ou à proximité des mêmes lignes
Règles de commentaire :
- Maximum 10 commentaires en ligne au total ; prioriser les problèmes les plus critiques
- Un seul problème par commentaire ; le placer exactement sur la ligne modifiée
- Ton naturel, précis et exploitable ; ne pas mentionner l’automatisation ni un niveau de confiance élevé
- Utiliser des émojis : 🚨 Critique 🔒 Sécurité ⚡ Performance ⚠️ Logique ✅ Résolu ✨ Amélioration
Soumission :
- Soumettre une seule revue contenant des commentaires en ligne plus un résumé concis
- Utiliser uniquement : gh pr review --comment
- Ne pas utiliser : gh pr review --approve ou --request-changes"
```
```text theme={null}
.
├── .cursor/
│ └── cli.json
├── .github/
│ └── workflows/
│ └── cursor-code-review.yml
```
## Teste ton reviewer
Crée une pull request de test pour vérifier que le workflow fonctionne et que l’agent publie des commentaires de review avec des retours en émojis.
## Prochaines étapes
Tu as maintenant un système automatisé de revue de code opérationnel. Pense à ces améliorations :
* Mettre en place des workflows supplémentaires pour [corriger les échecs CI](/fr/cli/cookbook/fix-ci)
* Configurer différents niveaux de revue selon les branches
* Intégrer ça au processus de revue de code existant de ton équipe
* Personnaliser le comportement de l’agent selon les types de fichiers ou les répertoires
Tu peux configurer le workflow pour échouer en cas de problèmes critiques, empêchant la fusion de la pull request tant qu’ils ne sont pas résolus.
**Ajouter un comportement bloquant au prompt**
D’abord, mets à jour l’étape de ton agent de revue pour inclure la variable d’environnement `BLOCKING_REVIEW` et ajoute ce comportement bloquant au prompt :
```
Blocking behavior:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
```
**Ajouter l’étape de vérification de blocage**
Ajoute ensuite cette nouvelle étape après ton étape de revue de code :
```yaml theme={null}
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
# Corriger les échecs CI
Source: https://docs.cursor.com/fr/cli/cookbook/fix-ci
Corrige les problèmes de CI d’un dépôt en utilisant Cursor CLI dans GitHub Actions
Corrige les échecs de CI avec Cursor CLI dans GitHub Actions. Ce workflow analyse les échecs, applique des correctifs ciblés et crée une branche de correctif avec un lien de PR à création rapide.
Ce workflow surveille un workflow spécifique par son nom. Mets à jour la liste `workflows` pour correspondre au nom réel de ton workflow de CI.
```yaml auto-fix-ci.yml theme={null}
name: Fix CI Failures
on:
workflow_run:
workflows: [Test]
types: [completed]
permissions:
contents: write
pull-requests: write
actions: read
jobs:
attempt-fix:
if: >-
${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.name != 'Fix CI Failures' }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Fix CI failure
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: ci-fix
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- Workflow Run ID: ${{ github.event.workflow_run.id }}
- Workflow Run URL: ${{ github.event.workflow_run.html_url }}
- Fix Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end CI fix flow driven by the failing PR, creating a separate persistent fix branch and proposing a quick-create PR back into the original PR's branch.
# Requirements:
1) Identify the PR associated with the failed workflow run and determine its base and head branches. Let HEAD_REF be the PR's head branch (the contributor/origin branch).
2) Maintain a persistent fix branch for this PR head using the Fix Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
3) Attempt to resolve the CI failure by making minimal, targeted edits consistent with the repo's style. Keep changes scoped and safe.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the CI fix and includes an inline compare link to quick-create a PR.
# Inputs and conventions:
- Use `gh api`, `gh run view`, `gh pr view`, `gh pr diff`, `gh pr list`, `gh run download`, and git commands as needed to discover the failing PR and branches.
- Avoid duplicate comments; if a previous bot comment exists, update it instead of posting a new one.
- If no actionable fix is possible, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent fix branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above.
" --force --model "$MODEL" --output-format=text
```
# Audit des secrets
Source: https://docs.cursor.com/fr/cli/cookbook/secret-audit
Audite les secrets d’un dépôt avec Cursor CLI dans GitHub Actions
Analyse ton dépôt pour détecter des vulnérabilités de sécurité et des fuites de secrets avec Cursor CLI. Ce workflow recherche des secrets potentiels, repère des schémas de workflows à risque et propose des correctifs de sécurité.
```yaml auto-secret-audit.yml theme={null}
name: Secrets Audit
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
actions: read
jobs:
secrets-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Scan and propose hardening
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: audit
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Hardening Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Perform a repository secrets exposure and workflow hardening audit on a schedule, and propose minimal safe fixes.
# Requirements:
1) Scan for potential secrets in tracked files and recent history; support allowlist patterns if present (e.g., .gitleaks.toml).
2) Detect risky workflow patterns: unpinned actions, overbroad permissions, unsafe pull_request_target usage, secrets in forked PR contexts, deprecated insecure commands, missing permissions blocks.
3) Maintain a persistent branch for this run using the Hardening Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) Propose minimal edits: redact literals where safe, add ignore rules, pin actions to SHA, reduce permissions, add guardrails to workflows, and add a SECURITY_LOG.md summarizing changes and remediation guidance.
5) Push to origin.
6) If there is at least one open PR in the repo, post or update a single natural-language comment (1–2 sentences) on the most recently updated open PR that briefly explains the hardening changes and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update an existing bot comment if present. If no changes or no open PRs, post nothing.
# Inputs and conventions:
- Use `gh` to list PRs and to post comments. Avoid duplicate comments.
# Deliverables when updates occur:
- Pushed commits to the persistent hardening branch for this run.
- A single natural-language PR comment with the compare link above (only if an open PR exists).
" --force --model "$MODEL" --output-format=text
```
# Traduire des clés
Source: https://docs.cursor.com/fr/cli/cookbook/translate-keys
Traduire les clés d’un dépôt avec Cursor CLI dans GitHub Actions
Gère les clés de traduction pour l’internationalisation avec Cursor CLI. Ce workflow détecte les nouvelles clés i18n ou celles modifiées dans les pull requests et complète les traductions manquantes sans écraser celles qui existent déjà.
```yaml auto-translate-keys.yml theme={null}
name: Translate Keys
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
i18n:
if: ${{ !startsWith(github.head_ref, 'translate/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Propose i18n updates
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: translate
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- Head Ref: ${{ github.head_ref }}
- Translate Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Detect i18n keys added or changed in the PR and fill only missing locales in message files. Never overwrite existing translations.
# Requirements:
1) Determine changed keys by inspecting the PR diff (source files and messages files).
2) Compute missing keys per locale using the source/canonical locale as truth.
3) Add entries only for missing keys. Preserve all existing values untouched.
4) Validate JSON formatting and schemas.
5) Maintain a persistent translate branch for this PR head using the Translate Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
6) Post or update a single PR comment on the original PR written in natural language (1–2 sentences) that briefly explains what was updated and why, and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update a previous bot comment if present.
8) If no changes are necessary, make no commits and post no comment.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes.
# Deliverables when updates occur:
- Pushed commits to the persistent translate branch for this PR head.
- A single natural-language PR comment on the original PR with the compare link above.
" --force --model "$MODEL" --output-format=text
```
# Mettre à jour la doc
Source: https://docs.cursor.com/fr/cli/cookbook/update-docs
Mets à jour la doc d’un dépôt avec Cursor CLI dans GitHub Actions
Mets à jour la doc avec Cursor CLI dans GitHub Actions. Deux approches : autonomie complète de l’agent ou workflow déterministe où seul l’agent modifie les fichiers.
```yaml auto-update-docs.yml theme={null}
name: Mettre à jour la doc
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Cloner le dépôt
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Installer l’interface en ligne de commande Cursor
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configurer Git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Mettre à jour la doc
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Tu tournes dans un runner GitHub Actions.
Le CLI GitHub est disponible sous `gh` et authentifié via `GH_TOKEN`. Git est disponible. Tu as un accès en écriture au contenu du dépôt et tu peux commenter les pull requests, mais tu ne dois pas créer ni modifier de PR.
# Contexte :
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
- Docs Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Objectif :
- Mettre en place un flux de mise à jour de la doc de bout en bout, piloté par les changements incrémentaux de la PR d’origine.
# Exigences :
1) Déterminer ce qui a changé dans la PR d’origine et, s’il y a eu plusieurs pushs, calculer les diffs incrémentiels depuis la dernière mise à jour de la doc réussie.
2) Mettre à jour uniquement la doc pertinente en fonction de ces changements incrémentiels.
3) Maintenir la branche de doc persistante pour le head de cette PR en utilisant le préfixe de branche Docs indiqué dans le Contexte. La créer si elle est absente, sinon la mettre à jour, puis pousser les changements vers origin.
4) Tu n’as PAS la permission de créer des PR. À la place, publie ou mets à jour un unique commentaire en langage naturel sur la PR (1–2 phrases) qui explique brièvement les mises à jour de la doc et inclut un lien de comparaison en ligne pour créer rapidement une PR.
# Entrées et conventions :
- Utilise `gh pr diff` et l’historique Git pour détecter les changements et dériver les plages incrémentielles depuis la dernière mise à jour de la doc.
- N’essaie pas de créer ou de modifier des PR directement. Utilise le format de lien de comparaison ci-dessus.
- Garde les changements minimaux et cohérents avec le style du dépôt. S’il n’y a pas de mises à jour de doc nécessaires, ne fais aucun changement et ne publie aucun commentaire.
# Livrables en cas de mises à jour :
- Commits poussés vers la branche de doc persistante pour le head de cette PR.
- Un unique commentaire en langage naturel sur la PR d’origine qui inclut le lien de comparaison en ligne ci-dessus. Évite les doublons ; mets à jour un précédent commentaire du bot s’il existe.
" --force --model "$MODEL" --output-format=text
```
```yaml auto-update-docs-deterministic.yml theme={null}
name: Mettre à jour la doc
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Récupérer le dépôt
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Installer le CLI Cursor
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configurer git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Générer les mises à jour de la doc (pas de commit/push/commentaire)
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Tu es en train d’exécuter dans un runner GitHub Actions.
Le CLI GitHub est disponible sous `gh` et authentifié via `GH_TOKEN`. Git est disponible.
IMPORTANT : Ne crée pas de branches, ne fais pas de commit, ne push pas et ne poste pas de commentaires sur la PR. Modifie uniquement les fichiers dans le répertoire de travail si nécessaire. Une étape ultérieure du workflow publiera les changements et commentera la PR.
# Contexte :
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
# Objectif :
- Mettre à jour la documentation du dépôt en fonction des changements incrémentaux introduits par cette PR.
# Exigences :
1) Détermine ce qui a changé dans la PR d’origine (utilise `gh pr diff` et l’historique git si nécessaire). Si une branche de doc persistante `${{ env.BRANCH_PREFIX }}/${{ github.head_ref }}` existe, tu peux l’utiliser comme point de référence en lecture seule pour comprendre les mises à jour précédentes.
2) Mets à jour uniquement la doc pertinente en fonction de ces changements. Garde les modifications minimales et conformes au style du dépôt.
3) Ne fais pas de commit, ne push pas, ne crée pas de branches et ne poste pas de commentaires sur la PR. Laisse l’arbre de travail avec uniquement les fichiers mis à jour ; une étape ultérieure publiera.
# Entrées et conventions :
- Utilise `gh pr diff` et l’historique git pour détecter les changements et cibler les modifications de la doc en conséquence.
- Si aucune mise à jour de la doc n’est nécessaire, ne fais aucun changement et ne produis aucune sortie.
# Livrables lorsque des mises à jour ont lieu :
- Fichiers de doc modifiés dans le répertoire de travail uniquement (pas de commits/push/commentaires).
" --force --model "$MODEL" --output-format=text
- name: Publier la branche de doc
id: publish_docs
env:
BRANCH_PREFIX: docs
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
echo "changes_published=false" >> "$GITHUB_OUTPUT"
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
# Assure-toi d’être sur une branche locale que l’on peut pousser
git fetch origin --prune
# Crée/bascule vers la branche persistante de doc, en conservant les changements actuels de l’arborescence de travail
git checkout -B "$DOCS_BRANCH"
# Indexer et détecter les changements
git add -A
if git diff --staged --quiet; then
echo "Aucun changement de doc à publier. On saute le commit/push."
exit 0
fi
COMMIT_MSG="docs: update for PR #${PR_NUMBER} (${HEAD_REF} @ $(git rev-parse --short HEAD))"
git commit -m "$COMMIT_MSG"
git push --set-upstream origin "$DOCS_BRANCH"
echo "changes_published=true" >> "$GITHUB_OUTPUT"
- name: Publier ou mettre à jour le commentaire de la PR
if: steps.publish_docs.outputs.changes_published == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
COMPARE_URL="https://github.com/${REPO}/compare/${BASE_REF}...${DOCS_BRANCH}?quick_pull=1&title=docs%3A+updates+for+PR+%23${PR_NUMBER}"
COMMENT_FILE="${RUNNER_TEMP}/auto-docs-comment.md"
{
echo "Cursor a mis à jour la branche de doc : \`${DOCS_BRANCH}\`"
echo "Tu peux maintenant [voir le diff et créer rapidement une PR pour fusionner ces mises à jour de doc](${COMPARE_URL})."
echo
echo "_Ce commentaire sera mis à jour lors des exécutions suivantes au fur et à mesure que la PR évolue._"
echo
echo ""
} > "$COMMENT_FILE"
# Si la modification du dernier commentaire du bot échoue (gh plus ancien), on revient à la création d’un nouveau commentaire
if gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE" --edit-last; then
echo "Commentaire de PR existant mis à jour."
else
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "Nouveau commentaire de PR publié."
fi
```
# GitHub Actions
Source: https://docs.cursor.com/fr/cli/github-actions
Découvre comment utiliser la CLI de Cursor dans GitHub Actions et d'autres systèmes d'intégration continue
Utilise la CLI de Cursor dans GitHub Actions et d'autres systèmes CI/CD pour automatiser des tâches de développement.
## Intégration de GitHub Actions
Configuration de base :
```yaml theme={null}
- name: Installer l’outil en ligne de commande Cursor
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Exécuter Cursor Agent
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
run: |
cursor-agent -p "Ton prompt ici" --model gpt-5
```
## Exemples de recettes
Découvre nos exemples de recettes pour des workflows concrets : [mise à jour de la doc](/fr/cli/cookbook/update-docs) et [correction des problèmes de CI](/fr/cli/cookbook/fix-ci).
## Autres systèmes CI
Utilise le CLI Cursor dans n’importe quel système CI/CD avec :
* **Exécution de scripts shell** (bash, zsh, etc.)
* **Variables d’environnement** pour configurer la clé API
* **Connexion Internet** pour accéder à l’API de Cursor
## Niveaux d'autonomie
Choisis le niveau d'autonomie de ton agent :
### Autonomie totale
Donne à l'agent le contrôle complet des opérations Git, des appels API et des interactions externes. Configuration plus simple, mais nécessite davantage de confiance.
**Exemple :** Dans notre cookbook [Update Documentation](/fr/cli/cookbook/update-docs), le premier workflow permet à l'agent de :
* Analyser les changements du PR
* Créer et gérer des branches Git
* Commit et push des changements
* Publier des commentaires sur les pull requests
* Gérer tous les scénarios d’erreur
```yaml theme={null}
- name: Mettre à jour la doc (autonomie totale)
run: |
cursor-agent -p "Tu as un accès complet à git, au CLI GitHub et aux opérations de PR.
Gère tout le workflow de mise à jour de la doc, y compris les commits, les push et les commentaires de PR."
```
### Approche d’autonomie restreinte
On recommande d’utiliser cette approche avec des **restrictions fondées sur des permissions** pour les workflows CI en production. Ça te donne le meilleur des deux mondes : l’agent peut gérer intelligemment des analyses complexes et des modifications de fichiers, tandis que les opérations critiques restent déterministes et auditables.
Limite les opérations de l’agent tout en traitant les étapes critiques dans des étapes de workflow séparées. Meilleur contrôle et meilleure prévisibilité.
**Exemple :** Le deuxième workflow du même cookbook restreint l’agent aux seules modifications de fichiers :
```yaml theme={null}
- name: Générer des mises à jour de la doc (restreint)
run: |
cursor-agent -p "IMPORTANT : Ne crée pas de branches, ne fais pas de commit, ne fais pas de push et ne publie pas de commentaires sur les PR.
Modifie uniquement les fichiers dans le répertoire de travail. Une étape ultérieure du workflow s’occupe de la publication."
- name: Publier la branche de doc (déterministe)
run: |
# Opérations git déterministes gérées par le CI
git checkout -B "docs/${{ github.head_ref }}"
git add -A
git commit -m "docs: mise à jour pour la PR"
git push origin "docs/${{ github.head_ref }}"
- name: Publier un commentaire de PR (déterministe)
run: |
# Publication de commentaires de PR déterministe gérée par le CI
gh pr comment ${{ github.event.pull_request.number }} --body "Docs mises à jour"
```
### Restrictions basées sur les permissions
Utilise les [configurations d’autorisations](/fr/cli/reference/permissions) pour appliquer des restrictions au niveau du CLI :
```json theme={null}
{
"permissions": {
"allow": [
"Read(**/*.md)",
"Write(docs/**/*)",
"Shell(grep)",
"Shell(find)"
],
"deny": [
"Shell(git)",
"Shell(gh)",
"Write(.env*)",
"Write(package.json)"
]
}
}
```
## Authentification
### Générer ta clé API
D’abord, [génère une clé API](/fr/cli/reference/authentication#api-key-authentication) depuis ton tableau de bord Cursor.
### Configurer les secrets du dépôt
Stocke ta clé API Cursor en toute sécurité dans ton dépôt :
1. Va sur ton dépôt GitHub
2. Clique sur **Settings** → **Secrets and variables** → **Actions**
3. Clique sur **New repository secret**
4. Nomme-la `CURSOR_API_KEY`
5. Colle ta clé API comme valeur
6. Clique sur **Add secret**
### Utiliser dans les workflows
Définis ta variable d’environnement `CURSOR_API_KEY` :
```yaml theme={null}
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
```
# Utiliser le CLI en mode headless
Source: https://docs.cursor.com/fr/cli/headless
Découvre comment écrire des scripts avec Cursor CLI pour l’analyse, la génération et la modification automatisées de code
Utilise Cursor CLI dans des scripts et des workflows d’automatisation pour des tâches d’analyse de code, de génération et de refactorisation.
## Comment ça marche
Utilise le [mode d’impression](/fr/cli/using#non-interactive-mode) (`-p, --print`) pour les scripts non interactifs et l’automatisation.
### Modification de fichiers dans des scripts
Combine `--print` avec `--force` pour modifier des fichiers dans des scripts :
```bash theme={null}
# Autoriser les modifications de fichiers en mode impression
cursor-agent -p --force "Refactor this code to use modern ES6+ syntax"
# Sans --force, les modifications sont proposées mais non appliquées
cursor-agent -p "Ajouter des commentaires JSDoc à ce fichier" # Ne modifiera pas les fichiers
# Traitement par lots avec modifications réelles des fichiers
find src/ -name "*.js" | while read file; do
cursor-agent -p --force "Ajouter des commentaires JSDoc détaillés à $file"
done
```
L’option `--force` permet à l’agent d’apporter des modifications directes aux fichiers sans confirmation
## Configuration
Consulte [Installation](/fr/cli/installation) et [Authentification](/fr/cli/reference/authentication) pour tous les détails de configuration.
```bash theme={null}
# Installer l’interface en ligne de commande (CLI) de Cursor
curl https://cursor.com/install -fsS | bash
# Définir la clé d’API pour les scripts
export CURSOR_API_KEY=your_api_key_here
cursor-agent -p "Analyse ce code"
```
## Exemples de scripts
Utilise différents formats de sortie selon les besoins des scripts. Consulte la page [Format de sortie](/fr/cli/reference/output-format) pour plus de détails.
### Recherche dans la base de code
Utilise `--output-format text` pour obtenir des réponses lisibles :
```bash theme={null}
#!/bin/bash
# Question simple sur le codebase
cursor-agent -p --output-format text "À quoi sert ce codebase ?"
```
### Revue de code automatisée
Utilise `--output-format json` pour obtenir une analyse structurée :
```bash theme={null}
#!/bin/bash
# simple-code-review.sh - Script de revue de code simple
echo "Début de la revue de code..."
# Examiner les changements récents
cursor-agent -p --force --output-format text \
"Passe en revue les derniers changements de code et donne un retour sur :
- Qualité du code et lisibilité
- Bugs ou problèmes potentiels
- Aspects de sécurité
- Conformité aux bonnes pratiques
Donne des suggestions d’amélioration concrètes et écris-les dans review.txt"
if [ $? -eq 0 ]; then
echo "✅ Revue de code terminée avec succès"
else
echo "❌ Échec de la revue de code"
exit 1
fi
```
### Suivi de la progression en temps réel
Utilise `--output-format stream-json` pour un suivi de la progression en temps réel :
```bash theme={null}
#!/bin/bash
# stream-progress.sh - Suivre la progression en temps réel
echo "🚀 Démarrage du traitement du stream..."
# Suivi de la progression en temps réel
accumulated_text=""
tool_count=0
start_time=$(date +%s)
cursor-agent -p --force --output-format stream-json \
"Analyse la structure de ce projet et crée un rapport de synthèse dans analysis.txt" | \
while IFS= read -r line; do
type=$(echo "$line" | jq -r '.type // empty')
subtype=$(echo "$line" | jq -r '.subtype // empty')
case "$type" in
"system")
if [ "$subtype" = "init" ]; then
model=$(echo "$line" | jq -r '.model // "unknown"')
echo "🤖 Modèle utilisé : $model"
fi
;;
"assistant")
# Accumuler les deltas de texte en streaming
content=$(echo "$line" | jq -r '.message.content[0].text // empty')
accumulated_text="$accumulated_text$content"
# Afficher la progression en temps réel
printf "\r📝 Génération : %d caractères" ${#accumulated_text}
;;
"tool_call")
if [ "$subtype" = "started" ]; then
tool_count=$((tool_count + 1))
# Extraire les informations de l’outil
if echo "$line" | jq -e '.tool_call.writeToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.writeToolCall.args.path // "unknown"')
echo -e "\n🔧 Outil n°$tool_count : Création de $path"
elif echo "$line" | jq -e '.tool_call.readToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.readToolCall.args.path // "unknown"')
echo -e "\n📖 Outil n°$tool_count : Lecture de $path"
fi
elif [ "$subtype" = "completed" ]; then
# Extraire et afficher les résultats de l’outil
if echo "$line" | jq -e '.tool_call.writeToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.linesCreated // 0')
size=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.fileSize // 0')
echo " ✅ Création de $lines lignes ($size octets)"
elif echo "$line" | jq -e '.tool_call.readToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.readToolCall.result.success.totalLines // 0')
echo " ✅ Lecture de $lines lignes"
fi
fi
;;
"result")
duration=$(echo "$line" | jq -r '.duration_ms // 0')
end_time=$(date +%s)
total_time=$((end_time - start_time))
echo -e "\n\n🎯 Terminé en ${duration} ms (${total_time} s au total)"
echo "📊 Statistiques finales : $tool_count outils, ${#accumulated_text} caractères générés"
;;
esac
done
```
# Installation
Source: https://docs.cursor.com/fr/cli/installation
Installer et mettre à jour l’interface en ligne de commande (CLI) Cursor
## Installation
### macOS, Linux et Windows (WSL)
Installe la CLI Cursor avec une seule commande :
```bash theme={null}
curl https://cursor.com/install -fsS | bash
```
### Vérification
Après l’installation, vérifie que le CLI Cursor fonctionne correctement :
```bash theme={null}
cursor-agent --version
```
## Configuration après installation
1. **Ajoute \~/.local/bin à ton PATH :**
Pour bash :
```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
Pour zsh :
```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
2. **Commence à utiliser Cursor Agent :**
```bash theme={null}
cursor-agent
```
## Mises à jour
Par défaut, Cursor CLI essaie de se mettre à jour automatiquement pour que t’aies toujours la dernière version.
Pour mettre à jour manuellement Cursor CLI vers la dernière version :
```bash theme={null}
cursor-agent update
# ou
cursor-agent upgrade
```
Les deux commandes mettront à jour Cursor Agent vers la version la plus récente.
# MCP
Source: https://docs.cursor.com/fr/cli/mcp
Utilise des serveurs MCP avec cursor-agent pour te connecter à des outils externes et à des sources de données
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Vue d’ensemble
La CLI de Cursor prend en charge les serveurs [Model Context Protocol (MCP)](/fr/context/mcp), te permettant de connecter des outils externes et des sources de données à `cursor-agent`. **MCP dans la CLI utilise la même configuration que l’éditeur** — tous les serveurs MCP que t’as configurés fonctionneront sans accroc avec les deux.
Nouveau sur MCP ? Lis le guide complet sur la configuration, l’authentification et les serveurs disponibles
## Commandes CLI
Utilise la commande `cursor-agent mcp` pour gérer les serveurs MCP :
### Lister les serveurs configurés
Affiche tous les serveurs MCP configurés et leur état actuel :
```bash theme={null}
cursor-agent mcp list
```
Cela affiche :
* Noms et identifiants des serveurs
* État de la connexion (connecté/déconnecté)
* Source de la configuration (projet ou global)
* Méthode de transport (stdio, HTTP, SSE)
### Lister les outils disponibles
Voir les outils fournis par un serveur MCP donné :
```bash theme={null}
cursor-agent mcp list-tools
```
Cela affiche :
* Noms et descriptions des outils
* Paramètres requis et facultatifs
* Types de paramètres et contraintes
### Connexion au serveur MCP
Authentifie-toi auprès d’un serveur MCP configuré dans ton `mcp.json` :
```bash theme={null}
cursor-agent mcp login
```
### Désactiver un serveur MCP
Retire un serveur MCP de la liste locale des serveurs approuvés :
```bash theme={null}
cursor-agent mcp disable
```
## Utiliser MCP avec Agent
Une fois que tu as configuré des serveurs MCP (voir le [guide MCP principal](/fr/context/mcp) pour la configuration), `cursor-agent` détecte automatiquement et utilise les outils disponibles lorsqu’ils sont pertinents pour tes requêtes.
```bash theme={null}
# Vérifier quels serveurs MCP sont disponibles
cursor-agent mcp list
# Voir quels outils un serveur donné fournit
cursor-agent mcp list-tools playwright
# Utiliser cursor-agent - il utilise automatiquement les outils MCP quand c’est pertinent
cursor-agent --prompt "Va sur google.com et prends une capture d’écran de la page de recherche"
```
La CLI suit la même priorité de configuration que l’éditeur (projet → global → imbriqué), et détecte automatiquement les configurations dans les répertoires parents.
## Articles associés
Guide complet de MCP : installation, configuration et authentification
Parcours les serveurs MCP prêts à l’emploi que tu peux utiliser
# Cursor CLI
Source: https://docs.cursor.com/fr/cli/overview
Commence avec Cursor CLI pour coder dans ton terminal
Cursor CLI te permet d’interagir avec des agents IA directement depuis ton terminal pour écrire, relire et modifier du code. Que tu préfères une interface terminal interactive ou l’automatisation en sortie texte pour des scripts et des pipelines CI, la CLI t’apporte une aide puissante, là où tu travailles.
```bash theme={null}
# Installation
curl https://cursor.com/install -fsS | bash
# Lancer une session interactive
cursor-agent
```
Cursor CLI est actuellement en bêta, on adorerait ton feedback !
### Mode interactif
Démarre une session de discussion avec l’agent pour décrire tes objectifs, passer en revue les changements proposés et approuver les commandes :
```bash theme={null}
# Démarrer une session interactive
cursor-agent
# Démarrer avec une invite initiale
cursor-agent "refactorise le module d'auth pour utiliser des tokens JWT"
```
### Mode non interactif
Utilise le mode print pour les scénarios non interactifs, comme les scripts, les pipelines CI ou l’automatisation :
```bash theme={null}
# Exécuter avec une invite et un modèle spécifiques
cursor-agent -p "find and fix performance issues" --model "gpt-5"
# Utiliser avec les modifications Git incluses pour relecture
cursor-agent -p "review these changes for security issues" --output-format text
```
### Sessions
Reprends des conversations précédentes pour garder le contexte sur plusieurs échanges :
```bash theme={null}
# Lister toutes les discussions précédentes
cursor-agent ls
# Reprendre la dernière conversation
cursor-agent resume
# Reprendre une conversation précise
cursor-agent --resume="chat-id-here"
```
# Authentification
Source: https://docs.cursor.com/fr/cli/reference/authentication
Authentifie Cursor CLI via la connexion navigateur ou des clés API
Cursor CLI prend en charge deux méthodes d'authentification : la connexion via le navigateur (recommandée) et les clés API.
## Authentification via le navigateur (recommandé)
Utilise le parcours via le navigateur pour une expérience d’authentification ultra simple :
```bash theme={null}
# Se connecter via le navigateur
cursor-agent login
# Vérifier l’état de l’authentification
cursor-agent status
# Se déconnecter et effacer les informations d’authentification stockées
cursor-agent logout
```
La commande de connexion ouvrira ton navigateur par défaut et te demandera de t’authentifier avec ton compte Cursor. Une fois l’opération terminée, tes identifiants seront stockés localement de manière sécurisée.
## Authentification par clé API
Pour l’automatisation, les scripts ou les environnements CI/CD, utilise l’authentification par clé API :
### Étape 1 : Générer une clé API
Génère une clé API dans ton tableau de bord Cursor, sous Integrations > User API Keys.
### Étape 2 : Définir la clé API
Tu peux fournir la clé API de deux façons :
**Option 1 : Variable d’environnement (recommandé)**
```bash theme={null}
export CURSOR_API_KEY=your_api_key_here
cursor-agent "implémenter l’authentification des utilisateurs"
```
**Option 2 : Drapeau de ligne de commande**
```bash theme={null}
cursor-agent --api-key your_api_key_here "implémente l’authentification des utilisateurs"
```
## État d’authentification
Vérifie ton statut d’authentification actuel :
```bash theme={null}
cursor-agent status
```
Cette commande affichera :
* Si t’es authentifié
* Les infos de ton compte
* La configuration actuelle de l’endpoint
## Dépannage
* **Erreurs « Not authenticated » :** Exécute `cursor-agent login` ou vérifie que ta clé API est correctement définie
* **Erreurs de certificat SSL :** Utilise l’option `--insecure` pour les environnements de développement
* **Problèmes d’endpoint :** Utilise l’option `--endpoint` pour spécifier un endpoint d’API personnalisé
# Configuration
Source: https://docs.cursor.com/fr/cli/reference/configuration
Référence de configuration de l’Agent CLI pour cli-config.json
Configure l’Agent CLI à l’aide du fichier `cli-config.json`.
## Emplacement du fichier
| Type | Plateforme | Chemin |
| :----- | :---------- | :----------------------------------------- |
| Global | macOS/Linux | `~/.cursor/cli-config.json` |
| Global | Windows | `$env:USERPROFILE\.cursor\cli-config.json` |
| Projet | Tous | `/.cursor/cli.json` |
Seules les autorisations peuvent être configurées au niveau du projet. Tous les autres réglages du CLI doivent être définis globalement.
Remplacer via des variables d’environnement :
* **`CURSOR_CONFIG_DIR`** : chemin de répertoire personnalisé
* **`XDG_CONFIG_HOME`** (Linux/BSD) : utilise `$XDG_CONFIG_HOME/cursor/cli-config.json`
## Schéma
### Champs requis
| Champ | Type | Description |
| :------------------ | :-------- | :------------------------------------------------------------------------ |
| `version` | number | Version du schéma de configuration (actuelle : `1`) |
| `editor.vimMode` | boolean | Activer les raccourcis Vim (par défaut : `false`) |
| `permissions.allow` | string\[] | Opérations autorisées (voir [Permissions](/fr/cli/reference/permissions)) |
| `permissions.deny` | string\[] | Opérations interdites (voir [Permissions](/fr/cli/reference/permissions)) |
### Champs optionnels
| Champ | Type | Description |
| :----------------------- | :------ | :--------------------------------------------------- |
| `model` | object | Configuration du modèle sélectionné |
| `hasChangedDefaultModel` | boolean | Indicateur de remplacement du modèle géré par la CLI |
```json theme={null}
{
"version": 1,
"editor": { "vimMode": false },
"permissions": {
"allow": ["Shell(ls)", "Shell(echo)"],
"deny": ["Shell(rm)"]
}
}
```
Consulte [Permissions](/fr/cli/reference/permissions) pour les types d’autorisations disponibles et des exemples.
## Dépannage
**Erreurs de configuration** : Mets le fichier de côté et redémarre :
```bash theme={null}
mv ~/.cursor/cli-config.json ~/.cursor/cli-config.json.bad
```
**Les modifications ne sont pas conservées** : Assure-toi que le JSON est valide et que tu as les autorisations d’écriture. Certains champs sont gérés par la CLI et peuvent être écrasés.
## Notes
* Format JSON pur (sans commentaires)
* La CLI répare automatiquement les champs manquants
* Les fichiers corrompus sont sauvegardés en `.bad` puis recréés
* Les entrées d’autorisations sont des chaînes exactes (voir [Permissions](/fr/cli/reference/permissions) pour plus de détails)
# Format de sortie
Source: https://docs.cursor.com/fr/cli/reference/output-format
Schéma de sortie pour les formats texte, JSON et stream-JSON
Le CLI Cursor Agent propose plusieurs formats de sortie via l’option `--output-format` lorsqu’elle est utilisée avec `--print`. Ces formats incluent des formats structurés pour un usage programmatique (`json`, `stream-json`) et un format texte simplifié pour suivre l’avancement de manière lisible.
Le `--output-format` par défaut est `stream-json`. Cette option n’est valable que lors de l’impression (`--print`) ou lorsque le mode impression est déduit (stdout non TTY ou stdin passé en pipe).
## Format JSON
Le format de sortie `json` émet un seul objet JSON (suivi d’un saut de ligne) lorsque l’exécution se termine avec succès. Aucune delta ni aucun événement d’outil n’est émis ; le texte est agrégé dans le résultat final.
En cas d’échec, le processus se termine avec un code non nul et écrit un message d’erreur sur stderr. Aucun objet JSON valide n’est émis en cas d’échec.
### Réponse en cas de succès
En cas de réussite, la CLI affiche un objet JSON avec la structure suivante :
```json theme={null}
{
"type": "result",
"subtype": "success",
"is_error": false,
"duration_ms": 1234,
"duration_api_ms": 1234,
"result": "",
"session_id": "",
"request_id": ""
}
```
| Champ | Description |
| ----------------- | -------------------------------------------------------------------------------------- |
| `type` | Toujours `"result"` pour les résultats du terminal |
| `subtype` | Toujours `"success"` pour les exécutions réussies |
| `is_error` | Toujours `false` pour les réponses réussies |
| `duration_ms` | Durée totale d’exécution en millisecondes |
| `duration_api_ms` | Durée de la requête API en millisecondes (actuellement égale à `duration_ms`) |
| `result` | Texte complet de la réponse de l’assistant (concaténation de tous les deltas de texte) |
| `session_id` | Identifiant de session unique |
| `request_id` | Identifiant de requête facultatif (peut être omis) |
## Format JSON de flux
Le format de sortie `stream-json` émet du JSON délimité par des retours à la ligne (NDJSON). Chaque ligne contient un unique objet JSON représentant un événement en temps réel pendant l'exécution.
Le flux se termine par un événement final `result` en cas de réussite. En cas d'échec, le processus se termine avec un code différent de zéro et le flux peut s'arrêter plus tôt sans événement final ; un message d'erreur est écrit sur stderr.
### Types d'événements
#### Initialisation du système
Émis une fois au début de chaque session :
```json theme={null}
{
"type": "system",
"subtype": "init",
"apiKeySource": "env|flag|login",
"cwd": "/chemin/absolu",
"session_id": "",
"model": "",
"permissionMode": "par défaut"
}
```
Des champs comme `tools` et `mcp_servers` pourraient être ajoutés à cet événement à l’avenir.
Émis plusieurs fois pendant que l’assistant génère sa réponse. Ces événements contiennent des fragments de texte au fil de l’eau :
```json theme={null}
{
"type": "assistant",
"message": {
"role": "assistant",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
Concatène toutes les valeurs `message.content[].text`, dans l’ordre, pour reconstruire la réponse complète de l’assistant.
**Outil de lecture de fichier :**
* **Démarrage** : `tool_call.readToolCall.args` contient `{ "path": "file.txt" }`
* **Achèvement** : `tool_call.readToolCall.result.success` contient les métadonnées et le contenu du fichier
**Outil d’écriture de fichier :**
* **Démarrage** : `tool_call.writeToolCall.args` contient `{ "path": "file.txt", "fileText": "content...", "toolCallId": "id" }`
* **Achèvement** : `tool_call.writeToolCall.result.success` contient `{ "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }`
**Autres outils :**
* Peut utiliser la structure `tool_call.function` avec `{ "name": "tool_name", "arguments": "..." }`
#### Résultat du terminal
L’événement final émis en cas de réussite :
```json theme={null}
{
"type": "result",
"subtype": "réussite",
"duration_ms": 1234,
"duration_api_ms": 1234,
"is_error": false,
"result": "",
"session_id": "",
"request_id": ""
}
```
### Exemple de séquence
Voici une séquence NDJSON représentative illustrant le déroulement typique des événements :
```json theme={null}
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Lis README.md et fais un résumé"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Je vais "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"lire le fichier README.md"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Project\n\nThis is a sample project...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":" et faire un résumé"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"Je vais lire le fichier README.md et faire un résumé","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}
```
## Format texte
Le format de sortie `text` fournit un flux simplifié et lisible des actions de l’agent. Au lieu d’événements JSON détaillés, il produit des descriptions concises de ce que fait l’agent en temps réel.
Ce format est utile pour suivre la progression de l’agent sans le coût d’analyse de données structurées, ce qui le rend idéal pour la journalisation, le débogage ou un simple suivi de l’avancement.
### Exemple de sortie
```
Fichier lu
Fichier modifié
Commande de terminal exécutée
Nouveau fichier créé
```
Chaque action s’affiche sur une nouvelle ligne à mesure que l’agent l’exécute, offrant un retour immédiat sur l’avancement de l’agent dans la tâche.
## Notes d’implémentation
* Chaque événement est émis sur une seule ligne terminée par `\n`
* Les événements `thinking` sont masqués en mode impression et n’apparaissent dans aucun des formats de sortie
* Des champs peuvent être ajoutés au fil du temps de manière rétrocompatible (les consommateurs doivent ignorer les champs inconnus)
* Le format stream fournit des mises à jour en temps réel, tandis que le format JSON attend la fin avant d’afficher les résultats
* Concatène tous les deltas du message `assistant` pour reconstituer la réponse complète
* Les IDs d’appels d’outils peuvent être utilisés pour faire correspondre les événements de début et de fin
* Les IDs de session restent identiques tout au long d’une exécution unique de l’agent
# Paramètres
Source: https://docs.cursor.com/fr/cli/reference/parameters
Référence complète des commandes du CLI Cursor Agent
## Options globales
Les options globales peuvent être utilisées avec n'importe quelle commande :
| Option | Description |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `-v, --version` | Affiche le numéro de version |
| `-a, --api-key ` | Clé API pour l'authentification (tu peux aussi utiliser la variable d'env `CURSOR_API_KEY`) |
| `-p, --print` | Affiche les réponses dans la console (pour les scripts ou l'usage non interactif). A accès à tous les outils, y compris write et bash. |
| `--output-format ` | Format de sortie (ne fonctionne qu'avec `--print`) : `text`, `json` ou `stream-json` (par défaut : `stream-json`) |
| `-b, --background` | Démarre en arrière-plan (ouvre le sélecteur de composition au lancement) |
| `--fullscreen` | Active le mode plein écran |
| `--resume [chatId]` | Rétablit une session de chat |
| `-m, --model ` | Modèle à utiliser |
| `-f, --force` | Force l'autorisation des commandes sauf refus explicite |
| `-h, --help` | Affiche l'aide de la commande |
## Commandes
| Commande | Description | Utilisation |
| ----------------- | ------------------------------------------------------ | ----------------------------------------------- |
| `login` | S’authentifier avec Cursor | `cursor-agent login` |
| `logout` | Se déconnecter et effacer les identifiants enregistrés | `cursor-agent logout` |
| `status` | Vérifier l’état de l’authentification | `cursor-agent status` |
| `mcp` | Gérer les serveurs MCP | `cursor-agent mcp` |
| `update\|upgrade` | Mettre à jour Cursor Agent vers la dernière version | `cursor-agent update` ou `cursor-agent upgrade` |
| `ls` | Reprendre une session de chat | `cursor-agent ls` |
| `resume` | Reprendre la dernière session de chat | `cursor-agent resume` |
| `help [command]` | Afficher l’aide d’une commande | `cursor-agent help [command]` |
Si tu ne précises aucune commande, Cursor Agent démarre par défaut en mode chat interactif.
## MCP
Gère les serveurs MCP configurés pour Cursor Agent.
| Sous-commande | Description | Utilisation |
| ------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------ |
| `login ` | S’authentifie auprès d’un serveur MCP défini dans `.cursor/mcp.json` | `cursor-agent mcp login ` |
| `list` | Liste les serveurs MCP configurés et leur état | `cursor-agent mcp list` |
| `list-tools ` | Liste les outils disponibles et les noms de leurs arguments pour un MCP donné | `cursor-agent mcp list-tools ` |
Toutes les commandes MCP acceptent `-h, --help` pour obtenir l’aide spécifique à la commande.
## Arguments
Quand tu démarres en mode chat (comportement par défaut), tu peux fournir un prompt initial :
**Arguments :**
* `prompt` — Prompt initial pour l’agent
## Obtenir de l’aide
Toutes les commandes prennent en charge l’option globale `-h, --help` pour afficher l’aide propre à chaque commande.
# Permissions
Source: https://docs.cursor.com/fr/cli/reference/permissions
Types d’autorisations pour contrôler l’accès de l’agent aux fichiers et aux commandes
Configure ce que l’agent est autorisé à faire en utilisant des jetons d’autorisation dans ta configuration CLI. Les autorisations se définissent dans `~/.cursor/cli-config.json` (global) ou `/.cursor/cli.json` (spécifique au projet).
## Types d’autorisations
### Commandes shell
**Format :** `Shell(commandBase)`
Contrôle l’accès aux commandes shell. Le `commandBase` est le premier jeton de la ligne de commande.
| Exemple | Description |
| ------------ | --------------------------------------------------------------------- |
| `Shell(ls)` | Autoriser l’exécution des commandes `ls` |
| `Shell(git)` | Autoriser toutes les sous-commandes `git` |
| `Shell(npm)` | Autoriser les commandes du gestionnaire de paquets npm |
| `Shell(rm)` | Refuser la suppression destructrice de fichiers (souvent dans `deny`) |
### Lectures de fichiers
**Format :** `Read(pathOrGlob)`
Contrôle l’accès en lecture aux fichiers et aux répertoires. Prend en charge les motifs glob.
| Exemple | Description |
| ------------------- | ------------------------------------------------------- |
| `Read(src/**/*.ts)` | Autoriser la lecture des fichiers TypeScript dans `src` |
| `Read(**/*.md)` | Autoriser la lecture des fichiers Markdown partout |
| `Read(.env*)` | Refuser la lecture des fichiers d’environnement |
| `Read(/etc/passwd)` | Refuser la lecture des fichiers système |
### Écritures de fichiers
**Format :** `Write(pathOrGlob)`
Contrôle l’accès en écriture aux fichiers et aux répertoires. Prend en charge les motifs glob. En mode impression, `--force` est requis pour écrire des fichiers.
| Exemple | Description |
| --------------------- | ----------------------------------------------------------- |
| `Write(src/**)` | Autoriser l’écriture dans n’importe quel fichier sous `src` |
| `Write(package.json)` | Autoriser la modification de `package.json` |
| `Write(**/*.key)` | Refuser l’écriture de fichiers de clés privées |
| `Write(**/.env*)` | Refuser l’écriture des fichiers d’environnement |
## Configuration
Ajoute des permissions à l’objet `permissions` dans ton fichier de configuration du CLI :
```json theme={null}
{
"permissions": {
"allow": [
"Shell(ls)",
"Shell(git)",
"Read(src/**/*.ts)",
"Write(package.json)"
],
"deny": [
"Shell(rm)",
"Read(.env*)",
"Write(**/*.key)"
]
}
}
```
## Correspondance de motifs
* Les motifs glob utilisent les caractères génériques `**`, `*` et `?`
* Les chemins relatifs sont limités à l’espace de travail actuel
* Les chemins absolus peuvent cibler des fichiers en dehors du projet
* Les règles de refus priment sur les règles d’autorisation
# Commandes slash
Source: https://docs.cursor.com/fr/cli/reference/slash-commands
Actions rapides disponibles dans les sessions CLI de Cursor
| Commande | Description |
| --------------------- | ----------------------------------------------------------------------- |
| `/model ` | Définir ou lister les modèles |
| `/auto-run [state]` | Activer/désactiver l’auto-run (par défaut) ou régler \[on\|off\|status] |
| `/new-chat` | Démarrer une nouvelle session de chat |
| `/vim` | Activer/désactiver les touches Vim |
| `/help [command]` | Afficher l’aide (/help \[cmd]) |
| `/feedback ` | Envoyer un feedback à l’équipe |
| `/resume ` | Reprendre un chat précédent par nom de dossier |
| `/copy-req-id` | Copier le dernier ID de requête |
| `/logout` | Se déconnecter de Cursor |
| `/quit` | Quitter |
Les commandes s’exécutent dans ton shell de connexion (`$SHELL`) avec le répertoire de travail et l’environnement du CLI. Enchaîne les commandes pour les exécuter dans d’autres répertoires :
```bash theme={null}
cd subdir && npm test
```
## Sortie
Sortie de commande affichant un en-tête avec le code de retour, l’affichage de stdout/stderr et des contrôles de troncature
Les sorties volumineuses sont automatiquement tronquées et les processus longue durée expirent pour maintenir les performances.
## Limitations
* Les commandes expirent au bout de 30 secondes
* Les processus longue durée, les serveurs et les invites interactives ne sont pas pris en charge
* Utilise des commandes courtes et non interactives pour de meilleurs résultats
## Permissions
Les commandes sont vérifiées par rapport à tes permissions et aux paramètres de ton équipe avant exécution. Consulte [Permissions](/fr/cli/reference/permissions) pour une configuration détaillée.
Bandeau de décision affichant les options d’approbation : Run, Reject/Propose, Add to allowlist et Auto‑run
Les politiques d’admin peuvent bloquer certaines commandes, et les commandes avec redirection ne peuvent pas être ajoutées à la allowlist en ligne.
## Recommandations d’utilisation
Le mode Shell est idéal pour les vérifications d’état, les builds rapides, les opérations sur les fichiers et l’inspection de l’environnement.
Évite les serveurs longue durée, les applications interactives et les commandes nécessitant une entrée.
Chaque commande s’exécute indépendamment — utilise `cd && ...` pour lancer des commandes dans d’autres répertoires.
## Dépannage
* Si une commande se fige, annule avec Ctrl+C et ajoute des options non interactives
* Quand on te demande des autorisations, approuve une fois ou ajoute à la allowlist avec Tab
* Si la sortie est tronquée, utilise Ctrl+O pour l’étendre
* Pour exécuter dans d’autres répertoires, utilise `cd && ...` car les changements ne persistent pas
* Le mode Shell prend en charge zsh et bash d’après ta variable `$SHELL`
## FAQ
Non. Chaque commande s'exécute indépendamment. Utilise `cd && ...` pour lancer des commandes dans différents répertoires.
Non. Les commandes sont limitées à 30 secondes et ce n'est pas configurable.
Les autorisations sont gérées par la configuration du CLI et de l'équipe. Utilise la bannière de décision pour ajouter des commandes aux listes d'autorisation.
Appuie sur Échap quand le champ est vide, sur Retour arrière/Suppr quand l'entrée est vide, ou Ctrl+C pour tout effacer et quitter.
# Utiliser Agent dans le CLI
Source: https://docs.cursor.com/fr/cli/using
Exécute des prompts, révise et itère efficacement avec le CLI Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Prompting
Énoncer clairement ton intention est recommandé pour obtenir les meilleurs résultats. Par exemple, tu peux utiliser l’invite « do not write any code » pour t’assurer que l’agent n’éditera aucun fichier. C’est généralement utile quand tu planifies des tâches avant de les implémenter.
L’agent dispose actuellement d’outils pour les opérations sur les fichiers, la recherche et l’exécution de commandes shell. D’autres outils sont en cours d’ajout, similaires à ceux de l’agent IDE.
## MCP
Agent prend en charge le [MCP (Model Context Protocol)](/fr/tools/mcp) pour des fonctionnalités étendues et des intégrations. Le CLI détecte automatiquement et respecte ton fichier de configuration `mcp.json`, ce qui active les mêmes serveurs et outils MCP que t’as configurés pour l’IDE.
## Règles
L’agent CLI prend en charge le même [système de règles](/fr/context/rules) que l’IDE. Tu peux créer des règles dans le répertoire `.cursor/rules` pour fournir du contexte et des indications à l’agent. Ces règles sont automatiquement chargées et appliquées selon leur configuration, ce qui te permet de personnaliser le comportement de l’agent pour différentes parties de ton projet ou pour des types de fichiers spécifiques.
Le CLI lit aussi `AGENTS.md` et `CLAUDE.md` à la racine du projet (s’ils sont présents) et les applique comme règles, en complément de `.cursor/rules`.
## Travailler avec Agent
### Navigation
Parcours les messages précédents avec la flèche haut (ArrowUp).
### Relecture
Passe en revue les modifications avec Cmd+R. Appuie sur i pour ajouter des instructions complémentaires. Utilise ArrowUp/ArrowDown pour faire défiler, et ArrowLeft/ArrowRight pour changer de fichier.
### Sélection du contexte
Sélectionne des fichiers et des dossiers à inclure dans le contexte avec @. Libère de l’espace dans la fenêtre de contexte en exécutant `/compress`. Consulte [Summarization](/fr/agent/chat/summarization) pour plus de détails.
## Historique
Reprends un fil existant avec `--resume [thread id]` pour charger le contexte précédent.
Pour reprendre la conversation la plus récente, utilise `cursor-agent resume`.
Tu peux aussi lancer `cursor-agent ls` pour voir la liste des conversations précédentes.
## Validation des commandes
Avant d'exécuter des commandes dans le terminal, le CLI te demandera de valider (y) ou d'annuler (n) l'exécution.
## Mode non interactif
Utilise `-p` ou `--print` pour lancer Agent en mode non interactif. Ça affichera la réponse dans la console.
En mode non interactif, tu peux invoquer Agent sans interaction. Ça te permet de l’intégrer à des scripts, des pipelines CI, etc.
Tu peux combiner ça avec `--output-format` pour contrôler le format de la sortie. Par exemple, utilise `--output-format json` pour une sortie structurée plus simple à analyser dans des scripts, ou `--output-format text` pour une sortie en texte brut.
Cursor dispose d’un accès en écriture complet en mode non interactif.
# Raccourcis clavier
Source: https://docs.cursor.com/fr/configuration/kbd
Raccourcis clavier et raccourcis de touches dans Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Aperçu des raccourcis clavier dans Cursor. Vois tous les raccourcis clavier en appuyant sur Cmd R puis Cmd S, ou en ouvrant la palette de commandes avec Cmd Shift P et en cherchant `Keyboard Shortcuts`.
Pour en savoir plus sur les raccourcis clavier dans Cursor, utilise [Key Bindings for VS Code](https://code.visualstudio.com/docs/getstarted/keybindings) comme référence de base pour les raccourcis de Cursor.
Tous les raccourcis de Cursor, y compris les fonctionnalités spécifiques à Cursor, peuvent être remappés dans les paramètres Keyboard Shortcuts.
## Général
| Raccourci | Action |
| ---------------------- | --------------------------------------------------------------- |
| Cmd I | Afficher/masquer le panneau latéral (sauf si associé à un mode) |
| Cmd L | Afficher/masquer le panneau latéral (sauf si associé à un mode) |
| Cmd E | Panneau de contrôle de l’agent en arrière-plan |
| Cmd . | Menu des modes |
| Cmd / | Basculer entre les modèles d’IA |
| Cmd Shift J | Paramètres de Cursor |
| Cmd , | Paramètres généraux |
| Cmd Shift P | Palette de commandes |
## Chat
Raccourcis pour la zone de saisie du chat.
| Raccourci | Action |
| ---------------------------------------------------- | ----------------------------------------------------------- |
| Return | Nudge (par défaut) |
| Ctrl Return | Mettre le message en file d’attente |
| Cmd Return when typing | Forcer l’envoi du message |
| Cmd Shift Backspace | Annuler la génération |
| Cmd Shift L with code selected | Ajouter le code sélectionné au contexte |
| Cmd V with code or log in clipboard | Ajouter le contenu du presse‑papiers au contexte |
| Cmd Shift V with code or log in clipboard | Ajouter le contenu du presse‑papiers dans la zone de saisie |
| Cmd Return with suggested changes | Accepter toutes les modifications |
| Cmd Backspace | Rejeter toutes les modifications |
| Tab | Passer au message suivant |
| Shift Tab | Revenir au message précédent |
| Cmd Opt / | Basculer de modèle |
| Cmd N / Cmd R | Nouveau chat |
| Cmd T | Nouvel onglet de chat |
| Cmd \[ | Chat précédent |
| Cmd ] | Chat suivant |
| Cmd W | Fermer le chat |
| Escape | Retirer le focus du champ |
## Édition en ligne
| Raccourci | Action |
| ------------------------------ | ----------------------------- |
| Cmd K | Ouvrir |
| Cmd Shift K | Basculer le focus de l’entrée |
| Return | Valider |
| Cmd Shift Backspace | Annuler |
| Opt Return | Poser une question rapide |
## Sélection de code et contexte
| Raccourci | Action |
| ------------------------------------------------------------- | ------------------------------------------------- |
| @ | [Symboles @](/fr/context/@-symbols/) |
| # | Fichiers |
| / | Commandes rapides |
| Cmd Shift L | Ajouter la sélection au chat |
| Cmd Shift K | Ajouter la sélection à Edit |
| Cmd L | Ajouter la sélection à une nouvelle discussion |
| Cmd M | Basculer la stratégie de lecture des fichiers |
| Cmd → | Accepter le mot suivant de la suggestion |
| Cmd Return | Rechercher la base de code dans le chat |
| Sélectionne du code, Cmd C, Cmd V | Ajouter le code de référence copié comme contexte |
| Sélectionne du code, Cmd C, Cmd Shift V | Ajouter le code copié comme contexte texte |
## Tab
| Raccourci | Action |
| ---------------- | ----------------------- |
| Tab | Accepter la suggestion |
| Cmd → | Accepter le mot suivant |
## Terminal
| Raccourci | Action |
| --------------------- | ------------------------------------ |
| Cmd K | Ouvrir la barre d’invite du terminal |
| Cmd Return | Exécuter la commande générée |
| Escape | Valider la commande |
# Commandes shell
Source: https://docs.cursor.com/fr/configuration/shell
Installer et utiliser les commandes shell de Cursor
Cursor fournit des outils en ligne de commande pour ouvrir des fichiers et des dossiers depuis ton terminal. Installe les commandes `cursor` et `code` pour intégrer Cursor à ton flux de travail de développement.
## Installation des commandes CLI
Installe les commandes CLI via la palette de commandes :
1. Ouvre la palette de commandes (Cmd/Ctrl + P)
2. Tape « Install » pour filtrer les commandes d’installation
3. Sélectionne et exécute `Install 'cursor' to shell`
4. Répète et sélectionne `Install 'code' to shell`
Palette de commandes affichant les options d’installation CLI
## Utiliser les commandes CLI
Après l’installation, utilise l’une de ces commandes pour ouvrir des fichiers ou des dossiers dans Cursor :
```bash theme={null}
# Utiliser la commande cursor
cursor chemin/vers/fichier.js
cursor chemin/vers/dossier/
# Utiliser la commande code (compatible avec VS Code)
code chemin/vers/fichier.js
code chemin/vers/dossier/
```
## Options de commande
Les deux commandes prennent en charge ces options :
* Ouvrir un fichier : `cursor file.js`
* Ouvrir un dossier : `cursor ./my-project`
* Ouvrir plusieurs éléments : `cursor file1.js file2.js folder1/`
* Ouvrir dans une nouvelle fenêtre : `cursor -n` ou `cursor --new-window`
* Attendre la fermeture de la fenêtre : `cursor -w` ou `cursor --wait`
## FAQ
Elles sont identiques. La commande `code` est fournie pour la compatibilité avec VS Code.
Non, installe l’une ou les deux selon ta préférence.
Les commandes sont installées dans le fichier de configuration du shell par défaut de ton système (p. ex. `.bashrc`, `.zshrc` ou `.config/fish/config.fish`).
# Thèmes
Source: https://docs.cursor.com/fr/configuration/themes
Personnalise l’apparence de Cursor
Cursor prend en charge les thèmes clair et sombre pour ton environnement de code. Cursor hérite des fonctionnalités de thème de VS Code : utilise n’importe quel thème VS Code, crée des thèmes personnalisés et installe des extensions de thème depuis la marketplace.
## Changer de thème
1. Ouvre la palette de commandes (Cmd/Ctrl + P)
2. Tape « theme » pour filtrer les commandes
3. Sélectionne « Preferences: Color Theme »
4. Choisis un thème
## FAQ
Oui ! Cursor est compatible avec les thèmes VS Code. Installe n’importe quel thème du Marketplace VS Code ou copie des fichiers de thème personnalisés.
Crée des thèmes personnalisés comme dans VS Code. Utilise « Developer: Generate Color Theme From Current Settings » pour partir de tes paramètres actuels, ou suis le guide de création de thèmes VS Code.
# @Code
Source: https://docs.cursor.com/fr/context/@-symbols/@-code
Référence des extraits de code spécifiques dans Cursor avec @Code
Référence des sections de code spécifiques avec le symbole `@Code`. Ça te donne un contrôle plus fin que [`@Files & Folders`](/fr/context/@-symbols/@-files-and-folders), et te permet de sélectionner des extraits de code précis plutôt que des fichiers entiers.
# @Cursor Rules
Source: https://docs.cursor.com/fr/context/@-symbols/@-cursor-rules
Appliquer des règles et des consignes propres au projet
Le symbole `@Cursor Rules` te donne accès aux [règles du projet](/fr/context/rules) et aux consignes que tu as configurées, pour que tu puisses les appliquer explicitement à ton contexte.
# @Files & Folders
Source: https://docs.cursor.com/fr/context/@-symbols/@-files-and-folders
Référencer des fichiers et des dossiers comme contexte dans Chat et Inline Edit
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Fichiers
Réfère des fichiers entiers dans Chat et Inline Edit en sélectionnant `@Files & Folders`, puis le nom du fichier à rechercher. Tu peux aussi faire glisser des fichiers depuis la barre latérale directement dans Agent pour les ajouter au contexte.
## Dossiers
Quand tu fais référence à des dossiers avec `@Folders`, Cursor fournit le chemin du dossier et un aperçu de son contenu pour aider l’IA à comprendre ce qui est disponible.
Après avoir sélectionné un dossier, tape « / » pour descendre dans l’arborescence et voir tous les sous-dossiers.
### Contenu intégral du dossier
Active **Contenu intégral du dossier** dans les paramètres. Une fois activé, Cursor tente d’inclure tous les fichiers du dossier dans le contexte.
Pour les dossiers volumineux dépassant la fenêtre de contexte, une vue d’ensemble apparaît avec une info-bulle indiquant le nombre de fichiers inclus, tandis que Cursor gère l’espace de contexte disponible.
Utiliser le contenu intégral du dossier avec le [mode Max activé](/fr/context/max-mode)
augmente sensiblement le coût des requêtes, car davantage de tokens d’entrée sont consommés.
## Gestion du contexte
Les fichiers et dossiers volumineux sont automatiquement condensés pour respecter les limites de contexte. Consulte [condensation des fichiers et dossiers](/fr/agent/chats/summarization#file--folder-condensation) pour plus de détails.
# @Git
Source: https://docs.cursor.com/fr/context/@-symbols/@-git
Référencer les changements Git et les différences entre branches
* `@Commit`: Référence les changements de ton espace de travail actuel par rapport au dernier commit. Affiche tous les fichiers modifiés, ajoutés et supprimés qui ne sont pas encore commités.
* `@Branch`: Compare les changements de ta branche actuelle avec la branche main. Affiche tous les commits et changements présents dans ta branche mais pas dans main.
# @Link
Source: https://docs.cursor.com/fr/context/@-symbols/@-link
Inclure du contenu web en collant des URL
Quand tu colles une URL dans Chat, Cursor l’identifie automatiquement comme un `@Link` et récupère le contenu pour l’utiliser comme contexte. Ça inclut la prise en charge des PDF — Cursor extrait et analyse le texte de toute URL de PDF accessible publiquement.
## Dissocier
Pour utiliser une URL comme texte brut sans en récupérer le contenu :
* Clique sur le lien balisé et sélectionne `Dissocier`
* Ou colle en maintenant `Maj` pour empêcher le balisage automatique
# @Linter Errors
Source: https://docs.cursor.com/fr/context/@-symbols/@-linter-errors
Accéder aux erreurs de lint et t’y référer dans ta base de code
Le symbole `@Linter Errors` capture automatiquement et fournit du contexte sur les erreurs et avertissements de lint dans ton fichier actif. Par défaut, [Agent](/fr/agent/overview) peut voir les erreurs de lint.
Pour rendre les erreurs du linter visibles, tu dois avoir le language server approprié
installé et configuré pour ton langage de programmation. Cursor détecte
automatiquement et utilise les language servers installés, mais tu pourrais avoir besoin d’installer
des extensions ou des outils supplémentaires pour certains langages.
# @Past Chats
Source: https://docs.cursor.com/fr/context/@-symbols/@-past-chats
Inclure des chats résumés depuis l’historique
Quand tu bosses sur des tâches complexes dans [Chat](/fr/chat), tu peux avoir besoin de te référer au contexte ou aux décisions prises lors de conversations précédentes. Le symbole `@Past Chats` inclut des versions résumées des chats précédents comme contexte.
Particulièrement utile quand :
* Tu as une longue session de Chat avec un contexte important à retrouver
* Tu démarres une nouvelle tâche liée et tu veux garder de la continuité
* Tu veux partager le raisonnement ou les décisions d’une session précédente
# @Recent Changes
Source: https://docs.cursor.com/fr/context/@-symbols/@-recent-changes
Inclure le code récemment modifié comme contexte
Le symbole `@Recent Changes` inclut les modifications de code récentes comme contexte dans les conversations avec l’IA.
* Modifications triées par ordre chronologique
* Met en priorité les 10 dernières modifications
* Respecte les réglages de `.cursorignore`
# @Web
Source: https://docs.cursor.com/fr/context/@-symbols/@-web
Rechercher des informations récentes sur le Web
Avec `@Web`, Cursor effectue des recherches sur le Web via [exa.ai](https://exa.ai) pour trouver des informations à jour et les ajouter au contexte. Ça inclut aussi l’analyse de fichiers PDF à partir de liens directs.
La recherche Web est désactivée par défaut. Active-la dans Settings → Features → Web
Search.
# Vue d’ensemble
Source: https://docs.cursor.com/fr/context/@-symbols/overview
Référence du code, des fichiers et de la documentation avec des symboles @
Navigue dans les suggestions avec les flèches. Appuie sur `Enter` pour sélectionner. Si la suggestion est une catégorie comme `Files`, les suggestions se filtrent pour afficher les éléments les plus pertinents dans cette catégorie.
Voici la liste de tous les symboles @ disponibles :
* [@Files](/fr/context/@-symbols/@-files) - Référence des fichiers précis dans ton projet
* [@Folders](/fr/context/@-symbols/@-folders) - Référence des dossiers entiers pour un contexte plus large
* [@Code](/fr/context/@-symbols/@-code) - Référence des extraits ou des symboles spécifiques de ta base de code
* [@Docs](/fr/context/@-symbols/@-docs) - Accède à la documentation et aux guides
* [@Git](/fr/context/@-symbols/@-git) - Accède à l’historique et aux modifications Git
* [@Past Chats](/fr/context/@-symbols/@-past-chats) - Travaille avec des sessions de compositeur résumées
* [@Cursor Rules](/fr/context/@-symbols/@-cursor-rules) - Travaille avec les règles Cursor
* [@Web](/fr/context/@-symbols/@-web) - Référence des ressources web externes et de la documentation
* [@Link (paste)](/fr/context/@-symbols/@-link) - Crée des liens vers du code ou de la documentation spécifiques
* [@Recent Changes](/fr/context/@-symbols/@-recent-changes) - Crée des liens vers du code ou de la documentation spécifiques
* [@Lint Errors](/fr/context/@-symbols/@-lint-errors) - Référence des erreurs de lint ([Chat](/fr/chat/overview) uniquement)
* [@Definitions](/fr/context/@-symbols/@-definitions) - Recherche des définitions de symboles ([Inline Edit](/fr/inline-edit/overview) uniquement)
* [# Files](/fr/context/@-symbols/pill-files) - Ajoute des fichiers au contexte sans les référencer
* [/ Commands](/fr/context/@-symbols/slash-commands) - Ajoute les fichiers ouverts et actifs au contexte
# #Files
Source: https://docs.cursor.com/fr/context/@-symbols/pill-files
Sélectionne des fichiers précis avec le préfixe #
Utilise « # » suivi d’un nom de fichier pour cibler des fichiers précis. Combine avec les symboles « @ » pour un contrôle de contexte précis.
# /command
Source: https://docs.cursor.com/fr/context/@-symbols/slash-commands
Commandes rapides pour ajouter des fichiers et gérer le contexte
La commande « / » te donne un accès rapide à tes onglets d’éditeur ouverts et te permet d’ajouter plusieurs fichiers au contexte.
## Commandes
* **`/Reset Context`**: Réinitialise le contexte à l’état par défaut
* **`/Generate Cursor Rules`**: Génère des règles que Cursor devra suivre
* **`/Disable Iterate on Lints`**: N’essaiera pas de corriger les erreurs et avertissements du linter
* **`/Add Open Files to Context`**: Ajoute tous les onglets de l’éditeur actuellement ouverts au contexte
* **`/Add Active Files to Context`**: Ajoute au contexte tous les onglets de l’éditeur actuellement visibles (pratique avec une mise en page en panneaux)
# Indexation de la base de code
Source: https://docs.cursor.com/fr/context/codebase-indexing
Comment Cursor apprend ta base de code pour mieux la comprendre
Cursor indexe ta base de code en calculant des embeddings pour chaque fichier. Ça améliore les réponses générées par l’IA sur ton code. Quand tu ouvres un projet, Cursor commence l’indexation automatiquement. Les nouveaux fichiers sont indexés au fil de l’eau.
Vérifie l’état de l’indexation dans : `Cursor Settings` > `Indexing & Docs`
## Configuration
Cursor indexe tous les fichiers, sauf ceux dans les [fichiers d’exclusion](/fr/context/ignore-files) (p. ex. `.gitignore`, `.cursorignore`).
Clique sur `Show Settings` pour :
* Activer l’indexation automatique pour les nouveaux dépôts
* Configurer les fichiers à ignorer
[Ignorer les fichiers volumineux](/fr/context/ignore-files) améliore la précision des réponses.
### Voir les fichiers indexés
Pour voir les chemins des fichiers indexés : `Cursor Settings` > `Indexing & Docs` > `View included files`
Ça ouvre un fichier `.txt` listant tous les fichiers indexés.
## Espaces de travail multi-racines
Cursor prend en charge les [espaces de travail multi‑racines](https://code.visualstudio.com/docs/editor/workspaces#_multiroot-workspaces), ce qui te permet de bosser avec plusieurs bases de code :
* Toutes les bases de code sont indexées automatiquement
* Le contexte de chaque base de code est accessible à l’IA
* `.cursor/rules` s’applique dans tous les dossiers
## Recherche de PR
La recherche de PR t’aide à comprendre l’évolution de ta base de code en rendant les changements historiques consultables et accessibles via l’IA.
### Comment ça marche
Cursor **indexe automatiquement toutes les PR fusionnées** dans l’historique de ton dépôt. Des résumés apparaissent dans les résultats de recherche sémantique, avec un filtrage intelligent pour donner la priorité aux changements récents.
Agent peut **ajouter des PR, commits, issues ou branches** au contexte en utilisant `@[PR number]`, `@[commit hash]` ou `@[branch name]`. Inclut les commentaires GitHub et les revues Bugbot lorsqu’il est connecté.
**Plateformes prises en charge** : GitHub, GitHub Enterprise et Bitbucket. GitLab n’est pas encore pris en charge.
Utilisateurs GitHub Enterprise : l’outil de récupération bascule sur des commandes git en raison
des limitations d’authentification de VSCode.
### Utiliser la recherche de PR
Pose des questions comme « Comment les services sont-ils implémentés dans d’autres PR ? » et Agent récupérera automatiquement les PR pertinentes dans le contexte pour fournir des réponses complètes basées sur l’historique de ton dépôt.
## FAQ
Il n’existe pas encore de liste globale. Vérifie chaque projet individuellement en l’ouvrant dans
Cursor et en consultant les paramètres de Codebase Indexing.
Supprime ton compte Cursor depuis Settings pour retirer toutes les bases de code indexées.
Sinon, supprime les bases de code individuellement dans les paramètres de Codebase Indexing
de chaque projet.
Les bases de code indexées sont supprimées après 6 semaines d’inactivité. La réouverture du
projet déclenche un réindexage.
Non. Cursor crée des embeddings sans stocker les noms de fichiers ni le code source. Les noms de fichiers sont masqués et les fragments de code sont chiffrés.
Quand Agent recherche dans la base de code, Cursor récupère les embeddings depuis le serveur et déchiffre les fragments.
# Ignorer des fichiers
Source: https://docs.cursor.com/fr/context/ignore-files
Gérer l’accès aux fichiers avec .cursorignore et .cursorindexingignore
## Vue d’ensemble
Cursor lit et indexe le code de ton projet pour alimenter ses fonctionnalités. Contrôle les répertoires et fichiers auxquels Cursor peut accéder avec un fichier `.cursorignore` à la racine de ton projet.
Cursor bloque l’accès aux fichiers listés dans `.cursorignore` pour :
* L’indexation du codebase
* Le code accessible via [Tab](/fr/tab/overview), [Agent](/fr/agent/overview) et [Inline Edit](/fr/inline-edit/overview)
* Le code accessible via les [références avec le symbole @](/fr/context/@-symbols/overview)
Les appels d’outils lancés par Agent, comme le terminal et les serveurs MCP, ne peuvent pas bloquer
l’accès au code régi par `.cursorignore`
## Pourquoi ignorer des fichiers ?
**Sécurité** : Restreins l’accès aux clés d’API, identifiants et secrets. Même si Cursor bloque les fichiers ignorés, une protection totale n’est pas garantie à cause de l’imprévisibilité des LLM.
**Performance** : Dans de grandes bases de code ou des monorepos, exclue les parties non pertinentes pour un indexage plus rapide et une découverte de fichiers plus précise.
## Fichiers d’ignore globaux
Définis des patterns d’exclusion pour tous les projets dans tes paramètres utilisateur afin d’écarter les fichiers sensibles sans configurer chaque projet individuellement.
Les patterns par défaut incluent :
* Fichiers d’environnement : `**/.env`, `**/.env.*`
* Identifiants : `**/credentials.json`, `**/secrets.json`
* Clés : `**/*.key`, `**/*.pem`, `**/id_rsa`
## Configurer `.cursorignore`
Crée un fichier `.cursorignore` à la racine de ton projet en utilisant la syntaxe de `.gitignore`.
Active `Cursor Settings` > `Features` > `Editor` > `Hierarchical Cursor Ignore` pour rechercher des fichiers `.cursorignore` dans les répertoires parents.
**Notes** : Les commentaires commencent par `#`. Les règles définies plus tard écrasent les précédentes. Les règles sont relatives à l’emplacement du fichier.
## Limiter l’indexation avec `.cursorindexingignore`
Utilise `.cursorindexingignore` pour exclure des fichiers de l’indexation uniquement. Ces fichiers restent accessibles aux fonctionnalités d’IA, mais n’apparaîtront pas dans les recherches du codebase.
## Fichiers ignorés par défaut
Cursor ignore automatiquement les fichiers listés dans `.gitignore` ainsi que la liste d’exclusion par défaut ci-dessous. Tu peux les rétablir avec le préfixe `!` dans `.cursorignore`.
Uniquement pour l’indexation, ces fichiers sont ignorés en plus de ceux présents dans ton `.gitignore`, `.cursorignore` et `.cursorindexingignore` :
```sh theme={null}
package-lock.json
pnpm-lock.yaml
yarn.lock
composer.lock
Gemfile.lock
bun.lockb
.env*
.git/
.svn/
.hg/
*.lock
*.bak
*.tmp
*.bin
*.exe
*.dll
*.so
*.lockb
*.qwoff
*.isl
*.csv
*.pdf
*.doc
*.doc
*.xls
*.xlsx
*.ppt
*.pptx
*.odt
*.ods
*.odp
*.odg
*.odf
*.sxw
*.sxc
*.sxi
*.sxd
*.sdc
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tif
*.mp3
*.wav
*.wma
*.ogg
*.flac
*.aac
*.mp4
*.mov
*.wmv
*.flv
*.avi
*.zip
*.tar
*.gz
*.7z
*.rar
*.tgz
*.dmg
*.iso
*.cue
*.mdf
*.mds
*.vcd
*.toast
*.img
*.apk
*.msi
*.cab
*.tar.gz
*.tar.xz
*.tar.bz2
*.tar.lzma
*.tar.Z
*.tar.sz
*.lzma
*.ttf
*.otf
*.pak
*.woff
*.woff2
*.eot
*.webp
*.vsix
*.rmeta
*.rlib
*.parquet
*.svg
.egg-info/
.venv/
node_modules/
__pycache__/
.next/
.nuxt/
.cache/
.sass-cache/
.gradle/
.DS_Store/
.ipynb_checkpoints/
.pytest_cache/
.mypy_cache/
.tox/
.git/
.hg/
.svn/
.bzr/
.lock-wscript/
.Python/
.jupyter/
.history/
.yarn/
.yarn-cache/
.eslintcache/
.parcel-cache/
.cache-loader/
.nyc_output/
.node_repl_history/
.pnp.js/
.pnp/
```
### Limitations des motifs de négation
Quand tu utilises des motifs de négation (préfixés par `!`), tu ne peux pas réinclure un fichier si un répertoire parent est exclu via \*.
```sh theme={null}
# Ignorer tous les fichiers du dossier public
public/*
# ✅ Ça fonctionne, car le fichier se trouve à la racine
!public/index.html
# ❌ Ça ne fonctionne pas — impossible de réinclure des fichiers depuis des sous-répertoires
!public/assets/style.css
```
**Solution de contournement** : exclure explicitement les sous-répertoires :
```sh theme={null}
public/assets/*
!public/assets/style.css # Ce fichier est désormais accessible
```
Les répertoires exclus ne sont pas parcourus pour des raisons de performances, donc les motifs visant les fichiers qu’ils contiennent n’ont aucun effet.
Cela correspond à l’implémentation de .gitignore pour les motifs de négation dans les répertoires imbriqués. Pour plus de détails, consulte la [documentation officielle de Git sur les motifs gitignore](https://git-scm.com/docs/gitignore).
[Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) permet à Cursor de se connecter à des outils et des sources de données externes.
### Pourquoi utiliser MCP ?
MCP relie Cursor à des systèmes et données externes. Au lieu de réexpliquer la structure de ton projet en boucle, connecte-toi directement à tes outils.
Écris des serveurs MCP dans n’importe quel langage capable d’écrire sur `stdout` ou d’exposer un endpoint HTTP — Python, JavaScript, Go, etc.
### Comment ça marche
Les serveurs MCP exposent des fonctionnalités via le protocole, ce qui connecte Cursor à des outils externes ou à des sources de données.
Cursor prend en charge trois méthodes de transport :
| Transport | Environnement d’exécution | Déploiement | Utilisateurs | Entrée | Authentification |
| :--------------------------------------------------------------- | :------------------------ | :-------------------------- | :--------------------- | :--------------------- | :--------------- |
| **`stdio`** | Local | Géré par Cursor | Un seul utilisateur | Commande shell | Manuelle |
| **`SSE`** | Local/Remote | Déployé en tant que serveur | Plusieurs utilisateurs | URL d’un endpoint SSE | OAuth |
| **`Streamable HTTP`** | Local/Remote | Déployé en tant que serveur | Plusieurs utilisateurs | URL d’un endpoint HTTP | OAuth |
### Prise en charge du protocole
Cursor prend en charge les capacités suivantes du protocole MCP :
| Fonctionnalité | Prise en charge | Description |
| :-------------- | :-------------- | :------------------------------------------------------------------------------------------------------------------ |
| **Tools** | Pris en charge | Fonctions que le modèle d’IA peut exécuter |
| **Prompts** | Pris en charge | Messages et workflows paramétrés pour les utilisateurs |
| **Resources** | Pris en charge | Sources de données structurées pouvant être lues et référencées |
| **Roots** | Pris en charge | Requêtes initiées par le serveur pour déterminer les limites d’URI ou du système de fichiers dans lesquelles opérer |
| **Elicitation** | Pris en charge | Demandes initiées par le serveur pour obtenir des informations supplémentaires auprès des utilisateurs |
## Installation de serveurs MCP
### Installation en un clic
Installe des serveurs MCP depuis notre collection et authentifie-toi via OAuth.
Parcours les serveurs MCP disponibles
Crée un bouton « Ajouter à Cursor »
### Utiliser `mcp.json`
Configure des serveurs MCP personnalisés avec un fichier JSON :
```json CLI Server - Node.js theme={null}
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "mcp-server"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json CLI Server - Python theme={null}
{
"mcpServers": {
"server-name": {
"command": "python",
"args": ["mcp-server.py"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json Remote Server theme={null}
// Serveur MCP via HTTP ou SSE — s’exécute sur un serveur
{
"mcpServers": {
"server-name": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}
```
### Configuration du serveur STDIO
Pour les serveurs STDIO (serveurs locaux en ligne de commande), configure ces champs dans ton `mcp.json` :
| Champ | Requis | Description | Exemples |
| :---------- | :----- | :---------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- |
| **type** | Oui | Type de connexion du serveur | `"stdio"` |
| **command** | Oui | Commande pour lancer l’exécutable du serveur. Doit être disponible dans ton PATH système ou inclure son chemin complet. | `"npx"`, `"node"`, `"python"`, `"docker"` |
| **args** | Non | Tableau d’arguments passés à la commande | `["server.py", "--port", "3000"]` |
| **env** | Non | Variables d’environnement pour le serveur | `{"API_KEY": "${input:api-key}"}` |
| **envFile** | Non | Chemin vers un fichier d’environnement pour charger d’autres variables | `".env"`, `"${workspaceFolder}/.env"` |
### Utiliser l’API d’extension
Pour enregistrer des serveurs MCP par programmation, Cursor fournit une API d’extension qui permet une configuration dynamique sans modifier les fichiers `mcp.json`. C’est particulièrement utile dans les environnements d’entreprise et pour les workflows d’installation automatisés.
Découvre comment enregistrer des serveurs MCP par programmation avec `vscode.cursor.mcp.registerServer()`
### Emplacements de configuration
Crée le fichier `.cursor/mcp.json` dans ton projet pour des outils spécifiques à ce projet.
Crée le fichier `~/.cursor/mcp.json` dans ton dossier personnel pour des outils disponibles partout.
### Interpolation de configuration
Utilise des variables dans les valeurs de `mcp.json`. Cursor résout les variables dans ces champs : `command`, `args`, `env`, `url` et `headers`.
Syntaxe prise en charge :
* `${env:NAME}` variables d’environnement
* `${userHome}` chemin vers ton dossier personnel
* `${workspaceFolder}` racine du projet (le dossier qui contient `.cursor/mcp.json`)
* `${workspaceFolderBasename}` nom de la racine du projet
* `${pathSeparator}` et `${/}` séparateur de chemins du système d’exploitation
Exemples
```json theme={null}
{
"mcpServers": {
"local-server": {
"command": "python",
"args": ["${workspaceFolder}/tools/mcp_server.py"],
"env": {
"API_KEY": "${env:API_KEY}"
}
}
}
}
```
```json theme={null}
{
"mcpServers": {
"remote-server": {
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${env:MY_SERVICE_TOKEN}"
}
}
}
}
```
### Authentification
Les serveurs MCP utilisent des variables d’environnement pour l’authentification. Passe les clés d’API et les jetons via la config.
Cursor prend en charge OAuth pour les serveurs qui en ont besoin.
## Utiliser MCP dans le chat
Le Composer Agent utilise automatiquement les outils MCP répertoriés sous `Available Tools` quand c’est pertinent. Demande un outil précis par son nom ou décris ce dont tu as besoin. Active ou désactive des outils dans les paramètres.
### Activer/désactiver des outils
Active ou désactive des outils MCP directement depuis l’interface de chat. Clique sur le nom d’un outil dans la liste pour l’activer ou le désactiver. Les outils désactivés ne seront pas chargés dans le contexte et ne seront pas disponibles pour Agent.
### Approbation des outils
Par défaut, l’agent demande une approbation avant d’utiliser les outils MCP. Clique sur la flèche à côté du nom de l’outil pour afficher les arguments.
#### Exécution automatique
Active l’exécution automatique pour que Agent utilise les outils MCP sans te demander. Fonctionne comme des commandes de terminal. En savoir plus sur les paramètres d’exécution automatique [ici](/fr/agent/tools#auto-run).
### Réponse de l’outil
Cursor affiche la réponse dans le chat avec des volets déroulants pour les arguments et les réponses :
### Images comme contexte
Les serveurs MCP peuvent retourner des images — captures d’écran, schémas, etc. Retourne-les sous forme de chaînes encodées en base64 :
```js theme={null}
const RED_CIRCLE_BASE64 = "/9j/4AAQSkZJRgABAgEASABIAAD/2w...";
// ^ base64 complet supprimé pour plus de lisibilité
server.tool("generate_image", async (params) => {
return {
content: [
{
type: "image",
data: RED_CIRCLE_BASE64,
mimeType: "image/jpeg",
},
],
};
});
```
Consulte cet [exemple de serveur](https://github.com/msfeldstein/mcp-test-servers/blob/main/src/image-server.js) pour les détails de l’implémentation. Cursor joint les images renvoyées à la conversation. Si le modèle prend en charge les images, il les analyse.
## Considérations de sécurité
Quand t’installes des serveurs MCP, garde en tête ces bonnes pratiques :
* **Vérifie la source** : installe uniquement des serveurs MCP provenant de développeurs et de dépôts fiables
* **Passe en revue les autorisations** : regarde à quelles données et quelles API le serveur aura accès
* **Limite les clés API** : utilise des clés API restreintes avec le minimum d’autorisations nécessaire
* **Audit du code** : pour les intégrations critiques, examine le code source du serveur
Souviens-toi que les serveurs MCP peuvent accéder à des services externes et exécuter du code en ton nom. Assure-toi toujours de comprendre ce que fait un serveur avant de l’installer.
## Exemples concrets
Pour des exemples pratiques de MCP en action, consulte notre [guide de développement web](/fr/guides/tutorials/web-development), qui montre comment intégrer Linear, Figma et des outils de navigateur dans ton workflow de développement.
## FAQ
Les serveurs MCP connectent Cursor à des outils externes comme Google Drive, Notion,
et d'autres services pour intégrer des docs et des specs dans ton workflow de code.
{" "}
Consulte les logs MCP de cette façon : 1. Ouvre le panneau Output dans Cursor (Cmd+Shift+U) 2. Sélectionne "MCP Logs" dans le menu déroulant 3. Vérifie les erreurs de connexion, les problèmes d'authentification ou les crashs serveur. Les logs affichent l'initialisation du serveur, les appels d'outils et les messages d'erreur.
{" "}
Oui ! Active/désactive des serveurs sans les supprimer : 1. Ouvre Settings (Cmd+Shift+J) 2. Va dans Features → Model Context Protocol 3. Clique sur le toggle à côté de n'importe quel serveur pour l'activer/désactiver. Les serveurs désactivés ne se chargent pas et n'apparaissent pas dans le chat. C'est utile pour dépanner ou réduire l'encombrement des outils.
{" "}
Si un serveur MCP échoue : Cursor affiche un message d'erreur dans le chat. L'appel d'outil est marqué comme échoué. Tu peux réessayer l'opération ou consulter les logs pour plus de détails. Les autres serveurs MCP continuent de fonctionner normalement. Cursor isole les échecs des serveurs pour éviter qu'un serveur n'affecte les autres.
{" "}
Pour les serveurs basés sur npm : 1. Supprime le serveur dans les paramètres 2. Vide le cache npm : `npm cache clean --force` 3. Ajoute à nouveau le serveur pour obtenir la dernière version. Pour les serveurs custom, mets à jour tes fichiers locaux et redémarre Cursor.
Oui, mais suis les bonnes pratiques de sécu : utilise des variables d'environnement pour les secrets, ne les hard-code jamais ; exécute les serveurs sensibles en local avec le transport `stdio` ; limite les permissions des clés API au strict nécessaire ; passe en revue le code du serveur avant de le connecter à des systèmes sensibles ; et envisage d'exécuter les serveurs dans des environnements isolés.
# Memories
Source: https://docs.cursor.com/fr/context/memories
Les Memories sont des règles générées automatiquement à partir de tes conversations dans Chat. Elles sont propres à ton projet et conservent le contexte d’une session à l’autre.
## Comment les souvenirs sont créés
1. **Observation en sidecar** : Cursor utilise une approche sidecar où un autre modèle observe tes conversations et extrait automatiquement des souvenirs pertinents. Ça se fait passivement en arrière-plan pendant que tu travailles. Les souvenirs générés en arrière-plan nécessitent ton approbation avant d’être enregistrés, garantissant la confiance et le contrôle sur ce qui est retenu.
2. **Appels d’outils** : l’agent peut créer directement des souvenirs via des appels d’outils quand tu lui demandes explicitement de retenir quelque chose ou quand il repère des informations importantes qui devraient être conservées pour de futures sessions.
## Gérer les mémoires
Tu peux gérer les mémoires dans Cursor → Settings → Rules.
# Règles
Source: https://docs.cursor.com/fr/context/rules
Contrôle le comportement du modèle Agent avec des instructions réutilisables et à portée définie.
Les règles fournissent des instructions au niveau système à Agent et Inline Edit. Pense-les comme un contexte persistant, des préférences ou des workflows pour tes projets.
Cursor prend en charge quatre types de règles :
Stockées dans `.cursor/rules`, versionnées et limitées à ta base de code.
Globales à ton environnement Cursor. Définies dans les paramètres et toujours appliquées.
Instructions d’Agent au format Markdown. Alternative simple à `.cursor/rules`.
Toujours pris en charge, mais obsolète. Utilise plutôt les Project Rules.
## Comment fonctionnent les règles
Les grands modèles de langage ne gardent pas de mémoire entre les complétions. Les règles fournissent un contexte persistant et réutilisable au niveau du prompt.
Quand elles sont appliquées, le contenu des règles est inclus au début du contexte du modèle. Ça donne à l’IA des consignes cohérentes pour générer du code, interpréter des modifications ou aider dans les workflows.
Les règles s’appliquent à [Chat](/fr/chat/overview) et à [Inline
Edit](/fr/inline-edit/overview). Les règles actives s’affichent dans la barre latérale de l’Agent.
## Règles du projet
Les règles du projet se trouvent dans `.cursor/rules`. Chaque règle est un fichier versionné. Elles peuvent être ciblées via des motifs de chemin, invoquées manuellement, ou incluses en fonction de leur pertinence. Les sous-répertoires peuvent inclure leur propre dossier `.cursor/rules` limité à ce dossier.
Utilise les règles du projet pour :
* Encoder des connaissances spécifiques à ton codebase
* Automatiser des workflows ou des templates propres au projet
* Standardiser les décisions de style ou d’architecture
### Anatomie d’une règle
Chaque fichier de règle est écrit en **MDC** (`.mdc`), un format qui prend en charge les métadonnées et le contenu. Gère comment les règles sont appliquées via la liste déroulante du type, qui modifie les propriétés `description`, `globs`, `alwaysApply`.
| Rule Type | Description |
| :--------------------------------------------- | :--------------------------------------------------------------------------------- |
| `Always` | Toujours inclus dans le contexte du modèle |
| `Auto Attached` | Inclus quand des fichiers correspondant à un motif glob sont référencés |
| `Agent Requested` | Disponible pour l’IA, qui décide s’il faut l’inclure. Doit fournir une description |
| `Manual` | Inclus uniquement quand il est explicitement mentionné avec `@ruleName` |
```
---
description: Modèle de service RPC
globs:
alwaysApply: false
---
- Utilise notre schéma RPC interne pour définir les services
- Utilise toujours snake_case pour les noms de services.
@service-template.ts
```
### Règles imbriquées
Organise les règles en les plaçant dans des répertoires `.cursor/rules` à travers ton projet. Les règles imbriquées s’appliquent automatiquement quand des fichiers de leur répertoire sont référencés.
```
project/
.cursor/rules/ # Règles à l’échelle du projet
backend/
server/
.cursor/rules/ # Règles spécifiques au backend
frontend/
.cursor/rules/ # Règles spécifiques au frontend
```
### Créer une règle
Crée des règles avec la commande `New Cursor Rule` ou via `Cursor Settings > Rules`. Ça crée un nouveau fichier de règle dans `.cursor/rules`. Depuis les paramètres, tu peux voir toutes les règles et leur état.
### Génération de règles
Génère des règles directement dans les conversations avec la commande `/Generate Cursor Rules`. Pratique quand t’as défini le comportement de l’agent et que tu veux le réutiliser.
## Bonnes pratiques
De bonnes règles sont ciblées, actionnables et bien délimitées.
* Garde les règles sous la barre des 500 lignes
* Scinde les règles volumineuses en plusieurs règles composables
* Fournis des exemples concrets ou des fichiers de référence
* Évite les consignes vagues. Écris les règles comme une doc interne claire
* Réutilise les règles quand tu répètes des prompts dans le chat
## Exemples
Cette règle définit des normes pour les composants frontend :
Dans le répertoire components :
* Utilise toujours Tailwind pour le style
* Utilise Framer Motion pour les animations
* Suis les conventions de nommage des composants
Cette règle impose la validation des endpoints d’API :
Dans le répertoire API :
* Utilise zod pour toute validation
* Définit les types de retour avec des schémas zod
* Exporte les types générés à partir des schémas
Cette règle fournit un modèle pour les services Express :
Utilise ce modèle lors de la création d’un service Express :
* Suis les principes RESTful
* Inclue un middleware de gestion des erreurs
* Mets en place une journalisation adéquate
@express-service-template.ts
Cette règle définit la structure des composants React :
Les composants React doivent suivre cette structure :
* Interface des props en haut
* Composant exporté nommément
* Styles en bas
@component-template.tsx
Cette règle automatise l’analyse de l’app :
Quand on te demande d’analyser l’app :
1. Lance le serveur de dev avec `npm run dev`
2. Récupère les logs depuis la console
3. Propose des améliorations de performance
Cette règle aide à générer la documentation :
Aide à rédiger la doc en :
* Extrayant les commentaires de code
* Analysant README.md
* Générant de la documentation Markdown
Commence par créer une propriété à basculer dans `@reactiveStorageTypes.ts`.
Ajoute une valeur par défaut dans `INIT_APPLICATION_USER_PERSISTENT_STORAGE` dans `@reactiveStorageService.tsx`.
Pour les fonctionnalités bêta, ajoute un toggle dans `@settingsBetaTab.tsx`, sinon ajoute-le dans `@settingsGeneralTab.tsx`. Les toggles peuvent être ajoutés comme `` pour les cases à cocher générales. Regarde le reste du fichier pour des exemples.
```
{
vsContext.reactiveStorageService.setApplicationUserPersistentStorage(
'myNewProperty',
newVal
);
}}
/>
```
Pour l’utiliser dans l’app, importe reactiveStorageService et utilise la propriété :
```
const flagIsEnabled = vsContext.reactiveStorageService.applicationUserPersistentStorage.myNewProperty
```
De nombreux exemples sont disponibles auprès des fournisseurs et des frameworks. Des règles proposées par la communauté se trouvent dans des collections et dépôts collaboratifs en ligne.
## AGENTS.md
`AGENTS.md` est un simple fichier Markdown pour définir des instructions d’agent. Place-le à la racine de ton projet comme alternative à `.cursor/rules` pour des cas d’usage simples.
Contrairement aux règles de projet, `AGENTS.md` est un fichier Markdown brut, sans métadonnées ni configurations complexes. C’est parfait pour les projets qui ont besoin d’instructions simples et lisibles, sans le surcoût de règles structurées.
```markdown theme={null}
# Instructions du projet
## Style de code
- Utilise TypeScript pour tous les nouveaux fichiers
- Privilégie les composants fonctionnels dans React
- Utilise snake_case pour les colonnes de la base de données
## Architecture
- Suis le pattern « repository »
- Conserve la logique métier dans les couches de service
```
## Règles utilisateur
Les règles utilisateur sont des préférences globales définies dans **Cursor Settings → Rules** et qui s’appliquent à tous les projets. Elles sont en texte brut, idéal pour définir ton style de communication préféré ou tes conventions de code :
```
Réponds de façon concise. Évite les répétitions inutiles et le remplissage.
```
## `.cursorrules` (Ancien)
Le fichier `.cursorrules` à la racine de ton projet est toujours pris en charge, mais il sera bientôt obsolète. On te recommande de migrer vers Project Rules pour plus de contrôle, de flexibilité et de visibilité.
## FAQ
Vérifie le type de règle. Pour `Agent Requested`, assure-toi qu’une description est définie. Pour `Auto Attached`, assure-toi que le pattern de fichier correspond aux fichiers référencés.
{" "}
Oui. Utilise `@filename.ts` pour inclure des fichiers dans le contexte de ta règle.
{" "}
Oui, génère des règles de projet depuis le chat avec la commande `/Generate Cursor Rules`.
Si Memories est activé, des memories sont générées automatiquement.
Non. Les règles s’appliquent uniquement à Agent et à Inline Edit.
# Concepts
Source: https://docs.cursor.com/fr/get-started/concepts
Découvre les fonctionnalités clés qui rendent Cursor si puissant
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Complétion de code qui prédit des modifications sur plusieurs lignes. Appuie sur Tab pour accepter
des suggestions basées sur ton code actuel et tes changements récents.
Instructions personnalisées qui définissent le comportement de l’IA. Définis des normes de codage,
des préférences de framework et des conventions propres au projet.
Stockage persistant du contexte du projet et des décisions prises lors de
conversations précédentes. Référencées automatiquement dans les interactions à venir.
Différents modèles d’IA sont disponibles pour la génération de code. Chaque modèle a
des caractéristiques distinctes en termes de vitesse et de capacités.
C’est super simple de commencer :
1. Va sur [cursor.com](https://cursor.com) et clique sur « Download »
2. Lance l’installateur une fois le téléchargement terminé
3. Ouvre Cursor quand l’installation est terminée
Tu as besoin d’une version précise ? Retrouve toutes les plateformes et les méthodes d’installation sur
[cursor.com/downloads](https://cursor.com/downloads)
## Première configuration
Quand tu ouvres Cursor pour la première fois, on te guide à travers une configuration rapide :
* Choisis des raccourcis clavier familiers
* Choisis un thème qui te plaît
* Configure tes préférences de terminal
Tu peux relancer l’assistant de configuration à tout moment en appuyant sur Cmd Shift P{" "}
et en recherchant `Cursor: Start Onboarding`.
En savoir plus sur les [raccourcis clavier](/fr/kbd), les [thèmes](/fr/settings/themes) et les [commandes shell](/fr/settings/shell)
Voir les raccourcis clavier
Choisir un thème dans Cursor
Installer les commandes shell
## Tu viens d’un autre éditeur ?
Si tu utilises déjà un autre éditeur de code, on te facilite le passage :
Importe directement tes réglages VS Code
Guides de migration pour JetBrains, Eclipse, Neovim et Sublime
D’autres guides de migration arrivent bientôt.
## Prise en charge des langages
Cursor fonctionne avec tous les principaux langages de programmation. Voici quelques langages populaires bénéficiant d’une prise en charge IA améliorée :
}
arrow
/>
}
arrow
/>
}
arrow
/>
}
arrow
/>
Tu peux ajouter la prise en charge de langues supplémentaires via des extensions, comme dans VS Code.
## Créer ton compte
Même si Cursor fonctionne sans compte, t’inscrire débloque toutes les fonctionnalités d’IA :
1. On te proposera de t’inscrire pendant la configuration, ou tu peux le faire plus tard dans Settings (Cmd Shift J)
2. Une fois inscrit·e, gère ton compte sur [cursor.com/dashboard](https://cursor.com/dashboard)
## Comprendre l’indexation de la base de code
Quand tu ouvres un projet, Cursor commence à apprendre ton code. C’est ce qu’on appelle « l’indexation » et c’est ce qui rend les suggestions de l’IA pertinentes.
* L’indexation démarre automatiquement quand tu ouvres un projet
* Ça prend environ 1 à 15 minutes selon la taille de ton projet
* Plus Cursor apprend ton code, plus ses suggestions deviennent pertinentes
* Les équipes peuvent partager leurs index entre elles pour gagner du temps
* Tu peux vérifier la progression de l’indexation dans Settings (Cmd Shift J) → Indexing & Docs
Tu veux en savoir plus ? Consulte [comment fonctionne l’indexation](/fr/context/codebase-indexing)
## Prochaines étapes
Maintenant que Cursor est installé, tu es prêt·e à découvrir le code assisté par l’IA :
* Suis notre [guide de démarrage rapide](/fr/get-started/quickstart) pour apprendre les bases en 5 minutes
* Découvre les [concepts clés](/fr/get-started/concepts) pour comprendre comment Cursor fonctionne
* [Parcours les guides](/fr/guides) pour explorer ce que tu peux créer avec Cursor
* Si tu rencontres des problèmes, [obtiens de l’aide](/fr/troubleshooting/common-issues) grâce à notre guide de dépannage
* [Rejoins notre communauté](https://cursor.com/community) pour échanger avec d’autres utilisateurs de Cursor
# Démarrage rapide
Source: https://docs.cursor.com/fr/get-started/quickstart
Prends en main Cursor en 5 minutes
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Ce guide de démarrage rapide te fera parcourir un projet qui utilise les fonctionnalités clés de Cursor. À la fin, tu seras à l’aise avec Tab, Inline Edit et Agent.
## Ouvre un projet dans Cursor
Utilise un projet existant ou clone notre exemple :
1. Assure-toi que git est installé
2. Clone le projet d’exemple :
```bash theme={null}
git clone git@github.com:voxelize/voxelize.git && \
cd voxelize && \
cursor .
```
1. Ouvre Cursor
2. Ouvre un dossier de projet avec Cmd O ou `cursor `
On va montrer l’exemple avec le projet d’exemple, mais tu peux utiliser n’importe quel projet que tu as en local.
## Autocomplete avec [Tab](/fr/kbd#tab)
Tab est le modèle d'autocomplétion qu'on a entraîné en interne. C'est un super moyen d'entrer en douceur dans le codage assisté par l'IA si t'y es pas encore habitué. Avec Tab, tu peux :
* Autocompléter **plusieurs lignes et blocs** de code
* Passer **dans** et **entre** les fichiers jusqu'à la prochaine suggestion d'autocomplétion
1. Commence à taper le début d'une fonction :
```javascript theme={null}
function calculate
```
2. Les suggestions Tab apparaissent automatiquement
3. Appuie sur Tab pour accepter la suggestion
4. Cursor propose des paramètres et des corps de fonction
## [Inline Edit](/fr/inline-edit) d’une sélection
1. Sélectionne la fonction que tu viens de créer
2. Appuie sur Cmd K
3. Tape « make this function calculate fibonacci numbers »
4. Appuie sur Return pour appliquer les modifications
5. Cursor ajoute les imports et la documentation
## Discuter avec [Agent](/fr/agent)
1. Ouvre le panneau Chat (Cmd I)
2. Demande : « Ajoute des tests pour cette fonction et exécute-les »
3. Agent va créer un fichier de test, écrire des tests et les lancer pour toi
## Bonus
Fonctionnalités avancées :
1. Ouvre le panneau de contrôle du Background Agent (Cmd E)
2. Demande : « Find and fix a bug in this project »
3. [Background Agent](/fr/background-agent) va :
* Créer une machine virtuelle (VM) distante
* Explorer ton projet
* Détecter des bugs
* Proposer des correctifs
Passe en revue et applique les modifications.
{" "}
1. Ouvre la palette de commandes (Cmd Shift P) 2. Recherche : « New Cursor
Rule » 3. Donne-lui un nom (p. ex. : `style-guide`) 4. Sélectionne le type de règle « Always » 5. Définis
ton style : `Prefer using camelCase for variable names`
1. Va sur notre [répertoire MCP](https://docs.cursor.com/tools)
2. Choisis un outil
3. Clique sur « Install »
Les serveurs peuvent aussi être installés manuellement :
1. Ouvre les paramètres de Cursor (Cmd Shift J)
2. Va dans « Tools & Integrations »
3. Clique sur « New MCP Server »
## Prochaines étapes
Parcours ces guides pour en savoir plus :
Fournis un contexte pertinent pour de meilleurs résultats
Choisis le bon modèle pour ta tâche
Découvre tous les [concepts de Cursor](/fr/get-started/concepts) et lance-toi !
# Data Science
Source: https://docs.cursor.com/fr/guides/advanced/datascience
Découvre comment configurer Cursor pour des workflows de data science, incluant Python, R et SQL, avec des notebooks, des environnements distants et des analyses propulsées par l’IA
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor fournit des outils intégrés pour le développement en data science, avec des environnements reproductibles, la prise en charge des notebooks et une assistance au code propulsée par l’IA. Ce guide présente les configurations essentielles pour les workflows Python, R et SQL.
## Développement de notebooks
Pour une prise en charge complète des notebooks, télécharge l’extension Jupyter (id : ms-toolsai.jupyter), publiée par ms-toolsai.
Cursor prend en charge les fichiers `.ipynb` et `.py` avec exécution de cellules intégrée. Tab, Inline Edit et Agents
fonctionnent dans les notebooks, comme dans les autres fichiers de code.
Fonctionnalités clés :
* **L’exécution de cellules en ligne** lance le code directement dans l’interface de l’éditeur
* **Tab, Inline Edit et Agent** comprennent les bibliothèques de data science, notamment pandas, NumPy, scikit-learn, ainsi que les commandes magiques SQL
## Intégration des bases de données
Les bases de données peuvent être intégrées à Cursor via deux mécanismes principaux : les serveurs MCP et les extensions.
* Les **serveurs MCP** permettent à tes agents de se connecter à tes bases de données
* Les **extensions** intègrent ton IDE au sens large avec tes bases de données
### Via MCP
Les serveurs MCP permettent à ton agent d’exécuter des requêtes directement sur ta base de données. Ça permet à ton agent de choisir d’interroger la base, d’écrire la requête appropriée, d’exécuter la commande et d’analyser les résultats, le tout dans le cadre d’une tâche en cours.
Par exemple, tu peux connecter une base de données Postgres à ton instance Cursor en ajoutant la [config MCP](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) suivante à Cursor :
```json theme={null}
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/ma_bdd"
]
}
}
}
```
Pour en savoir plus sur MCP, consulte notre [documentation MCP](/fr/tools/mcp).
### Via des extensions
Installe des extensions spécifiques aux bases de données (PostgreSQL, BigQuery, SQLite, Snowflake) pour exécuter des requêtes directement depuis l’éditeur. Ça évite de jongler entre les outils et permet à l’IA d’aider à optimiser tes requêtes.
```sql theme={null}
-- Cursor suggère des index, des fonctions de fenêtre et des optimisations de requêtes
SELECT
user_id,
event_type,
COUNT(*) AS nombre_d’événements,
RANK() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) AS rang_de_fréquence
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id, event_type;
```
Utilise les Agents pour analyser des requêtes lentes, proposer des optimisations de performance ou générer du code de visualisation pour les résultats. Cursor comprend le contexte SQL et peut recommander des types de graphiques adaptés à ta structure de données.
## Visualisation de données
L’assistant IA de Cursor fonctionne avec des bibliothèques de visualisation comme Matplotlib, Plotly et Seaborn. L’agent peut générer du code de visualisation pour t’aider à explorer rapidement tes données, tout en créant un artefact reproductible et partageable.
```python theme={null}
import plotly.express as px
import pandas as pd
# L’IA suggère des types de graphiques pertinents en fonction des colonnes de données
df = pd.read_csv('sales_data.csv')
fig = px.scatter(df, x='advertising_spend', y='revenue',
color='region', size='customer_count',
title='Revenus vs dépenses publicitaires par région')
fig.show()
```
## Foire aux questions
**Est-ce que je peux utiliser des notebooks Jupyter existants ?**
Oui, Cursor ouvre les fichiers `.ipynb` avec exécution complète des cellules et prise en charge de l'autocomplétion par IA.
**Comment gérer de gros jeux de données qui ne tiennent pas en mémoire ?**
Utilise des bibliothèques de calcul distribué comme Dask, ou connecte-toi à des clusters Spark via des connexions Remote-SSH vers des machines plus puissantes.
**Est-ce que Cursor prend en charge les fichiers R et SQL ?**
Oui, Cursor fournit une assistance IA et la coloration syntaxique pour les scripts R (`.R`) et les fichiers SQL (`.sql`).
**Quelle est la façon recommandée de partager des environnements de développement ?**
Valide le dossier `.devcontainer` dans le système de gestion de versions. Les membres de l'équipe peuvent reconstruire l'environnement automatiquement à l'ouverture du projet.
**Comment déboguer des pipelines de traitement de données ?**
Utilise le débogueur intégré de Cursor avec des points d'arrêt dans les scripts Python, ou utilise Agent pour analyser et expliquer étape par étape des transformations de données complexes.
## Reproductibilité de l’environnement
### Conteneurs de développement
Les conteneurs de développement t’aident à garantir des runtimes et des dépendances cohérents entre les membres de l’équipe et les environnements de déploiement. Ils peuvent éliminer les bugs liés à l’environnement et réduire le temps d’intégration des nouveaux membres de l’équipe.
Pour utiliser un conteneur de développement, commence par créer un dossier `.devcontainer` à la racine de ton dépôt. Ensuite, crée les fichiers `devcontainer.json`, `Dockerfile` et `requirements.txt`.
```json theme={null}
// .devcontainer/devcontainer.json
{
"name": "ds-env",
"build": { "dockerfile": "Dockerfile" },
"features": {
"ghcr.io/devcontainers/features/python:1": { "version": "3.11" }
},
"postCreateCommand": "pip install -r requirements.txt"
}
```
```dockerfile theme={null}
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/python:3.11
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install -r requirements.txt
```
```txt theme={null}
# requirements.txt
pandas==2.3.0
numpy
# ajoute d’autres dépendances dont tu as besoin pour ton projet
```
Cursor détectera automatiquement le devcontainer et te proposera de rouvrir ton projet dans un conteneur. Tu peux aussi rouvrir manuellement dans un conteneur via la Command Palette (Cmd+Shift+P) en recherchant `Reopen in Container`.
Les conteneurs de développement offrent plusieurs avantages :
* **Isolation des dépendances** pour éviter les conflits entre projets
* **Builds reproductibles** garantissant un comportement cohérent entre les environnements de développement et de production
* **Onboarding simplifié** permettant aux nouveaux membres de l’équipe de démarrer immédiatement sans configuration manuelle
### Développement à distance avec SSH
Quand ton travail nécessite des ressources de calcul supplémentaires, des GPU, ou l’accès à des jeux de données privés, connecte-toi à des machines distantes tout en conservant ton environnement de développement local.
1. Mets à disposition une instance cloud ou accède à un serveur on-premises avec les ressources requises
2. Clone ton dépôt sur la machine distante, y compris la configuration `.devcontainer`
3. Connecte-toi via Cursor : Cmd+Shift+P → "Remote-SSH: Connect to Host"
Cette approche conserve un outillage cohérent tout en faisant évoluer les ressources de calcul selon les besoins. La même configuration de conteneur de développement fonctionne aussi bien en local qu’à distance.
# Grandes bases de code
Source: https://docs.cursor.com/fr/guides/advanced/large-codebases
Comment travailler avec de grandes bases de code dans Cursor
Travailler avec de grandes bases de code pose des défis différents de ceux des petits projets. Forts de notre expérience à faire évoluer la base de code de Cursor et des retours de clients gérant des bases de code massives, on a identifié des approches utiles pour gérer la complexité croissante.
Dans ce guide, on va parcourir quelques techniques qu’on a trouvées utiles pour les grandes bases de code.
```mermaid theme={null}
flowchart LR
A[Comprendre la base de code] --> B[Définir l’objectif / Diff]
B --> C[Planifier les modifications]
C --> D[Mettre en œuvre les modifications]
D --> A
```
# Utilise Chat pour te mettre rapidement à jour sur un code que tu ne connais pas
Parcourir une grande base de code, surtout si elle est nouvelle pour toi, peut être difficile. Tu vas souvent greper, chercher et cliquer un peu partout pour trouver les parties spécifiques qui t’intéressent. Avec [Chat](/fr/chat/overview), tu peux poser des questions pour trouver ce que tu cherches et obtenir une explication détaillée de son fonctionnement.
Ici, on demande de l’aide pour trouver des détails d’implémentation de l’indexation de la base de code dans Cursor, et on demande même des exemples pour que ce soit plus facile à comprendre.
# Écris des règles pour les connaissances spécifiques au domaine
Si tu accueillais un·e nouveau·elle collaborateur·rice dans ta base de code, quel contexte lui donnerais-tu pour qu’il·elle puisse commencer à apporter des contributions utiles ?
Ta réponse à cette question est probablement une information précieuse pour aider Cursor à comprendre aussi. Dans chaque organisation ou projet, il existe des connaissances latentes qui ne sont pas forcément entièrement reflétées dans ta documentation. Utiliser des règles de manière efficace est le meilleur moyen de s’assurer que Cursor ait une vision complète.
Par exemple, si tu écris des instructions sur la manière d’implémenter une nouvelle fonctionnalité ou un nouveau service, pense à rédiger une courte règle pour la documenter et la pérenniser.
```mdc Modèle standard theme={null}
---
description: Ajouter un nouveau service frontend VSCode
---
1. **Définition de l’interface :**
- Définir une nouvelle interface de service avec `createDecorator` et s’assurer que `_serviceBrand` est présent pour éviter les erreurs.
2. **Implémentation du service :**
- Implémenter le service dans un nouveau fichier TypeScript, en étendant `Disposable`, puis l’enregistrer comme singleton avec `registerSingleton`.
3. **Contribution du service :**
- Créer un fichier de contribution pour importer et charger le service, puis l’enregistrer dans le point d’entrée principal.
4. **Intégration au contexte :**
- Mettre à jour le contexte pour inclure le nouveau service, afin de le rendre accessible dans toute l’application.
```
S'il existe des modèles de mise en forme courants que tu veux que Cursor respecte, envisage d'attacher automatiquement des règles basées sur des motifs glob.
```mdc Mise en forme theme={null}
---
globs: *.ts
---
- Utilise bun comme gestionnaire de packages. Voir [package.json](mdc:backend/reddit-eval-tool/package.json) pour les scripts
- Utilise le kebab-case pour les noms de fichiers
- Utilise le camelCase pour les noms de fonctions et de variables
- Utilise UPPERCASE_SNAKE_CASE pour les constantes codées en dur
- Préfère `function foo()` à `const foo = () =>`
- Utilise `Array` plutôt que `T[]`
- Utilise des exports nommés plutôt que des exports par défaut, p. ex. (`export const variable ...`, `export function `)
```
# Reste proche du processus de création du plan
Pour des changements plus importants, passer plus de temps que d’habitude à élaborer un plan précis et bien délimité peut améliorer considérablement les résultats de Cursor.
Si tu constates que tu n’obtiens pas le résultat voulu après quelques variantes du même prompt, pense à prendre du recul et à créer un plan plus détaillé depuis zéro, comme si tu rédigeais un PRD pour un collègue. Souvent, **le plus difficile est de déterminer quelle** modification doit être apportée, une tâche qui convient bien aux humains. Avec les bonnes instructions, on peut déléguer certaines parties de la mise en œuvre à Cursor.
Une façon d’utiliser l’IA pour renforcer le processus de création du plan est d’utiliser le mode Ask. Pour créer un plan, active le mode Ask dans Cursor et balance tout le contexte que tu as depuis tes outils de gestion de projet, tes docs internes ou tes idées en vrac. Réfléchis aux fichiers et dépendances de la base de code que tu sais déjà vouloir inclure. Ça peut être un fichier contenant des portions de code avec lesquelles tu veux t’intégrer, ou même un dossier entier.
Voici un exemple de prompt :
```mdc Invite de planification theme={null}
- prépare un plan pour la création d’une nouvelle fonctionnalité (comme @existingfeature.ts)
- pose-moi des questions (max 3) si quelque chose n’est pas clair
- pense à chercher dans la base de code
@Past Chats (mes prompts d’exploration précédents)
voici un peu plus de contexte depuis [outil de gestion de projet] :
[description du ticket]
```
On demande au modèle d’élaborer un plan et de rassembler du contexte en posant des questions à l’humain, en se référant aux éventuelles invites d’exploration précédentes ainsi qu’aux descriptions des tickets. L’utilisation d’un modèle de raisonnement comme `claude-3.7-sonnet`, `gemini-2.5-pro` ou `o3` est recommandée, car ces modèles comprennent l’intention de la modification et synthétisent plus efficacement un plan.
À partir de là, tu peux affiner le plan de manière itérative avec l’aide de Cursor avant de commencer l’implémentation.
```mermaid theme={null}
flowchart LR
A[Contexte] -- Demander --> B[Plan]
B -- Agent --> C[Mise en œuvre]
```
# Choisis le bon outil pour la bonne tâche
L’une des compétences clés pour utiliser Cursor efficacement, c’est de choisir le bon outil pour la bonne tâche. Pense à ce que tu veux accomplir et choisis l’approche qui te garde dans le flow.
| **Tool** | **Use case** | **Strength** | **Limitation** |
| :------------------------------------------ | :--------------------------------------- | :---------------------------------------------------------------- | :--------------------------- |
| **[Tab](/fr/tab/overview)** | Petites modifications manuelles | Contrôle total, rapidité | Un seul fichier |
| **[Inline Edit](/fr/inline-edit/overview)** | Modifications ciblées dans un fichier | Modifications focalisées | Un seul fichier |
| **[Chat](/fr/chat/overview)** | Modifications plus larges multi-fichiers | Regroupe automatiquement le contexte, modifications en profondeur | Plus lent, lourd en contexte |
Chaque outil a sa zone de confort :
* Tab est ton go-to pour des modifs rapides où tu veux garder la main
* Inline Edit brille quand tu dois apporter des changements ciblés à une section précise du code
* Chat est parfait pour les gros changements où Cursor doit comprendre le contexte global
Quand tu utilises le mode Chat (qui peut paraître un peu plus lent mais est super puissant), aide-le en donnant un bon contexte. Utilise [@files](/fr/context/@-symbols/@-files) pour pointer vers du code similaire à reproduire, ou [@folder](/fr/context/@-symbols/@-folders) pour lui donner une meilleure compréhension de la structure de ton projet. Et n’aie pas peur de découper les gros changements en plus petits morceaux — démarrer des chats tout neufs aide à garder le focus et l’efficacité.
# Points clés
* Réduis la portée des changements et n’essaie pas d’en faire trop d’un coup
* Ajoute du contexte pertinent quand tu peux
* Utilise Chat, Inline Edit et Tab pour ce à quoi ils sont le plus adaptés
* Crée souvent de nouveaux chats
* Planifie avec le [mode Ask](/fr/chat/ask), implémente avec le [mode Agent](/fr/chat/agent)
# Travailler avec la documentation
Source: https://docs.cursor.com/fr/guides/advanced/working-with-documentation
Comment exploiter efficacement la documentation dans Cursor grâce aux prompts, aux sources externes et au contexte interne
export const ChatInput = ({content = []}) => {
const renderContent = () => {
return content.map((item, index) => {
if (item.type === 'mention') {
return
{item.text}
;
}
return item.text;
});
};
return <>
La documentation fournit un contexte à jour et précis. Sans elle, les modèles s'appuient sur des données d’entraînement obsolètes ou incomplètes. La documentation aide les modèles à comprendre, par exemple :
* Les API et leurs paramètres actuels
* Les bonnes pratiques
* Les conventions de l’organisation
* La terminologie du domaine
Et bien plus encore. Lis la suite pour découvrir comment utiliser la documentation directement dans Cursor, sans avoir à changer de contexte.
## Date de coupure des connaissances du modèle
Les grands modèles de langage sont entraînés sur des données jusqu'à un moment précis, appelé « date de coupure des connaissances ». Ça veut dire que :
* Les mises à jour récentes des bibliothèques peuvent ne pas être prises en compte
* De nouveaux frameworks ou outils peuvent être inconnus
* Les changements d’API après la date de coupure passent à la trappe
* Les bonnes pratiques ont peut-être évolué depuis l’entraînement
Par exemple, si la date de coupure des connaissances d’un modèle est début 2024, il ne saura rien des fonctionnalités sorties fin 2024, même pour des frameworks populaires.
# Quel outil utiliser ?
Utilise cet arbre de décision pour déterminer rapidement la meilleure approche pour ta documentation :
```mermaid theme={null}
flowchart TD
A[De quelles infos t’as besoin ?] --> B[Frameworks/bibliothèques publics]
A --> C[Savoirs récents de la communauté/dépannage]
A --> D[Infos internes de l’entreprise]
B --> E[Besoin de la doc officielle ?]
E -->|Oui| F[Utilise @Docs Références d’API, guides, bonnes pratiques]
E -->|Non| G[Utilise @Web Tutoriels de la communauté, comparatifs]
C --> H[Utilise @Web Posts récents, issues GitHub]
D --> I[Intégrations MCP existantes disponibles ?]
I -->|Oui| J[Utilise une MCP existante Confluence, Google Drive, etc.]
I -->|Non| K[Crée une MCP sur mesure API internes, systèmes propriétaires]
style F fill:#e1f5fe
style G fill:#e8f5e8
style H fill:#e8f5e8
style J fill:#fff3e0
style K fill:#fce4ec
```
## Modèle mental
| Outil | Modèle mental |
| ----------- | ----------------------------------------- |
| **`@Docs`** | Comme parcourir et lire la doc officielle |
| **`@Web`** | Comme chercher des solutions sur le web |
| **MCP** | Comme accéder à ta doc interne |
# Documentation publique
La documentation externe couvre des informations publiques dont les modèles peuvent avoir une connaissance limitée ou obsolète. Cursor propose deux principales façons d’y accéder.
## Utiliser @Docs
`@Docs` relie Cursor à la doc officielle des outils et frameworks populaires. Utilise-le quand t’as besoin d’infos à jour et fiables sur :
* **Références d’API** : Signatures de fonctions, paramètres, types de retour
* **Guides de prise en main** : Installation, configuration, usage de base
* **Bonnes pratiques** : Patterns recommandés par la source
* **Débogage spécifique aux frameworks** : Guides de dépannage officiels
## Utiliser @Web
`@Web` parcourt le web en temps réel pour trouver des informations à jour, des articles de blog et des discussions de la communauté. Utilise-le quand tu as besoin de :
* **Tutoriels récents** : contenu et exemples issus de la communauté
* **Comparaisons** : articles qui comparent différentes approches
* **Mises à jour récentes** : annonces ou nouveautés toutes fraîches
* **Multiples points de vue** : différentes façons d’aborder un problème
# Documentation interne
La documentation interne comprend des informations propres à ton organisation que les modèles d’IA n’ont jamais vues pendant leur entraînement. Ça peut être :
* **API internes** : Services et microservices personnalisés
* **Standards de l’entreprise** : Conventions de code, patterns d’architecture
* **Systèmes propriétaires** : Outils, bases de données, workflows personnalisés
* **Connaissances métier** : Logique métier, exigences de conformité
## Accéder à la doc interne avec MCP
Le Model Context Protocol (MCP) offre un moyen standardisé d’intégrer ta documentation privée et tes systèmes dans Cursor. MCP sert de fine couche entre Cursor et tes ressources internes.
**Pourquoi MCP compte :**
* Les modèles ne peuvent pas deviner tes conventions internes
* La doc d’API pour des services custom n’est pas publique
* La logique métier et la connaissance du domaine sont propres à ton organisation
* Les exigences de conformité et de sécurité varient selon les entreprises
### Intégrations MCP courantes
| Intégration | Accès | Exemples |
| ---------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Confluence** | Espaces Confluence de l’entreprise | Doc d’architecture, spécifications d’API pour les services internes, standards et guidelines de code, doc de processus |
| **Google Drive** | Documents et dossiers partagés | Docs de spécification, notes de réunion et décisions, docs de conception et exigences, bases de connaissances d’équipe |
| **Notion** | Bases de données et pages d’espace de travail | Doc de projet, wikis d’équipe, bases de connaissances, exigences produit, specs techniques |
| **Custom** | Systèmes et bases de données internes | APIs propriétaires, systèmes de doc hérités, bases de connaissances custom, outils et workflows spécialisés |
#### Solutions custom
Pour des besoins spécifiques, tu peux construire des serveurs MCP custom qui :
* Scrappent des sites web ou portails internes
* Se connectent à des bases de données propriétaires
* Accèdent à des systèmes de doc personnalisés
* Récupèrent des contenus depuis des wikis internes ou des bases de connaissances
Si tu construis un serveur MCP custom, tu peux aussi exposer des tools pour que Cursor mette à jour la doc
Exemple de serveur MCP custom pour scraper la doc interne :
```javascript TypeScript theme={null}
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import TurndownService from "turndown";
// Create an MCP server for scraping internal docs
const server = new McpServer({
name: "internal-docs",
version: "1.0.0"
});
const turndownService = new TurndownService();
// Add tool to scrape internal documentation
server.tool("get_doc",
{ url: z.string() },
async ({ url }) => {
try {
const response = await fetch(url);
const html = await response.text();
// Convert HTML to markdown
const markdown = turndownService.turndown(html);
return {
content: [{ type: "text", text: markdown }]
};
} catch (error) {
return {
content: [{ type: "text", text: `Error scraping ${url}: ${error.message}` }]
};
}
}
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);
```
```python Python theme={null}
# server.py
import os
import asyncio
from mcp.server.fastmcp import FastMCP
import aiohttp
from markdownify import markdownify as md
# Create an MCP server for scraping internal docs
mcp = FastMCP("internal-docs")
@mcp.tool()
async def get_doc(url: str) -> dict:
"""Scrape internal documentation from a URL"""
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
html = await response.text()
# Convert HTML to markdown
markdown = md(html)
return {
"content": [{"type": "text", "text": markdown}]
}
except Exception as error:
return {
"content": [{"type": "text", "text": f"Error scraping {url}: {str(error)}"}]
}
```
# Garder la doc à jour
La documentation devient vite obsolète. Cursor peut t’aider à maintenir une documentation à jour et utile en la générant et en la mettant à jour à partir de ton code et de tes conversations de développement.
## À partir du code existant
Utilise Cursor pour générer de la documentation directement depuis ton code :
## À partir des sessions de chat
Tes conversations avec Cursor contiennent des informations précieuses qui peuvent être transformées en documentation.
**Après avoir résolu un problème complexe :**
**Après des décisions d’architecture :**
**Après des sessions de débogage :**
## Points à retenir
* Utiliser la documentation comme contexte rend Cursor plus précis et à jour
* Utilise `@Docs` pour la doc officielle et `@Web` pour la connaissance de la communauté
* MCP fait le lien entre Cursor et tes systèmes internes
* Génère de la documentation à partir du code et des conversations pour garder la connaissance à jour
* Combine des sources de doc externes et internes pour une compréhension globale
# Java
Source: https://docs.cursor.com/fr/guides/languages/java
Configurer le développement Java avec le JDK, des extensions et des outils de build
Ce guide t’aide à configurer Cursor pour le développement Java : installer et configurer le JDK, ajouter les extensions nécessaires, déboguer, exécuter des applications Java, et intégrer des outils de build comme Maven et Gradle. Il couvre aussi des fonctionnalités de workflow similaires à IntelliJ ou VS Code.
Avant de commencer, assure-toi d’avoir installé Cursor et de l’avoir mis à jour
vers la dernière version.
## Configuration de Java pour Cursor
### Installation de Java
Avant de configurer Cursor, tu dois avoir Java installé sur ta machine.
Cursor n’embarque pas de compilateur Java, donc tu dois installer un JDK si tu
ne l’as pas déjà fait.
Télécharge et installe un JDK (p. ex. OpenJDK, Oracle JDK, Microsoft Build of
OpenJDK).
Configure JAVA\_HOME et ajoute JAVA\_HOME\bin à ton PATH.
Installe via Homebrew (`brew install openjdk`) ou télécharge un programme d’installation.
Assure-toi que JAVA\_HOME pointe vers le JDK installé.
Utilise ton gestionnaire de paquets (`sudo apt install openjdk-17-jdk` ou équivalent)
ou installe via SDKMAN.
Pour vérifier l’installation, exécute :
```bash theme={null}
java -version
javac -version
```
Si Cursor ne détecte pas ton JDK, configure-le manuellement dans settings.json :
```json theme={null}
{
"java.jdt.ls.java.home": "/chemin/vers/jdk",
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/chemin/vers/jdk-17",
"default": true
}
]
}
```
Redémarre Cursor pour appliquer les changements.
### Configuration de Cursor
Cursor est compatible avec les extensions VS Code. Installe celles-ci manuellement :
Inclut la prise en charge du langage Java, le débogueur, l’exécution de tests, la prise en charge de Maven et
le gestionnaire de projets
Indispensable pour travailler avec le système de build Gradle
Requis pour le développement Spring Boot
Nécessaire pour développer des applications Kotlin
### Configurer les outils de build
#### Maven
Assure-toi que Maven est installé (`mvn -version`). Installe-le depuis [maven.apache.org](https://maven.apache.org/download.cgi) si besoin :
1. Télécharge l’archive binaire
2. Extrais-la à l’emplacement souhaité
3. Définis la variable d’environnement MAVEN\_HOME sur le dossier extrait
4. Ajoute %MAVEN\_HOME%\bin (Windows) ou \$MAVEN\_HOME/bin (Unix) au PATH
#### Gradle
Assure-toi que Gradle est installé (`gradle -version`). Installe-le depuis [gradle.org](https://gradle.org/install/) si besoin :
1. Télécharge la distribution binaire
2. Extrais-la à l’emplacement souhaité
3. Définis la variable d’environnement GRADLE\_HOME sur le dossier extrait
4. Ajoute %GRADLE\_HOME%\bin (Windows) ou \$GRADLE\_HOME/bin (Unix) au PATH
Sinon, utilise le Gradle Wrapper, qui téléchargera et utilisera automatiquement la bonne version de Gradle :
## Exécution et débogage
Maintenant que tout est en place, il est temps d’exécuter et de déboguer ton code Java.
Selon tes besoins, tu peux utiliser les méthodes suivantes :
Clique sur le lien « Run » qui apparaît au-dessus de n’importe quelle méthode main pour exécuter rapidement
ton programme
Ouvre le panneau latéral « Run and Debug » et utilise le bouton « Run » pour démarrer ton
application
Exécute depuis la ligne de commande avec des commandes Maven ou Gradle
Lance des applications Spring Boot directement depuis l’extension « Spring Boot Dashboard »
## Java x Cursor : flux de travail
Les fonctionnalités IA de Cursor peuvent nettement booster ton flux de travail en Java. Voici quelques façons de tirer parti des capacités de Cursor spécifiquement pour Java :
Des complétions intelligentes pour les méthodes, les signatures et le
boilerplate Java, comme les getters/setters.
Implémente des patrons de conception, refactorise du code ou génère des classes
avec une bonne hiérarchie d’héritage.
Fais des modifications rapides en ligne sur des méthodes, corrige des erreurs
ou génère des tests unitaires sans casser ton flux.
Obtiens de l’aide sur des concepts Java, débogue des exceptions ou
comprends des fonctionnalités de frameworks.
### Exemples de flux de travail
1. **Générer du boilerplate Java**\
Utilise la [tab completion](/fr/tab/overview) pour générer rapidement des constructeurs, des getters/setters, des méthodes equals/hashCode et d’autres motifs Java répétitifs.
2. **Déboguer des exceptions Java complexes**\
Face à une stack trace Java cryptique, surligne-la et utilise [Ask](/fr/chat/overview) pour expliquer la cause racine et proposer des correctifs possibles.
3. **Refactoriser du code Java legacy**\
Utilise le [mode Agent](/fr/chat/agent) pour moderniser du code Java ancien : convertis des classes anonymes en lambdas, migre vers des fonctionnalités plus récentes du langage Java ou implémente des patrons de conception.
4. **Développement avec des frameworks**\
Ajoute ta doc au contexte de Cursor avec @docs et génère du code spécifique aux frameworks partout dans Cursor.
# JavaScript & TypeScript
Source: https://docs.cursor.com/fr/guides/languages/javascript
Développement JavaScript et TypeScript avec prise en charge des frameworks
Bienvenue dans le développement JavaScript et TypeScript avec Cursor ! L’éditeur offre une excellente prise en charge du dev JS/TS grâce à son écosystème d’extensions. Voici ce qu’il faut savoir pour tirer le meilleur parti de Cursor.
## Extensions essentielles
Même si Cursor fonctionne très bien avec les extensions que tu préfères, on te recommande celles-ci pour bien démarrer :
* **ESLint** - Requis pour les capacités de correction de lint propulsées par l'IA de Cursor
* **JavaScript and TypeScript Language Features** - Prise en charge du langage améliorée et IntelliSense
* **Path Intellisense** - Autocomplétion intelligente des chemins de fichiers
## Fonctionnalités de Cursor
Cursor améliore ton workflow JavaScript/TypeScript avec :
* **Complétions par tabulation** : des propositions de code contextuelles qui comprennent la structure de ton projet
* **Imports automatiques** : Tab peut importer automatiquement les bibliothèques dès que tu les utilises
* **Édition inline** : utilise `CMD+K` sur n’importe quelle ligne pour modifier avec une syntaxe parfaite
* **Assistance du Composer** : planifie et édite ton code sur plusieurs fichiers avec le Composer
### Intelligence des frameworks avec @Docs
La fonctionnalité @Docs de Cursor te permet de booster ton développement JavaScript en ajoutant des sources de documentation personnalisées que l’IA peut consulter. Ajoute de la documentation depuis MDN, Node.js ou ton framework préféré pour obtenir des suggestions de code plus précises et contextuelles.
Découvre comment ajouter et gérer des sources de documentation personnalisées dans Cursor.
### Résolution automatique des lints
L’une des fonctionnalités phares de Cursor est son intégration fluide avec les extensions de linter.
Assure-toi d’avoir configuré un linter, comme ESLint, et active le paramètre « Iterate on Lints ».
Ensuite, quand tu utilises le mode Agent dans le Composer, une fois que l’IA a tenté de répondre à ta requête et a apporté des modifications au code, elle lira automatiquement la sortie du linter et tentera de corriger les erreurs de lint qu’elle n’aurait pas détectées.
## Prise en charge des frameworks
Cursor fonctionne parfaitement avec tous les principaux frameworks et bibliothèques JavaScript, comme :
### React & Next.js
* Prise en charge complète de JSX/TSX avec des suggestions de composants intelligentes
* Intelligence pour les Server Components et les routes API dans Next.js
* Recommandé : extension [**React Developer Tools**](cursor:extension/msjsdiag.vscode-react-native)
### Vue.js
* Prise en charge de la syntaxe des templates avec intégration Volar
* Auto-complétion des composants et vérification des types
* Recommandé : [**Vue Language Features**](cursor:extension/vue.volar)
### Angular
* Validation des templates et prise en charge des décorateurs TypeScript
* Génération de composants et de services
* Recommandé : [**Angular Language Service**](cursor:extension/Angular.ng-template)
### Svelte
* Surlignage de la syntaxe des composants et complétions intelligentes
* Suggestions pour les statements réactifs et les stores
* Recommandé : [**Svelte for VS Code**](cursor:extension/svelte.svelte-vscode)
### Frameworks backend (Express/NestJS)
* Intelligence pour les routes et les middlewares
* Prise en charge des décorateurs TypeScript pour NestJS
* Intégration d’outils de test d’API
N’oublie pas : les fonctionnalités d’IA de Cursor fonctionnent avec tous ces frameworks, comprennent leurs patterns et bonnes pratiques, et fournissent des suggestions pertinentes. L’IA peut t’aider pour tout, de la création de composants aux refactorings complexes, tout en respectant les patterns existants de ton projet.
# Python
Source: https://docs.cursor.com/fr/guides/languages/python
Configurer un environnement Python avec des extensions et des outils de linting
Ce guide s’inspire largement de [Jack Fields](https://x.com/OrdinaryInds)
et de son
[article](https://medium.com/ordinaryindustries/the-ultimate-vs-code-setup-for-python-538026b34d94)
sur la configuration de VS Code pour le développement Python. Va lire son article pour
plus de détails.
## Prérequis
Avant de commencer, assure-toi d’avoir :
* [Python](https://python.org) installé (3.8 ou version ultérieure recommandée)
* [Git](https://git-scm.com/) pour le contrôle de version
* Cursor installé et à jour avec la dernière version
## Extensions essentielles
Les extensions suivantes configurent Cursor pour offrir un environnement Python complet. Elles te fournissent la coloration syntaxique, le linting, le débogage et les tests unitaires.
Prise en charge principale du langage par Microsoft
Serveur de langage Python ultra-rapide
Capacités de débogage avancées
Linter et formateur pour Python
### Outils Python avancés
Même si les extensions ci-dessus ont longtemps été les plus populaires pour le développement Python dans Cursor, on a aussi ajouté d’autres extensions pour t’aider à tirer le maximum de ton workflow Python.
#### `uv` - Gestionnaire d’environnements Python
[uv](https://github.com/astral-sh/uv) est un gestionnaire de paquets Python moderne qui permet de créer et gérer des environnements virtuels, et peut remplacer pip comme gestionnaire de paquets par défaut.
Pour installer uv, exécute la commande suivante dans ton terminal :
```bash theme={null}
pip install uv
```
#### `ruff` - Linter et formateur Python
[Ruff](https://docs.astral.sh/ruff/) est un linter et formateur Python moderne qui permet de détecter des erreurs de programmation, d’appliquer les conventions de code et de suggérer des refactorings. Il peut être utilisé avec Black pour le formatage du code.
Pour installer Ruff, exécute la commande suivante dans ton terminal :
```bash theme={null}
pip install ruff
```
## Configuration de Cursor
### 1. Interpréteur Python
Configure ton interpréteur Python dans Cursor :
1. Ouvre la palette de commandes (Cmd/Ctrl + Shift + P)
2. Cherche « Python: Select Interpreter »
3. Choisis ton interpréteur Python (ou ton environnement virtuel si tu en utilises un)
### 2. Formatage du code
Mets en place le formatage automatique du code avec Black :
Black est un formateur qui aligne automatiquement ton code sur un
style cohérent. Il ne nécessite aucune configuration et est largement adopté par la
communauté Python.
Pour installer Black, exécute la commande suivante dans ton terminal :
```bash theme={null}
pip install black
```
Ensuite, configure Cursor pour utiliser Black pour le formatage du code en ajoutant ce qui suit à ton fichier `settings.json` :
```json theme={null}
{
"python.formatting.provider": "black",
"editor.formatOnSave": true,
"python.formatting.blackArgs": ["--line-length", "88"]
}
```
### 3. Linting
On peut utiliser PyLint pour détecter les erreurs de programmation, faire respecter les conventions de code et suggérer des refactorisations.
Pour installer PyLint, exécute la commande suivante dans ton terminal :
```bash theme={null}
pip install pylint
```
```json theme={null}
{
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.lintOnSave": true
}
```
### 4. Vérification des types
En plus du linting, on peut utiliser MyPy pour détecter les erreurs de type.
Pour installer MyPy, exécute la commande suivante dans ton terminal :
```bash theme={null}
pip install mypy
```
```json theme={null}
{
"python.linting.mypyEnabled": true
}
```
## Débogage
Cursor offre de puissantes fonctionnalités de débogage pour Python :
1. Place des points d’arrêt en cliquant dans la gouttière
2. Utilise le panneau Débogage (Cmd/Ctrl + Shift + D)
3. Configure `launch.json` pour des configurations de débogage personnalisées
## Fonctionnalités recommandées
Des suggestions de code intelligentes qui comprennent ce que tu fais
Explore et comprends le code grâce à des conversations naturelles
Gère des tâches de développement complexes avec l’aide de l’IA
Récupère du contexte depuis des systèmes tiers
Importe automatiquement les modules pendant que tu codes
Cursor passe ton code en revue en continu grâce à l’IA
## Prise en charge des frameworks
Cursor s’intègre parfaitement aux principaux frameworks Python :
* **Frameworks web** : Django, Flask, FastAPI
* **Data science** : Jupyter, NumPy, Pandas
* **Machine learning** : TensorFlow, PyTorch, scikit-learn
* **Tests** : pytest, unittest
* **API** : requests, aiohttp
* **Bases de données** : SQLAlchemy, psycopg2
# iOS & macOS (Swift)
Source: https://docs.cursor.com/fr/guides/languages/swift
Intègre Cursor à Xcode pour le développement Swift
Bienvenue dans le développement Swift avec Cursor ! Que tu crées des apps iOS, des applications macOS ou des projets Swift côté serveur, on a ce qu’il te faut. Ce guide t’aidera à configurer ton environnement Swift dans Cursor, en commençant par les bases avant de passer à des fonctionnalités plus avancées.
## Flux de travail de base
La façon la plus simple d'utiliser Cursor avec Swift, c'est d'en faire ton éditeur de code principal tout en t'appuyant sur Xcode pour la compilation et l'exécution de tes apps. Tu profiteras de fonctionnalités au top comme :
* Complétion de code intelligente
* Assistance de codage par IA (essaie [CMD+K](/fr/inline-edit/overview) sur n'importe quelle ligne)
* Accès rapide à la doc avec [@Docs](/fr/context/@-symbols/@-docs)
* Coloration syntaxique
* Navigation de code basique
Quand tu dois builder ou lancer ton app, bascule simplement sur Xcode. Ce flux de travail est parfait si tu veux tirer parti des capacités d'IA de Cursor tout en gardant tes outils Xcode habituels pour le débogage et le déploiement.
### Hot Reloading
Quand tu utilises des workspaces ou des projets Xcode (au lieu d'ouvrir directement un dossier dans Xcode), Xcode peut souvent ignorer les modifications apportées à tes fichiers depuis Cursor, ou plus généralement en dehors de Xcode.
Même si ouvrir le dossier dans Xcode peut régler ça, tu peux avoir besoin d'utiliser un projet pour ton flux de travail Swift.
Une super solution, c'est d'utiliser [Inject](https://github.com/krzysztofzablocki/Inject), une bibliothèque de hot reloading pour Swift qui permet à ton app de “hot reload” et de se mettre à jour en temps réel dès que tu fais des changements. Cette approche n'est pas sujette aux effets de bord liés aux workspaces/projets Xcode et te permet de modifier ton code dans Cursor et de voir les changements reflétés immédiatement dans ton app.
En savoir plus sur Inject et comment l'utiliser dans tes projets Swift.
## Développement Swift avancé
Cette section du guide s’inspire largement de [Thomas
Ricouard](https://x.com/Dimillian) et de son
[article](https://dimillian.medium.com/how-to-use-cursor-for-ios-development-54b912c23941)
sur l’utilisation de Cursor pour le développement iOS. Va lire son article pour plus
de détails et abonne-toi pour plus de contenu Swift.
Si tu veux n’avoir qu’un seul éditeur ouvert à la fois et éviter d’alterner entre Xcode et Cursor, tu peux utiliser une extension comme [Sweetpad](https://sweetpad.hyzyla.dev/) pour intégrer Cursor directement au système de build sous-jacent de Xcode.
Sweetpad est une extension puissante qui te permet de compiler, lancer et déboguer tes projets Swift directement dans Cursor, sans rien sacrifier des fonctionnalités de Xcode.
Pour démarrer avec Sweetpad, tu auras quand même besoin d’avoir Xcode installé sur ton Mac — c’est la base du développement Swift. Tu peux télécharger Xcode depuis le [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835). Une fois Xcode configuré, on va améliorer ton expérience de dev dans Cursor avec quelques outils essentiels.
Ouvre ton terminal et exécute :
```bash theme={null}
# Compile tes projets sans avoir besoin d’ouvrir Xcode
brew install xcode-build-server
# Met en forme la sortie de la commande `xcodebuild` dans le terminal de Cursor
brew install xcbeautify
# Offre un formatage avancé et des fonctionnalités du langage
brew install swiftformat
```
Next, install the [Swift Language Support](cursor:extension/chrisatwindsurf.swift-vscode) extension in Cursor. This will give you syntax highlighting and basic language features right out of the box.
Then, we can install the [Sweetpad](https://sweetpad.hyzyla.dev/) extension to integrate Cursor with Xcode. Sweetpad wraps a bunch of shortcuts around the `xcodebuild` CLI (and much more), and allows you to scan your targets, select the destination, build, and run your app just like Xcode. On top of that, it’ll set up your project for Xcode Build Server so you get all the features mentioned above.
### Utilisation de Sweetpad
Une fois Sweetpad installé et un projet Swift ouvert dans Cursor, lance d’abord la commande `Sweetpad: Generate Build Server Config`. Ça va générer un fichier `buildServer.json` à la racine de ton projet pour permettre à Xcode Build Server de fonctionner avec ton projet.
Ensuite, depuis la palette de commandes ou la barre latérale de Sweetpad, tu peux sélectionner la cible que tu veux builder et exécuter.
{" "}
Tu dois builder ton projet une fois pour activer l’auto-complétion, Aller à la définition,
et d’autres fonctionnalités du langage.{" "}
Tu peux aussi maintenant appuyer sur F5 pour builder et lancer ton projet avec un débogueur — tu devras peut‑être créer d’abord une configuration de lancement, mais sélectionne simplement Sweetpad dans la liste quand on te le demande !
Comme pour beaucoup d’extensions dans Cursor, tu peux associer de nombreuses commandes de Sweetpad à des raccourcis clavier pour rendre ton workflow encore plus efficace.
Pour en savoir plus sur Sweetpad, jette un œil à ces ressources :
Site officiel de Sweetpad avec les fonctionnalités et les instructions d’installation
Guide complet couvrant la configuration, l’utilisation et les fonctionnalités avancées
# JetBrains
Source: https://docs.cursor.com/fr/guides/migration/jetbrains
Passe des IDE JetBrains à Cursor avec des outils familiers
Cursor offre une expérience de développement moderne, alimentée par l’IA, qui peut remplacer tes IDE JetBrains. Même si la transition peut sembler déroutante au début, la base de Cursor sur VS Code apporte des fonctionnalités puissantes et de vastes options de personnalisation.
## Composants de l’éditeur
### Extensions
Les IDE JetBrains sont d’excellents outils, car ils arrivent déjà préconfigurés pour les langages et frameworks auxquels ils sont destinés.
Cursor est différent — c’est une toile vierge dès l’installation : tu peux le personnaliser comme tu veux, sans être limité par les langages et frameworks pour lesquels l’IDE a été conçu.
Cursor a accès à un vaste écosystème d’extensions, et presque toutes les fonctionnalités (et plus encore !) offertes par les IDE JetBrains peuvent être reproduites via ces extensions.
Jette un œil à quelques-unes des extensions populaires ci-dessous :
Extension SSH
Gérer plusieurs projets
Intégration Git avancée
Suivre les modifications locales des fichiers
Surlignage des erreurs en ligne
Linting du code
Formatage du code
Suivre les TODO et FIXME
### Raccourcis clavier
Cursor dispose d’un gestionnaire intégré de raccourcis clavier qui te permet d’associer tes raccourcis préférés à des actions.
Avec cette extension, tu peux retrouver presque tous les raccourcis des IDE JetBrains directement dans Cursor !
Assure-toi de lire la doc de l’extension pour apprendre à la configurer comme tu veux :
Installe cette extension pour retrouver les raccourcis clavier des IDE JetBrains dans Cursor.
Raccourcis courants qui diffèrent :
* Find Action : ⌘/Ctrl+Shift+P (vs ⌘/Ctrl+Shift+A)
* Quick Fix : ⌘/Ctrl+. (vs Alt+Enter)
* Go to File : ⌘/Ctrl+P (vs ⌘/Ctrl+Shift+N)
### Thèmes
Recrée l’apparence de tes IDE JetBrains préférés dans Cursor avec ces thèmes de la communauté.
Choisis le thème standard Darcula, ou prends un thème qui correspond à la coloration syntaxique de tes outils JetBrains.
Découvre le classique thème sombre JetBrains Darcula
Retrouve les icônes de fichiers et dossiers familières de JetBrains
### Police
Pour compléter ton expérience façon JetBrains, tu peux utiliser la police officielle JetBrains Mono :
1. Télécharge et installe la police JetBrains Mono sur ton système :
2. Redémarre Cursor après l’installation de la police
3. Ouvre les paramètres de Cursor (⌘/Ctrl+,)
4. Recherche « Font Family »
5. Définis la famille de polices sur `'JetBrains Mono'`
Pour une meilleure expérience, tu peux aussi activer les ligatures de police en ajoutant « "editor.fontLigatures": true » dans tes paramètres.
## Migration spécifique à chaque IDE
Beaucoup d'utilisateurs adoraient les IDE JetBrains pour leur prise en charge prête à l'emploi des langages et frameworks auxquels ils étaient destinés. Cursor est différent : c’est une toile vierge dès l’installation, tu peux le personnaliser comme tu veux, sans être limité par les langages et frameworks pour lesquels l’IDE était prévu.
Cursor a déjà accès à l’écosystème d’extensions de VS Code, et presque toutes les fonctionnalités (et plus encore !) offertes par les IDE JetBrains peuvent être recréées via ces extensions.
Jette un œil aux extensions recommandées ci-dessous pour chaque IDE JetBrains.
### IntelliJ IDEA (Java)
Fonctionnalités de base du langage Java
Prise en charge du débogage Java
Exécuter et déboguer des tests Java
Prise en charge de Maven
Outils de gestion de projet
Principales différences :
* Les configurations Build/Run sont gérées via launch.json
* Outils Spring Boot disponibles via l’extension ["Spring Boot Extension Pack"](cursor:extension/vmware.vscode-boot-dev-pack)
* Prise en charge de Gradle via l’extension ["Gradle for Java"](cursor:extension/vscjava.vscode-gradle)
### PyCharm (Python)
Prise en charge de base de Python
Vérification de types rapide
Prise en charge des notebooks
Formateur et linter Python
Principales différences :
* Environnements virtuels gérés via la palette de commandes
* Configurations de débogage dans launch.json
* Gestion des dépendances via requirements.txt ou Poetry
### WebStorm (JavaScript/TypeScript)
Dernières fonctionnalités du langage
Développement React
Prise en charge de Vue.js
Développement Angular
La plupart des fonctionnalités de WebStorm sont intégrées à Cursor/VS Code, notamment :
* Vue des scripts npm
* Débogage
* Intégration Git
* Prise en charge de TypeScript
### PhpStorm (PHP)
Serveur de langage PHP
Intégration Xdebug
Intelligence de code
Outils de documentation
Principales différences :
* Configuration de Xdebug via launch.json
* Intégration de Composer via le terminal
* Outils de base de données via l’extension ["SQLTools"](cursor:extension/mtxr.sqltools)
### Rider (.NET)
Prise en charge C# essentielle
Environnement de développement C# open source
Plugin C# JetBrains
Gestion du SDK .NET
Principales différences :
* Explorateur de solutions via l’explorateur de fichiers
* Gestion des packages NuGet via la CLI ou des extensions
* Intégration du test runner via l’explorateur de tests
### GoLand (Go)
Extension Go officielle
Principales différences :
* Installation des outils Go proposée automatiquement
* Débogage via launch.json
* Gestion des packages intégrée avec go.mod
## Conseils pour une transition fluide
Appuie sur ⌘/Ctrl + Shift + P pour rechercher des commandes
Exploite les fonctionnalités d’IA de Cursor pour l’autocomplétion et le refactoring de code
Peaufine ton settings.json pour un workflow optimal
Utilise le terminal intégré pour les opérations en ligne de commande
Parcours la marketplace de VS Code pour des outils supplémentaires
Souviens-toi que même si certains workflows peuvent être différents, Cursor propose de puissantes fonctionnalités de codage assisté par IA qui peuvent booster ta productivité au-delà des capacités d’un IDE traditionnel.
# VS Code
Source: https://docs.cursor.com/fr/guides/migration/vscode
Importer les paramètres et extensions de VS Code en un clic
Cursor est basé sur la base de code de VS Code, ce qui nous permet de nous concentrer sur la meilleure expérience de codage propulsée par l’IA tout en conservant un environnement d’édition familier. Ça te permet de migrer facilement tes paramètres VS Code existants vers Cursor.
## Migration de profil
### Import en un clic
Voici comment récupérer toute ta config VS Code en un clic :
1. Ouvre les paramètres de Cursor (⌘/Ctrl + Shift + J)
2. Va dans General > Account
3. Sous "VS Code Import", clique sur le bouton Import
Ça va transférer tes :
* Extensions
* Thèmes
* Paramètres
* Raccourcis clavier
### Migration manuelle du profil
Si tu passes d’une machine à une autre, ou si tu veux plus de contrôle sur tes paramètres, tu peux migrer ton profil manuellement.
#### Exporter un profil
1. Dans ton instance VS Code, ouvre la Command Palette (⌘/Ctrl + Shift + P)
2. Recherche "Preferences: Open Profiles (UI)"
3. Trouve le profil que tu veux exporter dans la barre latérale gauche
4. Clique sur le menu à 3 points et sélectionne "Export Profile"
5. Choisis de l’exporter soit sur ta machine locale, soit vers un GitHub Gist
#### Importer un profil
1. Dans ton instance Cursor, ouvre la Command Palette (⌘/Ctrl + Shift + P)
2. Recherche "Preferences: Open Profiles (UI)"
3. Clique sur le menu déroulant à côté de "New Profile" et clique sur "Import Profile"
4. Colle l’URL du GitHub Gist ou choisis "Select File" pour importer un fichier local
5. Clique sur "Import" en bas de la boîte de dialogue pour enregistrer le profil
6. Enfin, dans la barre latérale, sélectionne le nouveau profil et clique sur l’icône en forme de coche pour l’activer
## Paramètres et interface
### Menus des paramètres
Accède à la Command Palette (⌘/Ctrl + Shift{" "}
* P), puis tape "Cursor Settings"
Accède à la Command Palette (⌘/Ctrl + Shift{" "}
* P), puis tape "Preferences: Open Settings (UI)"
### Mises à jour de version
On rebase régulièrement Cursor sur la dernière version de VS Code pour rester à jour
avec les fonctionnalités et correctifs. Pour garantir la stabilité, Cursor utilise souvent des versions de
VS Code légèrement plus anciennes.
### Orientation de la barre d’activité
On l’a mise à l’horizontale pour optimiser l’espace de l’interface de chat IA. Si tu préfères en vertical :
1. Ouvre la Command Palette (⌘/Ctrl + Shift + P)
2. Recherche "Preferences: Open Settings (UI)"
3. Recherche `workbench.activityBar.orientation`
4. Défini la valeur sur `vertical`
5. Redémarre Cursor
# Schémas d’architecture
Source: https://docs.cursor.com/fr/guides/tutorials/architectural-diagrams
Apprends à générer des schémas d’architecture avec Mermaid pour visualiser la structure du système et les flux de données
Les schémas d’architecture t’aident à comprendre le fonctionnement de ton système. Tu peux t’en servir pour explorer la logique, suivre les données et communiquer la structure. Cursor permet de générer ces schémas directement avec des outils comme Mermaid, pour passer du code au visuel en seulement quelques prompts.
## Pourquoi les diagrammes comptent
Les diagrammes clarifient comment les données circulent et comment les composants interagissent. Ils sont utiles quand tu :
* Veux comprendre le contrôle de flux dans ton codebase
* Dois retracer la lignée des données de l’entrée à la sortie
* Fais l’onboarding d’autres personnes ou documentes ton système
Ils sont aussi super pour déboguer et poser de meilleures questions. Les visuels t’aident (toi et le modèle) à voir l’ensemble.
## Deux dimensions à prendre en compte
Il y a plusieurs angles à considérer :
* **Objectif** : Est-ce que tu représentes la logique, le flux de données, l’infrastructure, ou autre chose ?
* **Format** : Tu veux quelque chose de rapide (comme un diagramme Mermaid) ou de plus formel (comme UML) ?
## Comment formuler une requête
Commence avec un objectif clair. Voici quelques façons courantes de demander :
* **Contrôle du flux** : « Montre-moi comment les requêtes passent du contrôleur à la base de données. »
* **Traçabilité des données** : « Retrace cette variable depuis son point d’entrée jusqu’à sa destination. »
* **Structure** : « Donne-moi une vue au niveau des composants de ce service. »
Tu peux inclure des points de départ et d’arrivée, ou demander à Cursor de retrouver le chemin complet.
## Travailler avec Mermaid
Mermaid est facile à apprendre et se rend directement dans Markdown (avec la bonne extension). Cursor peut générer des diagrammes comme :
* `flowchart` pour la logique et les séquences
* `sequenceDiagram` pour les interactions
* `classDiagram` pour la structure des objets
* `graph TD` pour des graphes directionnels simples
```mermaid theme={null}
sequenceDiagram
participant Utilisateur
participant Serveur
participant Base de données
Utilisateur->>Serveur: Envoyer le formulaire
Serveur->>Base de données: Enregistrer l’entrée
Base de données-->>Serveur: Succès
Serveur-->>Utilisateur: Confirmation
```
Tu peux installer l’[extension Mermaid](https://marketplace.cursorapi.com/items?itemName=bierner.markdown-mermaid) pour afficher un aperçu des diagrammes.
1. Va dans l’onglet Extensions
2. Cherche « Mermaid »
3. Clique sur Installer
## Stratégie de diagramme
Commence petit. N’essaie pas de tout modéliser d’un coup.
* Choisis une fonction, une route ou un processus
* Demande à Cursor de diagrammer cette partie avec Mermaid
* Une fois que t’en as quelques-uns, demande-lui de les combiner
Ça reprend le **modèle C4** — où tu pars d’un niveau bas (code ou composants) et tu montes vers des vues de plus haut niveau.
### Parcours recommandé
1. Commence par un diagramme détaillé de bas niveau
2. Résume-le en une vue de niveau intermédiaire
3. Répète jusqu’à atteindre le niveau d’abstraction que tu veux
4. Demande à Cursor de les fusionner en un seul diagramme ou une carte du système
```mermaid theme={null}
graph TD
subgraph Niveau 1 : Composants bas niveau
A1[AuthService] --> A2[TokenValidator]
A1 --> A3[UserDB]
B1[PaymentService] --> B2[BillingEngine]
B1 --> B3[InvoiceDB]
end
subgraph Niveau 2 : Systèmes de niveau intermédiaire
A[Système utilisateur] --> A1
B[Système de facturation] --> B1
end
subgraph Niveau 3 : Application de haut niveau
App[Application principale] --> A
App --> B
end
```
## Points clés
* Utilise des diagrammes pour comprendre les flux, la logique et les données
* Commence avec de petits prompts et fais évoluer ton diagramme à partir de là
* Mermaid est le format le plus simple à utiliser dans Cursor
* Pars du bas niveau et abstrais vers le haut, comme dans le modèle C4
* Cursor peut t’aider à générer, affiner et combiner des diagrammes facilement
# Créer un serveur MCP
Source: https://docs.cursor.com/fr/guides/tutorials/building-mcp-server
Apprends à créer un serveur Model Context Protocol (MCP) avec intégration à PostgreSQL pour Cursor
## Introduction
Les serveurs MCP te permettent de connecter des sources de données personnalisées et de les rendre disponibles dans Cursor. C’est particulièrement utile quand tu as besoin de contexte depuis un navigateur, une base de données ou des journaux d’erreurs et système. Configurer un serveur MCP est simple, et avec Cursor, ça se fait rapidement.
Dans ce guide, on va voir comment créer un serveur MCP pour Postgres. L’objectif est de permettre à Cursor d’exécuter des requêtes SQL directement sur une base de données Postgres et d’exposer les schémas de tables de façon structurée.
Ce tutoriel est conçu pour enseigner les bases de la création de serveurs MCP.
```mermaid theme={null}
graph LR
A[Utilisateur dans Cursor] --> B[Cursor]
B <--> C["Serveur MCP (stdio)"]
C <--> D[(Base de données Postgres)]
subgraph Machine locale
B
C
end
class B cursor
class C mcp
class D db
```
## Qu’est-ce qu’un serveur MCP ?
Un [serveur MCP](/fr/context/mcp) est un processus qui communique avec Cursor et donne accès à des données ou actions externes. Il peut être implémenté de plusieurs façons, mais ici on va utiliser la méthode la plus simple : un serveur qui tourne en local sur ton ordinateur via [stdio](https://en.wikipedia.org/wiki/Standard_streams) (flux standard d’entrée/sortie). Ça évite des considérations de sécurité complexes et nous permet de nous concentrer sur la logique MCP elle-même.
L’un des cas d’usage les plus courants de MCP est l’accès aux bases de données. Quand tu construis des dashboards, exécutes des analyses ou crées des migrations, il est souvent nécessaire d’interroger et d’inspecter une base de données. Notre serveur MCP pour Postgres prendra en charge deux capacités principales : exécuter des requêtes arbitraires et lister les schémas de tables.
Même si ces deux tâches pourraient être réalisées en SQL « pur », MCP offre des fonctionnalités qui les rendent plus puissantes et plus largement utiles. Les outils permettent d’exposer des actions comme l’exécution de requêtes, tandis que les ressources nous permettent de partager un contexte standardisé, par exemple des informations de schéma. Plus loin dans ce guide, on verra aussi les prompts, qui permettent des workflows plus avancés.
Sous le capot, on va s’appuyer sur le package npm postgres pour exécuter des instructions SQL sur la base de données. Le SDK MCP servira de wrapper autour de ces appels, ce qui nous permet d’intégrer les fonctionnalités de Postgres de manière transparente dans Cursor.
## Comment créer le serveur MCP
La première étape pour créer le serveur, c’est de configurer un nouveau projet. On commence par créer un nouveau dossier et initialiser un projet Bun
```bash theme={null}
> mkdir postgres-mcp-server
> Bun init
```
À partir d’ici, on va sélectionner le projet `Blank`. Une fois notre boilerplate en place, on doit installer les dépendances nécessaires. `zod` est requis pour définir des schémas d’E/S dans le SDK MCP
```bash theme={null}
bun add postgres @modelcontextprotocol/sdk zod
```
À partir d’ici, on va aller sur les dépôts de chacune des bibliothèques et récupérer le lien vers le contenu brut de leurs README respectifs. On s’en servira comme contexte pour construire le serveur
* `postgres`
* Repo: [https://github.com/porsager/postgres](https://github.com/porsager/postgres),
* README: [https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md](https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md)
* `@modelcontextprotocol/sdk`:
* Repo: [https://github.com/modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)
* README: [https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md](https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md)
Maintenant, on va définir le comportement attendu du serveur. Pour ça, on va créer un `spec.md` et décrire les objectifs de haut niveau
```markdown theme={null}
# Spécifications
- Autoriser la définition de DATABASE_URL via la configuration d’environnement MCP
- Interroger les données Postgres via l’outil
- Par défaut, en lecture seule
- Autoriser les opérations d’écriture en définissant la variable d’environnement `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Accéder aux tables comme des `resources`
- Utiliser Zod pour les définitions de schémas
```
Comme tu peux le voir, c’est une spec assez légère. N’hésite pas à ajouter des détails supplémentaires si besoin. Avec les liens du README, on construira le prompt final.
```markdown theme={null}
Lis ce qui suit et suis @spec.md pour comprendre ce qu’on veut. Toutes les dépendances nécessaires sont installées
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
```
Avec ces trois composants en place (la spécification, la doc du SDK MCP et la doc de la bibliothèque Postgres), on peut utiliser Cursor pour générer l’ossature de l’implémentation du serveur. Cursor va nous aider à assembler les pièces en générant le code qui connecte le SDK MCP à Postgres.
Après quelques aller-retours dans les prompts, on a maintenant une première version du serveur MCP qui tourne. Pour l’essayer, on peut utiliser le [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector)
```bash theme={null}
npx @modelcontextprotocol/inspector bun run index.ts
```
## Tester le serveur MCP
Une fois la première implémentation terminée, on peut la tester avec MCP Inspector. L’inspecteur permet de voir ce que le serveur expose et de vérifier que les outils et les ressources se comportent comme prévu. Il faut confirmer que les requêtes peuvent être exécutées et que les informations de schéma sont renvoyées correctement.
Quand tout semble correct, on peut connecter le serveur à Cursor et le tester dans un environnement réel. À ce stade, Cursor pourra utiliser le serveur MCP Postgres comme s’il s’agissait d’une fonctionnalité intégrée, ce qui nous permettra d’interroger et d’inspecter la base de données directement.
## Prochaines étapes
Exécuter le serveur MCP localement via stdio est un excellent point de départ, mais les équipes ont souvent besoin d’un accès partagé à la même base de données via leur serveur MCP. Dans ces cas, déployer le serveur MCP comme service HTTP centralisé devient nécessaire.
Un serveur MCP déployé offre plusieurs avantages par rapport aux instances stdio individuelles :
* **Accès partagé à la base de données :** plusieurs membres de l’équipe peuvent interroger la même instance de base de données via Cursor
* **Configuration centralisée :** les mises à jour de schéma et les modifications d’autorisations sont gérées en un seul endroit
* **Sécurité renforcée :** authentification adaptée, limitation de débit et contrôles d’accès peuvent être mis en place
* **Observabilité :** les schémas d’utilisation et les métriques de performance peuvent être suivis à l’échelle de l’équipe
Pour y parvenir, tu passerais du transport stdio à HTTP.
On ne couvrira pas toute la configuration, mais voici une bonne consigne de départ que tu peux donner à Cursor
```
Sur la base du serveur MCP existant, crée un nouveau fichier qui implémente le protocole HTTP.
Déplace la logique partagée dans mcp-core, et nomme chaque implémentation de transport explicitement (mcp-server-stdio, mcp-server-http)
@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
```
Les résultats finaux sont disponibles ici : [pg-mcp-server](https://github.com/ericzakariasson/pg-mcp-server)
```mermaid theme={null}
graph LR
subgraph Team_Network_or_Cloud["VPC"]
SVC["Serveur MCP (transport HTTP)"] <--> DB[(BD PostgreSQL)]
end
Dev1["Développeur 1 sur Cursor"] -->|HTTP| SVC
Dev2["Développeur 2 sur Cursor"] -->|HTTP| SVC
Dev3["Développeur 3 sur Cursor"] -->|HTTP| SVC
subgraph SVC_Internals["Internes"]
direction TB
T1["Auth et ACL"]
T2["Limitation de taux et journalisation"]
T3["Outil : query"]
T4["Ressource : table_schemas"]
T5["Prompts"]
T1 --> T2 --> T3
T3 --> T4
T3 --> T5
end
SVC --> SVC_Internals
class SVC svc
class DB db
class T1,T2,T3,T4,T5 internals
class Dev1,Dev2,Dev3 dev
```
# Développement web
Source: https://docs.cursor.com/fr/guides/tutorials/web-development
Comment configurer Cursor pour le développement web
export const McpInstallButtonPrimary = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
Le développement web implique des itérations rapides et des boucles de feedback rapprochées entre Cursor et des outils externes comme Figma ou le navigateur. Chez Cursor, on a identifié des workflows qui resserrent cette boucle. Une bonne définition des tâches, la réutilisation des composants et l’utilisation de design systems permettent de rester rapide et cohérent.
Ce guide explique comment configurer Cursor pour le développement web et resserrer la boucle de feedback.
```mermaid theme={null}
graph LR
A[Projet] --> B[Conception]
B --> C[Code]
C -- Test --> D[Vérification]
D -- Retours --> C
```
# Commence à orchestrer dans Cursor
**Chat** est top pour amorcer des changements. Une fois les éléments majeurs en place, passer à **Inline Edit** et **Tab** t’aide à rester dans le flow.
Après avoir configuré Cursor, tu pourras orchestrer des workflows avec différents outils. Ci-dessous, une démo de ce qui est possible : un jeu Snake créé en combinant Linear, Figma et des outils de navigateur. Même si les projets réels sont généralement plus complexes, cet exemple illustre le potentiel de ces workflows intégrés.
# Connecte tes outils de gestion de projet
Tu peux intégrer Cursor à ton logiciel de gestion de projet existant à l’aide de différents outils. Dans ce guide, on va voir comment intégrer Linear avec son serveur MCP.
### Installation
Ou ajoute manuellement le serveur MCP de Linear dans `mcp.json` :
```jsx theme={null}
{
"mcpServers": {
"Linear": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.linear.app/sse"
]
}
}
}
```
Then:
1. Assure-toi d’activer Linear dans les paramètres MCP
2. Le navigateur web s’ouvrira et tu seras invité·e à autoriser Linear
En raison de l’état actuel de MCP, la configuration peut nécessiter plusieurs tentatives.
Si l’intégration ne fonctionne pas, essaie de « Reload » le serveur depuis les paramètres
de Cursor.
### Utiliser Linear dans Cursor
Les serveurs MCP de Linear exposent différents outils que Cursor peut utiliser pour lire et gérer les tickets. Va dans les paramètres MCP et repère le serveur Linear pour voir la liste de tous les outils. Pour vérifier, essaie cette invite dans Chat :
```jsx theme={null}
liste toutes les issues liées à ce projet
```
Ça devrait renvoyer une liste de tickets si l’intégration est correctement configurée.
# Importer tes designs Figma
Les designs et maquettes sont au cœur du développement web. Avec le serveur MCP officiel pour Figma, tu peux accéder directement aux fichiers de design et travailler dessus dans Cursor. Pour commencer, suis les instructions de configuration sur [Figma Dev Mode MCP Server](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
### Installation
Tu peux cliquer sur le bouton ci-dessous pour installer le serveur MCP.
Ou ajoute-le manuellement à ton `mcp.json` :
```jsx theme={null}
{
"mcpServers": {
"Figma": {
"url": "http://127.0.0.1:3845/sse"
}
}
}
```
### Utilisation
Le serveur met à disposition plusieurs outils que tu peux utiliser dans tes prompts. Par exemple, essaie de demander les designs de la sélection en cours dans Figma. En savoir plus dans la [documentation](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
# Garde ton scaffolding de code cohérent
Tu as probablement déjà du code, un design system ou des conventions établies que tu veux réutiliser. Quand tu bosses avec des modèles, c’est utile de t’appuyer sur les patterns déjà présents dans ta codebase, comme des menus déroulants ou d’autres composants courants.
En bossant nous-mêmes sur une grosse codebase web, on a constaté que le code déclaratif marche particulièrement bien, surtout pour React et JSX.
Si t’as un design system, tu peux aider l’agent à le découvrir en lui fournissant une règle. Voici un fichier `ui-components.mdc` où on essaie de faire respecter la réutilisation des composants quand c’est possible :
```mdc components.mdc theme={null}
---
description: Implémenter les designs et construire l’UI
---
- réutilise les composants d’UI existants de `/src/components/ui`. ce sont les primitives sur lesquelles on peut s’appuyer
- crée de nouveaux composants en orchestrant des composants d’UI si tu n’en trouves aucun qui résout le problème
- demande à l’humain comment il veut procéder lorsqu’il manque des composants et des designs
```
Au fur et à mesure que ta bibliothèque de composants s’étoffe, ajoute de nouvelles règles en conséquence. Quand elles deviennent trop nombreuses, pense à les répartir en catégories plus spécifiques, par exemple « à appliquer uniquement lors de la gestion des saisies utilisateur ».
# Donner à Cursor l’accès au navigateur
Pour étendre les capacités de Cursor, tu peux configurer le serveur MCP de Browser Tools, qui donne accès aux journaux de console et aux requêtes réseau. Une fois configuré, tu peux valider tes modifications en surveillant la sortie de la console et l’activité réseau. Cette configuration aide à s’assurer que ton implémentation correspond à ton intention. Suis les instructions ici pour configurer le serveur MCP : [https://browsertools.agentdesk.ai/installation](https://browsertools.agentdesk.ai/installation)
On travaille à rendre ça plus simple à intégrer nativement dans Cursor.
# Points clés
* Des boucles de feedback rapides sont essentielles en développement web. Utilise Cursor avec des outils comme Figma, Linear et le navigateur pour avancer vite et rester dans le flow.
* Les serveurs MCP te permettent d’intégrer des systèmes externes directement dans Cursor, réduisant le switch de contexte et améliorant l’exécution des tâches.
* Réutiliser des composants et des design systems aide le modèle à produire un code et des résultats plus propres et plus cohérents.
* Des tâches claires et bien cadrées donnent de meilleurs résultats. Sois intentionnel dans la façon dont tu rédiges tes prompts et ce que tu demandes.
* Si tu n’obtiens pas de bons résultats, essaie d’ajuster :
* **Instructions :** Utilise des règles, des prompts, et donne accès à plus de contexte, p. ex. avec des serveurs MCP.
* **Systèmes :** Des patterns, des abstractions et de la clarté facilitent la compréhension du modèle, son aide et un fonctionnement plus autonome.
* Tu peux étendre le contexte du modèle en incluant des infos d’exécution comme des logs de console, des requêtes réseau et des données d’éléments d’UI.
* Tout n’a pas besoin d’être automatisé. Si ton système devient trop complexe, reviens à des modifications plus chirurgicales avec Tab et Inline Edit.
* Cursor est le plus puissant quand c’est un copilote, pas un autopilote. Utilise-le pour améliorer — pas remplacer — ta propre prise de décision.
# Travailler avec le contexte
Source: https://docs.cursor.com/fr/guides/working-with-context
Comment travailler avec le contexte dans Cursor
D’abord, c’est quoi une fenêtre de contexte ? Et quel rapport avec le fait de coder efficacement avec Cursor ?
Pour prendre un peu de recul, un large language model (LLM) est un modèle d’IA entraîné à prédire et générer du texte en apprenant des motifs à partir d’énormes jeux de données. Il alimente des outils comme Cursor en comprenant ce que tu saisis et en suggérant du code ou du texte en fonction de ce qu’il a déjà vu.
Les tokens sont les entrées et sorties de ces modèles. Ce sont des morceaux de texte, souvent des fragments de mots, qu’un LLM traite un par un. Les modèles ne lisent pas des phrases entières d’un coup ; ils prédisent le token suivant à partir de ceux qui le précèdent.
Pour voir comment du texte est tokenisé, tu peux utiliser un tokenizer comme [celui-ci](https://tiktokenizer.vercel.app/).
# C’est quoi le contexte ?
Quand on génère une suggestion de code dans Cursor, le « contexte » désigne les informations fournies au modèle (sous forme de « jetons d’entrée ») que le modèle utilise ensuite pour prédire la suite (sous forme de « jetons de sortie »).
Il existe deux types de contexte :
1. **Contexte d’intention**: ce que tu veux obtenir du modèle. Par exemple, un system prompt sert généralement d’instructions de haut niveau sur la façon dont tu veux que le modèle se comporte. La plupart du « prompting » dans Cursor relève du contexte d’intention. « Passe ce bouton du bleu au vert » est un exemple d’intention explicite ; c’est prescriptif.
2. **Contexte d’état**: l’état du monde à l’instant T. Fournir à Cursor des messages d’erreur, des logs de console, des images ou des extraits de code sont des exemples de contexte lié à l’état. C’est descriptif, pas prescriptif.
Ensemble, ces deux types de contexte fonctionnent de concert en décrivant l’état actuel et l’état futur souhaité, ce qui permet à Cursor de proposer des suggestions de code pertinentes.
```mermaid theme={null}
flowchart LR
A["Intention (ce que tu veux)"] --> C[Modèle]
B["État (ce qui est vrai)"] --> C
C -- Prédire --> D["Action (ce qu’il fait)"]
```
# Fournir du contexte dans Cursor
Plus tu fournis de contexte pertinent à un modèle, plus il sera utile. Si le contexte donné dans Cursor est insuffisant, le modèle va tenter de résoudre le problème sans les infos nécessaires. Ça mène généralement à :
1. Des hallucinations où le modèle essaie de faire du pattern matching (alors qu’il n’y a pas de pattern), entraînant des résultats inattendus. Ça peut arriver souvent avec des modèles comme `claude-3.5-sonnet` quand ils n’ont pas assez de contexte.
2. L’Agent qui cherche à réunir le contexte par lui-même en explorant la codebase, en lisant des fichiers et en appelant des outils. Un modèle avec de fortes capacités de raisonnement (comme `claude-3.7-sonnet`) peut aller assez loin avec cette stratégie, et fournir le bon contexte initial va en déterminer la trajectoire.
La bonne nouvelle, c’est que Cursor est conçu avec la conscience du contexte au cœur et vise à nécessiter un minimum d’intervention de ta part. Cursor récupère automatiquement les parties de ta codebase que le modèle estime pertinentes, comme le fichier en cours, des patterns sémantiquement similaires dans d’autres fichiers, et d’autres infos de ta session.
Cependant, il y a énormément de contexte possible à exploiter, donc préciser manuellement le contexte que tu sais pertinent pour la tâche est une bonne façon d’orienter les modèles dans la bonne direction.
## Symbole @
La façon la plus simple de fournir un contexte explicite, c’est d’utiliser le symbole @. C’est idéal quand tu sais précisément quel fichier, dossier, site web ou autre élément de contexte tu veux inclure. Plus tu es précis, mieux c’est. Voici comment affiner le contexte de manière plus ciblée :
| Symbole | Exemple | Cas d’usage | Inconvénient |
| --------- | -------------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `@code` | `@LRUCachedFunction` | Tu sais quelle fonction, constante ou quel symbole est pertinent pour la sortie générée | Nécessite une bonne connaissance de la base de code |
| `@file` | `cache.ts` | Tu sais quel fichier doit être lu ou modifié, mais pas exactement où dans le fichier | Peut inclure beaucoup de contexte non pertinent pour la tâche selon la taille du fichier |
| `@folder` | `utils/` | Tous ou la majorité des fichiers d’un dossier sont pertinents | Peut inclure beaucoup de contexte non pertinent pour la tâche |
## Règles
Pense aux règles comme à une mémoire à long terme à laquelle toi ou les autres membres de ton équipe pouvez accéder. Capturer le contexte spécifique à ton domaine — workflows, formatage et autres conventions — est un excellent point de départ pour rédiger des règles.
Tu peux aussi générer des règles à partir de conversations existantes avec `/Generate Cursor Rules`. Si tu as eu une longue conversation en aller-retour avec beaucoup de prompts, il y a probablement des directives utiles ou des règles générales que tu voudras réutiliser plus tard.
## MCP
Le [Model Context Protocol](https://modelcontextprotocol.io/introduction) est une couche d’extensibilité qui permet à Cursor d’exécuter des actions et d’ingérer du contexte externe.
Selon ta config de développement, tu peux t’appuyer sur différents types de serveurs, mais deux catégories qu’on trouve particulièrement utiles sont :
* **Documentation interne** : p. ex. Notion, Confluence, Google Docs
* **Gestion de projet** : p. ex. Linear, Jira
Si tu as déjà des outils pour accéder au contexte et exécuter des actions via une API, tu peux créer un serveur MCP pour ça. Voici un court guide pour construire des [serveurs MCP](https://modelcontextprotocol.io/tutorials/building-mcp-with-llms).
## Auto-collecte de contexte
Un modèle d’utilisation puissant que beaucoup d’utilisateurs adoptent consiste à laisser l’Agent écrire de petits outils temporaires qu’il peut ensuite exécuter pour rassembler plus de contexte. C’est particulièrement efficace dans des workflows avec humain dans la boucle, où tu passes en revue le code avant son exécution.
Par exemple, ajouter des instructions de débogage à ton code, l’exécuter, puis laisser le modèle inspecter la sortie lui donne accès à un contexte dynamique qu’il ne pourrait pas déduire de manière statique.
En Python, tu peux faire ça en demandant à l’Agent de :
1. Ajouter des print("debugging: ...") aux endroits pertinents du code
2. Exécuter le code ou les tests via le terminal
L’Agent lira la sortie du terminal et décidera de la suite. L’idée centrale est de donner à l’Agent accès au comportement réel à l’exécution, pas seulement au code statique.
# Points clés
* Le contexte est la base d’un codage IA efficace. Il se compose de l’intention (ce que tu veux) et de l’état (ce qui existe). Fournir les deux aide Cursor à faire des prédictions précises.
* Utilise un contexte chirurgical avec les symboles @ (@code, @file, @folder) pour guider Cursor avec précision, plutôt que de te reposer uniquement sur la collecte automatique de contexte.
* Capture les connaissances récurrentes dans des règles pour les réutiliser à l’échelle de l’équipe, et étends les capacités de Cursor avec le Model Context Protocol pour connecter des systèmes externes.
* Un contexte insuffisant mène à des hallucinations ou à de l’inefficacité, tandis qu’un excès de contexte non pertinent dilue le signal. Trouve le bon équilibre pour des résultats optimaux.
# Modification en ligne
Source: https://docs.cursor.com/fr/inline-edit/overview
Modifie et pose des questions avec la modification en ligne (Cmd/Ctrl+K) dans Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Inline Edit te permet de modifier du code ou de poser des questions directement dans ton éditeur avec Cmd+K. Ça ouvre un champ de saisie où le code que tu as sélectionné et tes instructions forment ta requête.
## Modes
### Modifier la sélection
Avec du code sélectionné, Cmd+K modifie ce code précis selon tes instructions.
Sans sélection, Cursor génère du nouveau code à la position de ton curseur. L’IA inclut le code environnant pertinent pour le contexte. Par exemple, déclencher sur un nom de fonction inclut toute la fonction.
### Question rapide
Appuie sur Opt+Return dans l’éditeur inline pour poser des questions sur le code sélectionné.
Après avoir obtenu une réponse, tape « do it » ou une formulation similaire pour convertir la suggestion en code. Ça te permet d’explorer des idées avant de les implémenter.
### Modifications du fichier complet
Pour des changements à l’échelle du fichier, utilise Cmd+Shift+Return. Ce mode permet des modifications globales tout en gardant le contrôle.
### Envoyer au chat
Pour des modifications multi-fichiers ou des fonctionnalités avancées, utilise Cmd+L pour envoyer le code sélectionné au [Chat](/fr/agent/modes#agent). Ça offre l’édition multi-fichiers, des explications détaillées et des capacités d’IA avancées.
## Instructions de suivi
Après chaque modification, affine le résultat en ajoutant des instructions, puis appuie sur Return. L’IA met à jour les changements en fonction de ton retour.
## Contexte par défaut
Inline Edit inclut un contexte par défaut pour améliorer la génération de code, en plus de tous les [symboles @](/fr/context/@-symbols/@-files) que tu ajoutes.
Cela inclut des fichiers connexes, du code récemment consulté et des informations pertinentes. Cursor privilégie le contexte le plus pertinent pour de meilleurs résultats.
# Terminal
Source: https://docs.cursor.com/fr/inline-edit/terminal
Génère des commandes pour le terminal avec Cmd/Ctrl+K
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Dans le terminal de Cursor, appuie sur Cmd+K pour ouvrir une barre de commande en bas.
Décris l’action que tu veux effectuer et Inline Edit génère la commande.
Dans le terminal, Inline Edit utilise ton historique récent, tes instructions et le contenu de ta demande comme contexte.
# Git
Source: https://docs.cursor.com/fr/integrations/git
Fonctionnalités Git propulsées par l’IA, notamment la génération de messages de commit et la résolution de conflits de fusion
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor propose des fonctionnalités Git boostées par l’IA pour fluidifier ton workflow, comme la génération automatique de messages de commit et la résolution intelligente des conflits de merge.
## Message de commit IA
Cursor génère des messages de commit à partir des modifications indexées.
1. Indexe les fichiers à committer
2. Ouvre l’onglet Git dans la barre latérale
3. Clique sur l’icône scintillante (✨) à côté du champ du message de commit
Les messages générés s’appuient sur les modifications indexées et l’historique Git du dépôt. Si tu utilises des conventions comme [Conventional Commits](https://www.conventionalcommits.org/), les messages suivent le même format.
### Ajouter un raccourci
Pour l’associer à un raccourci clavier :
1. Va dans Keyboard Shortcuts (Cmd+R Cmd+S ou Cmd+Shift+P puis recherche "Open Keyboard Shortcuts (JSON)")
2. Ajoute cette association pour Cmd+M :
```json theme={null}
{
"key": "cmd+m",
"command": "cursor.generateGitCommitMessage"
}
```
3. Enregistre
Tu ne peux pas personnaliser la génération des messages de commit. Cursor s’adapte à ton style de commit actuel.
## Résoudre les conflits avec l’IA
Quand des conflits de fusion surviennent, Cursor Agent peut aider à les résoudre en comprenant les deux côtés du conflit et en proposant une résolution.
### Comment l’utiliser
1. Quand un conflit de fusion se produit, tu verras les marqueurs de conflit dans ton fichier
2. Clique sur le bouton **Resolve in Chat** qui apparaît dans l’interface de résolution de conflit
3. L’Agent analysera les deux versions et proposera une résolution
4. Passe en revue les modifications proposées et applique-les
# GitHub
Source: https://docs.cursor.com/fr/integrations/github
Application GitHub officielle de Cursor pour les agents en arrière-plan
[Background Agents](/fr/background-agent) et [Bugbot](/fr/bugbot) requièrent l’application GitHub de Cursor pour cloner des dépôts et pousser des modifications.
## Installation
1. Va sur [Intégrations dans le tableau de bord](https://cursor.com/dashboard?tab=integrations)
2. Clique sur **Connect** à côté de GitHub
3. Choisis le dépôt : **All repositories** ou **Selected repositories**
Pour déconnecter ton compte GitHub, retourne sur le tableau de bord des intégrations et clique sur **Disconnect Account**.
## Utiliser Agent dans GitHub
L’intégration GitHub permet d’exécuter des workflows d’agent en arrière‑plan directement depuis les pull requests et les issues. Tu peux déclencher un agent pour lire le contexte, appliquer des correctifs et pousser des commits en commentant `@cursor [prompt]` sur n’importe quel PR ou issue.
Si tu as [Bugbot](/fr/bugbot) activé, tu peux commenter `@cursor fix` pour lire la correction suggérée par Bugbot et déclencher un agent en arrière‑plan pour traiter le problème.
## Permissions
L’appli GitHub a besoin d’autorisations spécifiques pour fonctionner avec les agents en arrière-plan :
| Permission | Purpose |
| ------------------------- | --------------------------------------------------------------------------- |
| **Repository access** | Cloner ton code et créer des branches de travail |
| **Pull requests** | Créer des PR avec les changements des agents pour que tu puisses les relire |
| **Issues** | Suivre les bugs et les tâches que les agents découvrent ou corrigent |
| **Checks and statuses** | Rendre compte de la qualité du code et des résultats de tests |
| **Actions and workflows** | Surveiller les pipelines CI/CD et l’état des déploiements |
Toutes les autorisations respectent le principe du moindre privilège nécessaire au fonctionnement des agents en arrière-plan.
## Configuration de la liste d’autorisation d’IP
Si ton organisation utilise la fonctionnalité de liste d’autorisation d’IP de GitHub pour restreindre l’accès à tes dépôts, tu dois d’abord contacter le support pour activer la fonctionnalité de liste d’autorisation d’IP pour ton équipe.
### Contacter le support
Avant de configurer des listes d’autorisation d’IP, contacte [hi@cursor.com](mailto:hi@cursor.com) pour activer cette fonctionnalité pour ton équipe. C’est requis pour les deux méthodes de configuration ci-dessous.
### Activer la configuration de la liste d’autorisation d’IP pour les applications GitHub installées (recommandé)
L’application GitHub Cursor a déjà la liste d’IP préconfigurée. Tu peux activer la liste d’autorisation pour les applications installées afin d’hériter automatiquement de cette liste. C’est l’approche **recommandée**, car elle nous permet de mettre à jour la liste et ton organisation reçoit les mises à jour automatiquement.
Pour l’activer :
1. Va dans les paramètres de sécurité de ton organisation
2. Accède aux paramètres de la liste d’autorisation d’IP
3. Coche **« Allow access by GitHub Apps »**
Pour des instructions détaillées, consulte [la documentation de GitHub](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#allowing-access-by-github-apps).
### Ajouter des IP directement à ta liste d’autorisation
Si ton organisation utilise des listes d’autorisation définies par un IdP dans GitHub ou ne peut pas utiliser la liste d’autorisation préconfigurée, tu peux ajouter les adresses IP manuellement :
```
184.73.225.134
3.209.66.12
52.44.113.131
```
La liste d’adresses IP peut occasionnellement changer. Les équipes utilisant des listes d’autorisation d’IP seront prévenues à l’avance avant tout ajout ou suppression d’adresses IP.
## Dépannage
* Installe l'app GitHub avec accès au dépôt
* Vérifie les permissions du dépôt pour les dépôts privés
* Vérifie les permissions de ton compte GitHub
* Accorde à l'app l'accès en écriture aux pull requests
* Vérifie les règles de protection de branches
* Réinstalle si l'installation de l'app a expiré
* Vérifie si elle est installée au niveau de l'organisation
* Réinstalle depuis [github.com/apps/cursor](https://github.com/apps/cursor)
* Contacte le support si l'installation est corrompue
# Linear
Source: https://docs.cursor.com/fr/integrations/linear
Utilise des Background Agents depuis Linear
Utilise les [Background Agents](/fr/background-agent) directement depuis Linear en déléguant des tickets à Cursor ou en mentionnant `@Cursor` dans les commentaires.
## Pour commencer
### Installation
Tu dois être admin Cursor pour connecter l’intégration Linear. D’autres réglages d’équipe sont disponibles pour les membres non admins.
1. Va sur [Cursor integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Clique sur *Connect* à côté de Linear
3. Connecte ton espace de travail Linear et sélectionne l’équipe
4. Clique sur *Authorize*
5. Termine la configuration restante de Background Agent dans Cursor :
* Connecte GitHub et sélectionne le dépôt par défaut
* Active la tarification à l’usage
* Confirme les paramètres de confidentialité
### Association de compte
La première utilisation déclenche l’association de compte entre Cursor et Linear. Connexion à GitHub requise pour créer des PR.
## Comment l’utiliser
Délègue des tickets à Cursor ou mentionne `@Cursor` dans les commentaires. Cursor analyse les tickets et filtre automatiquement les tâches non liées au développement.
### Déléguer des tickets
1. Ouvre le ticket Linear
2. Clique sur le champ d’assignation
3. Sélectionne « Cursor »
### Mentionner Cursor
Mentionne `@Cursor` dans un commentaire pour créer un nouvel agent ou fournir des instructions supplémentaires, par exemple : `@Cursor corrige le bug d’authentification décrit ci-dessus`.
## Flux de travail
Les Background Agents affichent leur statut en temps réel dans Linear et créent des PR automatiquement une fois terminés. Suis l’avancement dans le [dashboard Cursor](https://www.cursor.com/dashboard?tab=background-agents).
### Instructions de suivi
Tu peux répondre dans la session de l’agent et ton message sera envoyé comme suivi à l’agent. Mentionne simplement `@Cursor` dans un commentaire Linear pour donner des indications supplémentaires à un Background Agent en cours d’exécution.
## Configuration
Configure les paramètres de Background Agents depuis [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
| Paramètre | Emplacement | Description |
| :-------------------- | :--------------- | :--------------------------------------------------------------------------- |
| **Dépôt par défaut** | Cursor Dashboard | Dépôt principal lorsqu’aucun dépôt de projet n’est configuré |
| **Modèle par défaut** | Cursor Dashboard | Modèle d’IA pour les Background Agents |
| **Branche de base** | Cursor Dashboard | Branche à partir de laquelle créer les PR (généralement `main` ou `develop`) |
### Options de configuration
Tu peux configurer le comportement de Background Agents via plusieurs méthodes :
**Description de l’issue ou commentaires** : utilise la syntaxe `[key=value]`, par exemple :
* `@cursor please fix [repo=anysphere/everysphere]`
* `@cursor implement feature [model=claude-3.5-sonnet] [branch=feature-branch]`
**Labels d’issue** : utilise une structure parent-enfant où le label parent est la clé de configuration et le label enfant est la valeur.
**Labels de projet** : même structure parent-enfant que les labels d’issue, appliquée au niveau du projet.
Clés de configuration prises en charge :
* `repo` : spécifie le dépôt cible (p. ex. `owner/repository`)
* `branch` : spécifie la branche de base pour la création de PR
* `model` : spécifie le modèle d’IA à utiliser
### Sélection du dépôt
Cursor détermine sur quel dépôt travailler selon cet ordre de priorité :
1. **Description/commentaires de l’issue** : syntaxe `[repo=owner/repository]` dans le texte de l’issue ou les commentaires
2. **Labels d’issue** : labels de dépôt attachés à l’issue Linear concernée
3. **Labels de projet** : labels de dépôt attachés au projet Linear
4. **Dépôt par défaut** : dépôt spécifié dans les paramètres du dashboard Cursor
#### Configuration des labels de dépôt
Pour créer des labels de dépôt dans Linear :
1. Va dans **Settings** de ton workspace Linear
2. Clique sur **Labels**
3. Clique sur **New group**
4. Nomme le groupe "repo" (insensible à la casse — doit être exactement "repo", pas "Repository" ni d’autres variantes)
5. Dans ce groupe, crée des labels pour chaque dépôt au format `owner/repo`
Ces labels peuvent ensuite être assignés aux issues ou aux projets pour indiquer sur quel dépôt les Background Agents doivent travailler.
{/* ### Getting help
Check [agent activity](https://www.cursor.com/dashboard?tab=background-agents) and include request IDs when contacting support.
## Feedback
Share feedback through Linear comments or your Cursor dashboard support channels. */}
# Slack
Source: https://docs.cursor.com/fr/integrations/slack
Utiliser les Background Agents depuis Slack
export const SlackThread = ({messages = []}) => {
const MessageWithMentions = ({text}) => {
const parts = text.split(/(@\w+)/g);
return <>
{parts.map((part, index) => {
if (part.startsWith('@')) {
return
{part}
;
}
return {part};
})}
>;
};
return
;
};
Avec l’intégration de Cursor pour Slack, tu peux utiliser les [Background Agents](/fr/background-agent) pour bosser sur tes tâches directement depuis Slack en mentionnant avec un prompt.
## Bien démarrer
### Installation
1. Va sur [Cursor integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Clique sur *Connect* à côté de Slack ou ouvre la [page d’installation](https://cursor.com/api/install-slack-app) depuis ici
3. On te demandera d’installer l’app Cursor pour Slack dans ton espace de travail.
4. Après l’installation dans Slack, tu seras redirigé vers Cursor pour finaliser la configuration
1. Connecte GitHub (si ce n’est pas déjà fait) et choisis un dépôt par défaut
2. Active la tarification à l’usage
3. Confirme les paramètres de confidentialité
5. Commence à utiliser les Background Agents dans Slack en mentionnant
## Comment utiliser
Mentionne et donne ton prompt. Ça couvre la plupart des cas d’usage, mais tu peux aussi utiliser les commandes ci-dessous pour personnaliser ton agent.
Par exemple, mentionne directement dans la conversation, ou utilise des commandes spécifiques comme pour cibler un dépôt particulier.
### Commandes
Lance pour obtenir la liste de commandes à jour.
| Commande | Description |
| :---------------------------------------------------------- | :----------------------------------------------------------------------------------------------------- |
| | Démarre un Background Agent. Dans les fils avec des agents existants, ajoute des instructions de suivi |
| | Configure les paramètres par défaut et le dépôt par défaut du canal |
| | Utilise des options avancées : `branch`, `model`, `repo` |
| | Force la création d’un nouvel agent dans un fil |
| | Affiche tes agents en cours d’exécution |
#### Options
Personnalise le comportement du Background Agent avec ces options :
| Option | Description | Exemple |
| :------- | :--------------------------------------------- | :---------------- |
| `branch` | Spécifie la branche de base | `branch=main` |
| `model` | Choisis le modèle d’IA | `model=o3` |
| `repo` | Cible un dépôt spécifique | `repo=owner/repo` |
| `autopr` | Active/désactive la création automatique de PR | `autopr=false` |
##### Formats de syntaxe
Utilise les options de plusieurs manières :
1. Format entre crochets
2. Format inline
##### Priorité des options
Quand tu combines des options :
* Les valeurs explicites remplacent les valeurs par défaut
* Les valeurs plus tardives remplacent les précédentes en cas de duplication
* Les options inline priment sur les valeurs par défaut du modal de paramètres
Le bot analyse les options où qu’elles se trouvent dans le message, ce qui permet d’écrire des commandes naturellement.
#### Utiliser le contexte du fil
Les Background Agents comprennent et utilisent le contexte des discussions existantes du fil. Pratique quand ton équipe discute d’un problème et que tu veux que l’agent implémente la solution en se basant sur cette conversation.
Les Background Agents lisent l’intégralité du fil pour le contexte lors de l’invocation
et comprennent puis implémentent des solutions en se basant sur la discussion de l’équipe.
#### Quand utiliser les commandes de forçage
Quand ai-je besoin de ?
Dans les fils avec des agents existants, ajoute des instructions de suivi (ne fonctionne que si tu es propriétaire de l’agent). Utilise pour lancer un agent distinct.
Quand ai-je besoin de Add follow-up (depuis le menu contextuel) ?
Utilise le menu contextuel (⋯) sur la réponse d’un agent pour ajouter des instructions de suivi. Pratique quand plusieurs agents existent dans un fil et que tu dois préciser lequel relancer.
### Mises à jour de statut et passation
Quand le Background Agent s’exécute, tu vois d’abord l’option Open in Cursor.
Quand Background Agent a fini, tu reçois une notif dans Slack et tu peux ouvrir la PR créée sur GitHub.
### Gérer les agents
Pour voir tous les agents en cours, lance .
Gère les Background Agents via le menu contextuel en cliquant sur les trois points (⋯) d’un message de l’agent.
Options disponibles :
* **Add follow-up**: Ajouter des instructions à un agent existant
* **Delete**: Arrêter et archiver le Background Agent
* **View request ID**: Afficher l’ID de requête unique pour le dépannage (à inclure quand tu contactes le support)
* **Give feedback**: Donner un feedback sur les performances de l’agent
## Configuration
Gère les paramètres par défaut et les options de confidentialité depuis [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
### Paramètres
#### Modèle par défaut
Utilisé quand aucun modèle n’est explicitement spécifié avec . Consulte les [paramètres](https://www.cursor.com/dashboard?tab=background-agents) pour les options disponibles.
#### Dépôt par défaut
Utilisé quand aucun dépôt n’est spécifié. Utilise ces formats :
* `https://github.com/org/repository`
* `org/repository`
Si tu fais référence à un dépôt inexistant, ça peut donner l’impression que tu n’as pas
accès. L’erreur s’affiche quand Background Agent ne parvient pas à démarrer.
#### Branche de base
Branche de départ pour Background Agent. Laisse vide pour utiliser la branche par défaut du dépôt (souvent `main`)
### Paramètres de canal
Configure des paramètres par défaut au niveau du canal avec . Ces paramètres sont définis par équipe et remplacent tes valeurs par défaut personnelles pour ce canal.
Particulièrement utile quand :
* Différents canaux travaillent sur différents dépôts
* Les équipes veulent des paramètres cohérents pour tous les membres
* Tu veux éviter de spécifier le dépôt dans chaque commande
Pour configurer les paramètres du canal :
1. Exécute dans le canal souhaité
2. Définit le dépôt par défaut pour ce canal
3. Tous les membres de l’équipe qui utilisent Background Agents dans ce canal utilisent ces valeurs par défaut
Les paramètres du canal priment sur les paramètres personnels mais peuvent être remplacés
par des options explicites comme{" "}
### Confidentialité
Les Background Agents prennent en charge le mode Confidentialité.
En savoir plus sur le [mode Confidentialité](https://www.cursor.com/privacy-overview) ou gère tes [paramètres de confidentialité](https://www.cursor.com/dashboard?tab=background-agents).
Le mode Confidentialité (héritage) n’est pas pris en charge. Les Background Agents nécessitent
un stockage temporaire du code pendant l’exécution.
#### Afficher le résumé de l’agent
Affiche les résumés d’agent et les images de diff. Peut contenir des chemins de fichiers ou des extraits de code. Peut être activé/désactivé.
#### Afficher le résumé de l’agent dans les canaux externes
Pour Slack Connect avec d’autres espaces de travail ou des canaux avec des membres externes comme des invités, choisis d’afficher les résumés d’agent dans les canaux externes.
## Permissions
Cursor demande ces permissions Slack pour que les Background Agents fonctionnent dans ton espace de travail :
| Permission | Description |
| :------------------ | :-------------------------------------------------------------------------------------------------------------- |
| `app_mentions:read` | Détecte les @mentions pour lancer les Background Agents et répondre aux demandes |
| `channels:history` | Lit les messages précédents dans les fils pour le contexte lors de l’ajout d’instructions de suivi |
| `channels:join` | Rejoint automatiquement les canaux publics lorsqu’il est invité ou sollicité |
| `channels:read` | Accède aux métadonnées des canaux (ID et noms) pour publier des réponses et des mises à jour |
| `chat:write` | Envoie des mises à jour de statut, des notifications d’achèvement et des liens de PR quand les agents ont fini |
| `files:read` | Télécharge les fichiers partagés (journaux, captures d’écran, extraits de code) pour un contexte supplémentaire |
| `files:write` | Met en ligne des résumés visuels des changements des agents pour une revue rapide |
| `groups:history` | Lit les messages précédents dans les canaux privés pour le contexte des conversations multi‑tours |
| `groups:read` | Accède aux métadonnées des canaux privés pour publier des réponses et maintenir le flux de conversation |
| `im:history` | Accède à l’historique des messages directs pour le contexte des conversations en continu |
| `im:read` | Lit les métadonnées des MD pour identifier les participants et maintenir le bon fil de discussion |
| `im:write` | Démarre des messages directs pour des notifications privées ou une communication individuelle |
| `mpim:history` | Accède à l’historique des MD de groupe pour des conversations multi‑participants |
| `mpim:read` | Lit les métadonnées des MD de groupe pour s’adresser aux participants et assurer une bonne livraison |
| `reactions:read` | Observe les réactions émoji pour les retours utilisateur et les signaux de statut |
| `reactions:write` | Ajoute des réactions émoji pour marquer le statut : ⏳ en cours, ✅ terminé, ❌ échec |
| `team:read` | Identifie les détails de l’espace de travail pour séparer les installations et appliquer les paramètres |
| `users:read` | Fait correspondre les utilisateurs Slack aux comptes Cursor pour les permissions et un accès sécurisé |
;
};
Cursor prend en charge tous les modèles de pointe pour le code proposés par tous les principaux fournisseurs.
## Tarification des modèles
Les [offres](/fr/account/pricing) de Cursor incluent une utilisation facturée aux tarifs des API de modèles. Par exemple, 20 \$ d'utilisation incluse dans l’offre Pro seront consommés selon le modèle que tu choisis et son prix.
Les limites d'utilisation s'affichent dans l’éditeur en fonction de ta consommation actuelle. Pour consulter l’ensemble des tarifs des API de modèles, vois la documentation des fournisseurs :
* [Tarifs OpenAI](https://openai.com/api/pricing/)
* [Tarifs Anthropic](https://www.anthropic.com/pricing#api)
* [Tarifs Google Gemini](https://ai.google.dev/gemini-api/docs/pricing)
* [Tarifs xAI](https://docs.x.ai/docs/models)
## Auto
Activer Auto permet à Cursor de choisir le modèle premium le mieux adapté à la tâche en cours et le plus fiable selon la demande actuelle. Cette fonctionnalité peut détecter une baisse de performance des réponses et basculer automatiquement de modèle pour y remédier.
## Fenêtres de contexte
Une [fenêtre de contexte](/fr/guides/working-with-context) est l’étendue maximale de tokens (texte et code) qu’un LLM peut prendre en compte en une seule fois, incluant à la fois le prompt d’entrée et la sortie générée par le modèle.
Chaque chat dans Cursor possède sa propre fenêtre de contexte. Plus une session inclut de prompts, de fichiers joints et de réponses, plus la fenêtre de contexte s’agrandit.
Découvre-en plus sur la [gestion du contexte](/fr/guides/working-with-context) dans Cursor.
## Mode Max
Normalement, Cursor utilise une fenêtre de contexte de 200 k tokens (\~15 000 lignes de code). Le mode Max étend cette fenêtre au maximum disponible pour quelques modèles. Ce sera un peu plus lent et plus coûteux. C’est particulièrement pertinent pour Gemini 2.5 Flash, Gemini 2.5 Pro, GPT‑4.1 et Grok 4, qui disposent de fenêtres de contexte supérieures à 200 k.
## FAQ
Les modèles sont hébergés sur une infrastructure située aux États‑Unis, par le fournisseur du modèle, un partenaire de confiance ou directement par Cursor.
Quand le mode Confidentialité est activé, ni Cursor ni les fournisseurs de modèles ne conservent tes données. Toutes les données sont supprimées après chaque requête. Pour plus de détails, consulte nos pages [Confidentialité](/fr/account/privacy), [Politique de confidentialité](https://cursor.com/privacy) et [Sécurité](https://cursor.com/security).
# Clés API
Source: https://docs.cursor.com/fr/settings/api-keys
Utilise ton propre fournisseur de LLM
Utilise tes propres clés API pour envoyer un nombre illimité de messages IA à tes frais. Une fois configuré, Cursor utilisera tes clés API pour appeler directement les fournisseurs de LLM.
Pour utiliser ta clé API, va dans `Cursor Settings` > `Models` et saisis tes clés API. Clique sur **Verify**. Une fois validée, ta clé API est activée.
Les clés API personnalisées ne fonctionnent qu’avec les modèles de chat standard. Les fonctionnalités qui nécessitent des modèles spécialisés (comme Tab Completion) continueront d’utiliser les modèles intégrés de Cursor.
## Fournisseurs pris en charge
* **OpenAI** - Uniquement des modèles de chat standard, sans raisonnement. Le sélecteur de modèles affichera les modèles OpenAI disponibles.
* **Anthropic** - Tous les modèles Claude disponibles via l’API Anthropic.
* **Google** - Modèles Gemini disponibles via l’API Google AI.
* **Azure OpenAI** - Modèles déployés dans ton instance Azure OpenAI Service.
* **AWS Bedrock** - Utilise des clés d’accès AWS, des clés secrètes ou des rôles IAM. Fonctionne avec les modèles disponibles dans ta configuration Bedrock.
Un ID externe unique est généré après validation de ton rôle IAM Bedrock, que tu peux ajouter à la stratégie d’approbation (trust policy) de ton rôle IAM pour renforcer la sécurité.
## FAQ
Ta clé API n'est pas stockée, mais elle est envoyée à notre serveur à chaque requête. Toutes les requêtes passent par notre backend pour l'assemblage final du prompt.
# Tab
Source: https://docs.cursor.com/fr/tab/overview
Autocomplétion avec modifications multilignes, suggestions interfichiers et complétions de code contextuelles
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Tab est un modèle Cursor spécialisé dans l’autocomplétion. Plus tu l’utilises, meilleur il devient, car tu transmets ton intention en acceptant les suggestions avec Tab ou en les rejetant avec Escape. Avec Tab, tu peux :
* Modifier plusieurs lignes à la fois
* Ajouter des imports quand ils manquent
* Naviguer dans un fichier et entre plusieurs fichiers pour des modifications coordonnées
* Obtenir des suggestions basées sur les changements récents, les erreurs du linter et les modifications acceptées
## Suggestions
Quand tu ajoutes du texte, les complétions apparaissent sous forme de texte fantôme semi-opaque. Quand tu modifies du code existant, elles s’affichent sous forme de popup de diff à droite de ta ligne actuelle.
Accepte les suggestions avec Tab, rejette-les avec Escape, ou accepte mot par mot avec Cmd+Arrow Right. Continue à taper ou appuie sur Escape pour masquer les suggestions.
### Sauts dans le fichier
Tab prédit ton prochain emplacement d’édition dans le fichier et suggère des sauts. Après avoir accepté une modification, appuie à nouveau sur Tab pour passer à l’emplacement suivant.
### Sauts entre fichiers
Tab prédit des modifications contextuelles à travers les fichiers. Une fenêtre portail apparaît en bas lorsqu’un saut inter-fichiers est suggéré.
### Auto-import
En TypeScript et Python, Tab ajoute automatiquement les instructions d’import quand elles manquent. Utilise une méthode d’un autre fichier et Tab suggère l’import. En l’acceptant, il est ajouté sans casser ton flow.
Si l’auto-import ne fonctionne pas :
* Assure-toi que ton projet dispose du bon serveur de langage ou des bonnes extensions
* Teste avec Cmd . pour vérifier si l’import apparaît dans les suggestions Quick Fix
### Tab dans Peek
Tab fonctionne dans les vues Peek *Go to Definition* et *Go to Type Definition*. Pratique pour modifier des signatures de fonctions et corriger les call sites.
Dans Vim, utilise-le avec `gd` pour aller aux définitions, modifier et résoudre les références en un seul flow.
### Acceptations partielles
Accepte un mot à la fois avec Cmd Right, ou configure ton raccourci via `editor.action.inlineSuggest.acceptNextWord`. Active-le dans : `Cursor Settings` → `Tab`.
## Paramètres
| Paramètre | Description |
| :--------------------------------------- | :-------------------------------------------------------------------------------------------------- |
| **Cursor Tab** | Suggestions contextuelles multi‑lignes autour de ton curseur, basées sur tes modifications récentes |
| **Acceptations partielles** | Accepter le mot suivant d’une suggestion via Cmd Right |
| **Suggestions pendant les commentaires** | Activer Tab à l’intérieur des blocs de commentaires |
| **Suggestions limitées aux espaces** | Autoriser les modifications n’affectant que le formatage |
| **Imports** | Activer l’auto‑import pour TypeScript |
| **Auto‑import pour Python (bêta)** | Activer l’auto‑import pour les projets Python |
### Activation/désactivation
Utilise la barre d’état (en bas à droite) pour :
* **Snooze** : désactiver temporairement Tab pendant une durée choisie
* **Désactiver globalement** : désactiver Tab pour tous les fichiers
* **Désactiver pour des extensions** : désactiver Tab pour certaines extensions de fichier (p. ex. Markdown ou JSON)
## FAQ
Désactive Tab dans les commentaires en allant dans `Cursor Settings` → `Tab Completion` et en décochant **Trigger in comments**.
Re-map l’acceptation et le rejet des suggestions sur n’importe quelle touche via `Accept Cursor Tab Suggestions` dans les paramètres `Keyboard Shortcuts`.
Cursor inclut une petite portion de code pertinent dans la fenêtre de contexte. Le contexte est chiffré et envoyé à notre backend. Le backend le déchiffre et lit le contexte en toute sécurité. Ensuite, le modèle Cursor Tab prédit une suggestion de code et la renvoie au client pour l’afficher dans l’éditeur.
# Développeurs
Source: https://docs.cursor.com/fr/tools/developers
Génère des liens d’installation pour les outils et les serveurs MCP
export const McpInstallLinkGenerator = () => {
const [config, setConfig] = useState("");
const [error, setError] = useState("");
const [showOverlay, setShowOverlay] = useState(null);
const [extractedServerName, setExtractedServerName] = useState("");
const debounceTimerRef = useRef(null);
useEffect(() => {
return () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
};
}, []);
const handleConfigChange = e => {
const configValue = e.target.value;
setConfig(configValue);
setError("");
setExtractedServerName("");
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
if (configValue.trim()) {
debounceTimerRef.current = setTimeout(() => {
validateConfigWithValue(configValue);
}, 500);
}
};
const handleBlur = () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
debounceTimerRef.current = null;
}
if (config.trim()) {
validateConfig();
}
};
const validateConfig = () => {
return validateConfigWithValue(config);
};
const validateConfigWithValue = configValue => {
try {
if (!configValue.trim()) {
setError("");
setExtractedServerName("");
return false;
}
const parsedConfig = JSON.parse(configValue);
if (typeof parsedConfig !== 'object' || parsedConfig === null) {
throw new Error("Config must be a JSON object");
}
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
if (!serverName) {
throw new Error("No server configuration found");
}
const serverConfig = configToUse[serverName];
if (typeof serverConfig !== 'object' || serverConfig === null) {
throw new Error("Server config must be an object");
}
if (!serverConfig.command && !serverConfig.url) {
throw new Error("Server config must have either 'command' or 'url' property");
}
if (serverConfig.command && typeof serverConfig.command !== 'string') {
throw new Error("'command' must be a string");
}
if (serverConfig.url && typeof serverConfig.url !== 'string') {
throw new Error("'url' must be a string");
}
if (serverConfig.args && !Array.isArray(serverConfig.args)) {
throw new Error("'args' must be an array");
}
if (serverConfig.env && (typeof serverConfig.env !== 'object' || serverConfig.env === null)) {
throw new Error("'env' must be an object");
}
setError("");
setExtractedServerName(serverName);
return true;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
setExtractedServerName("");
return false;
}
};
const INSTALL_BUTTON_IMAGE_URL = {
DARK: "https://cursor.com/deeplink/mcp-install-dark.svg",
LIGHT: "https://cursor.com/deeplink/mcp-install-light.svg"
};
const generateDeepLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
const protocol = window.location.hostname === 'localhost' ? 'cursor-dev' : 'cursor';
return `${protocol}://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(safeBase64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const generateWebLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
return `https://cursor.com/en/install-mcp?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(base64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const copyDeepLink = () => {
const link = generateDeepLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('link');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyWebLink = () => {
const link = generateWebLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('weblink');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyHtmlLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const htmlLink = ``;
navigator.clipboard.writeText(htmlLink);
setShowOverlay(theme.toLowerCase());
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyMarkdownLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const markdownLink = `[](${link})`;
navigator.clipboard.writeText(markdownLink);
setShowOverlay(`${theme.toLowerCase()}-md`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyJsxLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const jsxLink = ``;
navigator.clipboard.writeText(jsxLink);
setShowOverlay(`${theme.toLowerCase()}-jsx`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
return
{error &&
{error}
}
{extractedServerName.length > 0 ?
{extractedServerName}
: No server detected}
{showOverlay === 'link' &&
Copied
}
{showOverlay === 'weblink' &&
Copied
}
{showOverlay === 'dark-md' &&
Copied
}
{showOverlay === 'light-md' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark' &&
Copied
}
{showOverlay === 'light' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark-jsx' &&
Copied
}
{showOverlay === 'light-jsx' &&
Copied
}
Click to copy. Paste in JSX components
;
};
# Serveurs MCP
Tu peux installer des serveurs MCP avec des deeplinks Cursor. Ils utilisent le même format que [`mcp.json`](/fr/context/model-context-protocol.mdx), avec un nom et une configuration de transport.
Liens d’installation :
```
cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$BASE64_ENCODED_CONFIG
```
| Composant | Description |
| :-------------------------- | :---------------------------------------------------------------- |
| `cursor://` | Schéma de protocole |
| `anysphere.cursor-deeplink` | Gestionnaire de deeplink |
| `/mcp/install` | Chemin |
| `name` | Paramètre de requête pour le nom du serveur |
| `config` | Paramètre de requête pour la configuration JSON encodée en base64 |
## Générer un lien d’installation
1. Récupère le nom et la configuration JSON du serveur
2. Fais un `JSON.stringify` de la config puis encode-la en base64
3. Remplace `$NAME` et `$BASE64_ENCODED_CONFIG` par le nom et la config encodée
Outil pour générer des liens :
## Exemple
Essaie ce JSON dans le générateur de liens d’installation MCP :
```json Configuration d’un seul serveur MCP theme={null}
{
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/ma_base"
]
}
}
```
Résultat :
Suivi des tickets et gestion de projet pour les équipes de développement.
GitHub
Plateforme de gestion de versions et de développement collaboratif.
Playwright
Tests de navigateur end-to-end.
Sentry
Suivi des erreurs et monitoring des performances.
DuckDB
Base de données OLAP SQL intégrée au processus pour l’analytique locale.
Vercel
Gère tes projets et déploiements sur Vercel.
GitLab
Plateforme DevSecOps pour le code, le CI/CD et la sécurité.
Atlassian
Outils de gestion de projet et de collaboration, dont Jira et Confluence.
PostHog
Analyses, suivi des erreurs et indicateurs de fonctionnalités.
Stripe
APIs de paiement.
PayPal
API de paiement.
dbt Labs
dbt CLI, Semantic Layer et Discovery API.
Browserbase
Sessions de navigateur sans interface pour les agents.
Netlify
Crée et déploie des projets web.
Shopify
Outils pour développer des applications Shopify.
snyk
Analyse des vulnérabilités de ton code.
Zapier
Automatise les workflows entre les apps.
Heroku
Gère tes apps et ressources Heroku.
Hugging Face
Accède au Hub Hugging Face et aux serveurs MCP de Gradio.
Wix
Crée et gère des sites Wix.
Semgrep
Analyse le code pour détecter des vulnérabilités de sécurité.
Plaid
Accède aux données de comptes financiers.
Mercado Pago
Accède à la documentation de Mercado Pago.
"}}}} />
LaunchDarkly
Feature flags en service.
Context7
Documentation du code toujours à jour.
Documentation d’AWS
Accède à la doc AWS, lance des recherches et reçois des recommandations.
Endor Labs
Analyses des risques de sécurité pour le code.
InstantDB
Interroger et administrer InstantDB.
Tinybird
API d’analytique en temps réel.
MongoDB
Gère tes données et déploiements MongoDB.
Neon
Gérer Neon Postgres.
SonarQube
Analyse le code avec SonarQube.
Socket
Analyse et sécurise tes dépendances.
Select Star
Catalogue de données, traçabilité et contexte.
Pipedream
Connecte des API et des workflows.
/"}}} />
Auth0
Gère les ressources Auth0.
MS Learn Docs
Rechercher dans la documentation Microsoft.
Mercado Libre
Accède à la doc Mercado Libre.
Honeycomb
Interroge des données d’observabilité et des SLO.
PagerDuty
Gérer les incidents et les alertes.
Graphite
Crée et gère des PRs empilées.
Railway
Déploie des applications, des bases de données et des services.
Postman
Collaboration et tests API.
Voici un ensemble sélectionné d’outils MCP pour les développeurs, fournis par des éditeurs officiels.
Si ta boîte ou ton outil propose un serveur MCP officiel et que tu veux qu’il soit
inclus, merci de{" "}
créer une PR ou ouvrir un ticket sur GitHub
{" "}
et on l’examinera pour l’inclure.
# Problèmes courants
Source: https://docs.cursor.com/fr/troubleshooting/common-issues
Solutions aux problèmes fréquents et FAQ
Voici les problèmes courants et leurs solutions.
### Problèmes réseau
Commence par vérifier ta connectivité réseau. Va dans `Cursor Settings` > `Network` et clique sur `Run Diagnostics`. Ça testera ta connexion aux serveurs de Cursor et aidera à identifier tout problème réseau pouvant affecter les fonctionnalités d'IA, les mises à jour ou d'autres fonctions en ligne.
Cursor s'appuie sur HTTP/2 pour les fonctionnalités d'IA, car il gère efficacement les réponses en streaming. Si ton réseau ne prend pas en charge HTTP/2, tu peux rencontrer des échecs d'indexation et des problèmes avec les fonctionnalités d'IA.
Ça arrive sur les réseaux d'entreprise, via des VPN, ou quand tu utilises des proxys comme Zscaler.
Pour résoudre ça, active le repli en HTTP/1.1 dans les paramètres de l'app (pas dans les paramètres de Cursor) : appuie sur `CMD/CTRL + ,`, cherche `HTTP/2`, puis active `Disable HTTP/2`. Ça force l'utilisation de HTTP/1.1 et règle le problème.
On prévoit d'ajouter une détection et un repli automatiques.
### Problèmes de ressources (CPU, RAM, etc.)
Une forte utilisation du CPU ou de la RAM peut ralentir ta machine ou déclencher des alertes de ressources.
Même si les grands codebases nécessitent plus de ressources, une utilisation élevée provient généralement des extensions ou de certains réglages.
Si tu vois un avertissement de faible RAM sur **macOS**, sache qu'il existe un bug chez certains utilisateurs qui peut afficher des valeurs totalement incorrectes. Si tu vois ça, ouvre Moniteur d’activité et regarde l’onglet « Memory » pour voir l'utilisation réelle de la mémoire.
Si tu constates une forte utilisation du CPU ou de la RAM, essaie ces étapes :
Les extensions peuvent impacter les performances.
L’Extension Monitor affiche la consommation de ressources de toutes tes extensions installées et intégrées.
Active l’Extension Monitor depuis `Settings` > `Application` > `Experimental` et bascule `Extension Monitor: Enabled`. Tu devras redémarrer Cursor.
Ouvre-le : `Cmd/Ctrl + Shift + P` → `Developer: Open Extension Monitor`.
Cursor exécute tes extensions dans un ou plusieurs **extension hosts**. En général, la plupart de tes extensions s’exécutent dans le même extension host, ce qui signifie qu’une extension qui consomme beaucoup de temps CPU peut étouffer ses voisines !
L’Extension Monitor affiche :
* Chaque processus de longue durée lancé par une extension (macOS et Linux uniquement).
* **% Ext Host** : le pourcentage du temps total de l’extension host consommé par cette extension. Aide à identifier quelles extensions utilisent le plus de temps par rapport aux autres.
* **Max Blocking** : le plus long blocage continu d’une extension, par intervalle de surveillance.
* **% CPU** :
* Pour les extensions : le pourcentage de l’utilisation CPU totale attribuée au code de l’extension.
* Pour les processus : le pourcentage de l’utilisation CPU totale attribuée au processus lancé (macOS et Linux uniquement).
* **Memory** :
* Pour les extensions : la quantité de mémoire de tas JS utilisée par le code de l’extension (allocations externes non comptabilisées).
* Pour les processus : la quantité de mémoire système utilisée par le processus lancé (macOS et Linux uniquement).
Tu peux aussi tester en lançant `cursor --disable-extensions` depuis la ligne de commande. Si les performances s’améliorent, réactive les extensions une par une pour trouver celles qui posent problème.
Essaie Extension Bisect pour identifier les extensions problématiques. En savoir plus [ici](https://code.visualstudio.com/blogs/2021/02/16/extension-bisect#_welcome-extension-bisect). Remarque : ça marche mieux pour les problèmes immédiats, pas pour une dégradation progressive des performances.
Le Process Explorer montre quels processus consomment des ressources.
Ouvre-le : Command Palette (`Cmd/Ctrl + Shift + P`) → `Developer: Open Process Explorer`.
Examine les processus suivants :
* **`extensionHost`** : problèmes liés aux extensions
* **`ptyHost`** : consommation de ressources du terminal
Le Process Explorer affiche chaque terminal et ses commandes en cours d’exécution pour le diagnostic.
Pour les autres processus très gourmands, rapporte-les sur le [forum](https://forum.cursor.com/).
Utilise les outils de monitoring de ton système d’exploitation pour déterminer si le problème est spécifique à Cursor ou global au système.
Si les problèmes persistent, teste une installation minimale de Cursor.
## FAQ générales
Les nouvelles versions sont déployées progressivement — des utilisateurs choisis aléatoirement les reçoivent en premier. Ta mise à jour devrait arriver d'ici quelques jours.
Utilise `Sign Out of GitHub` depuis la palette de commandes `Ctrl/⌘ + Shift + P`.
GitHub Codespaces n'est pas encore pris en charge.
La connexion SSH aux machines Mac ou Windows n'est pas prise en charge. Pour d'autres problèmes, signale-les sur le [forum](https://forum.cursor.com/) avec des logs.
Si tu vois "SSH is only supported in Microsoft versions of VS Code":
1. Désinstalle Remote-SSH :
* Ouvre la vue Extensions (`Ctrl + Shift + X`)
* Cherche "Remote-SSH"
* Clique sur l'icône d'engrenage → "Uninstall"
2. Installe Anysphere Remote SSH :
* Ouvre le marketplace de Cursor
* Cherche "SSH"
* Installe l'extension Anysphere Remote SSH
3. Après l'installation :
* Ferme toutes les instances de VS Code avec des connexions SSH actives
* Redémarre Cursor
* Reconnecte-toi via SSH
Vérifie que ta configuration SSH et tes clés sont correctement configurées.
Cursor Tab et Inline Edit utilisent HTTP/2 pour réduire la latence et l'utilisation des ressources. Certains proxies d'entreprise (p. ex. Zscaler) bloquent HTTP/2. Corrige en définissant `"cursor.general.disableHttp2": true` dans les paramètres (`Cmd/Ctrl + ,`, recherche `http2`).
Déconnecte-toi puis reconnecte-toi depuis les paramètres de Cursor.
Abonné·e Pro : Clique sur `Manage Subscription` dans le [Dashboard](https://cursor.com/dashboard) pour voir ta date de renouvellement.
Utilisateur·rice gratuit·e : Vérifie la date de ton premier email de Cursor. L'utilisation est réinitialisée chaque mois à partir de cette date.
Un espace disque insuffisant peut amener Cursor à effacer des données historiques lors des mises à jour. Pour éviter ça :
1. Garde suffisamment d'espace disque libre avant les mises à jour
2. Nettoie régulièrement les fichiers système inutiles
3. Sauvegarde les conversations importantes avant de mettre à jour
Suis [ce guide](https://code.visualstudio.com/docs/setup/uninstall). Remplace "VS Code" ou "Code" par "Cursor", et ".vscode" par ".cursor".
Clique sur `Delete Account` dans le [Dashboard](https://cursor.com/dashboard). Ça supprime définitivement ton compte et toutes les données associées.
Exécute `cursor` dans ton terminal. Si la commande est absente :
1. Ouvre la palette de commandes `⌘⇧P`
2. Tape `install command`
3. Sélectionne `Install 'cursor' command` (tu peux aussi installer la commande `code` pour remplacer celle de VS Code)
Si cliquer sur Sign In te redirige vers cursor.com sans te connecter, désactive ton pare-feu ou ton antivirus — ils peuvent bloquer le processus d'authentification.
Suite à une récente augmentation des abus, ta requête a pu être bloquée par mesure de sécurité. Voici comment résoudre ça :
D'abord, vérifie ton VPN. Si tu en utilises un, essaie de le désactiver, car les VPN peuvent parfois déclencher nos systèmes de sécurité.
Si ça ne résout pas le problème, tu peux essayer :
* Créer un nouveau chat
* Attendre un peu et réessayer plus tard
* Créer un nouveau compte en utilisant l'authentification Google ou GitHub
* Passer à Cursor Pro
# Récupérer un ID de requête
Source: https://docs.cursor.com/fr/troubleshooting/request-reporting
Retrouver des IDs de requête pour l’assistance technique
Quand l’équipe Cursor enquête sur un problème technique, on peut te demander un « ID de requête ».
## C’est quoi un ID de requête ?
Un ID de requête identifie de façon unique chaque requête envoyée à Cursor dans nos systèmes internes.
Exemple de format : `8f2a5b91-4d3e-47c6-9f12-5e8d94ca7d23`
## Comment trouver un ID de requête ?
Les ID de requête sont limités quand le mode Confidentialité est activé. Désactive le mode Confidentialité quand tu signales un problème.
Remarque : pour les utilisateurs du plan Business, le mode Confidentialité est activé par défaut par l’admin de leur organisation.
### Obtenir ton ID de requête actuel
Pour signaler un problème avec ta conversation actuelle ou récente :
Avec la conversation ouverte dans la barre latérale Chat, utilise le menu contextuel (en haut à droite) et sélectionne `Copy Request ID`.
Envoie-nous l’ID de requête copié via le forum ou par e-mail, comme demandé.
### Obtenir un ID de requête depuis une action précédente
Récupère des ID de requête historiques avec la commande `Report AI Action` :
1. Ouvre la palette de commandes `⌘⇧P`
2. Tape `Report AI Action`
3. Sélectionne l’option `Report AI Action`
Ça affiche tes actions récentes de l’IA dans Chat, CMD+K et Apply.
Sélectionne l’action en faisant correspondre l’heure et la fonctionnalité. Copie l’ID de requête et envoie-le-nous.
# Guide de dépannage
Source: https://docs.cursor.com/fr/troubleshooting/troubleshooting-guide
Étapes pour résoudre les problèmes et signaler des bugs
Les problèmes de Cursor peuvent venir des extensions, des données de l’app ou du système. Essaie ces étapes de dépannage.
Étapes pour signaler un problème à l’équipe Cursor
## Dépannage
Commence par vérifier si Cursor peut se connecter à ses services.
**Lance un diagnostic réseau :** Va dans `Cursor Settings` > `Network` et clique sur `Run Diagnostics`. Ça teste ta connexion aux serveurs de Cursor et identifie les problèmes réseau qui affectent les fonctionnalités d’IA, les mises à jour ou d’autres fonctions en ligne.
Si les diagnostics révèlent des problèmes de connectivité, vérifie les paramètres du pare-feu, la configuration du proxy ou les restrictions réseau qui bloquent l’accès de Cursor.
Pour les problèmes liés aux extensions :
**Désactive temporairement toutes les extensions :** Exécute `cursor --disable-extensions` depuis la ligne de commande. Si les problèmes disparaissent, réactive les extensions une par une pour identifier celle qui pose problème.
**Réinitialiser les données des extensions :** Désinstalle et réinstalle les extensions problématiques pour réinitialiser leurs données stockées. Vérifie les réglages de l’extension qui peuvent persister après réinstallation.
Ça supprime les données de ton application, y compris les extensions, thèmes, snippets et les données liées à l’installation. Exporte d’abord ton profil pour conserver ces données.
Cursor stocke les données de l’application en dehors de l’app pour permettre la restauration entre les mises à jour et les réinstallations.
Pour effacer les données de l’app :
**Windows :** Exécute ces commandes dans l’Invite de commandes :
```txt theme={null}
rd /s /q "%USERPROFILE%\AppData\Local\Programs\Cursor"
rd /s /q "%USERPROFILE%\AppData\Local\Cursor"
rd /s /q "%USERPROFILE%\AppData\Roaming\Cursor"
del /f /q "%USERPROFILE%\.cursor*"
rd /s /q "%USERPROFILE%\.cursor"
```
**macOS :** Exécute `sudo rm -rf ~/Library/Application\ Support/Cursor` et `rm -f ~/.cursor.json` dans le Terminal.
**Linux :** Exécute `rm -rf ~/.cursor ~/.config/Cursor/` dans le Terminal.
Pour désinstaller Cursor :
Recherche « Add or Remove Programs » dans le menu Démarrer, trouve « Cursor », clique sur « Uninstall ».
Ouvre le dossier Applications, clique droit sur « Cursor », sélectionne « Move to Trash ».
**Pour les paquets .deb :** `sudo apt remove cursor`
**Pour les paquets .rpm :** `sudo dnf remove cursor` ou `sudo yum remove cursor`
**Pour AppImage :** Supprime le fichier Cursor.appimage à son emplacement.
Réinstalle depuis la [page de téléchargement](https://www.cursor.com/downloads). Sans effacer les données de l’app, Cursor est restauré à son état précédent. Sinon, tu obtiens une installation neuve.
## Signaler un problème
Si ces étapes ne suffisent pas, signale-le sur le [forum](https://forum.cursor.com/).
Signale un bug ou un problème sur le forum Cursor
Pour une résolution rapide, fournis :
Prends une capture d’écran et masque les informations sensibles.
Documente précisément les étapes pour reproduire le problème.
Récupère les infos système depuis :
`Cursor` > `Help` > `About`
Clique pour voir notre guide sur la collecte des ID de requête
Vérifie la console de développement :
`Developer: Toggle Developer Tools`
Accède aux logs :
`Developer: Open Logs Folder`
# Bienvenue
Source: https://docs.cursor.com/fr/welcome
Découvre Cursor et comment bien démarrer
Cursor est un éditeur de code propulsé par l’IA qui comprend ta base de code et t’aide à coder plus vite en langage naturel. Décris simplement ce que tu veux construire ou modifier et Cursor générera le code pour toi.
Télécharge, installe et lance-toi avec Cursor en quelques minutes
Reste à jour sur les dernières fonctionnalités et améliorations
Utilise Cursor dans ton terminal
Comprends les concepts et fonctionnalités clés qui font tourner Cursor
Explore les modèles d’IA disponibles et comment choisir le bon
Découvre les bonnes pratiques et workflows pour différents cas d’usage
Télécharge Cursor pour ton ordinateur
Pour les questions techniques et partager ton expérience, visite notre forum
Pour les questions de compte et de facturation, écris à notre équipe support
# Keamanan Agent
Source: https://docs.cursor.com/id/account/agent-security
Pertimbangan keamanan saat menggunakan Cursor Agent
Prompt injection, halusinasi AI, dan masalah lain bisa bikin AI bertingkah di luar dugaan dan berpotensi berbahaya. Sambil terus ngejar solusi prompt injection di level yang lebih mendasar, perlindungan utama di produk Cursor adalah guardrail tentang apa yang boleh dilakukan agent, termasuk mewajibkan persetujuan manual untuk tindakan sensitif secara default. Tujuan dokumen ini adalah menjelaskan guardrail kami dan apa yang bisa lo harapkan dari itu.
Semua kontrol dan perilaku di bawah ini adalah pengaturan default sekaligus yang kami rekomendasikan.
## Panggilan tool pihak pertama
Cursor dibekali dengan tool yang memungkinkan agent bantu pengguna nulis kode. Ini termasuk baca file, edit, jalanin perintah terminal, nyari dokumentasi di web, dan lainnya.
Tool baca tidak butuh persetujuan (mis. membaca file, mencari di seluruh kode). Pengguna bisa pakai [.cursorignore](/id/context/ignore-files) buat ngeblokir agent mengakses file tertentu sama sekali, tapi selain itu pembacaan umumnya diizinkan tanpa persetujuan. Untuk tindakan yang berisiko mengekfiltrasi data sensitif, kami butuh persetujuan eksplisit.
Mengubah file di workspace saat ini tidak butuh persetujuan eksplisit dengan beberapa pengecualian. Begitu agent mengubah file, perubahan langsung disimpan ke disk. Kami rekomendasikan menjalankan Cursor di workspace yang pakai version control, biar isi file bisa dibalikin kapan aja. Kami butuh persetujuan eksplisit sebelum mengubah file yang memodifikasi konfigurasi IDE/CLI kami, seperti file pengaturan workspace editor. Namun, pengguna yang auto-reload saat file berubah perlu sadar kalau perubahan agent ke file bisa memicu eksekusi otomatis sebelum sempat meninjau perubahan.
Perintah terminal apa pun yang disaranin agent butuh persetujuan secara default. Kami rekomendasikan pengguna meninjau tiap perintah sebelum agent jalanin. Pengguna yang menerima risikonya bisa milih ngizinin agent jalanin semua perintah tanpa persetujuan. Kami menyertakan fitur [allowlist](/id/agent/tools) di Cursor, tapi kami tidak menganggapnya sebagai kontrol keamanan. Beberapa pengguna milih ngizinin perintah tertentu, tapi ini sistem best effort dan bypass mungkin terjadi. Kami tidak merekomendasikan "Run Everything", yang melewati allowlist apa pun yang dikonfigurasi.
## Panggilan tool pihak ketiga
Cursor memungkinkan menghubungkan tool eksternal lewat [MCP](/id/context/mcp). Semua koneksi MCP pihak ketiga harus disetujui secara eksplisit oleh pengguna. Setelah pengguna menyetujui sebuah MCP, secara default setiap panggilan tool yang disarankan di Agent Mode untuk setiap integrasi MCP eksternal harus disetujui secara eksplisit sebelum dijalankan.
## Permintaan jaringan
Permintaan jaringan bisa dimanfaatkan penyerang untuk mengekfiltrasi data. Saat ini kami tidak mendukung alat first‑party apa pun yang membuat permintaan jaringan ke luar sejumlah kecil host terpilih (mis. GitHub), pengambilan tautan secara eksplisit, serta dukungan penelusuran web dengan penyedia tertentu yang dipilih. Permintaan jaringan agen yang sewenang‑wenang diblokir dengan pengaturan default.
## Kepercayaan workspace
Cursor IDE mendukung fitur standar [workspace trust](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust) yang secara default *nonaktif*. Workspace trust bakal nampilin prompt saat lo buka workspace baru untuk milih mode normal atau mode terbatas. Mode terbatas bakal bikin AI dan fitur lain yang biasanya dipakai di Cursor jadi nggak berfungsi. Kami saranin pakai tool lain, seperti text editor basic, buat kerjaan dengan repo yang lo nggak percaya.
Workspace trust bisa diaktifin di pengaturan pengguna dengan langkah-langkah ini:
1. Buka file user settings.json lo
2. Tambahin konfigurasi berikut:
```json theme={null}
"security.workspace.trust.enabled": true
```
Pengaturan ini juga bisa dipaksain di seluruh organisasi lewat solusi Mobile Device Management (MDM).
## Pengungkapan yang bertanggung jawab
Kalau kamu menemukan kerentanan di Cursor, ikuti panduan di halaman GitHub Security kami dan kirim laporannya di sana. Kalau nggak bisa pakai GitHub, kamu juga bisa hubungi kami di [security@cursor.com](mailto:security@cursor.com).
Kami berkomitmen untuk mengakui penerimaan laporan kerentanan dalam 5 hari kerja dan menangani laporan tersebut secepatnya. Kami akan memublikasikan hasilnya dalam bentuk security advisory di halaman GitHub Security kami. Insiden kritis akan dikomunikasikan di halaman GitHub Security dan juga lewat email ke semua pengguna.
# Billing
Source: https://docs.cursor.com/id/account/billing
Ngatur langganan Cursor, refund, dan invoice
### Gimana cara akses pengaturan billing?
Akses portal billing lewat [Dashboard](https://cursor.com/dashboard) dengan klik "Billing" di Dashboard. Ini bakal ngebuka portal aman buat semua urusan billing.
### Apa aja siklus billing Cursor?
Siklus billing berjalan bulanan atau tahunan, mulai dari tanggal langganan lo. Akun Teams dikenai biaya per seat dengan billing prorata buat member baru.
### Gimana cara kerja seat buat akun Teams?
Akun Teams ngecas per seat (satu per member Team). Kalau nambah member di tengah siklus, lo cuma ditagih buat sisa waktunya. Kalau ada member yang udah pakai kredit dan dihapus, seat mereka tetap kepake sampai akhir siklus billing—nggak ada refund prorata. Admin Team bisa ngatur seat lewat dashboard.
### Bisa nggak pindah antara billing bulanan dan tahunan?
Bisa! Caranya:
**Pro plan**
1. Buka [dashboard](https://cursor.com/dashboard) Cursor
2. Klik "Billing and Invoices" di sidebar kiri buat ke halaman billing
3. Klik "Manage subscription"
4. Klik "Update subscription"
5. Pilih "Yearly" atau "Monthly", terus klik "Continue"
**Teams plan**
1. Buka [dashboard](https://cursor.com/dashboard) Cursor
2. Klik "Billing and Invoices" di sidebar kiri buat ke halaman billing
3. Klik tombol "Upgrade Now" buat pindah ke billing tahunan
Lo cuma bisa pindah dari billing bulanan ke tahunan secara self-serve. Buat pindah dari tahunan ke bulanan, hubungi kami di
[hi@cursor.com](mailto:hi@cursor.com).
### Di mana gue bisa nemuin invoice?
Semua riwayat billing ada di portal billing. Lo bisa lihat dan download invoice yang sekarang maupun yang lama.
### Bisa nggak invoice dikirim otomatis ke email?
Invoice untuk saat ini harus didownload manual dari portal billing. Kita lagi ngembangin email invoice otomatis. Lo bakal bisa opt-in begitu tersedia.
### Gimana cara update informasi billing?
Update metode pembayaran, nama perusahaan, alamat, dan info pajak lewat portal billing. Kita pakai Stripe buat transaksi yang aman. Perubahan cuma ngaruh ke invoice berikutnya, kita nggak bisa ubah invoice yang sudah terbit.
### Gimana cara batalin langganan?
Batalin langganan lewat halaman Billing and Invoices dengan klik "Manage Subscription" terus tombol "Cancel subscription". Akses tetap aktif sampai akhir periode billing lo saat ini.
### Gue punya masalah billing lain. Gimana cara minta bantuan?
Kalau ada pertanyaan billing yang belum kejawab di sini, email ke [hi@cursor.com](mailto:hi@cursor.com) dari email yang terhubung ke akun lo. Sertakan detail akun dan concern lo.
# Harga
Source: https://docs.cursor.com/id/account/pricing
Paket dan harga Cursor
Kamu bisa coba Cursor gratis atau beli paket individu atau tim.
## Individual
Semua paket individual mencakup:
* Tab completion tanpa batas
* Batas penggunaan agent yang diperluas di semua model
* Akses ke Bugbot
* Akses ke Background Agents
Setiap paket menyertakan penggunaan yang ditagihkan sesuai harga inferensi model [API prices](/id/models#model-pricing):
* Pro mencakup penggunaan agent API senilai \$20 + bonus penggunaan tambahan
* Pro Plus mencakup penggunaan agent API senilai \$70 + bonus penggunaan tambahan
* Ultra mencakup penggunaan agent API senilai \$400 + bonus penggunaan tambahan
Kami bekerja keras buat ngasih kapasitas bonus di luar penggunaan yang dijamin. Karena tiap model punya biaya API yang berbeda, pilihan model kamu memengaruhi output token dan seberapa cepat jatah penggunaan kamu kepakai. Kamu bisa lihat penggunaan dan rincian token di [dashboard kamu](https://cursor.com/dashboard?tab=usage). Notifikasi batas rutin ditampilkan di editor.
### Seberapa banyak penggunaan yang gue butuhin?
Berdasarkan data penggunaan kami, lo bisa expect level penggunaan berikut:
* **Pengguna Tab harian**: Selalu di bawah \$20
* **Pengguna Agent terbatas**: Sering cukup dengan \$20 yang udah termasuk
* **Pengguna Agent harian**: Biasanya total penggunaan $60–$100/bulan
* **Power user (multiple agents/automation)**: Sering total penggunaan \$200+/bulan
Berdasarkan data penggunaan kami, limit kira-kira setara dengan berikut untuk *pengguna median*:
* Pro: \~225 request Sonnet 4, \~550 request Gemini, atau \~500 request GPT 5
* Pro+: \~675 request Sonnet 4, \~1.650 request Gemini, atau \~1.500 request GPT 5
* Ultra: \~4.500 request Sonnet 4, \~11.000 request Gemini, atau \~10.000 request GPT 5
### Apa yang terjadi kalau gue mencapai limit?
Kalau lo melewati kuota penggunaan bulanan yang termasuk, lo bakal dikasih tahu di editor dan bisa pilih untuk:
* **Tambah penggunaan on-demand**: Tetap pakai Cursor dengan rate API yang sama pakai penagihan pay-as-you-go
* **Upgrade plan lo**: Naik ke tier yang lebih tinggi buat kuota penggunaan yang lebih besar
Penggunaan on-demand ditagih bulanan dengan rate yang sama seperti penggunaan yang termasuk. Request nggak pernah diturunin kualitas atau kecepatannya.
## Teams
Ada dua paket Teams: Teams (\$40/user/bulan) dan Enterprise (Kustom).
Paket Teams nyediain fitur tambahan seperti:
* Penegakan Privacy Mode
* Admin Dashboard dengan statistik penggunaan
* Penagihan tim terpusat
* SAML/OIDC SSO
Kami nyaranin Teams buat siapa pun yang nyaman melayani diri sendiri. Kami nyaranin [Enterprise](/id/contact-sales) buat yang butuh dukungan prioritas, pooled usage, penagihan via invoice, SCIM, atau kontrol keamanan tingkat lanjut.
Pelajari lebih lanjut tentang [harga Teams](/id/account/teams/pricing).
## Auto
Mengaktifkan Auto memungkinkan Cursor memilih model premium yang paling sesuai untuk tugas saat ini dengan reliabilitas tertinggi berdasarkan permintaan terkini. Fitur ini bisa mendeteksi penurunan kualitas output dan otomatis mengganti model untuk mengatasinya.
Kami telah banyak berinvestasi pada kualitas dan performa keseluruhan Auto. Mulai pada pembaruan tagihan berikutnya setelah 15 September, Auto akan mengonsumsi penggunaan dengan tarif API berikut.
* **Input + Cache Write**: \$1.25 per 1M token
* **Output**: \$6.00 per 1M token
* **Cache Read**: \$0.25 per 1M token
Baik editor maupun dashboard bakal menampilkan penggunaan kamu, termasuk Auto. Kalau kamu lebih suka memilih model secara langsung, penggunaan akan dikenakan sesuai harga API model tersebut.
## Max Mode
Model tertentu bisa pakai [Max Mode](/id/models#max-mode), yang memungkinkan penalaran lebih panjang dan jendela konteks lebih besar hingga 1M token. Walaupun sebagian besar tugas coding nggak perlu Max Mode, fitur ini bisa membantu buat kueri yang lebih kompleks, terutama untuk file atau codebase yang besar. Menggunakan Max Mode bakal mengonsumsi lebih banyak kuota. Kamu bisa lihat semua request dan rincian token di [dashboard kamu](https://cursor.com/dashboard?tab=usage).
## Bugbot
Bugbot adalah produk terpisah dari langganan Cursor dan punya paket harga sendiri.
* **Pro** (\$40/bulan): Review tanpa batas untuk hingga 200 PR/bulan, akses tanpa batas ke Cursor Ask, integrasi dengan Cursor untuk memperbaiki bug, dan akses ke Bugbot Rules
* **Teams** (\$40/pengguna/bulan): Code review tanpa batas untuk semua PR, akses tanpa batas ke Cursor Ask, penggunaan bersama di seluruh tim, serta aturan dan pengaturan lanjutan
* **Enterprise** (Kustom): Semua yang ada di Teams plus analitik dan pelaporan lanjutan, dukungan prioritas, dan manajemen akun
Pelajari lebih lanjut tentang [harga Bugbot](https://cursor.com/bugbot#pricing).
## Background Agent
Background Agent dikenakan biaya sesuai harga API untuk [model](/id/models) yang dipilih. Kamu bakal diminta menetapkan batas pengeluaran untuk Background Agent saat pertama kali mulai pakai mereka.
Komputasi Virtual Machine (VM) untuk background agent akan diberi harga di masa mendatang.
# Admin API
Source: https://docs.cursor.com/id/account/teams/admin-api
Akses metrik tim, data penggunaan, dan informasi pengeluaran lewat API
Admin API bikin lo bisa ngeakses data tim lo secara terprogram, termasuk info member, metrik penggunaan, dan detail pengeluaran. Bangun dashboard kustom, alat monitoring, atau integrasiin ke workflow yang udah ada.
API ini baru rilis pertama. Kita lagi nambahin kapabilitas berdasarkan feedback — kasih tahu kita endpoint apa yang lo butuhin!
## Autentikasi
Semua permintaan API memerlukan autentikasi menggunakan kunci API. Hanya admin tim yang bisa membuat dan mengelola kunci API.
Kunci API terikat ke organisasi, dapat dilihat oleh semua admin, dan tidak terpengaruh oleh status akun pembuatnya.
### Membuat API Key
1. Buka **cursor.com/dashboard** → tab **Settings** → **Cursor Admin API Keys**
2. Klik **Create New API Key**
3. Kasih nama yang deskriptif buat key lo (misalnya, "Usage Dashboard Integration")
4. Segera salin key yang dihasilkan — lo nggak bakal bisa lihat itu lagi
Format: `key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
### Pakai API key lo
Pakai API key lo sebagai username di basic authentication:
**Pakai curl dengan basic auth:**
```bash theme={null}
curl https://api.cursor.com/{route} -u API_KEY:
```
**Atau atur header Authorization secara langsung:**
```bash theme={null}
Authorization: Basic {base64_encode('API_KEY:')}
```
## URL Dasar
Semua endpoint API menggunakan:
```
https://api.cursor.com
```
```bash theme={null}
curl -X GET https://api.cursor.com/teams/members \
-u API_KEY_KAMU:
```
### Dapatkan Data Penggunaan Harian
Ambil metrik penggunaan harian yang detail buat tim lo dalam rentang tanggal tertentu. Ngasih insight tentang pengeditan kode, penggunaan bantuan AI, dan tingkat penerimaan.
```
POST /teams/daily-usage-data
```
#### Body Request
| Parameter | Type | Required | Description |
| :---------- | :----- | :------- | :---------------------------------- |
| `startDate` | number | Yes | Tanggal mulai dalam milidetik epoch |
| `endDate` | number | Yes | Tanggal akhir dalam milidetik epoch |
Rentang tanggal nggak boleh lebih dari 90 hari. Buat beberapa request untuk periode yang lebih panjang.
#### Respons
```typescript theme={null}
{
data: {
date: number;
isActive: boolean;
totalLinesAdded: number;
totalLinesDeleted: number;
acceptedLinesAdded: number;
acceptedLinesDeleted: number;
totalApplies: number;
totalAccepts: number;
totalRejects: number;
totalTabsShown: number;
totalTabsAccepted: number;
composerRequests: number;
chatRequests: number;
agentRequests: number;
cmdkUsages: number;
subscriptionIncludedReqs: number;
apiKeyReqs: number;
usageBasedReqs: number;
bugbotUsages: number;
mostUsedModel: string;
applyMostUsedExtension?: string;
tabMostUsedExtension?: string;
clientVersion?: string;
email?: string;
}[];
period: {
startDate: number;
endDate: number;
};
}
```
#### Kolom Respons
| Field | Description |
| :------------------------- | :------------------------------------------------------- |
| `date` | Tanggal dalam milidetik epoch |
| `isActive` | Pengguna aktif pada hari tersebut |
| `totalLinesAdded` | Jumlah baris kode yang ditambahkan |
| `totalLinesDeleted` | Jumlah baris kode yang dihapus |
| `acceptedLinesAdded` | Jumlah baris dari saran AI yang diterima dan ditambahkan |
| `acceptedLinesDeleted` | Jumlah baris dari saran AI yang diterima dan dihapus |
| `totalApplies` | Operasi apply |
| `totalAccepts` | Saran yang diterima |
| `totalRejects` | Saran yang ditolak |
| `totalTabsShown` | Tab completion yang ditampilkan |
| `totalTabsAccepted` | Tab completion yang diterima |
| `composerRequests` | Permintaan Composer |
| `chatRequests` | Permintaan Chat |
| `agentRequests` | Permintaan Agent |
| `cmdkUsages` | Penggunaan Command Palette (Cmd+K) |
| `subscriptionIncludedReqs` | Permintaan yang termasuk dalam langganan |
| `apiKeyReqs` | Permintaan API key |
| `usageBasedReqs` | Permintaan bayar per penggunaan |
| `bugbotUsages` | Penggunaan deteksi bug |
| `mostUsedModel` | Model AI yang paling sering digunakan |
| `applyMostUsedExtension` | Ekstensi file yang paling sering digunakan untuk apply |
| `tabMostUsedExtension` | Ekstensi file yang paling sering digunakan untuk tab |
| `clientVersion` | Versi Cursor |
| `email` | Email pengguna |
Ambil data pengeluaran untuk bulan kalender berjalan, lengkap dengan pencarian, penyortiran, dan pagination.
```
POST /teams/spend
```
#### Request Body
| Parameter | Type | Required | Description |
| :-------------- | :----- | :------- | :--------------------------------------------------------- |
| `searchTerm` | string | No | Cari di nama dan email pengguna |
| `sortBy` | string | No | Urutkan menurut: `amount`, `date`, `user`. Default: `date` |
| `sortDirection` | string | No | Arah pengurutan: `asc`, `desc`. Default: `desc` |
| `page` | number | No | Nomor halaman (indeks mulai 1). Default: `1` |
| `pageSize` | number | No | Jumlah hasil per halaman |
| Field | Description |
| :------------------------- | :--------------------------------------- |
| `spendCents` | Total pengeluaran dalam sen |
| `fastPremiumRequests` | Permintaan model premium cepat |
| `name` | Nama anggota |
| `email` | Email anggota |
| `role` | Peran dalam tim |
| `hardLimitOverrideDollars` | Penggantian batas pengeluaran kustom |
| `subscriptionCycleStart` | Mulai siklus langganan (milidetik epoch) |
| `totalMembers` | Total anggota tim |
| `totalPages` | Total halaman |
**Data pengeluaran dasar:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Cari pengguna tertentu dengan paginasi:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"searchTerm": "alex@company.com",
"page": 2,
"pageSize": 25
}'
```
### Dapatkan Data Event Penggunaan
Ambil data event penggunaan yang detail untuk tim lo, dengan opsi filter, pencarian, dan paginasi yang lengkap. Endpoint ini ngasih insight granular tentang panggilan API per request, penggunaan model, konsumsi token, dan biaya.
```
POST /teams/filtered-usage-events
```
#### Body Permintaan
| Parameter | Tipe | Wajib | Deskripsi |
| :---------- | :----- | :---- | :-------------------------------------------- |
| `startDate` | number | Tidak | Tanggal mulai dalam milidetik epoch |
| `endDate` | number | Tidak | Tanggal akhir dalam milidetik epoch |
| `userId` | number | Tidak | Filter berdasarkan ID pengguna tertentu |
| `page` | number | Tidak | Nomor halaman (diindeks dari 1). Default: `1` |
| `pageSize` | number | Tidak | Jumlah hasil per halaman. Default: `10` |
| `email` | string | Tidak | Filter berdasarkan alamat email pengguna |
| Field | Description |
| :---------------------- | :-------------------------------------------------------------------- |
| `totalUsageEventsCount` | Jumlah total event penggunaan yang sesuai dengan query |
| `pagination` | Metadata paginasi untuk menavigasi hasil |
| `timestamp` | Stempel waktu event dalam epoch millisecond |
| `model` | Model AI yang dipakai untuk request |
| `kind` | Kategori penggunaan (mis., "Usage-based", "Included in Business") |
| `maxMode` | Apakah max mode diaktifkan |
| `requestsCosts` | Biaya dalam unit request |
| `isTokenBasedCall` | True saat event ditagihkan sebagai event berbasis penggunaan |
| `tokenUsage` | Rincian konsumsi token (tersedia saat isTokenBasedCall bernilai true) |
| `isFreeBugbot` | Apakah ini penggunaan bugbot gratis |
| `userEmail` | Email user yang membuat request |
| `period` | Rentang tanggal dari data yang di-query |
**Ambil semua peristiwa penggunaan dengan paginasi default:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
```
**Filter berdasarkan rentang tanggal dan pengguna tertentu:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u API_KEY_KAMU: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
```
**Ambil event penggunaan untuk user tertentu dengan paginasi kustom:**
```bash theme={null}
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": 12345,
"page": 2,
"pageSize": 50
}'
```
### Set Batas Pengeluaran Pengguna
Atur batas pengeluaran buat tiap anggota tim. Ini bikin lo bisa ngatur seberapa banyak tiap user boleh ngehabisin buat penggunaan AI di tim lo.
```
POST /teams/batas-pengeluaran-user
```
**Batas laju:** 60 permintaan per menit per tim
#### Request Body
| Parameter | Type | Required | Description |
| :------------------ | :----- | :------- | :------------------------------------------------------------------- |
| `userEmail` | string | Yes | Alamat email anggota tim |
| `spendLimitDollars` | number | Yes | Batas pengeluaran dalam dolar (hanya bilangan bulat, tanpa desimal). |
* Pengguna harus sudah menjadi anggota tim kamu
* Hanya nilai bilangan bulat yang diterima (tanpa angka desimal)
* Mengatur `spendLimitDollars` ke 0 akan menetapkan batas menjadi \$0
#### Respons
Mengembalikan respons standar yang menunjukkan apakah operasi berhasil atau gagal:
```typescript theme={null}
{
outcome: 'sukses' | 'error';
message: string;
}
```
#### Contoh Respons
**Berhasil mengatur batas:**
```json theme={null}
{
"outcome": "sukses",
"message": "Batas pengeluaran ditetapkan menjadi $100 untuk pengguna developer@company.com"
}
```
**Respons kesalahan:**
```json theme={null}
{
"outcome": "error",
"message": "Format email tidak valid"
}
```
```bash theme={null}
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u API_KEY_KAMU:
```
#### Upsert Repo Blocklists
Ganti blocklist repo yang sudah ada untuk repo yang diberikan.
*Catatan: Endpoint ini cuma bakal menimpa pola untuk repo yang diberikan. Repo lainnya nggak akan terpengaruh.*
```
POST /settings/repo-blocklists/repos/upsert
```
##### Request Body
| Parameter | Type | Required | Description |
| --------- | ----- | -------- | -------------------------------- |
| repos | array | Yes | Array objek blocklist repository |
Setiap objek repository harus berisi:
| Field | Type | Required | Description |
| -------- | --------- | -------- | -------------------------------------------------------- |
| url | string | Yes | URL repository untuk dimasukkan ke blocklist |
| patterns | string\[] | Yes | Array pola file yang akan diblokir (mendukung pola glob) |
##### Respons
Mengembalikan daftar blocklist repositori yang diperbarui:
```typescript theme={null}
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
```
Pola blocklist yang umum:
* `*` - Blokir seluruh repository
* `*.env` - Blokir semua file .env
* `config/*` - Blokir semua file di direktori config
* `**/*.secret` - Blokir semua file .secret di subdirektori mana pun
* `src/api/keys.ts` - Blokir file tertentu
# API Pelacakan Kode AI
Source: https://docs.cursor.com/id/account/teams/ai-code-tracking-api
Akses analitik kode berbasis AI buat repositori tim lo
Akses analitik kode berbasis AI buat repositori tim lo. Ini mencakup penggunaan AI per commit serta perubahan AI yang diterima secara granular.
API ini baru rilis pertama. Kami lagi nambah kapabilitas berdasarkan feedback—kasih tahu kami endpoint apa yang lo butuhin!
* **Ketersediaan**: Hanya buat tim enterprise
* **Status**: Alpha (bentuk respons dan field bisa berubah)
## Autentikasi
Semua request ke API harus diautentikasi pakai API key. API ini menggunakan skema autentikasi Admin API yang sama seperti endpoint lainnya.
Untuk panduan autentikasi yang lebih rinci, lihat [Admin API authentication](/id/account/teams/admin-api#authentication).
## URL Dasar
Semua endpoint API menggunakan:
```
https://api.cursor.com
```
## Batas Permintaan
* 5 permintaan per menit per tim, per endpoint
## Parameter Query
Semua endpoint di bawah menerima parameter query yang sama lewat query string:
| Parameter | Type | Required | Description | |
| :---------- | :----- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `startDate` | string | date | No | String tanggal ISO, literal "now", atau hari relatif seperti "7d" (berarti sekarang - 7 hari). Default: sekarang - 7 hari |
| `endDate` | string | date | No | String tanggal ISO, literal "now", atau hari relatif seperti "0d". Default: sekarang |
| `page` | number | No | Nomor halaman (basis 1). Default: 1 | |
| `pageSize` | number | No | Jumlah hasil per halaman. Default: 100, Maks: 1000 | |
| `user` | string | No | Filter opsional untuk satu pengguna. Menerima email (mis., [developer@company.com](mailto:developer@company.com)), ID terenkode (mis., user\_abc123...), atau ID numerik (mis., 42) | |
Respons mengembalikan userId sebagai ID eksternal terenkode dengan prefiks user\_. Nilai ini stabil untuk konsumsi API.
## Semantik dan Cara Perhitungan Metrik
* **Sumber**: "TAB" merepresentasikan inline completions yang diterima; "COMPOSER" merepresentasikan diff yang diterima dari Composer
* **Metrik baris**: tabLinesAdded/Deleted dan composerLinesAdded/Deleted dihitung terpisah; nonAiLinesAdded/Deleted diturunkan sebagai max(0, totalLines - AI lines)
* **Mode privasi**: Jika diaktifkan di klien, beberapa metadata (seperti fileName) mungkin dihilangkan
* **Info branch**: isPrimaryBranch bernilai true ketika branch saat ini sama dengan default branch repo; bisa undefined jika info repo tidak tersedia
Lo bisa nge-scan file itu buat paham gimana commit dan perubahan dideteksi dan dilaporkan.
## Endpoint
### Dapatkan Metrik Commit AI (JSON, dengan pagination)
Ambil metrik agregat per-commit yang mengatribusikan baris ke TAB, COMPOSER, dan non-AI.
```
GET /analytics/ai-code/commits
```
#### Respons
```typescript theme={null}
{
items: AiCommitMetric[];
totalCount: number;
page: number;
pageSize: number;
}
```
#### Field AiCommitMetric
| Field | Type | Description | |
| :--------------------- | :------ | :-------------------------------------------- | --------------------------------- |
| `commitHash` | string | Hash commit Git | |
| `userId` | string | ID pengguna terenkode (mis., user\_abc123) | |
| `userEmail` | string | Alamat email pengguna | |
| `repoName` | string | null | Nama repositori |
| `branchName` | string | null | Nama branch |
| `isPrimaryBranch` | boolean | null | Apakah ini branch utama |
| `totalLinesAdded` | number | Total baris yang ditambahkan dalam commit | |
| `totalLinesDeleted` | number | Total baris yang dihapus dalam commit | |
| `tabLinesAdded` | number | Baris yang ditambahkan lewat penyelesaian TAB | |
| `tabLinesDeleted` | number | Baris yang dihapus lewat penyelesaian TAB | |
| `composerLinesAdded` | number | Baris yang ditambahkan lewat Composer | |
| `composerLinesDeleted` | number | Baris yang dihapus lewat Composer | |
| `nonAiLinesAdded` | number | null | Baris non-AI yang ditambahkan |
| `nonAiLinesDeleted` | number | null | Baris non-AI yang dihapus |
| `message` | string | null | Pesan commit |
| `commitTs` | string | null | Stempel waktu commit (format ISO) |
| `createdAt` | string | Stempel waktu ingestion (format ISO) | |
**Permintaan dasar:**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/commits?startDate=7d&endDate=now&page=1&pageSize=100" \
-u API_KEY_KAMU:
```
**Filter berdasarkan pengguna (email):**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/commits?startDate=2025-06-01T00:00:00Z&endDate=now&user=developer@company.com" \
-u API_KEY_KAMU:
```
### Download Metrik Commit AI (CSV, streaming)
Unduh data metrik commit dalam format CSV untuk ekstraksi data berskala besar.
```
GET /analytics/ai-code/commits.csv
```
#### Respons
Header:
* Content-Type: text/csv; charset=utf-8
#### Kolom CSV
| Kolom | Tipe | Deskripsi |
| :----------------------- | :------ | :------------------------------------------- |
| `commit_hash` | string | Hash commit Git |
| `user_id` | string | ID pengguna yang dienkode |
| `user_email` | string | Alamat email pengguna |
| `repo_name` | string | Nama repositori |
| `branch_name` | string | Nama branch |
| `is_primary_branch` | boolean | Apakah ini branch utama |
| `total_lines_added` | number | Total baris yang ditambahkan dalam commit |
| `total_lines_deleted` | number | Total baris yang dihapus dalam commit |
| `tab_lines_added` | number | Baris yang ditambahkan lewat pelengkapan TAB |
| `tab_lines_deleted` | number | Baris yang dihapus lewat pelengkapan TAB |
| `composer_lines_added` | number | Baris yang ditambahkan lewat Composer |
| `composer_lines_deleted` | number | Baris yang dihapus lewat Composer |
| `non_ai_lines_added` | number | Baris non-AI yang ditambahkan |
| `non_ai_lines_deleted` | number | Baris non-AI yang dihapus |
| `message` | string | Pesan commit |
| `commit_ts` | string | Timestamp commit (format ISO) |
| `created_at` | string | Timestamp ingest (format ISO) |
### Dapatkan Metrik Perubahan Kode AI (JSON, paginasi)
Ambil perubahan AI terperinci yang diterima, dikelompokkan berdasarkan changeId deterministik. Berguna buat nganalisis event AI yang diterima secara independen dari commit.
```
GET /analytics/ai-code/changes
```
| Field | Type | Description | |
| :------------------ | :----- | :----------------------------------------------------------- | ----------------------- |
| `changeId` | string | ID deterministik untuk perubahan | |
| `userId` | string | ID pengguna yang dienkode (misalnya, user\_abc123) | |
| `userEmail` | string | Alamat email pengguna | |
| `source` | "TAB" | "COMPOSER" | Sumber perubahan AI |
| `model` | string | null | Model AI yang digunakan |
| `totalLinesAdded` | number | Total baris yang ditambahkan | |
| `totalLinesDeleted` | number | Total baris yang dihapus | |
| `createdAt` | string | Timestamp ingestion (format ISO) | |
| `metadata` | Array | Metadata file (fileName bisa dihilangkan dalam mode privasi) | |
**Permintaan dasar:**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?startDate=14d&endDate=now&page=1&pageSize=200" \
-u API_KEY_KAMU:
```
**Filter berdasarkan pengguna (ID terenkripsi):**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?user=user_3k9x8q..." \
-u API_KEY_KAMU:
```
**Filter berdasarkan pengguna (email):**
```bash theme={null}
curl -X GET "https://api.cursor.com/analytics/ai-code/changes?user=developer@company.com" \
-u KUNCI_API_LO:
```
### Unduh Metrik Perubahan Kode AI (CSV, streaming)
Unduh data metrik perubahan dalam format CSV untuk ekstraksi data berskala besar.
```
GET /analytics/ai-code/changes.csv
```
#### Respons
Header:
* Content-Type: text/csv; charset=utf-8
#### Kolom CSV
| Kolom | Tipe | Deskripsi |
| :-------------------- | :----- | :---------------------------------------------- |
| `change_id` | string | ID deterministik untuk perubahan |
| `user_id` | string | ID pengguna yang dienkode |
| `user_email` | string | Alamat email pengguna |
| `source` | string | Sumber perubahan AI (TAB atau COMPOSER) |
| `model` | string | Model AI yang digunakan |
| `total_lines_added` | number | Total baris yang ditambahkan |
| `total_lines_deleted` | number | Total baris yang dihapus |
| `created_at` | string | Timestamp ingestion (format ISO) |
| `metadata_json` | string | Array entri metadata yang dijadikan string JSON |
#### Catatan
* metadata\_json adalah array entri metadata yang dijadikan string JSON (mungkin menghilangkan fileName dalam mode privasi)
* Saat memproses CSV, pastikan untuk mengurai field yang diapit tanda kutip
* Pakai parameter `user` buat cepat filter satu user di semua endpoint
* Buat ekstraksi data besar, pilih endpoint CSV—mereka nge-stream per halaman 10.000 record di sisi server
* `isPrimaryBranch` bisa undefined kalau client nggak bisa resolve default branch
* `commitTs` adalah timestamp commit; `createdAt` adalah waktu ingestion di server kami
* Beberapa field mungkin nggak ada kalau privacy mode diaktifkan di client
## Changelog
* **Rilis alpha**: Endpoint awal untuk commit dan perubahan. Bentuk respons bisa berubah seiring masukan
# Analytics
Source: https://docs.cursor.com/id/account/teams/analytics
Lacak metrik penggunaan dan aktivitas tim
Admin tim bisa ngelacak metrik dari [dashboard](/id/account/teams/dashboard).
### Total Usage
Lihat metrik gabungan di seluruh tim, termasuk total tab dan permintaan premium. Buat tim yang umurnya kurang dari 30 hari, metrik nunjukin penggunaan sejak tim dibuat, termasuk aktivitas anggota sebelum gabung.
### Per Active User
Lihat rata-rata per pengguna aktif: tab yang diterima, jumlah baris kode, dan permintaan premium.
### User Activity
Lacak pengguna aktif mingguan dan bulanan.
## Header Laporan Analytics
Saat kamu mengekspor data analytics dari dashboard, laporan menyertakan metrik terperinci tentang perilaku pengguna dan penggunaan fitur. Berikut arti tiap header:
### Informasi Pengguna
Tanggal saat data analytics direkam (mis., 2024-01-15T04:30:00.000Z)
Pengidentifikasi unik untuk setiap pengguna di sistem
Alamat email pengguna yang terhubung ke akun mereka
Menunjukkan apakah pengguna aktif pada tanggal tersebut
### Metrik Kode yang Dihasilkan AI
Total baris kode yang disarankan oleh fitur chat AI
Total baris kode yang disarankan untuk dihapus oleh chat AI
Baris yang disarankan AI dan diterima lalu ditambahkan ke kode
Penghapusan yang disarankan AI dan diterima
### Metrik Penggunaan Fitur
Jumlah penerapan perubahan yang dihasilkan AI dari chat
Jumlah penerimaan saran AI
Jumlah penolakan saran AI
Jumlah tampilan tab saran AI kepada pengguna
Jumlah tab saran AI yang diterima
### Metrik Jenis Permintaan
Permintaan yang dibuat lewat fitur composer/edit (Cmd+K inline edits)
Permintaan chat saat pengguna mengajukan pertanyaan ke AI
Permintaan ke AI agent (asisten AI khusus)
Jumlah penggunaan command palette Cmd+K (atau Ctrl+K)
### Metrik Langganan dan API
Permintaan AI yang tercakup dalam paket langganan pengguna
Permintaan yang dibuat menggunakan API key untuk akses terprogram
Permintaan yang dihitung dalam penagihan berbasis penggunaan
### Fitur Tambahan
Jumlah penggunaan fitur AI deteksi/perbaikan bug
### Informasi Konfigurasi
Model AI yang paling sering digunakan oleh pengguna (mis., GPT-4, Claude)
Ekstensi file yang paling sering digunakan saat menerapkan saran AI (mis., .ts,
.py, .java)
Ekstensi file yang paling sering digunakan dengan fitur tab completion
Versi editor Cursor yang digunakan
### Metrik Terkalkulasi
Laporan juga menyertakan data terproses yang membantu memahami kontribusi kode AI:
* Total Lines Added/Deleted: Hitungan mentah semua perubahan kode
* Accepted Lines Added/Deleted: Baris yang berasal dari saran AI dan diterima
* Composer Requests: Permintaan yang dibuat lewat fitur inline composer
* Chat Requests: Permintaan yang dibuat lewat antarmuka chat
Semua nilai numerik default ke 0 jika tidak ada, nilai boolean default ke
false, dan nilai string default ke string kosong. Metrik diagregasi
harian per pengguna.
# Analytics V2
Source: https://docs.cursor.com/id/account/teams/analyticsV2
Pelacakan metrik penggunaan dan aktivitas tim tingkat lanjut
Kami sedang mengerjakan rilis V2 untuk infrastruktur analytics kami. Ini mencakup refactor terhadap cara kami melacak berbagai metrik.
Per **1 September 2025**, buat pengguna di **Cursor versi 1.5**, analytics akan menggunakan infrastruktur V2 kami. Versi sebelumnya cenderung mengurangi hitungan beberapa metrik, termasuk:
* Total Accepted Lines of Code
* Total Suggested Lines of Code
* Total Tabs Accepted
Tetap ikuti perkembangannya, kami akan terus berinvestasi di analytics dan merilis fitur-fitur baru di area ini.
# Dashboard
Source: https://docs.cursor.com/id/account/teams/dashboard
Kelola penagihan, penggunaan, dan pengaturan tim dari dashboard lo
Dashboard ngebantu lo ngakses penagihan, ngaktifin pricing berbasis penggunaan, dan ngatur tim lo.
## Ikhtisar
Dapatkan ringkasan cepat tentang aktivitas tim, statistik penggunaan, dan perubahan terbaru. Halaman Ikhtisar ngasih lo insight sekilas tentang workspace lo.
## Pengaturan
Atur preferensi dan keamanan untuk seluruh tim. Halaman Pengaturan mencakup:
## Pengaturan Teams & Enterprise
Atur preferensi berbagi data buat tim. Konfigurasikan kebijakan tanpa retensi data dengan penyedia AI (OpenAI, Anthropic, Google Vertex AI, xAi Grok) dan kelola penegakan privasi di seluruh tim.
{" "}
Aktifkan penetapan harga berbasis penggunaan dan tetapkan batas pengeluaran. Atur batas pengeluaran bulanan tim dan opsi batas per pengguna. Kontrol apakah cuma admin yang bisa mengubah pengaturan ini.
{" "}
Konfigurasikan role AWS Bedrock IAM untuk integrasi cloud yang aman.
{" "}
Siapkan autentikasi SSO untuk tim enterprise biar akses pengguna lebih simpel dan keamanan meningkat.
{" "}
Buat dan kelola API key untuk akses terprogram ke fitur admin Cursor.
{" "}
Pantau dan kelola sesi pengguna aktif di seluruh tim.
Buat dan kelola kode undangan buat nambahin anggota tim baru.
Akses endpoint REST API Cursor untuk integrasi terprogram. Semua endpoint API tersedia di paket Team dan Enterprise, kecuali [AI Code Tracking API](/id/docs/account/teams/ai-code-tracking-api) yang memerlukan langganan Enterprise.
## Pengaturan Khusus Enterprise
{" "}
Kendalikan model AI yang tersedia untuk anggota tim. Tetapkan pembatasan pada
model tertentu atau tier model untuk mengelola biaya dan memastikan penggunaan yang tepat
di seluruh organisasi.
{" "}
Konfigurasikan pengaturan eksekusi perintah otomatis untuk Cursor versi 0.49 ke atas.
Kendalikan perintah mana yang bisa dieksekusi otomatis dan tetapkan kebijakan
keamanan untuk eksekusi kode.
Cegah akses ke repositori tertentu untuk alasan keamanan atau kepatuhan.
{" "}
Konfigurasikan pengaturan Model Context Protocol untuk Cursor versi 0.51 ke atas.
Kelola cara model mengakses dan memproses konteks dari
lingkungan pengembangan kamu.
{" "}
Siapkan pola ignore untuk file dan direktori di Cursor versi 0.50 ke atas.
Kendalikan file dan direktori mana yang dikecualikan dari analisis AI dan
rekomendasi.
Lindungi direktori .cursor dari akses tidak sah di versi 0.51 ke atas. Pastikan file konfigurasi dan cache sensitif tetap aman.
Akses analitik kode yang dihasilkan AI secara mendetail untuk repositori tim kamu. Dapatkan metrik penggunaan AI per commit dan perubahan AI yang diterima secara granular melalui endpoint REST API. Memerlukan paket Enterprise. Info selengkapnya [di sini](/id/account/teams/ai-code-tracking-api).
Penyediaan **SCIM** (System for Cross-domain Identity Management) juga
tersedia untuk paket Enterprise. Lihat [dokumentasi SCIM](/id/account/teams/scim)
untuk petunjuk penyiapan.
## Anggota
Kelola anggota tim, undang pengguna baru, dan kendalikan izin akses. Atur izin berbasis peran dan pantau aktivitas anggota.
## Integrations
{" "}
Hubungkan Cursor dengan tool dan layanan favorit kamu. Atur integrasi dengan version control system, project management tool, dan layanan developer lainnya.
## Agen Latar Belakang
{" "}
Pantau dan kelola agen latar belakang yang berjalan di workspace lo. Lihat status, log, dan penggunaan resource agen.
## Bugbot
Akses kemampuan pendeteksian dan perbaikan bug otomatis. Bugbot bantu ngidentifikasi dan menyelesaikan masalah umum di codebase kamu secara otomatis.
## Manajemen Active Directory
Buat tim enterprise, kelola autentikasi dan akses pengguna lewat integrasi Active Directory. Konfigurasikan SSO dan provisioning pengguna.
## Penggunaan
Lacak metrik penggunaan secara detail, termasuk permintaan ke AI, penggunaan model, dan konsumsi sumber daya. Pantau penggunaan di seluruh anggota tim dan proyek.
## Penagihan & Faktur
Kelola langganan, perbarui metode pembayaran, dan akses riwayat penagihan. Unduh faktur dan kelola setelan harga berbasis penggunaan.
# Pengaturan Enterprise
Source: https://docs.cursor.com/id/account/teams/enterprise-settings
Kelola pengaturan Cursor secara terpusat untuk organisasimu
# Pengaturan enterprise
Kamu bisa mengelola fitur tertentu di Cursor secara terpusat lewat solusi manajemen perangkat supaya sesuai dengan kebutuhan organisasi kamu. Saat kamu menetapkan kebijakan Cursor, nilainya akan menimpa pengaturan Cursor yang terkait di perangkat pengguna.
Editor pengaturan yang menunjukkan bahwa pengaturan 'Extensions: Allowed' dikelola oleh organisasi.
Saat ini Cursor menyediakan kebijakan untuk mengontrol fitur-fitur yang dikelola admin berikut:
| Policy | Description | Cursor setting | Available since |
| ----------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------ | --------------- |
| AllowedExtensions | Mengontrol ekstensi mana yang boleh diinstal. | extensions.allowed | 1.2 |
| AllowedTeamId | Mengontrol ID tim mana yang diizinkan untuk login. Pengguna dengan ID tim yang tidak diizinkan akan dipaksa logout. | cursorAuth.allowedTeamId | 1.3 |
## Konfigurasi ekstensi yang diizinkan
Pengaturan Cursor `extensions.allowed` mengontrol ekstensi mana yang bisa dipasang. Pengaturan ini menerima objek JSON dengan key berupa nama publisher dan value berupa boolean yang menunjukkan apakah ekstensi dari publisher tersebut diizinkan.
Contohnya, menyetel `extensions.allowed` ke `{"anysphere": true, "github": true}` mengizinkan ekstensi dari publisher Anysphere dan GitHub, sedangkan menyetelnya ke `{"anysphere": false}` memblokir ekstensi dari Anysphere.
Untuk mengelola ekstensi yang diizinkan secara terpusat buat organisasimu, konfigurasikan kebijakan `AllowedExtensions` menggunakan solusi manajemen perangkat lo. Kebijakan ini menimpa pengaturan `extensions.allowed` di perangkat pengguna. Nilai kebijakan ini adalah string JSON yang mendefinisikan publisher yang diizinkan.
Kalau lo mau belajar lebih lanjut tentang ekstensi di Cursor, lihat dokumentasi ekstensi.
## Konfigurasi ID tim yang diizinkan
Pengaturan Cursor `cursorAuth.allowedTeamId` ngatur ID tim mana yang boleh login ke Cursor. Pengaturan ini nerima daftar ID tim yang dipisahkan koma yang diotorisasi buat akses.
Misalnya, ngeset `cursorAuth.allowedTeamId` ke `"1,3,7"` ngebolehin pengguna dari ID tim tersebut buat login.
Kalau pengguna coba login pakai ID tim yang nggak ada di daftar yang diizinkan:
* Mereka langsung dipaksa logout
* Muncul pesan error
* Aplikasi ngeblok percobaan autentikasi berikutnya sampai ID tim yang valid dipakai
Buat ngatur ID tim yang diizinkan secara terpusat buat organisasi lo, konfigurasikan kebijakan `AllowedTeamId` pakai solusi manajemen perangkat lo. Kebijakan ini ngeganti pengaturan `cursorAuth.allowedTeamId` di perangkat pengguna. Nilai kebijakan ini berupa string yang berisi daftar ID tim yang diotorisasi dan dipisahkan koma.
## Group Policy di Windows
Cursor mendukung Group Policy berbasis Windows Registry. Saat definisi kebijakan dipasang, admin bisa pakai Local Group Policy Editor buat ngatur nilai kebijakan.
Cara nambahin kebijakan:
1. Salin file ADMX dan ADML kebijakan dari `AppData\Local\Programs\cursor\policies`.
2. Tempel file ADMX ke direktori `C:\Windows\PolicyDefinitions`, dan file ADML ke direktori `C:\Windows\PolicyDefinitions\\`.
3. Restart Local Group Policy Editor.
4. Setel nilai kebijakan yang sesuai (contoh: `{"anysphere": true, "github": true}` untuk kebijakan `AllowedExtensions`) di Local Group Policy Editor.
Kebijakan bisa disetel di level Computer maupun User. Kalau dua-duanya disetel, level Computer bakal jadi prioritas. Saat nilai kebijakan disetel, nilai itu akan menimpa nilai pengaturan Cursor yang dikonfigurasi di level mana pun (default, user, workspace, dll.).
## Profil konfigurasi di macOS
Profil konfigurasi mengelola pengaturan di perangkat macOS. Profil adalah file XML berisi pasangan key/value yang sesuai dengan kebijakan yang tersedia. Profil bisa didistribusikan lewat solusi Mobile Device Management (MDM) atau dipasang manual.
Contoh file `.mobileconfig` untuk macOS ada di bawah:
```
PayloadContentPayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92.J6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadTypecom.todesktop.230313mzl4w4u92PayloadUUIDJ6B5723A-6539-4F31-8A4E-3CC96E51F48CPayloadVersion1AllowedExtensions{"anysphere":true}AllowedTeamId1,2PayloadDescriptionThis profile manages Cursor.PayloadDisplayNameCursorPayloadIdentifiercom.todesktop.230313mzl4w4u92PayloadOrganizationAnyspherePayloadTypeConfigurationPayloadUUIDF2C1A7B3-9D4E-4B2C-8E1F-7A6C5D4B3E2FPayloadVersion1TargetDeviceType5
```
### Kebijakan string
Contoh berikut menunjukkan konfigurasi kebijakan `AllowedExtensions`. Nilai kebijakan di file sampel awalnya kosong (tidak ada ekstensi yang diizinkan).
```
EkstensiDiizinkan
```
Tambahkan string JSON yang sesuai yang mendefinisikan policy lo di antara tag ``.
```
AllowedExtensions{"anysphere": true, "github": true}
```
Untuk kebijakan `AllowedTeamId`, tambahkan daftar ID tim yang dipisahkan koma:
```
AllowedTeamId1,3,7
```
**Penting:** File `.mobileconfig` yang disediakan menginisialisasi **semua** kebijakan yang tersedia di versi Cursor tersebut. Hapus kebijakan yang nggak kamu butuhkan.
Kalau kamu nggak mengedit atau menghapus suatu kebijakan dari contoh `.mobileconfig`, kebijakan itu bakal diterapkan dengan nilai default (lebih ketat).
Pasang profil konfigurasi secara manual dengan mengklik dua kali profil `.mobileconfig` di Finder, lalu aktifkan di System Settings lewat **General** > **Device Management**. Menghapus profil dari System Settings bakal menghapus kebijakan dari Cursor.
Untuk info selengkapnya tentang profil konfigurasi, lihat dokumentasi Apple.
## Kebijakan tambahan
Tujuannya adalah mengangkat pengaturan Cursor saat ini menjadi kebijakan dan mengikuti pengaturan yang ada dengan ketat, supaya penamaan dan perilakunya konsisten. Kalau ada permintaan untuk menerapkan lebih banyak kebijakan, buka issue di repositori GitHub Cursor. Tim bakal menentukan apakah sudah ada pengaturan yang sesuai untuk perilaku tersebut atau perlu dibuat pengaturan baru untuk mengontrol perilaku yang diinginkan.
## Pertanyaan yang sering diajukan
### Apakah Cursor mendukung profil konfigurasi di Linux?
Dukungan untuk Linux belum ada di roadmap. Kalau lo tertarik sama profil konfigurasi di Linux, buka issue di repositori GitHub Cursor dan ceritain detail skenario lo.
# Anggota & Peran
Source: https://docs.cursor.com/id/account/teams/members
Kelola anggota tim dan peran
Tim Cursor punya tiga jenis peran:
## Peran
**Member** adalah peran default dengan akses ke fitur Pro-nya Cursor.
* Akses penuh ke fitur Pro Cursor
* Nggak punya akses ke pengaturan penagihan atau dashboard admin
* Bisa lihat pemakaian sendiri dan sisa budget berbasis penggunaan
**Admin** ngatur manajemen tim dan pengaturan keamanan.
* Akses penuh ke fitur Pro
* Tambah/hapus member, ubah peran, setup SSO
* Atur harga berbasis penggunaan dan batas pengeluaran
* Akses ke analitik tim
**Unpaid Admin** nge-manage tim tanpa pakai seat berbayar — ideal buat staf IT atau finance yang nggak butuh akses ke Cursor.
* Nggak ditagih, nggak dapat fitur Pro
* Kapabilitas administratif sama seperti Admin
Unpaid Admin butuh minimal satu user berbayar di tim.
Semua anggota tim bisa mengundang orang lain. Saat ini undangan belum dibatasi.
### Tambah anggota
Tambah anggota dengan tiga cara:
1. **Undangan email**
* Klik `Invite Members`
* Masukkan alamat email
* Pengguna akan menerima undangan lewat email
2. **Tautan undangan**
* Klik `Invite Members`
* Salin `Invite Link`
* Bagikan ke anggota tim
3. **SSO**
* Konfigurasi SSO di [admin dashboard](/id/account/teams/sso)
* Pengguna otomatis bergabung saat login menggunakan email SSO
Tautan undangan memiliki masa berlaku yang panjang — siapa pun yang memiliki tautan tersebut bisa bergabung.
Cabut tautannya atau gunakan [SSO](/id/account/teams/sso)
### Hapus anggota
Admin bisa menghapus anggota kapan saja lewat menu konteks → "Remove". Jika anggota sudah memakai kredit apa pun, kursinya tetap terpakai sampai akhir siklus penagihan.
### Ubah peran
Admin bisa mengubah peran anggota lain dengan mengklik menu konteks lalu memilih opsi "Change role".
Harus selalu ada setidaknya satu Admin dan satu anggota berbayar dalam tim.
## Keamanan & SSO
SAML 2.0 Single Sign-On (SSO) tersedia di paket Team. Fitur utamanya meliputi:
* Mengonfigurasi koneksi SSO ([pelajari lebih lanjut](/id/account/teams/sso))
* Menyiapkan verifikasi domain
* Pendaftaran pengguna otomatis
* Opsi penegakan SSO
* Integrasi penyedia identitas (Okta, dll.)
Verifikasi domain wajib untuk mengaktifkan SSO.
## Kontrol Penggunaan
Buka pengaturan penggunaan buat:
* Mengaktifkan penagihan berbasis penggunaan
* Mengaktifkan model premium
* Mengatur perubahan khusus admin
* Menetapkan batas pengeluaran bulanan
* Memantau penggunaan seluruh tim
## Penagihan
Saat nambah anggota tim:
* Setiap member atau admin nambah satu kursi berbayar (lihat [pricing](https://cursor.com/pricing))
* Member baru dikenai biaya pro-rata untuk sisa waktu di periode penagihan
* Kursi admin yang Unpaid nggak dihitung
Penambahan di tengah bulan cuma ditagih untuk hari yang dipakai. Kalau ngehapus member yang udah pakai kredit, kursinya tetap kepakai sampai akhir siklus penagihan — nggak ada refund pro-rata.
Perubahan role (mis., Admin ke Unpaid Admin) ngubah penagihan mulai dari tanggal perubahan. Pilih penagihan bulanan atau tahunan.
Perpanjangan bulanan/tahunan terjadi di tanggal pendaftaran awal, terlepas dari perubahan member.
### Beralih ke penagihan tahunan
Hemat **20%** dengan beralih dari bulanan ke tahunan:
1. Buka [Dashboard](https://cursor.com/dashboard)
2. Di bagian akun, klik "Advanced" lalu "Upgrade to yearly billing"
Kamu cuma bisa beralih dari bulanan ke tahunan lewat dashboard. Untuk beralih dari
tahunan ke bulanan, hubungi [hi@cursor.com](mailto:hi@cursor.com).
# SCIM
Source: https://docs.cursor.com/id/account/teams/scim
Siapkan provisioning SCIM untuk otomatisasi pengelolaan pengguna dan grup
## Gambaran Umum
Provisioning SCIM 2.0 otomatis ngatur anggota tim dan grup direktori lewat identity provider lo. Tersedia di paket Enterprise dengan SSO diaktifkan.
Dasbor pengaturan SCIM yang menampilkan konfigurasi Active Directory Management
## Prasyarat
* Paket Cursor Enterprise
* SSO harus dikonfigurasi dulu — **SCIM perlu koneksi SSO yang aktif**
* Akses admin ke penyedia identitas lo (Okta, Azure AD, dll.)
* Akses admin ke organisasi Cursor lo
## Cara kerjanya
### Provisioning pengguna
Pengguna otomatis ditambahkan ke Cursor saat ditetapkan ke aplikasi SCIM di identity provider kamu. Saat penetapan dicabut, mereka akan dihapus. Perubahan disinkronkan secara real-time.
### Grup direktori
Grup direktori beserta keanggotaannya disinkronkan dari identity provider kamu. Pengelolaan grup dan pengguna harus dilakukan melalui identity provider kamu—Cursor menampilkan informasi ini sebagai read-only.
### Manajemen pengeluaran
Atur batas pengeluaran per pengguna yang berbeda untuk setiap grup direktori. Batas grup direktori memiliki prioritas dibanding batas di tingkat tim. Pengguna yang berada di beberapa grup akan menerima batas pengeluaran tertinggi yang berlaku.
## Penyiapan
SCIM memerlukan SSO disiapkan terlebih dulu. Kalau kamu belum mengonfigurasi SSO,
ikuti [panduan penyiapan SSO](/id/account/teams/sso) sebelum lanjut.
Buka
[cursor.com/dashboard?tab=active-directory](https://www.cursor.com/dashboard?tab=active-directory)
dengan akun admin, atau masuk ke pengaturan dashboard dan pilih tab
"Active Directory Management".
Setelah SSO terverifikasi, kamu bakal lihat tautan untuk penyiapan SCIM langkah demi langkah. Klik
ini untuk mulai wizard konfigurasi.
Di identity provider kamu: Buat atau konfigurasikan aplikasi SCIM. Gunakan
SCIM endpoint dan token yang disediakan Cursor. Aktifkan provisioning pengguna dan push grup.
Uji koneksinya.
Kembali ke halaman Active Directory Management di Cursor: Lihat grup direktori
yang tersinkron. Setel batas pengeluaran per pengguna untuk grup tertentu sesuai kebutuhan.
Tinjau batas yang berlaku untuk pengguna yang ada di beberapa grup.
### Penyiapan identity provider
Untuk instruksi penyiapan spesifik per provider:
Instruksi penyiapan untuk Okta, Azure AD, Google Workspace, dan lainnya.
## Mengelola pengguna dan grup
Semua pengelolaan pengguna dan grup harus dilakukan lewat identity provider lo.
Perubahan yang lo buat di identity provider bakal otomatis tersinkron ke Cursor, tapi
lo nggak bisa langsung ngubah pengguna atau grup di Cursor.
### Manajemen pengguna
* Tambahin pengguna dengan nge-assign mereka ke aplikasi SCIM lo di identity provider
* Hapus pengguna dengan nge-unassign mereka dari aplikasi SCIM
* Perubahan profil pengguna (nama, email) bakal otomatis tersinkron dari identity provider lo
### Manajemen grup
* Grup direktori otomatis disinkronkan dari identity provider lo
* Perubahan keanggotaan grup bakal keliatan secara real-time
* Pakai grup buat ngatur pengguna dan ngeset batas pengeluaran yang berbeda
### Batas pengeluaran
* Set batas per pengguna yang berbeda untuk tiap grup direktori
* Pengguna bakal mewarisi batas pengeluaran tertinggi dari grup mereka
* Batas grup bakal nge-override batas default per pengguna di seluruh tim
## FAQ
### Kenapa manajemen SCIM nggak muncul di dashboard?
Pastikan SSO udah dikonfigurasi dengan benar dan jalan sebelum nyetel SCIM. SCIM butuh koneksi SSO yang aktif buat berfungsi.
### Kenapa pengguna nggak ke-sync?
Pastikan pengguna udah ditetapkan (assigned) ke aplikasi SCIM di identity provider. Pengguna harus ditetapkan secara eksplisit biar muncul di Cursor.
### Kenapa grup nggak muncul?
Cek apakah push group provisioning diaktifkan di pengaturan SCIM di identity provider. Sinkronisasi grup harus dikonfigurasi terpisah dari sinkronisasi pengguna.
### Kenapa batas pengeluaran nggak kepakai?
Pastikan pengguna udah ditetapkan ke grup yang sesuai di identity provider. Keanggotaan grup yang nentuin batas pengeluaran mana yang berlaku.
### Bisa nggak ngelola pengguna dan grup SCIM langsung di Cursor?
Nggak. Semua manajemen pengguna dan grup harus dilakukan lewat identity provider. Cursor nampilin info ini sebagai read-only.
### Perubahan ke-sync secepat apa?
Perubahan yang dibuat di identity provider bakal ke-sync ke Cursor secara real-time. Mungkin ada jeda singkat buat operasi bulk yang besar.
# Mulai
Source: https://docs.cursor.com/id/account/teams/setup
Buat dan atur tim Cursor
## Cursor untuk Tim
Cursor bisa dipakai oleh individu maupun tim. Paket Tim menyediakan alat untuk organisasi: SSO, manajemen tim, kontrol akses, dan analitik penggunaan.
## Membuat Tim
Bikin tim dengan langkah-langkah berikut:
Untuk bikin Tim, ikuti langkah-langkah ini:
1. **Buat pengguna baru**: Kunjungi [cursor.com/team/new-team](https://cursor.com/team/new-team) buat bikin akun dan tim baru
2. **Buat pengguna yang sudah punya akun**: Buka [dashboard](/id/account/dashboard) dan klik "Upgrade to Teams"
Pilih nama Tim dan siklus penagihan
Undang anggota tim. Jumlah pengguna dihitung prorata — lo cuma bayar selama mereka jadi anggota.
Aktifkan [SSO](/id/account/teams/sso) buat keamanan dan onboarding otomatis.
## FAQ
Cursor pakai HTTP/2 secara default. Beberapa proxy dan VPN ngeblok protokol ini.
Aktifin fallback HTTP/1.1 di settings biar pakai HTTP/1.1.
Cursor menagih per pengguna aktif, bukan per seat. Tambah atau hapus pengguna kapan aja — member baru ditagih pro-rata untuk sisa periode. Kalau pengguna yang dihapus udah pakai kredit, seat mereka tetap kepakai sampai akhir siklus tagihan.
Tanggal perpanjangan kamu tetap sama.
Set diri kamu sebagai [Unpaid Admin](/id/account/teams/members) biar bisa nge-manage tanpa lisensi.
Tim perlu minimal satu member berbayar. Kamu bisa setup dulu, undang member, lalu ubah role kamu sebelum penagihan.
Link download untuk semua platform ada di [cursor.com/downloads](https://cursor.com/downloads).
Instruksi MDM:
* [Omnissa Workspace ONE](https://docs.omnissa.com/bundle/MobileApplicationManagementVSaaS/page/DeployInternalApplications.html) (sebelumnya VMware)
* [Microsoft Intune (Windows)](https://learn.microsoft.com/en-us/mem/intune-service/apps/apps-win32-app-management)
* [Microsoft Intune (Mac)](https://learn.microsoft.com/en-us/mem/intune-service/apps/lob-apps-macos-dmg)
* [Kandji MDM](https://support.kandji.io/kb/custom-apps-overview)
# SSO
Source: https://docs.cursor.com/id/account/teams/sso
Setel single sign-on buat tim lo
## Ikhtisar
SSO SAML 2.0 tersedia tanpa biaya tambahan di paket Business. Pakai identity provider (IdP) yang sudah ada buat mengautentikasi anggota tim tanpa perlu akun Cursor terpisah.
## Prasyarat
* Paket Cursor Team
* Akses admin ke penyedia identitas lo (misalnya Okta)
* Akses admin ke organisasi Cursor lo
## Langkah Konfigurasi
Buka [cursor.com/dashboard?tab=settings](https://www.cursor.com/dashboard?tab=settings) pakai akun admin.
Temuin bagian "Single Sign-On (SSO)" lalu buka.
Klik tombol "SSO Provider Connection settings" buat mulai setup SSO dan ikutin wizard.
Di identity provider lo (misalnya Okta):
* Bikin aplikasi SAML baru
* Konfigurasi pengaturan SAML pakai info dari Cursor
* Set up Just-in-Time (JIT) provisioning
Verifikasi domain user lo di Cursor dengan klik tombol "Domain verification settings".
### Panduan Setup Identity Provider
Buat instruksi setup per provider:
Instruksi setup untuk Okta, Azure AD, Google Workspace, dan lainnya.
## Pengaturan Tambahan
* Atur penerapan SSO lewat dasbor admin
* Pengguna baru otomatis terdaftar saat masuk lewat SSO
* Kelola pengguna lewat penyedia identitas lo
## Pemecahan Masalah
Kalau ada masalah:
* Pastikan domain sudah terverifikasi di Cursor
* Pastikan atribut SAML dipetakan dengan benar
* Cek SSO sudah diaktifkan di dasbor admin
* Samakan nama depan dan belakang antara identity provider dan Cursor
* Cek panduan khusus penyedia di atas
* Hubungi [hi@cursor.com](mailto:hi@cursor.com) kalau masalah tetap berlanjut
# Akses Pembaruan
Source: https://docs.cursor.com/id/account/update-access
Pilih seberapa sering kamu mau menerima pembaruan
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor punya dua kanal pembaruan.
Kanal pembaruan standar dengan rilis yang sudah diuji.
* Rilis stabil
* Perbaikan bug dari pengujian pra-rilis
* Standar untuk semua pengguna
* Satu-satunya opsi untuk pengguna tim
Akun tim dan bisnis pakai mode Default.
Versi pra-rilis dengan fitur baru.
Build Early Access bisa mengandung bug atau masalah stabilitas.
* Akses ke fitur yang masih dikembangkan
* Mungkin mengandung bug
* Tidak tersedia untuk akun tim
## Ubah kanal pembaruan
1. **Buka pengaturan**: Tekan Cmd+Shift+J
2. **Buka Beta**: Pilih Beta di sidebar
3. **Pilih kanal**: Pilih Default atau Early Access
Laporkan masalah Early Access di [Forum](https://forum.cursor.com).
# Apply
Source: https://docs.cursor.com/id/agent/apply
Pelajari cara menerapkan, menerima, atau menolak saran kode dari chat menggunakan Apply
## Cara kerja Apply
Apply adalah model khusus di Cursor yang mengambil kode yang dihasilkan oleh chat dan mengintegrasikannya ke file lo. Model ini memproses blok kode dari percakapan chat dan menerapkan perubahan tersebut ke codebase lo.
Apply tidak menghasilkan kode sendiri. Model chat yang menghasilkan kode, sementara Apply menangani integrasinya ke file yang sudah ada. Model ini bisa memproses perubahan di banyak file dan pada codebase yang besar.
## Menerapkan blok kode
Untuk menerapkan saran pada blok kode, tekan tombol play di pojok kanan atas blok kode.
# Checkpoints
Source: https://docs.cursor.com/id/agent/chat/checkpoints
Simpan dan pulihkan state sebelumnya setelah perubahan Agent
Checkpoints adalah snapshot otomatis dari perubahan Agent ke codebase lo. Fitur ini bikin lo bisa nge-undo modifikasi Agent kalau perlu.
## Memulihkan checkpoint
Ada dua cara untuk memulihkan:
1. **Dari kotak input**: Klik tombol `Restore Checkpoint` pada permintaan sebelumnya
2. **Dari pesan**: Klik tombol + saat mengarahkan kursor ke sebuah pesan
Checkpoint bukan sistem version control. Pakai Git untuk riwayat permanen.
## Cara kerjanya
* Disimpan secara lokal, terpisah dari Git
* Hanya melacak perubahan Agent (bukan edit manual)
* Dibersihkan secara otomatis
Edit manual nggak dilacak. Pakai checkpoint cuma untuk perubahan Agent.
## FAQ
Nggak. Mereka terpisah dari riwayat Git.
{" "}
Buat sesi saat ini dan riwayat terbaru. Dibersihkan otomatis.
Nggak. Mereka dibuat otomatis oleh Cursor.
{" "}
# Perintah
Source: https://docs.cursor.com/id/agent/chat/commands
Tentukan perintah untuk alur kerja yang dapat digunakan ulang
Perintah kustom memungkinkan lo bikin alur kerja yang bisa dipakai ulang dan dipicu dengan awalan sederhana `/` di kotak input chat. Perintah ini bantu nyeragamin proses di seluruh tim lo dan bikin tugas-tugas umum jadi lebih efisien.
Perintah saat ini masih beta. Fitur dan sintaksnya bisa berubah seiring kami terus ningkatin fiturnya.
## Cara kerja command
Command didefinisikan sebagai file Markdown biasa yang bisa disimpan di dua lokasi:
1. **Project commands**: Disimpan di direktori `.cursor/commands` di project lo
2. **Global commands**: Disimpan di direktori `~/.cursor/commands` di home directory lo
Saat lo ngetik `/` di kotak input chat, Cursor bakal otomatis mendeteksi dan nampilin command yang tersedia dari kedua direktori tersebut, jadi langsung bisa diakses di seluruh workflow lo.
## Membuat command
1. Bikin direktori `.cursor/commands` di root project
2. Tambahin file `.md` dengan nama yang deskriptif (misalnya, `review-code.md`, `write-tests.md`)
3. Tulis konten Markdown biasa yang ngejelasin apa yang harus dilakukan command
4. Command bakal otomatis muncul di chat pas lo ngetik `/`
Nih contoh struktur direktori command lo:
```
.cursor/
└── commands/
├── tanggapi-komentar-pr-github.md
├── daftar-periksa-code-review.md
├── buat-pr.md
├── review-ringan-diff-yang-ada.md
├── onboarding-developer-baru.md
├── jalankan-semua-test-dan-perbaiki.md
├── audit-keamanan.md
└── setup-fitur-baru.md
```
## Contoh
Coba perintah ini di proyek lo biar kerasa cara kerjanya.
```markdown theme={null}
# Daftar Periksa Code Review
## Ikhtisar
Daftar periksa komprehensif untuk melakukan code review menyeluruh demi memastikan kualitas, keamanan, dan kemudahan pemeliharaan.
## Kategori Review
### Fungsionalitas
- [ ] Kode berfungsi sesuai yang diharapkan
- [ ] Kasus tepi ditangani
- [ ] Penanganan error sudah tepat
- [ ] Tidak ada bug atau kesalahan logika yang jelas
### Kualitas Kode
- [ ] Kode mudah dibaca dan terstruktur dengan baik
- [ ] Fungsi kecil dan fokus
- [ ] Nama variabel deskriptif
- [ ] Tidak ada duplikasi kode
- [ ] Mengikuti konvensi proyek
### Keamanan
- [ ] Tidak ada kerentanan keamanan yang jelas
- [ ] Validasi input diterapkan
- [ ] Data sensitif ditangani dengan benar
- [ ] Tidak ada secret yang di-hardcode
```
```markdown theme={null}
# Audit Keamanan
## Ringkasan
Tinjauan keamanan menyeluruh untuk mengidentifikasi dan memperbaiki kerentanan pada codebase.
## Langkah
1. **Audit dependensi**
- Periksa kerentanan yang diketahui
- Perbarui paket yang usang
- Tinjau dependensi pihak ketiga
2. **Tinjauan keamanan kode**
- Periksa kerentanan umum
- Tinjau autentikasi/otorisasi
- Audit praktik penanganan data
3. **Keamanan infrastruktur**
- Tinjau variabel lingkungan
- Periksa kontrol akses
- Audit keamanan jaringan
## Daftar Periksa Keamanan
- [ ] Dependensi diperbarui dan aman
- [ ] Tidak ada secret yang di-hardcode
- [ ] Validasi input diimplementasikan
- [ ] Autentikasi aman
- [ ] Otorisasi dikonfigurasi dengan benar
```
```markdown theme={null}
# Menyiapkan Fitur Baru
## Ringkasan
Menyiapkan fitur baru secara sistematis dari perencanaan awal hingga struktur implementasinya.
## Langkah
1. **Tentukan requirement**
- Perjelas cakupan dan tujuan fitur
- Identifikasi user story dan acceptance criteria
- Rencanakan pendekatan teknis
2. **Buat feature branch**
- Branch dari main/develop
- Siapkan environment pengembangan lokal
- Konfigurasi dependensi baru (jika ada)
3. **Rencanakan arsitektur**
- Rancang model data dan API
- Rencanakan komponen UI dan alurnya
- Pertimbangkan strategi pengujian
## Checklist Setup Fitur
- [ ] Requirement terdokumentasi
- [ ] User story ditulis
- [ ] Pendekatan teknis direncanakan
- [ ] Feature branch dibuat
- [ ] Environment pengembangan siap
```
```markdown theme={null}
# Buat PR
## Ringkasan
Bikin pull request yang terstruktur rapi dengan deskripsi, label, dan reviewer yang tepat.
## Langkah
1. **Siapkan branch**
- Pastikan semua perubahan sudah di-commit
- Push branch ke remote
- Pastikan branch sudah up-to-date dengan main
2. **Tulis deskripsi PR**
- Ringkas perubahan dengan jelas
- Sertakan konteks dan motivasi
- Cantumkan perubahan yang bersifat breaking
- Tambahkan screenshot kalau ada perubahan UI
3. **Setelan PR**
- Bikin PR dengan judul yang deskriptif
- Tambahkan label yang sesuai
- Assign reviewer
- Tautkan issue terkait
## Template PR
- [ ] Fitur A
- [ ] Perbaikan bug B
- [ ] Unit test lulus
- [ ] Pengujian manual selesai
```
```markdown theme={null}
# Jalankan Semua Tes dan Perbaiki Kegagalan
## Ringkasan
Jalankan seluruh suite pengujian dan perbaiki kegagalan secara sistematis untuk memastikan kualitas dan fungsionalitas kode.
## Langkah
1. **Jalankan suite pengujian**
- Jalankan semua tes di proyek
- Simpan output dan identifikasi kegagalan
- Periksa baik unit test maupun integration test
2. **Analisis kegagalan**
- Kategorikan berdasarkan jenis: flaky, broken, failure baru
- Prioritaskan perbaikan berdasarkan dampaknya
- Cek apakah kegagalan terkait perubahan terbaru
3. **Perbaiki masalah secara sistematis**
- Mulai dari kegagalan yang paling kritis
- Perbaiki satu masalah dalam satu waktu
- Jalankan ulang tes setelah setiap perbaikan
```
```markdown theme={null}
# Onboarding Developer Baru
## Ringkasan
Proses onboarding komprehensif agar developer baru bisa segera siap dan produktif.
## Langkah
1. **Penyiapan environment**
- Instal tool yang diperlukan
- Siapkan environment pengembangan
- Konfigurasi IDE dan ekstensi
- Siapkan git dan key SSH
2. **Pengenalan proyek**
- Tinjau struktur proyek
- Pahami arsitektur
- Baca dokumentasi utama
- Siapkan database lokal
## Daftar Periksa Onboarding
- [ ] Environment pengembangan siap
- [ ] Semua test lulus
- [ ] Bisa menjalankan aplikasi secara lokal
- [ ] Database disiapkan dan berjalan
- [ ] PR pertama diajukan
```
# Compact
Source: https://docs.cursor.com/id/agent/chat/compact
Hemat ruang di chat dengan antarmuka mode compact
Mode compact nyediain antarmuka chat yang ringkas dengan ngurangin distraksi visual dan memaksimalkan ruang buat percakapan.
## Ikhtisar
Saat diaktifkan, mode ringkas mengubah antarmuka chat dengan:
* **Menyembunyikan ikon** untuk tampilan yang lebih bersih dan minimalis
* **Secara otomatis menciutkan diff** untuk mengurangi kebisingan visual
* **Secara otomatis menciutkan input** untuk memaksimalkan ruang percakapan
Pengaturan ini sangat berguna saat bekerja di layar yang lebih kecil atau kalau kamu lebih suka pengalaman chat yang fokus dan bebas distraksi.
## Sebelum dan Sesudah
### Mode bawaan
### Mode ringkas
## Mengaktifkan mode ringkas
Untuk mengaktifkan mode ringkas:
1. Buka Cursor Settings
2. Buka pengaturan **Chat**
3. Aktifkan **Compact Mode**
Antarmuka akan langsung beralih ke tampilan yang lebih ringkas, ngasih kamu lebih banyak ruang buat fokus ke percakapan.
# Duplikat
Source: https://docs.cursor.com/id/agent/chat/duplicate
Bikin branch dari titik mana pun dalam percakapan
Duplikasi/fork chat buat ngeksplor solusi alternatif tanpa kehilangan percakapan yang lagi jalan.
## Cara menduplikasi
1. Tentukan titik tempat kamu mau mulai branch
2. Klik ikon tiga titik pada pesan
3. Pilih "Duplicate Chat"
## Apa yang terjadi
* Konteks sampai titik itu tetap tersimpan
* Percakapan asli tetap apa adanya
* Kedua chat menyimpan riwayatnya masing-masing
# Ekspor
Source: https://docs.cursor.com/id/agent/chat/export
Ekspor obrolan ke format Markdown
Ekspor obrolan Agent sebagai file Markdown untuk dibagikan atau didokumentasikan.
## Apa yang diekspor
* Semua pesan dan respons
* Blok kode dengan penyorotan sintaks
* Referensi file dan konteks
* Alur percakapan secara kronologis
* Klik ikon histori di panel samping Agent
* Tekan Opt Cmd '
## Mengelola chat
* **Edit judul**: Klik untuk mengganti nama
* **Hapus**: Hapus chat yang nggak diperlukan
* **Buka**: Klik untuk meninjau percakapan lengkap
Riwayat chat disimpan secara lokal di database SQLite di mesin kamu.
Biar chat tetap tersimpan, [ekspor](/id/agent/chats/export) sebagai markdown.
## Background Agents
Obrolan background agent nggak muncul di riwayat biasa, tapi disimpan di database remote. Pakai Cmd E buat ngeliatnya.
## Mereferensikan chat sebelumnya
Gunakan [@Past Chats](/id/context/@-symbols/@-past-chats) buat masukin konteks dari percakapan sebelumnya ke chat lo yang sekarang.
# Ringkasan
Source: https://docs.cursor.com/id/agent/chat/summarization
Pengelolaan konteks untuk percakapan panjang di chat
## Perangkuman pesan
Saat percakapan makin panjang, Cursor otomatis meringkas dan mengelola konteks supaya chat tetap efisien. Pelajari cara pakai context menu dan pahami bagaimana file diringkas agar muat dalam window konteks model.
### Menggunakan perintah /summarize
Kamu bisa menjalankan peringkasan secara manual pakai perintah `/summarize` di chat. Perintah ini membantu ngatur konteks saat percakapan jadi terlalu panjang, jadi kamu bisa tetap lanjut kerja dengan efisien tanpa kehilangan info penting.
Buat bahasan lebih mendalam tentang cara kerja konteks di Cursor, cek panduan [Bekerja dengan Konteks](/id/guides/working-with-context).
### Cara kerja peringkasan
Saat percakapan makin panjang, percakapan itu bisa melampaui batas context window model:
User
Cursor
User
Batas context window
Cursor
User
Cursor
Buat ngatasi ini, Cursor meringkas pesan yang lebih lama supaya ada ruang untuk percakapan baru.
Batas context window
Pesan yang Dirangkum
Cursor
User
Cursor
## Kondensasi file & folder
Kalau peringkasan chat ngurusin percakapan panjang, Cursor pakai strategi beda buat nge-handle file dan folder yang besar: **kondensasi cerdas**. Kalau lo nyertakan file dalam percakapan, Cursor bakal nentuin cara terbaik buat nampilin file itu berdasarkan ukurannya dan ruang konteks yang tersedia.
Berikut berbagai status yang bisa dimiliki file/folder:
### Ringkas
Saat file atau folder terlalu besar untuk dimuat dalam jendela konteks, Cursor otomatis meringkasnya. Peringkasan menampilkan ke model elemen struktural penting seperti tanda tangan fungsi, kelas, dan metode. Dari tampilan ringkas ini, model bisa memilih buat memperluas file tertentu kalau diperlukan. Pendekatan ini memaksimalkan pemanfaatan jendela konteks yang tersedia.
### Dipadatkan secara signifikan
Saat nama file muncul dengan label "Dipadatkan secara signifikan", berarti file tersebut terlalu besar untuk disertakan secara penuh, bahkan dalam bentuk ringkas. Hanya nama file yang akan ditampilkan ke model.
Tekan Cmd+T untuk membuat tab baru. Setiap tab punya riwayat percakapan, konteks, dan pilihan modelnya sendiri.
Buat alur kerja paralel, coba [Background Agents](/id/background-agents)
## Mengelola tab
* Bikin tab baru dengan Cmd+T. Setiap tab dimulai dengan percakapan baru dan punya konteksnya sendiri.
* Pindah antartab dengan klik header-nya atau pakai Ctrl+Tab buat ganti tab satu per satu.
* Judul tab dibuat otomatis setelah pesan pertama, tapi lo bisa ganti dengan klik kanan di header tab.
Pakai satu task per tab, kasih deskripsi awal yang jelas, dan tutup tab
yang sudah selesai biar workspace lo tetap rapi.
### Konflik
Cursor mencegah beberapa tab ngedit file yang sama. Lo bakal diminta buat menyelesaikan konflik.
| Mode | Untuk | Kapabilitas | Tools |
| :-------------------- | :-------------------------------- | :--------------------------------------------- | :------------------- |
| **[Agent](#agent)** | Fitur kompleks, refactoring | Eksplorasi otonom, edit multi-file | Semua tools aktif |
| **[Ask](#ask)** | Belajar, perencanaan, tanya-jawab | Eksplorasi read-only, tanpa perubahan otomatis | Tools pencarian saja |
| **[Custom](#custom)** | Workflow khusus | Kapabilitas yang ditentukan pengguna | Bisa dikonfigurasi |
## Agent
Mode bawaan untuk tugas coding yang kompleks. Agent secara otomatis menelusuri codebase, mengedit banyak file, menjalankan perintah, dan memperbaiki error buat nyelesaiin permintaan lo.
## Ask
Mode baca-saja untuk belajar dan eksplorasi. Ask menelusuri codebase lo dan kasih jawaban tanpa bikin perubahan apa pun—pas banget buat paham kode sebelum ngedit.
## Kustom
Bikin mode sendiri dengan kombinasi tool dan instruksi spesifik. Mix and match kapabilitas biar pas sama workflow-mu.
Mode kustom masih beta. Aktifkan di `Cursor Settings` → `Chat` → `Custom
Modes`
### Contoh
**Tools:** All Search\
**Instructions:** Fokus menjelaskan konsep secara menyeluruh dan ajukan pertanyaan klarifikasi
{" "}
**Tools:** Edit & Reapply **Instructions:** Perbaiki struktur kode tanpa
nambah fungsionalitas baru
{" "}
**Tools:** Codebase, Read file, Terminal **Instructions:** Bikin rencana implementasi yang detail di `plan.md`
**Tools:** All Search, Terminal, Edit & Reapply\
**Instructions:** Investigasi masalah secara menyeluruh sebelum ngasih solusi
## Mengganti mode
* Pakai dropdown pemilih mode di Agent
* Tekan Cmd+. untuk beralih cepat
* Atur pintasan keyboard di [settings](#settings)
## Settings
Semua mode punya opsi konfigurasi yang sama:
| Setting | Description |
| :----------------- | :---------------------------------- |
| Model | Pilih model AI yang dipakai |
| Keyboard shortcuts | Set shortcut buat pindah antar mode |
Agent menggunakan tools untuk mencari, mengedit, dan menjalankan perintah. Mulai dari pencarian codebase semantik hingga eksekusi di terminal, tools ini memungkinkan penyelesaian tugas secara otonom.
Cek perubahan sebelum menyetujuinya. Antarmuka peninjauan menampilkan penambahan
dan penghapusan dengan baris berwarna agar kamu bisa mengontrol modifikasi.
Snapshot otomatis ngelacak perubahan Agent. Balikin ke status sebelumnya kalau
perubahan nggak jalan sesuai ekspektasi atau buat nyoba pendekatan lain.
Agent mengeksekusi perintah terminal, memantau output, dan menangani proses
multi-tahap. Atur auto-run untuk alur kerja tepercaya atau minta
konfirmasi demi keamanan.
Tentukan instruksi khusus buat perilaku Agent. Aturan bantu ngejaga standar
penulisan kode, menegakkan pola, dan ngepersonalisasi cara Agent ngebantu
proyek lo.
Agent bisa memecah tugas panjang menjadi langkah-langkah yang mudah dikelola dengan dependensi, sehingga terbentuk rencana terstruktur yang terus diperbarui seiring progres kerja.
### Cara kerja
* Agent otomatis membuat daftar to-do untuk tugas kompleks
* Tiap item bisa punya dependensi pada tugas lain
* Daftar diperbarui secara real-time seiring progres berjalan
* Tugas yang selesai ditandai otomatis
### Visibilitas
* To-do muncul di antarmuka chat
* Kalau [integrasi Slack](/id/slack) disetel, to-do juga keliatan di sana
* Kamu bisa melihat rincian pemecahan tugas lengkap kapan aja
Biar perencanaannya lebih bagus, jelasin tujuan akhirnya dengan jelas. Agent bakal bikin
pemecahan tugas yang lebih akurat kalau paham cakupan penuh.
Perencanaan dan to-do saat ini belum didukung di mode otomatis.
## Pesan dalam antrean
Antre pesan lanjutan sementara Agent ngerjain tugas saat ini. Instruksi lo nunggu di antrean dan jalan otomatis begitu siap.
### Menggunakan antrean
1. Sambil Agent bekerja, ketik instruksi berikutnya
2. Tekan Ctrl+Enter buat nambahkannya ke antrean
3. Pesan muncul berurutan di bawah tugas aktif
4. Ubah urutan pesan yang diantrikan dengan klik panah
5. Agent bakal memprosesnya satu per satu setelah selesai
### Mengabaikan antrean
Buat masukin pesan lo ke antrean alih-alih pakai pengiriman default, gunakan Ctrl+Enter. Buat ngirim pesan langsung tanpa diantrikan, gunakan Cmd+Enter. Ini bakal “memaksa” pesan lo dikirim, ngelewatin antrean supaya langsung dieksekusi.
## Pesan default
Secara default, pesan dikirim secepat mungkin, biasanya muncul tepat setelah Agent selesai menjalankan pemanggilan tool. Ini bikin pengalaman jadi paling responsif.
### Cara kerja pesan default
* Pesan lo bakal digabung ke pesan user terbaru di chat
* Pesan biasanya menempel ke hasil tool dan langsung dikirim begitu siap
* Ini bikin alur percakapan lebih natural tanpa mengganggu kerja Agent saat ini
* Secara default, ini kejadian saat lo menekan Enter sementara Agent lagi bekerja
# Diffs & Review
Source: https://docs.cursor.com/id/agent/review
Tinjau dan kelola perubahan kode yang dihasilkan oleh agen AI
Saat Agent menghasilkan perubahan kode, perubahan tersebut ditampilkan dalam antarmuka review yang menandai penambahan dan penghapusan dengan baris berwarna. Ini memungkinkan kamu meninjau dan menentukan perubahan mana yang diterapkan ke codebase kamu.
Antarmuka review menampilkan perubahan kode dalam format diff yang familiar:
## Diffs
| Type | Meaning | Example |
| :---------------- | :------------------------------ | :---------------------------------------------------------------------------------------------------- |
| **Added lines** | Penambahan kode baru | + const newVariable = 'hello'; |
| **Deleted lines** | Penghapusan kode | - const oldVariable = 'goodbye'; |
| **Context lines** | Kode konteks yang tidak berubah | function example() {} |
## Review
Setelah proses generasi selesai, bakal muncul prompt buat nge-review semua perubahan sebelum lanjut. Ini ngasih gambaran umum tentang apa aja yang bakal diubah.
### Per berkas
Bilah review mengambang bakal muncul di bagian bawah layar, bikin lo bisa:
* **Accept** atau **Reject** perubahan untuk berkas saat ini
* Pindah ke **next file** yang masih punya perubahan tertunda
### Penerimaan selektif
Buat kontrol yang lebih detail:
* Buat nerima sebagian besar perubahan: tolak baris yang nggak diinginkan, lalu klik **Accept all**
* Buat nolak sebagian besar perubahan: terima baris yang diinginkan, lalu klik **Reject all**
## Tinjau perubahan
Di akhir respons agent, klik tombol **Tinjau perubahan** untuk melihat diff lengkap dari perubahan.
# Terminal
Source: https://docs.cursor.com/id/agent/terminal
Jalankan perintah terminal secara otomatis sebagai bagian dari operasi agen
Agen mengeksekusi perintah di terminal native Cursor dengan riwayat yang tetap tersimpan. Klik Skip untuk mengirim Ctrl+C dan menghentikan perintah.
## Pemecahan Masalah
Beberapa tema shell (misalnya Powerlevel9k/Powerlevel10k) bisa mengganggu
output terminal inline. Kalau output perintah kelihatan terpotong atau
salah format, nonaktifkan temanya atau ganti ke prompt yang lebih sederhana saat Agent berjalan.
### Nonaktifkan prompt berat untuk sesi Agent
Pakai variabel lingkungan `CURSOR_AGENT` di konfigurasi shell buat mendeteksi kapan
Agent lagi berjalan dan lewati inisialisasi prompt/tema yang “fancy”.
```zsh theme={null}
# ~/.zshrc — nonaktifkan Powerlevel10k saat Cursor Agent berjalan
if [[ -n "$CURSOR_AGENT" ]]; then
# Lewati inisialisasi tema untuk meningkatkan kompatibilitas
else
[[ -r ~/.p10k.zsh ]] && source ~/.p10k.zsh
fi
```
```bash theme={null}
# ~/.bashrc — gunakan prompt sederhana sebagai cadangan dalam sesi Agent
if [[ -n "$CURSOR_AGENT" ]]; then
PS1='\u@\h \W \$ '
fi
```
# Tools
Source: https://docs.cursor.com/id/agent/tools
Tools yang tersedia untuk agen buat nyari, ngedit, dan ngejalanin kode
Daftar semua tools yang tersedia buat mode di dalam [Agent](/id/agent/overview), yang bisa lo aktifin atau nonaktifin waktu bikin [custom modes](/id/agent/modes#custom) lo sendiri.
Nggak ada batas jumlah panggilan tool yang bisa dilakukan Agent selama suatu tugas. Agent bakal terus pakai tools sesuai kebutuhan sampai permintaan lo kelar.
## Pencarian
Alat untuk menelusuri codebase dan web demi menemukan informasi yang relevan.
Membaca hingga 250 baris (750 dalam mode maksimum) dari sebuah file.
Membaca struktur direktori tanpa membaca isi file.
Melakukan pencarian semantik dalam [codebase
yang terindeks](/id/context/codebase-indexing).
Mencari kata kunci atau pola yang persis di dalam file.
Menemukan file berdasarkan nama menggunakan fuzzy matching.
Membuat kueri pencarian dan melakukan penelusuran web.
Mengambil [rules](/id/context/rules) tertentu berdasarkan tipe dan deskripsinya.
## Edit
Alat buat ngelakuin edit spesifik ke file dan codebase lo.
Ngasih saran edit ke file dan [nge-apply](/id/agent/apply) secara otomatis.
Hapus file secara otomatis (bisa dimatiin di settings).
## Run
Chat bisa berinteraksi langsung dengan terminal lo.
Jalanin perintah terminal dan pantau output-nya.
Secara default, Cursor bakal pakai profil terminal pertama yang tersedia.
Buat ngatur profil terminal yang lo pengin:
1. Buka Command Palette (`Cmd/Ctrl+Shift+P`)
2. Cari "Terminal: Select Default Profile"
3. Pilih profil yang lo mau
## MCP
Chat bisa pakai server MCP yang sudah dikonfigurasi buat berinteraksi dengan layanan eksternal, seperti database atau API pihak ketiga.
Nyalakan/nonaktifkan server MCP yang tersedia. Mengikuti konfigurasi auto-run.
Pelajari lebih lanjut tentang [Model Context Protocol](/id/context/model-context-protocol) dan jelajahi server yang tersedia di [direktori MCP](/id/tools).
## Opsi lanjutan
Terapkan perubahan secara otomatis tanpa konfirmasi manual.
Jalankan perintah terminal dan terima perubahan secara otomatis. Berguna untuk menjalankan test suite dan memverifikasi perubahan.
Konfigurasikan allow list untuk menentukan tool mana yang boleh berjalan otomatis. Allow list meningkatkan keamanan dengan secara eksplisit mendefinisikan operasi yang diizinkan.
Secara otomatis memperbaiki error dan peringatan linter saat ditemui oleh Agent.
# Agen Latar Belakang
Source: https://docs.cursor.com/id/background-agent
Agen jarak jauh asinkron di Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Dengan background agents, spawn agen asinkron yang mengedit dan menjalankan kode di lingkungan remote. Lihat status mereka, kirim tindak lanjut, atau ambil alih kapan saja.
## Cara Menggunakan
Lo bisa akses background agent dengan dua cara:
1. **Background Agent Sidebar**: Pakai tab background agent di sidebar native Cursor buat lihat semua background agent yang terhubung ke akun lo, cari agent yang udah ada, dan mulai yang baru.
2. **Background Agent Mode**: Pencet Cmd E buat ngaktifin background agent mode di UI.
Abis submit prompt, pilih agent lo dari daftar buat lihat status dan masuk ke mesin.
Background agent butuh retensi data selama beberapa hari.
## Setup
Background agent berjalan di mesin Ubuntu terisolasi secara default. Agent punya akses internet dan bisa memasang paket.
#### Koneksi GitHub
Agen latar belakang nge-clone repo lo dari GitHub dan kerja di branch terpisah, terus nge-push ke repo lo biar gampang dioper.
Kasih hak akses read-write ke repo lo (dan repo atau submodule yang jadi dependensi). Kita bakal dukung penyedia lain (GitLab, Bitbucket, dll.) ke depannya.
##### Konfigurasi Daftar Izin IP
Kalau organisasi lo pakai fitur daftar izin IP GitHub, lo perlu ngatur akses buat agen background. Lihat [dokumentasi integrasi GitHub](/id/integrations/github#ip-allow-list-configuration) buat petunjuk setup lengkap, termasuk info kontak dan alamat IP.
#### Penyiapan Lingkungan Dasar
Untuk kasus yang lebih advanced, atur sendiri lingkungannya. Dapatkan instance IDE yang terhubung ke mesin remote. Siapkan mesin kamu, instal tools dan paket, lalu ambil snapshot. Konfigurasikan pengaturan runtime:
* Perintah install berjalan sebelum agent mulai dan memasang dependensi runtime. Ini bisa berarti menjalankan `npm install` atau `bazel build`.
* Terminal menjalankan proses background saat agent bekerja—misalnya menjalankan server web atau mengompilasi file protobuf.
Untuk kasus paling advanced, gunakan Dockerfile untuk penyiapan mesin. Dockerfile memungkinkan kamu menyiapkan dependensi tingkat sistem: memasang versi compiler tertentu, debugger, atau mengganti base OS image. Jangan `COPY` seluruh proyek—kami yang mengelola workspace dan checkout commit yang tepat. Tetap lakukan instalasi dependensi di install script.
Masukkan secrets yang diperlukan untuk lingkungan dev kamu—secrets disimpan terenkripsi at rest (menggunakan KMS) di database kami dan disediakan ke environment agent di background.
Penyiapan mesin ada di `.cursor/environment.json`, yang bisa kamu commit ke repo (direkomendasikan) atau simpan privat. Alur penyiapan akan memandu kamu membuat `environment.json`.
#### Perintah Maintenance
Saat nyiapin mesin baru, kita mulai dari base environment, lalu jalanin perintah `install` dari `environment.json` lo. Perintah ini yang biasa dijalanin developer saat pindah branch—buat install dependency baru.
Buat kebanyakan orang, perintah `install` itu `npm install` atau `bazel build`.
Biar startup mesin cepet, kita nge-cache state disk setelah perintah `install` jalan. Rancang biar bisa dijalanin berkali-kali. Cuma state disk yang ke-persist dari perintah `install`—proses yang dimulai di sini nggak bakal hidup waktu agent mulai.
#### Perintah Startup
Setelah menjalankan `install`, mesin akan menyala dan kita menjalankan perintah `start`, lalu menyalakan semua `terminals`. Ini memulai proses yang harus tetap berjalan saat agen aktif.
Perintah `start` sering bisa dilewati. Pakai ini kalau environment dev kamu bergantung pada Docker—taruh `sudo service docker start` di perintah `start`.
`terminals` dipakai untuk kode aplikasi. Terminal-terminal ini berjalan dalam sesi `tmux` yang bisa diakses kamu dan agen. Misalnya, banyak repo website menaruh `npm run watch` sebagai sebuah terminal.
#### Spesifikasi `environment.json`
File `environment.json` bisa berbentuk seperti:
```json theme={null}
{
"snapshot": "POPULATED_FROM_SETTINGS",
"install": "npm install",
"terminals": [
{
"name": "Menjalankan Next.js",
"command": "npm run dev"
}
]
}
```
Secara formal, spesifikasinya [didefinisikan di sini](https://www.cursor.com/schemas/environment.schema.json).
## Model
Hanya model yang kompatibel dengan [Max Mode](/id/context/max-mode) yang tersedia untuk agen background.
## Harga
Pelajari lebih lanjut tentang [penetapan harga Background Agent](/id/account/pricing#background-agent).
## Keamanan
Background Agents tersedia dalam Privacy Mode. Kami nggak pernah melatih model pakai kode lo dan cuma nyimpen kode buat ngejalanin agent. [Pelajari lebih lanjut tentang Privacy Mode](https://www.cursor.com/privacy-overview).
Hal yang perlu lo tahu:
1. Kasih hak akses read-write ke app GitHub kami untuk repo yang mau lo edit. Ini dipakai buat nge-clone repo dan nge-apply perubahan.
2. Kode lo jalan di infrastruktur AWS kami dalam VM yang terisolasi dan disimpan di disk VM selama agent masih aktif.
3. Agent punya akses internet.
4. Agent otomatis ngejalanin semua perintah terminal, biar bisa iterasi di pengujian. Ini beda dari foreground agent, yang butuh persetujuan user untuk setiap perintah. Auto-run bisa memperkenalkan risiko kebocoran data: penyerang bisa ngejalanin prompt injection, ngejebak agent buat mengunggah kode ke situs berbahaya. Lihat [penjelasan OpenAI tentang risiko prompt injection untuk background agents](https://platform.openai.com/docs/codex/agent-network#risks-of-agent-internet-access).
5. Kalau Privacy Mode dimatikan, kami ngumpulin prompt dan environment dev buat ningkatin produk.
6. Kalau lo matiin Privacy Mode saat mulai background agent, lalu lo nyalain lagi di tengah jalan, agent bakal lanjut dengan Privacy Mode nonaktif sampai selesai.
## Pengaturan dashboard
Admin workspace bisa mengonfigurasi pengaturan tambahan lewat tab Background Agents di dashboard.
### Pengaturan Default
* **Model default** – model yang dipakai saat sebuah run nggak nentuin model. Pilih model apa pun yang mendukung Max Mode.
* **Repositori default** – kalau kosong, agen bakal minta pengguna milih repo. Ngisi repo di sini bikin pengguna bisa lewatin langkah itu.
* **Branch dasar** – branch yang jadi asal fork agen saat bikin pull request. Biarkan kosong untuk pakai branch default repositori.
### Pengaturan Keamanan
Semua opsi keamanan butuh privilese admin.
* **Pembatasan pengguna** – pilih *Tidak ada* (semua member bisa mulai agen latar belakang) atau *Allow list*. Kalau diset ke *Allow list*, lo nentuin persis siapa aja rekan tim yang boleh bikin agen.
* **Tindak lanjut tim** – kalau aktif, siapa pun di workspace bisa nambah pesan tindak lanjut ke agen yang dimulai orang lain. Matikan untuk ngebates tindak lanjut cuma ke pemilik agen dan admin.
* **Tampilkan ringkasan agen** – ngatur apakah Cursor nampilin gambar file-diff dan potongan kode agen. Nonaktifkan ini kalau lo nggak mau nge-ekspose path file atau kode di sidebar.
* **Tampilkan ringkasan agen di kanal eksternal** – memperluas toggle sebelumnya ke Slack atau kanal eksternal apa pun yang udah lo sambungin.
Perubahan kesimpen instan dan langsung ngefek ke agen baru.
# Tambahkan Tindak Lanjut
Source: https://docs.cursor.com/id/background-agent/api/add-followup
en/background-agent/api/openapi.yaml post /v0/agents/{id}/followup
Kirim instruksi tambahan ke agen latar belakang yang sedang berjalan.
# Percakapan Agen
Source: https://docs.cursor.com/id/background-agent/api/agent-conversation
en/background-agent/api/openapi.yaml get /v0/agents/{id}/conversation
Ambil riwayat percakapan dari agen latar.
Kalau agen latar sudah dihapus, kamu nggak bisa lagi mengakses percakapannya.
# Status Agen
Source: https://docs.cursor.com/id/background-agent/api/agent-status
en/background-agent/api/openapi.yaml get /v0/agents/{id}
Dapatkan status dan hasil saat ini dari agen latar belakang tertentu.
# Informasi Kunci API
Source: https://docs.cursor.com/id/background-agent/api/api-key-info
en/background-agent/api/openapi.yaml get /v0/me
Mengambil metadata tentang kunci API yang digunakan untuk autentikasi.
# Hapus Agen
Source: https://docs.cursor.com/id/background-agent/api/delete-agent
en/background-agent/api/openapi.yaml delete /v0/agents/{id}
Hapus agen latar belakang beserta sumber daya terkait secara permanen.
# Meluncurkan Agent
Source: https://docs.cursor.com/id/background-agent/api/launch-an-agent
en/background-agent/api/openapi.yaml post /v0/agents
Mulai agent latar belakang baru untuk bekerja di repositorimu.
# Daftar Agen
Source: https://docs.cursor.com/id/background-agent/api/list-agents
en/background-agent/api/openapi.yaml get /v0/agents
Mengambil daftar berhalaman dari semua agen latar belakang untuk pengguna yang diautentikasi.
# Daftar Model
Source: https://docs.cursor.com/id/background-agent/api/list-models
en/background-agent/api/openapi.yaml get /v0/models
Ambil daftar model yang direkomendasikan untuk background agent.
Kalau kamu mau menetapkan model background agent saat pembuatan, kamu bisa pakai endpoint ini untuk melihat daftar model yang direkomendasikan.
Dalam kasus itu, kami juga menyarankan menyediakan opsi "Auto", di mana kamu nggak mengirimkan nama model ke endpoint pembuatan,
dan kami akan memilih model yang paling sesuai.
# Daftar Repositori GitHub
Source: https://docs.cursor.com/id/background-agent/api/list-repositories
en/background-agent/api/openapi.yaml get /v0/repositories
Ambil daftar repositori GitHub yang bisa diakses oleh pengguna terautentikasi.
**Endpoint ini punya rate limit yang sangat ketat.**
Batasin request ke **1 / pengguna / menit**, dan **30 / pengguna / jam.**
Request ini bisa butuh puluhan detik buat ngerespons kalau pengguna punya akses ke banyak repositori.
Pastikan lo nangani kondisi saat informasi ini nggak tersedia dengan baik.
# Ikhtisar
Source: https://docs.cursor.com/id/background-agent/api/overview
Buat dan kelola agent latar belakang yang bekerja di repositori kamu secara terprogram
# Background Agents API
Beta
Background Agents API memungkinkan lo bikin dan ngelola agen coding bertenaga AI secara terprogram yang bekerja secara otonom di repositori lo.
Lo bisa pakai API ini buat otomatis nanggepin masukan pengguna, benerin bug, update dokumentasi, dan banyak lagi!
Background Agents API saat ini masih beta, kami bakal seneng banget nerima masukan dari lo!
## Fitur utama
* **Pembuatan kode otonom** - Bikin agen yang bisa paham prompt lo dan ngeubah codebase lo
* **Integrasi repository** - Kerja langsung dengan repository GitHub
* Follow-up prompt - Tambahin instruksi tambahan ke agen yang lagi jalan
* **Harga berbasis penggunaan** - Bayar cuma buat token yang lo pakai
* **Skalabel** - Dukungan sampai 256 agen aktif per API key
## Mulai cepat
### 1. Dapatkan kunci API-mu
**Buka** [Cursor Dashboard → Integrations](https://cursor.com/dashboard?tab=integrations) untuk membuat kunci API-mu.
### 2. Mulai pakai API
Semua endpoint API relatif terhadap:
```
https://api.cursor.com
```
Lihat [referensi API](/id/background-agent/api/launch-an-agent) buat daftar endpoint yang lengkap.
## Autentikasi
Semua request API perlu autentikasi dengan token Bearer:
```
Authorization: Bearer KUNCI_API_LO
```
Kunci API dibuat di [Cursor Dashboard](https://cursor.com/dashboard?tab=integrations). Kunci ini terikat ke akun lo dan memberi izin untuk membuat serta mengelola agent (tergantung batas paket lo dan akses repositori).
## Harga
API saat ini masih dalam beta dengan harga yang sama seperti Background Agents. Harga bisa berubah seiring pertumbuhan layanan. Lihat [harga Background Agent](/id/account/pricing#background-agent).
## Langkah berikutnya
* Baca [ikhtisar utama Background Agents](/id/background-agent) untuk memahami environment, permissions, dan workflows.
* Coba Background Agents di [web & mobile](/id/background-agent/web-and-mobile).
* Gabung diskusi di [Discord #background-agent](https://discord.gg/jfgpZtYpmb) atau kirim email ke [background-agent-feedback@cursor.com](mailto:background-agent-feedback@cursor.com).
# Webhooks
Source: https://docs.cursor.com/id/background-agent/api/webhooks
Dapatkan notifikasi real-time tentang perubahan status agen latar belakang
# Webhooks
Saat bikin agent dengan URL webhook, Cursor bakal ngirim request HTTP POST buat ngasih tahu perubahan status. Saat ini, cuma event `statusChange` yang didukung, khususnya ketika agent masuk ke state `ERROR` atau `FINISHED`.
## Verifikasi webhook
Biar yakin request webhook benar-benar dari Cursor, verifikasi signature yang disertakan di setiap request:
### Headers
Setiap request webhook menyertakan header berikut:
* **`X-Webhook-Signature`** – Berisi signature HMAC-SHA256 dengan format `sha256=`
* **`X-Webhook-ID`** – Identifier unik untuk delivery ini (berguna buat logging)
* **`X-Webhook-Event`** – Jenis event (saat ini hanya `statusChange`)
* **`User-Agent`** – Selalu di-set ke `Cursor-Agent-Webhook/1.0`
### Verifikasi signature
Buat verifikasi signature webhook, hitung signature yang diharapkan lalu bandingkan dengan signature yang diterima:
```javascript theme={null}
const crypto = require('crypto');
function verifyWebhook(secret, rawBody, signature) {
const expectedSignature = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return signature === expectedSignature;
}
```
```python theme={null}
import hmac
import hashlib
def verify_webhook(secret, raw_body, signature):
expected_signature = 'sha256=' + hmac.new(
secret.encode(),
raw_body,
hashlib.sha256
).hexdigest()
return signature == expected_signature
```
Selalu gunakan body request mentah (sebelum pemrosesan atau parsing apa pun) saat menghitung signature.
## Format payload
Payload webhook dikirim dalam bentuk JSON dengan struktur berikut:
```json theme={null}
{
"event": "statusChange",
"timestamp": "2024-01-15T10:30:00Z",
"id": "bc_abc123",
"status": "FINISHED",
"source": {
"repository": "https://github.com/your-org/your-repo",
"ref": "main"
},
"target": {
"url": "https://cursor.com/agents?id=bc_abc123",
"branchName": "cursor/add-readme-1234",
"prUrl": "https://github.com/your-org/your-repo/pull/1234"
},
"summary": "Menambahkan README.md berisi panduan instalasi"
}
```
Perlu dicatat, beberapa field itu opsional dan cuma bakal disertakan kalau tersedia.
## Praktik terbaik
* **Verifikasi signature** – Selalu verifikasi signature webhook buat memastikan permintaan itu dari Cursor
* **Tangani retry** – Webhook bisa dicoba ulang kalau endpoint kamu ngembaliin status code error
* **Balas cepat** – Balikin status code 2xx secepat mungkin
* **Pakai HTTPS** – Selalu pakai URL HTTPS buat endpoint webhook di production
* **Simpan payload mentah** – Simpan payload webhook mentah buat debugging dan verifikasi ke depannya
# Web & Mobile
Source: https://docs.cursor.com/id/background-agent/web-and-mobile
Jalankan agen coding dari perangkat apa pun dengan handoff mulus ke desktop
## Gambaran Umum
Agent Cursor di web menghadirkan asisten coding yang powerful ke setiap perangkat. Baik lagi pakai HP sambil jalan, atau kerja di browser, sekarang kamu bisa ngejalanin agent coding powerfull yang bekerja di latar belakang.
Begitu selesai, lanjutkan hasil kerja mereka di Cursor, review dan merge perubahan, atau bagikan tautan ke tim buat kolaborasi.
Mulai di [cursor.com/agents](https://cursor.com/agents).
## Memulai
### Penyiapan cepat
1. **Kunjungi web app**: Buka [cursor.com/agents](https://cursor.com/agents) di perangkat apa pun
2. **Masuk**: Login dengan akun Cursor
3. **Hubungkan GitHub**: Tautkan akun GitHub buat akses repositori
4. **Mulai agent pertamamu**: Ketik tugas dan lihat agent mulai bekerja
### Instalasi mobile
Biar pengalaman mobile maksimal, install Cursor sebagai Progressive Web App (PWA):
* **iOS**: Buka [cursor.com/agents](https://cursor.com/agents) di Safari, ketuk tombol bagikan, lalu "Add to Home Screen"
* **Android**: Buka URL di Chrome, ketuk menu, lalu "Add to Home Screen" atau "Install App"
Menginstal sebagai PWA memberikan pengalaman mirip native dengan: - Antarmuka layar penuh - Waktu mulai lebih cepat - Ikon app di layar beranda
## Bekerja lintas perangkat
Web dan Mobile Agent dirancang buat nyatu sama alur kerja desktop lo; klik "Open in Cursor" buat nerusin kerja agent di IDE lo.
### Kolaborasi tim
* **Akses bersama**: Share tautan ke anggota tim buat kolaborasi di run agent.
* **Proses review**: Kolaborator bisa nge-review diff dan ngasih feedback.
* **Manajemen pull request**: Bikin, review, dan merge pull request langsung dari antarmuka web.
### Integrasi Slack
Trigger agent langsung dari Slack dengan nyebut `@Cursor`, dan pas mulai agent dari web atau mobile, pilih buat nerima notifikasi Slack setelah selesai.
Pelajari lebih lanjut soal nyetel dan pakai integrasi Slack, termasuk
nge-trigger agent dan nerima notifikasi.
## Harga
Agen web dan mobile pakai model harga yang sama seperti Background Agents.
Pelajari lebih lanjut tentang [harga Background Agent](/id/account/pricing#background-agent).
## Pemecahan masalah
* Pastikan lo udah login dan udah nyambungin akun GitHub lo. - Cek
kalau lo punya permission repository yang diperlukan - Lo juga perlu
ada di Pro Trial atau paket berbayar dengan usage-based pricing diaktifin. Buat ngaktifin
usage-based pricing, buka tab settings di
[Dashboard](https://www.cursor.com/dashboard?tab=settings).
Coba refresh halaman atau bersihin cache browser. Pastikan lo pakai
akun yang sama di semua perangkat.
Pastikan admin workspace lo udah install app Cursor Slack dan
lo punya permission yang sesuai.
# Bugbot
Source: https://docs.cursor.com/id/bugbot
Tinjauan kode AI untuk pull request
Bugbot meninjau pull request dan mengidentifikasi bug, isu keamanan, dan masalah kualitas kode.
Bugbot punya paket gratis: setiap user dapat jatah tinjauan PR gratis tiap bulan. Saat mencapai batas, tinjauan akan dijeda sampai siklus penagihan berikutnya. Lo bisa upgrade kapan aja ke uji coba Pro gratis 14 hari untuk tinjauan tanpa batas (dengan guardrail anti-penyalahgunaan standar).
## Cara kerjanya
Bugbot menganalisis diff PR dan meninggalkan komentar berisi penjelasan serta saran perbaikan. Ini berjalan otomatis di setiap pembaruan PR atau bisa dijalankan manual saat dipicu.
* Menjalankan **review otomatis** di setiap pembaruan PR
* **Pemicu manual** dengan komentar `cursor review` atau `bugbot run` di PR mana pun
* Tautan **Fix in Cursor** membuka issue langsung di Cursor
* Tautan **Fix in Web** membuka issue langsung di [cursor.com/agents](https://cursor.com/agents)
## Setup
Butuh akses admin Cursor dan admin untuk organisasi GitHub.
1. Buka [cursor.com/dashboard](https://cursor.com/dashboard?tab=bugbot)
2. Buka tab Bugbot
3. Klik `Connect GitHub` (atau `Manage Connections` kalau sudah terhubung)
4. Ikuti alur instalasi GitHub
5. Balik ke dashboard untuk mengaktifkan Bugbot di repositori tertentu
## Konfigurasi
### Pengaturan repositori
Aktifkan atau nonaktifkan Bugbot per repositori dari daftar instalasi lo. Bugbot cuma jalan di PR yang lo bikin.
### Pengaturan personal
* Jalan **hanya kalau disebut** dengan komentar `cursor review` atau `bugbot run`
* Jalan **hanya sekali** per PR, ngelewatin commit berikutnya
### Pengaturan repositori
Admin tim bisa ngaktifin Bugbot per repositori, nyetel allow/deny list buat reviewer, dan ngatur:
* Jalan **hanya sekali** per PR per instalasi, ngelewatin commit berikutnya
* **Nonaktifkan inline review** biar Bugbot gak ninggalin komentar langsung di baris kode
Bugbot jalan buat semua kontributor di repositori yang diaktifkan, terlepas dari keanggotaan tim.
### Pengaturan personal
Anggota tim bisa override pengaturan buat PR mereka sendiri:
* Jalan **hanya kalau disebut** dengan komentar `cursor review` atau `bugbot run`
* Jalan **hanya sekali** per PR, ngelewatin commit berikutnya
* **Aktifkan review di draft PR** buat nyertain draft pull request dalam review otomatis
### Analitik
## Aturan
Buat file `.cursor/BUGBOT.md` untuk ngasih konteks spesifik proyek buat review. Bugbot selalu nyertakan file `.cursor/BUGBOT.md` di root dan file tambahan apa pun yang ketemu saat menelusuri naik dari file yang diubah.
```
project/
.cursor/BUGBOT.md # Selalu disertakan (aturan tingkat proyek)
backend/
.cursor/BUGBOT.md # Disertakan saat meninjau file backend
api/
.cursor/BUGBOT.md # Disertakan saat meninjau file API
frontend/
.cursor/BUGBOT.md # Disertakan saat meninjau file frontend
```
```markdown theme={null}
# Pedoman peninjauan proyek
## Fokus keamanan
- Validasi input pengguna di endpoint API
- Periksa kerentanan SQL injection dalam kueri database
- Pastikan autentikasi yang benar pada rute yang dilindungi
## Pola arsitektur
- Gunakan dependency injection untuk layanan
- Ikuti pola repository untuk akses data
- Terapkan penanganan error yang tepat dengan kelas error kustom
## Masalah umum
- Kebocoran memori di komponen React (cek cleanup di useEffect)
- Tidak ada error boundary di komponen UI
- Konvensi penamaan tidak konsisten (gunakan camelCase untuk fungsi)
```
## Harga
Bugbot menawarkan dua paket: **Gratis** dan **Pro**.
### Paket gratis
Setiap user dapat jatah terbatas untuk review PR gratis tiap bulan. Buat tim, tiap anggota tim punya jatah review gratisnya sendiri. Begitu nyentuh batas, review bakal ke-pause sampai siklus penagihan berikutnya. Kamu bisa upgrade kapan aja ke uji coba Pro 14 hari gratis buat review tanpa batas.
### Paket Pro
### Tarif tetap
\$40 per bulan untuk review Bugbot tanpa batas pada hingga 200 PR per bulan di semua repositori.
### Memulai
Berlangganan lewat pengaturan akun.
### Penagihan per pengguna
Tim membayar \$40 per pengguna per bulan untuk review tanpa batas.
Kami menganggap pengguna sebagai seseorang yang membuat PR yang direview oleh Bugbot dalam satu bulan.
Semua lisensi dilepas di awal setiap siklus penagihan, dan akan dialokasikan berdasarkan urutan pendaftaran. Kalau seorang pengguna nggak membuat PR apa pun yang direview oleh Bugbot dalam satu bulan, kursi tersebut bisa dipakai oleh pengguna lain.
### Batas kursi
Admin tim bisa menetapkan jumlah maksimum kursi Bugbot per bulan untuk mengontrol biaya.
### Memulai
Berlangganan lewat dasbor tim untuk mengaktifkan penagihan.
### Pembatasan penyalahgunaan
Untuk mencegah penyalahgunaan, kami punya batas gabungan 200 pull request per bulan untuk setiap lisensi Bugbot. Kalau kamu butuh lebih dari 200 pull request per bulan, hubungi kami di [hi@cursor.com](mailto:hi@cursor.com) dan kami dengan senang hati bakal bantu.
Misalnya, kalau tim kamu punya 100 pengguna, organisasi kamu awalnya bisa mereview 20.000 pull request per bulan. Kalau kamu mencapai batas itu secara natural, silakan hubungi kami dan kami dengan senang hati akan menaikkan batasnya.
## Pemecahan Masalah
Kalau Bugbot nggak jalan:
1. **Aktifin mode verbose** dengan nge-comment `cursor review verbose=true` atau `bugbot run verbose=true` buat log detail dan request ID
2. **Cek permissions** buat mastihin Bugbot punya akses ke repository
3. **Cek instalasi** buat mastihin GitHub app ke-install dan aktif
Sertakan request ID dari mode verbose waktu ngelaporin masalah.
## FAQ
Ya, Bugbot mengikuti kepatuhan privasi yang sama seperti Cursor dan memproses data dengan cara yang sama seperti permintaan Cursor lainnya.
Saat kamu mencapai batas paket gratis bulanan, peninjauan Bugbot akan dijeda sampai siklus penagihan berikutnya. Kamu bisa upgrade ke uji coba Pro gratis 14 hari untuk peninjauan tanpa batas (dengan perlindungan penyalahgunaan standar).
```
```
# Code Review
Source: https://docs.cursor.com/id/cli/cookbook/code-review
Bangun workflow GitHub Actions yang menggunakan Cursor CLI untuk secara otomatis meninjau pull request dan memberikan masukan
Tutorial ini nunjukin cara nyetel code review pakai Cursor CLI di GitHub Actions. Workflow-nya bakal menganalisis pull request, nemuin masalah, dan ngepost masukan sebagai komentar.
Buat kebanyakan pengguna, kami nyaranin pakai [Bugbot](/id/bugbot) aja. Bugbot ngasih automated code review terkelola tanpa perlu setup. Pendekatan CLI ini berguna buat ngejelajahi kapabilitas dan kustomisasi tingkat lanjut.
```yaml cursor-code-review.yml theme={null}
name: Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
pull-requests: write
contents: read
issues: write
jobs:
code-review:
runs-on: ubuntu-latest
# Lewati tinjauan kode otomatis untuk PR draft
if: github.event.pull_request.draft == false
steps:
- name: Checkout repositori
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Pasang Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Konfigurasikan identitas git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Lakukan tinjauan kode otomatis
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BLOCKING_REVIEW: ${{ vars.BLOCKING_REVIEW || 'false' }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print 'Kamu berjalan di runner GitHub Actions untuk melakukan tinjauan kode otomatis. gh CLI tersedia dan telah diautentikasi lewat GH_TOKEN. Kamu boleh berkomentar di pull request.
Konteks:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
- Tinjauan yang Memblokir: ${{ env.BLOCKING_REVIEW }}
Tujuan:
1) Cek ulang komentar tinjauan yang sudah ada dan balas resolved saat sudah ditangani.
2) Tinjau diff PR saat ini dan tandai hanya isu yang jelas dengan tingkat keparahan tinggi.
3) Tinggalkan komentar inline yang sangat singkat (1–2 kalimat) hanya pada baris yang diubah, plus ringkasan singkat di akhir.
Prosedur:
- Ambil komentar yang ada: gh pr view --json comments
- Ambil diff: gh pr diff
- Ambil file yang berubah beserta patch untuk menghitung posisi inline: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --paginate --jq '.[] | {filename,patch}'
- Hitung anchor inline yang tepat untuk tiap isu (path file + posisi diff). Komentar HARUS ditempatkan inline pada baris yang diubah di diff, bukan sebagai komentar tingkat atas.
- Deteksi komentar tingkat atas sebelumnya bergaya "tidak ada isu" yang dibuat oleh bot ini (cocokkan isi seperti: "✅ no issues", "No issues found", "LGTM").
- Jika run SAAT INI menemukan isu dan ada komentar "tidak ada isu" sebelumnya:
- Lebih baik hapus untuk menghindari kebingungan:
- Coba hapus komentar tingkat atas itu via: gh api -X DELETE repos/${{ github.repository }}/issues/comments/
- Jika penghapusan tidak memungkinkan, minimalkan via GraphQL (minimizeComment) atau edit dengan menambahkan awalan "[Digantikan oleh temuan baru]".
- Jika tidak bisa dihapus atau diminimalkan, balas komentar itu: "⚠️ Digantikan: isu ditemukan pada commit yang lebih baru".
- Jika isu yang dilaporkan sebelumnya tampak sudah diperbaiki oleh perubahan terbaru di sekitarnya, balas: ✅ Isu ini tampaknya telah terselesaikan oleh perubahan terbaru
- Analisis HANYA untuk:
- Dereferensi null/undefined
- Kebocoran sumber daya (file atau koneksi tidak ditutup)
- Injeksi (SQL/XSS)
- Concurrency/race condition
- Kurangnya penanganan error untuk operasi kritis
- Kesalahan logika yang jelas dengan perilaku tidak benar
- Pola antiperkinerja yang jelas dengan dampak terukur
- Kerentanan keamanan yang pasti
- Hindari duplikasi: lewati jika umpan balik serupa sudah ada pada atau dekat baris yang sama.
Aturan komentar:
- Maks 10 komentar inline total; prioritaskan isu yang paling kritis
- Satu isu per komentar; tempatkan tepat pada baris yang diubah
- Semua komentar isu HARUS inline (ditautkan ke file dan baris/posisi di diff PR)
- Nada natural, spesifik, dan actionable; jangan sebut otomatis atau tingkat kepercayaan tinggi
- Gunakan emoji: 🚨 Kritis 🔒 Keamanan ⚡ Performa ⚠️ Logika ✅ Terselesaikan ✨ Peningkatan
Pengiriman:
- Jika TIDAK ada isu untuk dilaporkan dan komentar tingkat atas yang menyatakan "tidak ada isu" sudah ada (misalnya, "✅ no issues", "No issues found", "LGTM"), JANGAN kirim komentar baru. Lewati pengiriman untuk menghindari redundansi.
- Jika TIDAK ada isu untuk dilaporkan dan TIDAK ada komentar "tidak ada isu" sebelumnya, kirim satu komentar ringkas yang menyatakan tidak ada isu.
- Jika ADA isu untuk dilaporkan dan ada komentar "tidak ada isu" sebelumnya, pastikan komentar sebelumnya dihapus/diminimalkan/diberi tanda sudah digantikan sebelum mengirim tinjauan baru.
- Jika ADA isu untuk dilaporkan, kirim SATU tinjauan yang HANYA berisi komentar inline plus ringkasan singkat opsional. Gunakan GitHub Reviews API untuk memastikan komentar bersifat inline:
- Bangun array JSON komentar seperti: [{ "path": "", "position": , "body": "..." }]
- Kirim lewat: gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews -f event=COMMENT -f body="$SUMMARY" -f comments='[$COMMENTS_JSON]'
- JANGAN gunakan: gh pr review --approve atau --request-changes
Perilaku pemblokiran:
- Jika BLOCKING_REVIEW bernilai true dan ada isu 🚨 atau 🔒 yang diposting: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Jika tidak: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Selalu set CRITICAL_ISSUES_FOUND di akhir
'
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Memeriksa isu kritis..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Isu kritis ditemukan dan peninjauan pemblokiran diaktifkan. Menggagalkan workflow."
exit 1
else
echo "✅ Tidak ada isu yang memblokir."
fi
```
## Konfigurasi autentikasi
[Siapkan API key dan secret repositori](/id/cli/github-actions#authentication) untuk mengautentikasi Cursor CLI di GitHub Actions.
## Menyiapkan izin agen
Bikin file konfigurasi buat ngontrol tindakan yang bisa dilakukan agen. Ini mencegah operasi yang nggak diinginkan seperti nge-push kode atau bikin pull request.
Bikin `.cursor/cli.json` di root repositori lo:
```json theme={null}
{
"izin": {
"tolak": [
"Shell(git push)",
"Shell(gh pr create)",
"Tulis(**)"
]
}
}
```
Konfigurasi ini bikin agent bisa baca file dan pakai GitHub CLI buat komentar, tapi ngeblok dia buat ngubah apa pun di repositori lo. Lihat [permissions reference](/id/cli/reference/permissions) buat opsi konfigurasi lainnya.
## Bangun workflow GitHub Actions
Sekarang kita bangun workflow-nya langkah demi langkah.
### Setel trigger workflow
Bikin `.github/workflows/cursor-code-review.yml` dan konfigurasikan supaya jalan saat ada pull request:
```yaml theme={null}
name: Tinjauan Kode Cursor
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
```
### Checkout repositori
Tambahkan langkah checkout untuk mengakses kode pada pull request:
```yaml theme={null}
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
```
Sebelum nerapin langkah full review, yuk pahami anatomi review prompt kita. Bagian ini ngejelasin gimana kita pengin agent berperilaku:
**Objective**:
Kita pengin agent nge-review PR diff saat ini dan cuma nandain isu yang jelas dengan tingkat keparahan tinggi, lalu ninggalin komentar inline yang sangat singkat (1–2 kalimat) hanya di baris yang berubah, dengan ringkasan singkat di akhir. Ini bantu jaga rasio signal-to-noise tetap seimbang.
**Format**:
Kita pengin komentar yang pendek dan to the point. Kita pakai emoji biar nge-scan komentar lebih gampang, dan kita mau ringkasan high-level dari full review di bagian akhir.
**Submission**:
Saat review selesai, kita pengin agent nyertakan komentar pendek berdasarkan temuan selama review. Agent harus submit satu review yang berisi komentar inline plus ringkasan yang ringkas.
**Edge cases**:
Kita perlu nangani:
* Komentar yang sudah ada dan udah diselesaikan: agent harus nandain sebagai selesai ketika sudah di-address
* Hindari duplikasi: agent harus skip komentar kalau feedback serupa sudah ada di atau dekat baris yang sama
**Final prompt**:
Prompt lengkap ini nggabungin semua requirement perilaku buat bikin feedback yang fokus dan bisa ditindaklanjuti
Sekarang yuk implement langkah review agent:
```yaml theme={null}
- name: Lakukan code review
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ github.token }}
run: |
cursor-agent --force --model "$MODEL" --output-format=text --print "Kamu berjalan di GitHub Actions runner yang melakukan code review otomatis. gh CLI tersedia dan sudah diautentikasi via GH_TOKEN. Kamu boleh berkomentar di pull request.
Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- PR Head SHA: ${{ github.event.pull_request.head.sha }}
- PR Base SHA: ${{ github.event.pull_request.base.sha }}
Objectives:
1) Cek ulang komentar review yang sudah ada dan balas resolved kalau sudah ditangani
2) Review diff PR saat ini dan tandai hanya isu yang jelas dengan tingkat keparahan tinggi
3) Tinggalkan komentar inline yang sangat singkat (1–2 kalimat) hanya pada baris yang berubah, plus ringkasan singkat di akhir
Procedure:
- Dapatkan komentar yang ada: gh pr view --json comments
- Dapatkan diff: gh pr diff
- Jika isu yang dilaporkan sebelumnya tampak sudah diperbaiki oleh perubahan di sekitarnya, balas: ✅ Isu ini tampaknya sudah terselesaikan oleh perubahan terbaru
- Hindari duplikasi: lewati jika umpan balik serupa sudah ada pada atau dekat baris yang sama
Commenting rules:
- Maksimal 10 komentar inline total; prioritaskan isu yang paling kritis
- Satu isu per komentar; tempatkan tepat pada baris yang berubah
- Nada santai, spesifik, dan dapat ditindaklanjuti; jangan sebutkan otomatis atau tingkat keyakinan tinggi
- Gunakan emoji: 🚨 Kritis 🔒 Keamanan ⚡ Performa ⚠️ Logika ✅ Terselesaikan ✨ Peningkatan
Submission:
- Kirim satu review yang berisi komentar inline plus ringkasan singkat
- Hanya gunakan: gh pr review --comment
- Jangan gunakan: gh pr review --approve atau --request-changes"
```
```text theme={null}
.
├── .cursor/
│ └── cli.json
├── .github/
│ └── workflows/
│ └── cursor-code-review.yml
```
## Tes reviewer lo
Bikin pull request percobaan buat ngecek workflow-nya jalan dan agen ngepost komentar review dengan feedback emoji.
## Langkah berikutnya
Sekarang kamu sudah punya sistem code review otomatis yang berfungsi. Pertimbangkan peningkatan berikut:
* Siapkan workflow tambahan untuk [memperbaiki kegagalan CI](/id/cli/cookbook/fix-ci)
* Konfigurasikan level review yang berbeda untuk branch yang berbeda
* Integrasikan dengan proses code review tim kamu yang sudah ada
* Kustomisasi perilaku agent untuk tipe file atau direktori yang berbeda
Kamu bisa mengonfigurasi workflow agar gagal kalau ditemukan isu kritis, sehingga pull request nggak bisa di-merge sampai ditangani.
**Tambahkan perilaku blocking ke prompt**
Pertama, update langkah review agent kamu untuk menyertakan variabel lingkungan `BLOCKING_REVIEW` dan tambahkan perilaku blocking ini ke prompt:
```
Blocking behavior:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
```
**Tambahkan langkah pemeriksaan blocking**
Lalu tambahkan langkah baru ini setelah langkah code review kamu:
```yaml theme={null}
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
# Perbaiki Kegagalan CI
Source: https://docs.cursor.com/id/cli/cookbook/fix-ci
Perbaiki masalah CI untuk sebuah repositori dengan Cursor CLI di GitHub Actions
Perbaiki kegagalan CI menggunakan Cursor CLI di GitHub Actions. Workflow ini menganalisis kegagalan, melakukan perbaikan terarah, dan membuat branch perbaikan dengan tautan PR quick-create.
Workflow ini memantau workflow tertentu berdasarkan nama. Perbarui daftar `workflows` agar sesuai dengan nama workflow CI yang sebenarnya.
```yaml auto-fix-ci.yml theme={null}
name: Fix CI Failures
on:
workflow_run:
workflows: [Test]
types: [completed]
permissions:
contents: write
pull-requests: write
actions: read
jobs:
attempt-fix:
if: >-
${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.name != 'Fix CI Failures' }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Fix CI failure
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: ci-fix
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- Workflow Run ID: ${{ github.event.workflow_run.id }}
- Workflow Run URL: ${{ github.event.workflow_run.html_url }}
- Fix Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end CI fix flow driven by the failing PR, creating a separate persistent fix branch and proposing a quick-create PR back into the original PR's branch.
# Requirements:
1) Identify the PR associated with the failed workflow run and determine its base and head branches. Let HEAD_REF be the PR's head branch (the contributor/origin branch).
2) Maintain a persistent fix branch for this PR head using the Fix Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
3) Attempt to resolve the CI failure by making minimal, targeted edits consistent with the repo's style. Keep changes scoped and safe.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the CI fix and includes an inline compare link to quick-create a PR.
# Inputs and conventions:
- Use `gh api`, `gh run view`, `gh pr view`, `gh pr diff`, `gh pr list`, `gh run download`, and git commands as needed to discover the failing PR and branches.
- Avoid duplicate comments; if a previous bot comment exists, update it instead of posting a new one.
- If no actionable fix is possible, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent fix branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above.
" --force --model "$MODEL" --output-format=text
```
# Audit Secret
Source: https://docs.cursor.com/id/cli/cookbook/secret-audit
Audit secret untuk sebuah repository menggunakan Cursor CLI di GitHub Actions
Audit repository-mu untuk kerentanan keamanan dan kebocoran secret pakai Cursor CLI. Workflow ini memindai potensi secret, mendeteksi pola workflow berisiko, dan mengusulkan perbaikan keamanan.
```yaml auto-secret-audit.yml theme={null}
name: Secrets Audit
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
actions: read
jobs:
secrets-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Scan and propose hardening
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: audit
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Hardening Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Perform a repository secrets exposure and workflow hardening audit on a schedule, and propose minimal safe fixes.
# Requirements:
1) Scan for potential secrets in tracked files and recent history; support allowlist patterns if present (e.g., .gitleaks.toml).
2) Detect risky workflow patterns: unpinned actions, overbroad permissions, unsafe pull_request_target usage, secrets in forked PR contexts, deprecated insecure commands, missing permissions blocks.
3) Maintain a persistent branch for this run using the Hardening Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) Propose minimal edits: redact literals where safe, add ignore rules, pin actions to SHA, reduce permissions, add guardrails to workflows, and add a SECURITY_LOG.md summarizing changes and remediation guidance.
5) Push to origin.
6) If there is at least one open PR in the repo, post or update a single natural-language comment (1–2 sentences) on the most recently updated open PR that briefly explains the hardening changes and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update an existing bot comment if present. If no changes or no open PRs, post nothing.
# Inputs and conventions:
- Use `gh` to list PRs and to post comments. Avoid duplicate comments.
# Deliverables when updates occur:
- Pushed commits to the persistent hardening branch for this run.
- A single natural-language PR comment with the compare link above (only if an open PR exists).
" --force --model "$MODEL" --output-format=text
```
# Translate Keys
Source: https://docs.cursor.com/id/cli/cookbook/translate-keys
Terjemahkan key untuk repositori dengan Cursor CLI di GitHub Actions
Kelola key terjemahan untuk internasionalisasi menggunakan Cursor CLI. Workflow ini mendeteksi key i18n baru atau yang berubah di pull request dan mengisi terjemahan yang belum ada tanpa menimpa terjemahan yang sudah ada.
```yaml auto-translate-keys.yml theme={null}
name: Translate Keys
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
i18n:
if: ${{ !startsWith(github.head_ref, 'translate/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Propose i18n updates
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: translate
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- Head Ref: ${{ github.head_ref }}
- Translate Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Detect i18n keys added or changed in the PR and fill only missing locales in message files. Never overwrite existing translations.
# Requirements:
1) Determine changed keys by inspecting the PR diff (source files and messages files).
2) Compute missing keys per locale using the source/canonical locale as truth.
3) Add entries only for missing keys. Preserve all existing values untouched.
4) Validate JSON formatting and schemas.
5) Maintain a persistent translate branch for this PR head using the Translate Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
6) Post or update a single PR comment on the original PR written in natural language (1–2 sentences) that briefly explains what was updated and why, and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update a previous bot comment if present.
8) If no changes are necessary, make no commits and post no comment.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes.
# Deliverables when updates occur:
- Pushed commits to the persistent translate branch for this PR head.
- A single natural-language PR comment on the original PR with the compare link above.
" --force --model "$MODEL" --output-format=text
```
# Update Docs
Source: https://docs.cursor.com/id/cli/cookbook/update-docs
Perbarui dokumen untuk sebuah repositori menggunakan Cursor CLI di GitHub Actions
Perbarui dokumentasi menggunakan Cursor CLI di GitHub Actions. Ada dua pendekatan: otonomi agen penuh atau alur kerja deterministik dengan modifikasi file hanya oleh agen.
```yaml auto-update-docs.yml theme={null}
name: Perbarui Docs
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Konfigurasi git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Perbarui docs
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Kamu lagi berjalan di runner GitHub Actions.
GitHub CLI tersedia sebagai `gh` dan sudah diautentikasi lewat `GH_TOKEN`. Git tersedia. Kamu punya akses tulis ke konten repository dan bisa komentar di pull request, tapi kamu nggak boleh bikin atau ngedit PR.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
- Docs Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Terapkan alur pembaruan docs end-to-end yang dipicu oleh perubahan inkremental pada PR asli.
# Requirements:
1) Tentukan apa yang berubah di PR asli dan, kalau ada beberapa push, hitung diff inkremental sejak pembaruan docs sukses terakhir.
2) Perbarui hanya docs yang relevan berdasarkan perubahan inkremental tersebut.
3) Pertahankan branch docs yang persisten untuk head PR ini dengan Prefix Branch Docs dari Context. Buat kalau belum ada, perbarui kalau sudah ada, dan push perubahan ke origin.
4) Kamu TIDAK punya izin buat bikin PR. Sebagai gantinya, kirim atau perbarui satu komentar PR berbahasa natural (1–2 kalimat) yang singkat menjelaskan pembaruan docs dan menyertakan tautan compare inline untuk cepat bikin PR
# Inputs and conventions:
- Gunakan `gh pr diff` dan riwayat git untuk mendeteksi perubahan dan menurunkan rentang inkremental sejak pembaruan docs terakhir.
- Jangan coba bikin atau ngedit PR secara langsung. Gunakan format tautan compare di atas.
- Jaga perubahan seminimal mungkin dan konsisten dengan gaya repo. Kalau nggak ada pembaruan docs yang diperlukan, jangan buat perubahan dan jangan kirim komentar.
# Deliverables when updates occur:
- Commit yang dipush ke branch docs persisten untuk head PR ini.
- Satu komentar PR berbahasa natural di PR asli yang menyertakan tautan compare inline di atas. Hindari kirim duplikat; perbarui komentar bot sebelumnya kalau ada.
" --force --model "$MODEL" --output-format=text
```
```yaml auto-update-docs-deterministic.yml theme={null}
name: Perbarui Docs
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Instal Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Konfigurasi git
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Hasilkan pembaruan docs (tanpa commit/push/komentar)
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "Kamu sedang berjalan di runner GitHub Actions.
GitHub CLI tersedia sebagai `gh` dan sudah diautentikasi via `GH_TOKEN`. Git tersedia.
PENTING: Jangan membuat branch, commit, push, atau mem-posting komentar PR. Hanya ubah file di working directory seperlunya. Langkah workflow berikutnya yang akan mempublikasikan perubahan dan mengomentari PR.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
# Goal:
- Perbarui dokumentasi repository berdasarkan perubahan inkremental yang diperkenalkan oleh PR ini.
# Requirements:
1) Tentukan apa yang berubah di PR asli (gunakan `gh pr diff` dan riwayat git jika perlu). Jika branch docs persisten `${{ env.BRANCH_PREFIX }}/${{ github.head_ref }}` sudah ada, kamu boleh menggunakannya sebagai titik referensi read-only untuk memahami pembaruan sebelumnya.
2) Perbarui hanya docs yang relevan berdasarkan perubahan tersebut. Jaga edit seminimal mungkin dan konsisten dengan gaya repo.
3) Jangan commit, push, membuat branch, atau mem-posting komentar PR. Biarkan working tree hanya dengan file yang sudah diperbarui; langkah berikutnya yang akan mempublikasikan.
# Inputs and conventions:
- Gunakan `gh pr diff` dan riwayat git untuk mendeteksi perubahan dan memfokuskan penyuntingan docs sesuai.
- Jika tidak ada pembaruan docs yang diperlukan, jangan lakukan perubahan dan jangan menghasilkan output.
# Deliverables when updates occur:
- File docs yang dimodifikasi hanya di working directory (tanpa commit/push/komentar).
" --force --model "$MODEL" --output-format=text
- name: Publikasikan branch docs
id: publish_docs
env:
BRANCH_PREFIX: docs
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
echo "changes_published=false" >> "$GITHUB_OUTPUT"
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
# Pastikan kita berada di branch lokal yang bisa kita push
git fetch origin --prune
# Buat/berpindah ke branch docs persisten, sambil mempertahankan perubahan working tree saat ini
git checkout -B "$DOCS_BRANCH"
# Stage dan deteksi perubahan
git add -A
if git diff --staged --quiet; then
echo "Tidak ada perubahan docs untuk dipublikasikan. Melewati commit/push."
exit 0
fi
COMMIT_MSG="docs: update for PR #${PR_NUMBER} (${HEAD_REF} @ $(git rev-parse --short HEAD))"
git commit -m "$COMMIT_MSG"
git push --set-upstream origin "$DOCS_BRANCH"
echo "changes_published=true" >> "$GITHUB_OUTPUT"
- name: Posting atau perbarui komentar PR
if: steps.publish_docs.outputs.changes_published == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
COMPARE_URL="https://github.com/${REPO}/compare/${BASE_REF}...${DOCS_BRANCH}?quick_pull=1&title=docs%3A+updates+for+PR+%23${PR_NUMBER}"
COMMENT_FILE="${RUNNER_TEMP}/auto-docs-comment.md"
{
echo "Cursor memperbarui branch docs: \`${DOCS_BRANCH}\`"
echo "Sekarang kamu bisa [melihat diff dan cepat membuat PR untuk menggabungkan pembaruan docs ini](${COMPARE_URL})."
echo
echo "_Komentar ini akan diperbarui pada run berikutnya saat PR berubah._"
echo
echo ""
} > "$COMMENT_FILE"
# Jika mengedit komentar bot terakhir gagal (versi gh lebih lama), fallback ke membuat komentar baru
if gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE" --edit-last; then
echo "Komentar PR yang ada telah diperbarui."
else
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "Komentar PR baru telah diposting."
fi
```
# GitHub Actions
Source: https://docs.cursor.com/id/cli/github-actions
Pelajari cara menggunakan Cursor CLI di GitHub Actions dan sistem integrasi berkelanjutan lainnya
Gunakan Cursor CLI di GitHub Actions dan sistem CI/CD lainnya untuk mengotomatiskan tugas pengembangan.
Lihat contoh cookbook kami untuk alur kerja praktis: [memperbarui dokumentasi](/id/cli/cookbook/update-docs) dan [memperbaiki isu CI](/id/cli/cookbook/fix-ci).
## Sistem CI lainnya
Pakai Cursor CLI di sistem CI/CD apa pun dengan:
* **Eksekusi skrip shell** (bash, zsh, dll.)
* **Variabel lingkungan** untuk konfigurasi API key
* **Koneksi internet** untuk mengakses API Cursor
## Tingkat otonomi
Pilih tingkat otonomi agent lo:
### Pendekatan otonomi penuh
Kasih agent kontrol penuh atas operasi git, panggilan API, dan interaksi eksternal. Setup lebih simpel, tapi butuh kepercayaan lebih.
**Contoh:** Di cookbook [Update Documentation](/id/cli/cookbook/update-docs) kita, workflow pertama bikin agent bisa:
* Menganalisis perubahan PR
* Bikin dan ngelola branch git
* Commit dan push perubahan
* Ngepost komentar di pull request
* Nanganin semua skenario error
```yaml theme={null}
- name: Perbarui dokumentasi (otonomi penuh)
run: |
cursor-agent -p "Kamu punya akses penuh ke git, GitHub CLI, dan operasi PR.
Tangani seluruh alur pembaruan dokumentasi, termasuk commit, push, dan komentar PR."
```
### Pendekatan otonomi terbatas
Kami merekomendasikan pakai pendekatan ini dengan **pembatasan berbasis izin** untuk alur kerja CI produksi. Ini ngasih kamu yang terbaik dari dua sisi: agen bisa dengan cerdas menangani analisis kompleks dan modifikasi file, sementara operasi kritis tetap deterministik dan bisa diaudit.
Batasi operasi agen, sementara langkah-langkah kritis ditangani di langkah alur kerja terpisah. Kontrol dan prediktabilitas jadi lebih baik.
**Contoh:** Alur kerja kedua di cookbook yang sama membatasi agen hanya untuk modifikasi file:
```yaml theme={null}
- name: Hasilkan pembaruan docs (terbatas)
run: |
cursor-agent -p "PENTING: Jangan membuat branch, commit, push, atau mengirim komentar PR.
Hanya ubah file di direktori kerja. Langkah workflow selanjutnya yang akan menangani publikasi."
- name: Publikasikan branch docs (deterministik)
run: |
# Operasi git deterministik ditangani oleh CI
git checkout -B "docs/${{ github.head_ref }}"
git add -A
git commit -m "docs: update untuk PR"
git push origin "docs/${{ github.head_ref }}"
- name: Kirim komentar PR (deterministik)
run: |
# Komentar PR deterministik ditangani oleh CI
gh pr comment ${{ github.event.pull_request.number }} --body "Docs diperbarui"
```
Pertama, [generate API key](/id/cli/reference/authentication#api-key-authentication) dari dashboard Cursor.
### Konfigurasikan repository secrets
Simpan API key Cursor dengan aman di repository:
1. Buka repository GitHub lo
2. Klik **Settings** → **Secrets and variables** → **Actions**
3. Klik **New repository secret**
4. Kasih nama `CURSOR_API_KEY`
5. Tempel API key lo sebagai value
6. Klik **Add secret**
### Gunakan di workflows
Set environment variable `CURSOR_API_KEY`:
```yaml theme={null}
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
```
# Menggunakan Headless CLI
Source: https://docs.cursor.com/id/cli/headless
Pelajari cara menulis skrip menggunakan Cursor CLI untuk analisis kode, pembuatan, dan modifikasi otomatis
Pakai Cursor CLI di skrip dan alur otomatis buat analisis kode, pembuatan, dan refactoring.
## Cara kerjanya
Gunakan [print mode](/id/cli/using#non-interactive-mode) (`-p, --print`) untuk skrip non-interaktif dan otomatisasi.
### Modifikasi file di skrip
Padukan `--print` dengan `--force` untuk mengubah file di skrip:
```bash theme={null}
# Aktifkan modifikasi file dalam mode cetak
cursor-agent -p --force "Refactor kode ini agar menggunakan sintaks ES6+ modern"
# Tanpa --force, perubahan hanya diusulkan, tidak diterapkan
cursor-agent -p "Tambahkan komentar JSDoc ke file ini" # Tidak akan memodifikasi file
# Pemrosesan batch dengan perubahan file sesungguhnya
find src/ -name "*.js" | while read file; do
cursor-agent -p --force "Tambahkan komentar JSDoc yang komprehensif ke $file"
done
```
Flag `--force` memungkinkan agen melakukan perubahan file secara langsung tanpa konfirmasi
## Penyiapan
Lihat [Instalasi](/id/cli/installation) dan [Autentikasi](/id/cli/reference/authentication) untuk detail penyiapan lengkap.
```bash theme={null}
# Instal Cursor CLI
curl https://cursor.com/install -fsS | bash
# Atur kunci API untuk skrip
export CURSOR_API_KEY=your_api_key_here
cursor-agent -p "Analisis kode ini"
```
## Contoh skrip
Gunakan format output yang berbeda untuk kebutuhan skrip yang berbeda. Lihat [Format output](/id/cli/reference/output-format) untuk detailnya.
### Menelusuri codebase
Gunakan `--output-format text` untuk respons yang mudah dibaca:
```bash theme={null}
#!/bin/bash
# Pertanyaan kodebase sederhana
cursor-agent -p --output-format text "Apa yang dilakukan kodebase ini?"
```
### Tinjauan kode otomatis
Pakai `--output-format json` buat analisis terstruktur:
```bash theme={null}
#!/bin/bash
# simple-code-review.sh - Skrip peninjauan kode dasar
echo "Memulai peninjauan kode..."
# Meninjau perubahan terbaru
cursor-agent -p --force --output-format text \
"Tinjau perubahan kode terbaru dan berikan feedback tentang:
- Kualitas dan keterbacaan kode
- Potensi bug atau masalah
- Pertimbangan keamanan
- Kepatuhan terhadap praktik terbaik
Berikan saran spesifik untuk perbaikan dan tulis ke review.txt"
if [ $? -eq 0 ]; then
echo "✅ Peninjauan kode berhasil diselesaikan"
else
echo "❌ Peninjauan kode gagal"
exit 1
fi
```
### Pelacakan progres waktu nyata
Gunakan `--output-format stream-json` untuk melacak progres secara waktu nyata:
```bash theme={null}
#!/bin/bash
# stream-progress.sh - Lacak progres secara real-time
echo "🚀 Memulai pemrosesan stream..."
# Lacak progres secara real-time
accumulated_text=""
tool_count=0
start_time=$(date +%s)
cursor-agent -p --force --output-format stream-json \
"Analisis struktur proyek ini dan buat ringkasan di analysis.txt" | \
while IFS= read -r line; do
type=$(echo "$line" | jq -r '.type // empty')
subtype=$(echo "$line" | jq -r '.subtype // empty')
case "$type" in
"system")
if [ "$subtype" = "init" ]; then
model=$(echo "$line" | jq -r '.model // "unknown"')
echo "🤖 Memakai model: $model"
fi
;;
"assistant")
# Akumulasi delta teks streaming
content=$(echo "$line" | jq -r '.message.content[0].text // empty')
accumulated_text="$accumulated_text$content"
# Tampilkan progres secara langsung
printf "\r📝 Menghasilkan: %d karakter" ${#accumulated_text}
;;
"tool_call")
if [ "$subtype" = "started" ]; then
tool_count=$((tool_count + 1))
# Ekstrak informasi alat
if echo "$line" | jq -e '.tool_call.writeToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.writeToolCall.args.path // "unknown"')
echo -e "\n🔧 Alat #$tool_count: Membuat $path"
elif echo "$line" | jq -e '.tool_call.readToolCall' > /dev/null 2>&1; then
path=$(echo "$line" | jq -r '.tool_call.readToolCall.args.path // "unknown"')
echo -e "\n📖 Alat #$tool_count: Membaca $path"
fi
elif [ "$subtype" = "completed" ]; then
# Ekstrak dan tampilkan hasil alat
if echo "$line" | jq -e '.tool_call.writeToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.linesCreated // 0')
size=$(echo "$line" | jq -r '.tool_call.writeToolCall.result.success.fileSize // 0')
echo " ✅ Membuat $lines baris ($size byte)"
elif echo "$line" | jq -e '.tool_call.readToolCall.result.success' > /dev/null 2>&1; then
lines=$(echo "$line" | jq -r '.tool_call.readToolCall.result.success.totalLines // 0')
echo " ✅ Membaca $lines baris"
fi
fi
;;
"result")
duration=$(echo "$line" | jq -r '.duration_ms // 0')
end_time=$(date +%s)
total_time=$((end_time - start_time))
echo -e "\n\n🎯 Selesai dalam ${duration}ms (${total_time}s total)"
echo "📊 Statistik akhir: $tool_count alat, ${#accumulated_text} karakter dihasilkan"
;;
esac
done
```
# Instalasi
Source: https://docs.cursor.com/id/cli/installation
Menginstal dan memperbarui Cursor CLI
## Instalasi
### macOS, Linux, dan Windows (WSL)
Instal CLI Cursor dengan satu perintah:
```bash theme={null}
curl https://cursor.com/install -fsS | bash
```
### Verifikasi
Setelah instalasi, pastikan Cursor CLI berfungsi dengan benar:
```bash theme={null}
cursor-agent --version
```
CLI Cursor mendukung server [Model Context Protocol (MCP)](/id/context/mcp), yang bikin lo bisa nyambungin tool eksternal dan sumber data ke `cursor-agent`. **MCP di CLI pakai konfigurasi yang sama kayak editor** — server MCP apa pun yang udah lo set bakal jalan mulus di keduanya.
Baru kenal MCP? Baca panduan lengkap soal konfigurasi, autentikasi, dan server yang tersedia
## Perintah CLI
Gunakan perintah `cursor-agent mcp` buat ngelola server MCP:
### Daftar server yang tersetup
Lihat semua server MCP yang tersetup dan statusnya saat ini:
```bash theme={null}
cursor-agent mcp list
```
Ini menampilkan:
* Nama server dan pengenal
* Status koneksi (terhubung/terputus)
* Sumber konfigurasi (proyek atau global)
* Metode transport (stdio, HTTP, SSE)
### Lihat daftar tool yang tersedia
Lihat tool yang disediakan oleh server MCP tertentu:
```bash theme={null}
cursor-agent mcp list-tools
```
Ini menampilkan:
* Nama dan deskripsi tool
* Parameter wajib dan opsional
* Jenis parameter dan batasannya
### Login ke server MCP
Lakukan autentikasi ke server MCP yang dikonfigurasi di `mcp.json`:
```bash theme={null}
cursor-agent mcp login
```
### Nonaktifkan server MCP
Hapus server MCP dari daftar lokal yang disetujui:
```bash theme={null}
cursor-agent mcp disable
```
## Menggunakan MCP bareng Agent
Begitu lo udah ngonfigurasi server MCP (lihat [panduan MCP utama](/id/context/mcp) buat setup), `cursor-agent` bakal otomatis nemuin dan make tools yang tersedia kalau relevan sama permintaan lo.
```bash theme={null}
# Cek server MCP yang tersedia
cursor-agent mcp list
# Lihat alat apa yang disediakan oleh server tertentu
cursor-agent mcp list-tools playwright
# Gunakan cursor-agent - otomatis memakai alat MCP saat membantu
cursor-agent --prompt "Buka google.com dan ambil tangkapan layar halaman pencarian"
```
CLI mengikuti urutan prioritas konfigurasi yang sama seperti editor (proyek → global → bertingkat), secara otomatis mendeteksi konfigurasi dari direktori induk.
## Terkait
Panduan MCP lengkap: penyiapan, konfigurasi, dan autentikasi
Jelajahi server MCP siap pakai yang bisa kamu gunakan
# Cursor CLI
Source: https://docs.cursor.com/id/cli/overview
Mulai pakai Cursor CLI buat ngoding di terminal
Cursor CLI bikin lo bisa berinteraksi sama agen AI langsung dari terminal buat nulis, nge-review, dan ngubah kode. Mau pakai antarmuka terminal interaktif atau output non-interaktif buat otomatisasi di script dan pipeline CI, CLI ngasih bantuan ngoding yang powerful tepat di tempat lo kerja.
```bash theme={null}
# Instal
curl https://cursor.com/install -fsS | bash
# Jalankan sesi interaktif
cursor-agent
```
Cursor CLI saat ini masih beta, kami sangat pengin dengerin feedback kamu!
### Mode interaktif
Mulai sesi percakapan bareng agent buat jelasin tujuan kamu, nge-review perubahan yang diusulin, dan nyetujuin command:
```bash theme={null}
# Mulai sesi interaktif
cursor-agent
# Mulai dengan prompt awal
cursor-agent "refactor modul auth agar menggunakan token JWT"
```
### Mode non-interaktif
Gunakan mode print untuk skenario non-interaktif seperti skrip, pipeline CI, atau automasi:
```bash theme={null}
# Jalankan dengan prompt dan model tertentu
cursor-agent -p "temukan dan perbaiki masalah performa" --model "gpt-5"
# Sertakan perubahan git untuk ditinjau
cursor-agent -p "tinjau perubahan ini untuk isu keamanan" --output-format text
```
### Sesi
Lanjutkan percakapan sebelumnya untuk mempertahankan konteks di berbagai interaksi:
```bash theme={null}
# Daftarkan semua obrolan sebelumnya
cursor-agent ls
# Lanjutkan percakapan terbaru
cursor-agent resume
# Lanjutkan percakapan tertentu
cursor-agent --resume="chat-id-here"
```
# Autentikasi
Source: https://docs.cursor.com/id/cli/reference/authentication
Autentikasi Cursor CLI lewat alur browser atau kunci API
Cursor CLI mendukung dua metode autentikasi: login via browser (disarankan) dan kunci API.
## Autentikasi lewat browser (disarankan)
Pakai flow via browser buat pengalaman autentikasi yang paling mudah:
```bash theme={null}
# Masuk lewat alur browser
cursor-agent login
# Cek status autentikasi
cursor-agent status
# Keluar dan hapus autentikasi yang tersimpan
cursor-agent logout
```
Perintah login bakal buka browser default kamu dan minta kamu buat autentikasi pake akun Cursor. Setelah selesai, kredensial kamu bakal disimpen secara aman di perangkat lokal.
## Otentikasi kunci API
Untuk otomatisasi, skrip, atau lingkungan CI/CD, pakai otentikasi kunci API:
### Langkah 1: Buat kunci API
Bikin kunci API di dashboard Cursor lo, di Integrations > User API Keys.
### Langkah 2: Setel kunci API
Lo bisa nyediain kunci API dengan dua cara:
**Opsi 1: Variabel lingkungan (disarankan)**
```bash theme={null}
export CURSOR_API_KEY=your_api_key_here
cursor-agent "implement autentikasi pengguna"
```
**Opsi 2: Flag baris perintah**
```bash theme={null}
cursor-agent --api-key your_api_key_here "implement user authentication"
```
## Status autentikasi
Cek status autentikasi kamu saat ini:
```bash theme={null}
cursor-agent status
```
Perintah ini akan menampilkan:
* Apakah kamu sudah diautentikasi
* Informasi akun kamu
* Konfigurasi endpoint saat ini
## Pemecahan Masalah
* **Error "Not authenticated":** Jalanin `cursor-agent login` atau pastiin API key lo udah diset dengan bener
* **Error sertifikat SSL:** Pakai flag `--insecure` buat environment pengembangan
* **Masalah endpoint:** Pakai flag `--endpoint` buat nentuin custom API endpoint
# Konfigurasi
Source: https://docs.cursor.com/id/cli/reference/configuration
Referensi konfigurasi Agent CLI untuk cli-config.json
Atur Agent CLI menggunakan file `cli-config.json`.
## Lokasi file
| Tipe | Platform | Path |
| :----- | :---------- | :----------------------------------------- |
| Global | macOS/Linux | `~/.cursor/cli-config.json` |
| Global | Windows | `$env:USERPROFILE\.cursor\cli-config.json` |
| Proyek | Semua | `/.cursor/cli.json` |
Cuma izin yang bisa dikonfigurasi di level proyek. Semua pengaturan CLI lainnya harus diatur secara global.
Override dengan variabel lingkungan:
* **`CURSOR_CONFIG_DIR`**: path direktori kustom
* **`XDG_CONFIG_HOME`** (Linux/BSD): memakai `$XDG_CONFIG_HOME/cursor/cli-config.json`
## Skema
### Field wajib
| Field | Type | Deskripsi |
| :------------------ | :-------- | :-------------------------------------------------------------------------- |
| `version` | number | Versi skema konfigurasi (saat ini: `1`) |
| `editor.vimMode` | boolean | Mengaktifkan keybinding Vim (default: `false`) |
| `permissions.allow` | string\[] | Operasi yang diizinkan (lihat [Permissions](/id/cli/reference/permissions)) |
| `permissions.deny` | string\[] | Operasi yang dilarang (lihat [Permissions](/id/cli/reference/permissions)) |
### Field opsional
| Field | Type | Deskripsi |
| :----------------------- | :------ | :------------------------------------ |
| `model` | object | Konfigurasi model yang dipilih |
| `hasChangedDefaultModel` | boolean | Flag override model yang dikelola CLI |
```json theme={null}
{
"version": 1,
"editor": { "vimMode": false },
"permissions": {
"allow": ["Shell(ls)", "Shell(echo)"],
"deny": ["Shell(rm)"]
}
}
```
Lihat [Permissions](/id/cli/reference/permissions) untuk jenis izin yang tersedia dan contohnya.
## Pemecahan Masalah
**Error konfigurasi**: Pindahin file-nya dulu ke lokasi lain, lalu restart:
```bash theme={null}
mv ~/.cursor/cli-config.json ~/.cursor/cli-config.json.bad
```
**Perubahan nggak tersimpan**: Pastikan JSON valid dan punya izin tulis. Beberapa field dikelola CLI dan bisa ke-overwrite.
## Catatan
* Format JSON murni (tanpa komentar)
* CLI melakukan perbaikan otomatis untuk field yang hilang
* File yang rusak dicadangkan sebagai `.bad` dan dibuat ulang
* Entri izin harus berupa string yang persis sama (lihat [Permissions](/id/cli/reference/permissions) untuk detail)
# Format output
Source: https://docs.cursor.com/id/cli/reference/output-format
Skema output untuk format teks, JSON, dan stream-JSON
Cursor Agent CLI menyediakan beberapa format output melalui opsi `--output-format` saat digabungkan dengan `--print`. Format ini mencakup format terstruktur untuk penggunaan terprogram (`json`, `stream-json`) dan format teks yang lebih sederhana untuk pelacakan progres yang mudah dibaca manusia.
Nilai default `--output-format` adalah `stream-json`. Opsi ini hanya berlaku saat melakukan print (`--print`) atau ketika mode print diinferensikan (stdout non-TTY atau stdin yang dipipe).
## Format JSON
Format output `json` menghasilkan satu objek JSON (diikuti baris baru) saat run selesai dengan sukses. Delta dan event tool tidak dikeluarkan; teks digabungkan ke hasil akhir.
Jika gagal, proses keluar dengan kode non-zero dan menulis pesan error ke stderr. Tidak ada objek JSON yang terformat dengan benar yang dikeluarkan dalam kasus kegagalan.
### Respons sukses
Saat berhasil, CLI mengeluarkan objek JSON dengan struktur berikut:
```json theme={null}
{
"type": "result",
"subtype": "success",
"is_error": false,
"duration_ms": 1234,
"duration_api_ms": 1234,
"result": "",
"session_id": "",
"request_id": ""
}
```
| Field | Deskripsi |
| ----------------- | ------------------------------------------------------------------------- |
| `type` | Selalu `"result"` untuk hasil di terminal |
| `subtype` | Selalu `"success"` untuk penyelesaian yang sukses |
| `is_error` | Selalu `false` untuk respons yang sukses |
| `duration_ms` | Total waktu eksekusi dalam milidetik |
| `duration_api_ms` | Waktu permintaan API dalam milidetik (saat ini sama dengan `duration_ms`) |
| `result` | Teks respons asisten lengkap (penggabungan semua delta teks) |
| `session_id` | Identifier sesi unik |
| `request_id` | Identifier permintaan opsional (bisa dihilangkan) |
## Format JSON stream
Format output `stream-json` menghasilkan JSON yang dipisahkan baris baru (NDJSON). Setiap baris berisi satu objek JSON yang merepresentasikan event real-time selama eksekusi.
Stream berakhir dengan event terminal `result` saat berhasil. Jika gagal, proses keluar dengan kode non-nol dan stream bisa berakhir lebih awal tanpa event terminal; pesan error ditulis ke stderr.
### Jenis event
#### Inisialisasi sistem
Dikirim sekali di awal setiap sesi:
```json theme={null}
{
"type": "system",
"subtype": "init",
"apiKeySource": "env|flag|login",
"cwd": "/absolute/path",
"session_id": "",
"model": "",
"permissionMode": "default"
}
```
Di masa mendatang, bidang seperti `tools` dan `mcp_servers` mungkin akan ditambahkan ke event ini.
Dipancarkan beberapa kali saat asisten menghasilkan responsnya. Event ini berisi potongan teks bertahap:
```json theme={null}
{
"type": "assistant",
"message": {
"role": "assistant",
"content": [{ "type": "text", "text": "" }]
},
"session_id": ""
}
```
Gabungkan semua nilai `message.content[].text` secara berurutan untuk menyusun ulang respons lengkap asisten.
Event terakhir yang dipancarkan saat berhasil selesai:
```json theme={null}
{
"type": "result",
"subtype": "success",
"duration_ms": 1234,
"duration_api_ms": 1234,
"is_error": false,
"result": "",
"session_id": "",
"request_id": ""
}
```
### Contoh urutan
Berikut adalah urutan NDJSON representatif yang menunjukkan alur kejadian yang khas:
```json theme={null}
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Baca README.md dan buat ringkasan"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Aku akan "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"membaca berkas README.md"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Proyek\n\nIni adalah proyek contoh...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":" dan membuat ringkasan"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# Ringkasan README\n\nProyek ini berisi...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# Ringkasan README\n\nProyek ini berisi...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"Aku akan membaca berkas README.md dan membuat ringkasan","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}
```
## Format teks
Format output `text` menyajikan rangkaian tindakan agen yang disederhanakan dan mudah dibaca. Alih-alih event JSON yang detail, format ini menampilkan deskripsi teks ringkas tentang apa yang lagi dilakukan agen secara real-time.
Format ini berguna buat memantau progress agen tanpa overhead parsing data terstruktur, jadi ideal buat logging, debugging, atau pelacakan progress sederhana.
### Contoh output
```
Membaca file
Mengedit file
Menjalankan perintah di terminal
Membuat file baru
```
Setiap aksi muncul di baris baru saat agen mengeksekusinya, memberi umpan balik instan tentang progres agen dalam menyelesaikan tugas.
## Catatan implementasi
* Setiap event dipancarkan sebagai satu baris yang diakhiri dengan `\n`
* Event `thinking` disembunyikan dalam mode cetak dan tidak akan muncul di kedua format output
* Penambahan field dapat terjadi dari waktu ke waktu dengan cara yang kompatibel mundur (konsumen harus mengabaikan field yang tidak dikenal)
* Format stream memberikan pembaruan waktu nyata, sementara format JSON menunggu hingga selesai sebelum mengeluarkan hasil
* Gabungkan semua delta pesan `assistant` untuk merekonstruksi respons lengkap
* ID pemanggilan tool dapat digunakan untuk mengorelasikan event mulai/selesai
* ID sesi tetap konsisten sepanjang satu eksekusi agen
# Parameter
Source: https://docs.cursor.com/id/cli/reference/parameters
Referensi lengkap perintah untuk Cursor Agent CLI
## Opsi global
Opsi global bisa dipakai dengan perintah apa pun:
| Opsi | Deskripsi |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `-v, --version` | Tampilkan nomor versi |
| `-a, --api-key ` | API key untuk autentikasi (juga bisa pakai variabel lingkungan `CURSOR_API_KEY`) |
| `-p, --print` | Cetak respons ke konsol (buat skrip atau penggunaan non-interaktif). Punya akses ke semua tool, termasuk write dan bash. |
| `--output-format ` | Format output (hanya berfungsi dengan `--print`): `text`, `json`, atau `stream-json` (default: `stream-json`) |
| `-b, --background` | Mulai dalam mode latar belakang (buka composer picker saat diluncurkan) |
| `--fullscreen` | Aktifkan mode layar penuh |
| `--resume [chatId]` | Lanjutkan sesi chat |
| `-m, --model ` | Model yang dipakai |
| `-f, --force` | Paksa izinkan perintah kecuali yang secara eksplisit ditolak |
| `-h, --help` | Tampilkan bantuan untuk perintah |
## Perintah
| Perintah | Deskripsi | Penggunaan |
| ----------------- | ------------------------------------------- | ------------------------------------------------- |
| `login` | Autentikasi dengan Cursor | `cursor-agent login` |
| `logout` | Keluar dan hapus autentikasi yang tersimpan | `cursor-agent logout` |
| `status` | Cek status autentikasi | `cursor-agent status` |
| `mcp` | Kelola server MCP | `cursor-agent mcp` |
| `update\|upgrade` | Perbarui Cursor Agent ke versi terbaru | `cursor-agent update` atau `cursor-agent upgrade` |
| `ls` | Lanjutkan sesi chat | `cursor-agent ls` |
| `resume` | Lanjutkan sesi chat terbaru | `cursor-agent resume` |
| `help [command]` | Tampilkan bantuan untuk perintah | `cursor-agent help [command]` |
Kalau nggak ada perintah yang ditentukan, Cursor Agent bakal mulai dalam mode chat interaktif secara default.
## MCP
Kelola server MCP yang dikonfigurasi untuk Cursor Agent.
| Subcommand | Deskripsi | Penggunaan |
| ------------------------- | ---------------------------------------------------------------------- | ------------------------------------------ |
| `login ` | Masuk ke server MCP yang dikonfigurasi di `.cursor/mcp.json` | `cursor-agent mcp login ` |
| `list` | Lihat daftar server MCP yang dikonfigurasi beserta statusnya | `cursor-agent mcp list` |
| `list-tools ` | Lihat daftar tool yang tersedia dan nama argumennya untuk MCP tertentu | `cursor-agent mcp list-tools ` |
Semua perintah MCP mendukung `-h, --help` untuk bantuan khusus perintah.
## Argumen
Saat mulai dalam mode chat (perilaku default), lo bisa ngasih prompt awal:
**Argumen:**
* `prompt` — Prompt awal buat agen
## Mendapatkan bantuan
Semua perintah mendukung opsi global `-h, --help` untuk menampilkan bantuan khusus untuk perintah tersebut.
# Permissions
Source: https://docs.cursor.com/id/cli/reference/permissions
Jenis izin untuk mengontrol akses agen ke file dan perintah
Atur apa yang boleh dilakukan agen pakai token izin di konfigurasi CLI lo. Izin disetel di `~/.cursor/cli-config.json` (global) atau `/.cursor/cli.json` (spesifik proyek).
## Jenis izin
### Perintah shell
**Format:** `Shell(commandBase)`
Mengontrol akses ke perintah shell. `commandBase` adalah token pertama di baris perintah.
**Format:** `Read(pathOrGlob)`
Mengontrol akses baca ke file dan direktori. Mendukung pola glob.
| Contoh | Deskripsi |
| ------------------- | ----------------------------------------- |
| `Read(src/**/*.ts)` | Izinkan membaca file TypeScript di `src` |
| `Read(**/*.md)` | Izinkan membaca file Markdown di mana pun |
| `Read(.env*)` | Tolak membaca file environment |
| `Read(/etc/passwd)` | Tolak membaca file sistem |
### Penulisan file
**Format:** `Write(pathOrGlob)`
Mengontrol akses tulis ke file dan direktori. Mendukung pola glob. Saat digunakan dalam mode print, `--force` diperlukan untuk menulis file.
| Contoh | Deskripsi |
| --------------------- | ---------------------------------------------- |
| `Write(src/**)` | Izinkan menulis ke file apa pun di bawah `src` |
| `Write(package.json)` | Izinkan memodifikasi package.json |
| `Write(**/*.key)` | Tolak menulis file kunci privat |
| `Write(**/.env*)` | Tolak menulis file environment |
* Pola glob menggunakan wildcard `**`, `*`, dan `?`
* Path relatif berlaku dalam workspace saat ini
* Path absolut bisa menargetkan file di luar proyek
* Aturan deny memiliki prioritas dibanding aturan allow
# Perintah slash
Source: https://docs.cursor.com/id/cli/reference/slash-commands
Aksi cepat yang tersedia di sesi Cursor CLI
| Command | Description |
| --------------------- | ----------------------------------------------------- |
| `/model ` | Set atau lihat daftar model |
| `/auto-run [state]` | Toggle auto-run (default) atau set \[on\|off\|status] |
| `/new-chat` | Mulai sesi chat baru |
| `/vim` | Toggle tombol Vim |
| `/help [command]` | Tampilkan bantuan (/help \[cmd]) |
| `/feedback ` | Kirim feedback ke tim |
| `/resume ` | Lanjutkan chat sebelumnya berdasarkan nama folder |
| `/copy-req-id` | Salin ID request terakhir |
| `/logout` | Sign out dari Cursor |
| `/quit` | Keluar |
Perintah dijalankan di shell login lo (`$SHELL`) dengan direktori kerja dan environment milik CLI. Rangkaikan perintah buat dijalankan di direktori lain:
```bash theme={null}
cd subdir && npm test
```
## Output
Output perintah menampilkan header dengan kode keluar (exit code), tampilan stdout/stderr, dan kontrol pemendekan
Output yang besar dipendekkan secara otomatis, dan proses yang berjalan lama akan di-timeout untuk menjaga performa.
## Keterbatasan
* Perintah akan timeout setelah 30 detik
* Proses jangka panjang, server, dan prompt interaktif tidak didukung
* Gunakan perintah singkat yang non-interaktif untuk hasil terbaik
## Permissions
Perintah bakal diperiksa berdasarkan permissions dan pengaturan tim kamu sebelum dijalankan. Lihat [Permissions](/id/cli/reference/permissions) untuk konfigurasi mendetail.
Banner keputusan yang menampilkan opsi persetujuan: Run, Reject/Propose, Add to allowlist, dan Auto-run
Kebijakan admin bisa memblokir perintah tertentu, dan perintah dengan redirection nggak bisa dimasukkan ke allowlist secara inline.
## Pedoman penggunaan
Shell Mode cocok untuk pengecekan status, build cepat, operasi file, dan inspeksi environment.
Hindari server yang berjalan lama, aplikasi interaktif, dan perintah yang memerlukan input.
Setiap perintah berjalan secara independen — pakai `cd && ...` untuk menjalankan perintah di direktori lain.
## Pemecahan masalah
* Kalau perintah ngegantung, batalin dengan Ctrl+C dan tambahin flag non-interaktif
* Kalau diminta izin, setujui sekali atau tambahin ke allowlist pakai Tab
* Kalau output kepotong, pakai Ctrl+O buat nge-expand
* Buat jalanin di direktori lain, pakai `cd && ...` soalnya perubahan nggak ke-save
* Shell Mode dukung zsh dan bash sesuai variabel `$SHELL` kamu
Ngasih tahu intent dengan jelas itu disarankan biar hasilnya maksimal. Misalnya, lo bisa pakai prompt "do not write any code" buat memastikan agent nggak bakal ngedit file apa pun. Ini biasanya membantu waktu ngerencanain task sebelum ngejalaninnya.
Agent saat ini punya tools buat operasi file, pencarian, dan ngejalanin perintah shell. Lebih banyak tools bakal ditambahin, mirip kayak agent di IDE.
## MCP
Agent mendukung [MCP (Model Context Protocol)](/id/tools/mcp) untuk fungsionalitas dan integrasi yang lebih luas. CLI bakal otomatis mendeteksi dan mengikuti file konfigurasi `mcp.json` lo, jadi server dan tool MCP yang sama kayak yang udah lo set di IDE bakal aktif juga.
## Rules
Agen CLI mendukung [sistem rules](/id/context/rules) yang sama seperti di IDE. Kamu bisa bikin rules di direktori `.cursor/rules` buat ngasih konteks dan panduan ke agen. Rules ini bakal otomatis dimuat dan diterapkan sesuai konfigurasinya, jadi kamu bisa ngustom perilaku agen buat bagian-bagian tertentu di proyekmu atau tipe file tertentu.
CLI juga baca `AGENTS.md` dan `CLAUDE.md` di root proyek (kalau ada) dan nerapinnya sebagai rules bareng `.cursor/rules`.
## Bekerja dengan Agent
### Navigasi
Pesan sebelumnya bisa diakses pakai panah atas (ArrowUp) dan kamu bisa menelusurinya satu per satu.
### Review
Review perubahan dengan Cmd+R. Tekan i buat nambah instruksi lanjutan. Pakai ArrowUp/ArrowDown buat nge-scroll, dan ArrowLeft/ArrowRight buat pindah file.
### Memilih konteks
Pilih file dan folder buat disertakan ke konteks dengan @. Bebasin ruang di jendela konteks dengan menjalankan `/compress`. Lihat [Summarization](/id/agent/chat/summarization) buat detailnya.
## Riwayat
Lanjutkan dari thread yang sudah ada dengan `--resume [thread id]` untuk memuat konteks sebelumnya.
Untuk melanjutkan percakapan terbaru, gunakan `cursor-agent resume`.
Kamu juga bisa menjalankan `cursor-agent ls` untuk melihat daftar percakapan sebelumnya.
## Persetujuan perintah
Sebelum ngejalanin perintah di terminal, CLI bakal minta lo buat nyetujuin (y) atau nolak (n) eksekusinya.
## Mode non-interaktif
Gunakan `-p` atau `--print` buat jalanin Agent dalam mode non-interaktif. Ini bakal nge-print respons ke konsol.
Dengan mode non-interaktif, lo bisa manggil Agent tanpa interaksi. Ini bikin lo bisa ngintegrasiin Agent ke skrip, pipeline CI, dll.
Lo bisa nggabungin ini dengan `--output-format` buat ngontrol format output. Misalnya, pakai `--output-format json` buat output terstruktur yang lebih gampang di-parse di skrip, atau `--output-format text` buat output teks polos.
Cursor punya akses tulis penuh dalam mode non-interaktif.
# Pintasan Keyboard
Source: https://docs.cursor.com/id/configuration/kbd
Pintasan keyboard dan pemetaan tombol di Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Ikhtisar pintasan keyboard di Cursor. Lihat semua pintasan keyboard dengan menekan Cmd R lalu Cmd S atau dengan membuka command palette Cmd Shift P dan mencari `Keyboard Shortcuts`.
Pelajari lebih lanjut tentang pintasan keyboard di Cursor dengan [Key Bindings for VS Code](https://code.visualstudio.com/docs/getstarted/keybindings) sebagai acuan dasar untuk keybinding Cursor.
Semua keybinding di Cursor, termasuk fitur khusus Cursor, bisa diubah di pengaturan Keyboard Shortcuts.
## Umum
| Pintasan | Aksi |
| ---------------------- | ----------------------------------------------- |
| Cmd I | Alihkan Panel Samping (kecuali terikat ke mode) |
| Cmd L | Alihkan Panel Samping (kecuali terikat ke mode) |
| Cmd E | Panel kontrol Background Agent |
| Cmd . | Menu Mode |
| Cmd / | Berpindah di antara model AI |
| Cmd Shift J | Pengaturan Cursor |
| Cmd , | Pengaturan umum |
| Cmd Shift P | Palet perintah |
## Chat
Shortcut untuk kotak input chat.
| Shortcut | Aksi |
| ---------------------------------------------------- | ------------------------------------------- |
| Return | Nudge (default) |
| Ctrl Return | Antrikan pesan |
| Cmd Return when typing | Paksa kirim pesan |
| Cmd Shift Backspace | Batalkan pembuatan |
| Cmd Shift L with code selected | Tambahkan kode yang dipilih sebagai konteks |
| Cmd V with code or log in clipboard | Tambahkan isi clipboard sebagai konteks |
| Cmd Shift V with code or log in clipboard | Tambahkan isi clipboard ke kotak input |
| Cmd Return with suggested changes | Terima semua perubahan |
| Cmd Backspace | Tolak semua perubahan |
| Tab | Pindah ke pesan berikutnya |
| Shift Tab | Pindah ke pesan sebelumnya |
| Cmd Opt / | Ganti model |
| Cmd N / Cmd R | Chat baru |
| Cmd T | Tab chat baru |
| Cmd \[ | Chat sebelumnya |
| Cmd ] | Chat berikutnya |
| Cmd W | Tutup chat |
| Escape | Lepas fokus bidang |
| Shortcut | Aksi |
| --------------------- | ----------------------------- |
| Cmd K | Buka bar prompt terminal |
| Cmd Return | Jalankan perintah yang dibuat |
| Escape | Terima perintah |
# Perintah Shell
Source: https://docs.cursor.com/id/configuration/shell
Instal dan gunakan perintah shell Cursor
Cursor menyediakan alat command-line untuk membuka file dan folder dari terminal. Instal perintah `cursor` dan `code` untuk mengintegrasikan Cursor ke alur kerja pengembangan lo.
## Menginstal perintah CLI
Pasang perintah CLI lewat Command Palette:
1. Buka Command Palette (Cmd/Ctrl + P)
2. Ketik "Install" untuk memfilter perintah instalasi
3. Pilih dan jalankan `Install 'cursor' to shell`
4. Ulangi dan pilih `Install 'code' to shell`
Command Palette menampilkan opsi pemasangan CLI
## Menggunakan perintah CLI
Setelah instalasi, gunakan salah satu perintah berikut untuk membuka file atau folder di Cursor:
```bash theme={null}
# Menggunakan perintah cursor
cursor path/to/file.js
cursor path/to/folder/
# Menggunakan perintah code (kompatibel dengan VS Code)
code path/to/file.js
code path/to/folder/
```
## Opsi perintah
Kedua perintah mendukung opsi berikut:
* Buka berkas: `cursor file.js`
* Buka folder: `cursor ./my-project`
* Buka beberapa item: `cursor file1.js file2.js folder1/`
* Buka di jendela baru: `cursor -n` atau `cursor --new-window`
* Tunggu hingga jendela ditutup: `cursor -w` atau `cursor --wait`
## FAQ
Keduanya sama. Perintah `code` disediakan untuk kompatibilitas dengan VS Code.
Nggak, install salah satu atau keduanya sesuai preferensi.
Perintah di-install di file konfigurasi shell default sistem kamu (misalnya `.bashrc`, `.zshrc`, atau `.config/fish/config.fish`).
# Tema
Source: https://docs.cursor.com/id/configuration/themes
Kustomisasi tampilan Cursor
Cursor mendukung tema terang dan gelap buat lingkungan ngoding kamu. Cursor mewarisi kapabilitas tema dari VS Code—pakai tema VS Code apa pun, bikin tema kustom, dan pasang ekstensi tema dari marketplace.
## Mengganti tema
1. Buka Command Palette (Cmd/Ctrl + P)
2. Ketik "theme" untuk memfilter perintah
3. Pilih "Preferences: Color Theme"
4. Pilih tema
## FAQ
Bisa! Cursor kompatibel dengan tema VS Code. Install tema apa pun dari VS Code Marketplace atau salin file tema kustom.
Bikin tema kustom sama kayak di VS Code. Pakai "Developer: Generate Color Theme From Current Settings" buat mulai dari pengaturan saat ini, atau ikutin panduan pembuatan tema VS Code.
# @Code
Source: https://docs.cursor.com/id/context/@-symbols/@-code
Referensi cuplikan kode spesifik di Cursor pakai @Code
Referensi bagian kode tertentu pakai simbol `@Code`. Ini ngasih kontrol yang lebih detail dibanding [`@Files & Folders`](/id/context/@-symbols/@-files-and-folders), jadi kamu bisa milih cuplikan kode yang tepat, bukan seluruh file.
# @Cursor Rules
Source: https://docs.cursor.com/id/context/@-symbols/@-cursor-rules
Terapkan aturan dan pedoman khusus proyek
Simbol `@Cursor Rules` ngasih akses ke [aturan proyek](/id/context/rules) dan pedoman yang udah lo set, jadi lo bisa menerapkannya secara eksplisit ke konteks lo.
# @Files & Folders
Source: https://docs.cursor.com/id/context/@-symbols/@-files-and-folders
Gunakan file dan folder sebagai konteks di Chat dan Inline Edit
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
## Files
Rujuk seluruh file di Chat dan Inline Edit dengan memilih `@Files & Folders`, lalu ketik nama file untuk mencari. Lo juga bisa menyeret file dari sidebar langsung ke Agent buat nambahinnya sebagai konteks.
## Folder
Saat ngerujuk folder pakai `@Folders`, Cursor ngasih path folder dan ringkasan isinya biar AI paham apa aja yang tersedia.
Setelah milih folder, ketik "/" buat masuk lebih dalam dan lihat semua subfolder.
### Konten folder lengkap
Aktifin **Konten Folder Lengkap** di pengaturan. Kalau diaktifkan, Cursor bakal nyoba nyertakan semua file dari folder ke dalam konteks.
Untuk folder besar yang melebihi jendela konteks, tampilan outline bakal muncul dengan tooltip yang nunjukin berapa banyak file yang disertakan, sementara Cursor ngatur ruang konteks yang tersedia.
Pakai konten folder lengkap bareng [Mode Maks diaktifkan](/id/context/max-mode)
bisa ningkatin biaya request secara signifikan karena lebih banyak token input kepake.
## Manajemen konteks
File dan folder berukuran besar otomatis diringkas agar tetap dalam batas konteks. Lihat [pengondensasian file & folder](/id/agent/chats/summarization#file--folder-condensation) untuk detailnya.
# @Git
Source: https://docs.cursor.com/id/context/@-symbols/@-git
Rujuk perubahan Git dan perbedaan branch
* `@Commit`: Merujuk perubahan di state kerja saat ini dibanding commit terakhir. Menampilkan semua file yang dimodifikasi, ditambahkan, dan dihapus yang belum di-commit.
* `@Branch`: Bandingkan perubahan di branch kamu saat ini dengan branch main. Menampilkan semua commit dan perubahan di branch kamu yang belum ada di main.
# @Link
Source: https://docs.cursor.com/id/context/@-symbols/@-link
Sertakan konten web dengan menempelkan URL
Saat lo menempelkan URL di Chat, Cursor otomatis menandainya sebagai `@Link` dan mengambil kontennya untuk dipakai sebagai konteks. Ini juga mendukung dokumen PDF — Cursor mengekstrak dan mengurai konten teks dari URL PDF yang dapat diakses publik.
## Hapus Tautan
Gunakan URL sebagai teks biasa tanpa mengambil kontennya:
* Klik tautan yang ditandai dan pilih `Unlink`
* Atau tempel sambil menahan `Shift` untuk mencegah penandaan otomatis
# @Linter Errors
Source: https://docs.cursor.com/id/context/@-symbols/@-linter-errors
Akses dan rujuk error linting di codebase lo
Simbol `@Linter Errors` otomatis nangkep dan ngasih konteks tentang error dan peringatan linting dari file aktif lo saat ini. [Agent](/id/agent/overview) bisa lihat lint errors secara default.
Biar linter errors kelihatan, lo perlu language server yang sesuai
dipasang dan dikonfigurasi buat bahasa pemrograman lo. Cursor otomatis
mendeteksi dan pakai language server yang terpasang, tapi lo mungkin perlu
pasang ekstensi atau tools tambahan buat bahasa tertentu.
# @Past Chats
Source: https://docs.cursor.com/id/context/@-symbols/@-past-chats
Sertakan obrolan yang diringkas dari riwayat
Saat ngerjain tugas kompleks di [Chat](/id/chat), kadang kamu perlu merujuk konteks atau keputusan dari percakapan sebelumnya. Simbol `@Past Chats` nyediain versi ringkas dari obrolan sebelumnya sebagai konteks.
Khususnya berguna ketika:
* Kamu punya sesi Chat panjang dengan konteks penting yang perlu dirujuk
* Kamu mulai tugas baru yang terkait dan pengin kontinuitas
* Kamu pengin berbagi alasan atau keputusan dari sesi sebelumnya
# @Recent Changes
Source: https://docs.cursor.com/id/context/@-symbols/@-recent-changes
Sertakan kode yang baru dimodifikasi sebagai konteks
Simbol `@Recent Changes` menyertakan perubahan kode terbaru sebagai konteks dalam percakapan AI.
* Perubahan diurutkan secara kronologis
* Memprioritaskan 10 perubahan terakhir
* Mengikuti pengaturan `.cursorignore`
# @Web
Source: https://docs.cursor.com/id/context/@-symbols/@-web
Cari di web untuk informasi terkini
Dengan `@Web`, Cursor menelusuri web menggunakan [exa.ai](https://exa.ai) untuk menemukan informasi paling mutakhir dan menambahkannya sebagai konteks. Fitur ini juga bisa memproses file PDF dari tautan langsung.
Penelusuran web nonaktif secara default. Aktifkan di Settings → Features → Web
Search.
# Gambaran Umum
Source: https://docs.cursor.com/id/context/@-symbols/overview
Referensikan kode, file, dan dokumentasi pakai simbol @
Navigasi saran pakai tombol panah. Tekan `Enter` buat milih. Kalau sarannya kategori kayak `Files`, daftar saran bakal kefilter buat nampilin item paling relevan di kategori itu.
Ini daftar semua simbol @ yang tersedia:
* [@Files](/id/context/@-symbols/@-files) - Referensikan file tertentu di project lo
* [@Folders](/id/context/@-symbols/@-folders) - Referensikan seluruh folder buat konteks yang lebih luas
* [@Code](/id/context/@-symbols/@-code) - Referensikan cuplikan kode atau simbol tertentu dari codebase lo
* [@Docs](/id/context/@-symbols/@-docs) - Akses dokumentasi dan panduan
* [@Git](/id/context/@-symbols/@-git) - Akses riwayat dan perubahan git
* [@Past Chats](/id/context/@-symbols/@-past-chats) - Kerja bareng sesi composer yang sudah diringkas
* [@Cursor Rules](/id/context/@-symbols/@-cursor-rules) - Kerja bareng aturan Cursor
* [@Web](/id/context/@-symbols/@-web) - Referensikan sumber daya web eksternal dan dokumentasi
* [@Link (paste)](/id/context/@-symbols/@-link) - Bikin link ke kode atau dokumentasi tertentu
* [@Recent Changes](/id/context/@-symbols/@-recent-changes) - Lihat perubahan terbaru di kode atau dokumentasi
* [@Lint Errors](/id/context/@-symbols/@-lint-errors) - Referensikan error lint (khusus [Chat](/id/chat/overview))
* [@Definitions](/id/context/@-symbols/@-definitions) - Cari definisi simbol (khusus [Inline Edit](/id/inline-edit/overview))
* [# Files](/id/context/@-symbols/pill-files) - Tambahin file ke konteks tanpa referensi
* [/ Commands](/id/context/@-symbols/slash-commands) - Tambahin file yang kebuka dan aktif ke konteks
# #Files
Source: https://docs.cursor.com/id/context/@-symbols/pill-files
Pilih file tertentu dengan awalan #
Gunakan `#` diikuti nama file untuk menargetkan file tertentu. Padukan dengan simbol `@` untuk kontrol konteks yang lebih presisi.
# /command
Source: https://docs.cursor.com/id/context/@-symbols/slash-commands
Perintah cepat untuk menambahkan file dan mengontrol konteks
Perintah `/` ngasih akses cepat ke tab editor yang lagi kebuka, jadi lo bisa nambahin banyak file sebagai konteks.
## Perintah
* **`/Reset Context`**: Mengatur ulang konteks ke keadaan default
* **`/Generate Cursor Rules`**: Membuat aturan yang akan diikuti Cursor
* **`/Disable Iterate on Lints`**: Nggak akan mencoba memperbaiki error dan peringatan dari linter
* **`/Add Open Files to Context`**: Merujuk semua tab editor yang lagi terbuka
* **`/Add Active Files to Context`**: Merujuk semua tab editor yang lagi kelihatan (berguna buat tata letak terpisah)
# Pengindeksan Codebase
Source: https://docs.cursor.com/id/context/codebase-indexing
Cara Cursor mempelajari codebase kamu untuk pemahaman yang lebih baik
Cursor mengindeks codebase kamu dengan menghitung embedding untuk setiap file. Ini meningkatkan kualitas jawaban AI tentang kodenya. Saat kamu membuka proyek, Cursor mulai mengindeks secara otomatis. File baru diindeks secara bertahap.
Cek status pengindeksan di: `Cursor Settings` > `Indexing & Docs`
## Konfigurasi
Cursor mengindeks semua file kecuali yang ada di [ignore files](/id/context/ignore-files) (misalnya `.gitignore`, `.cursorignore`).
Klik `Show Settings` untuk:
* Mengaktifkan pengindeksan otomatis untuk repositori baru
* Menentukan file mana yang ingin diabaikan
[Mengabaikan file konten berukuran besar](/id/context/ignore-files) dapat meningkatkan akurasi jawaban.
### Lihat file yang diindeks
Untuk melihat path file yang diindeks: `Cursor Settings` > `Indexing & Docs` > `View included files`
Ini akan membuka file `.txt` yang mencantumkan semua file yang diindeks.
## Workspace multi-root
Cursor mendukung [workspace multi-root](https://code.visualstudio.com/docs/editor/workspaces#_multiroot-workspaces), bikin lo bisa kerja bareng banyak codebase:
* Semua codebase keindeks otomatis
* Konteks tiap codebase tersedia buat AI
* `.cursor/rules` jalan di semua folder
## Pencarian PR
Pencarian PR bantu lo ngerti evolusi codebase lo dengan bikin perubahan historis bisa dicari dan diakses lewat AI.
### Cara kerjanya
Cursor otomatis **mengindeks semua PR yang sudah di-merge** dari riwayat repositori lo. Ringkasan muncul di hasil pencarian semantik, dengan penyaringan pintar yang memprioritaskan perubahan terbaru.
Agent bisa **ngambil PR, commit, issue, atau branch** ke konteks pakai `@[PR number]`, `@[commit hash]`, atau `@[branch name]`. Termasuk komentar GitHub dan review Bugbot kalau terhubung.
**Dukungan platform** mencakup GitHub, GitHub Enterprise, dan Bitbucket. GitLab saat ini belum didukung.
Pengguna GitHub Enterprise: Tool fetch bakal fallback ke perintah git karena
keterbatasan autentikasi VSCode.
### Menggunakan pencarian PR
Tanyain hal-hal kayak "Gimana layanan diimplementasi di PR lain?" dan Agent bakal otomatis ngambil PR yang relevan ke konteks buat ngasih jawaban komprehensif berdasarkan riwayat repositori lo.
## FAQ
Belum ada daftar global. Cek tiap proyek satu per satu dengan membukanya di
Cursor dan mengecek pengaturan Codebase Indexing.
Hapus akun Cursor kamu dari Settings untuk menghapus semua codebase yang terindeks.
Atau, hapus codebase satu per satu dari pengaturan Codebase Indexing di tiap proyek.
Codebase yang terindeks akan dihapus setelah 6 minggu tanpa aktivitas. Membuka kembali
proyek akan memicu reindexing.
Tidak. Cursor membuat embedding tanpa menyimpan nama file atau source code. Nama file diobfuski dan potongan kode dienkripsi.
Saat Agent mencari di codebase, Cursor mengambil embedding dari server dan mendekripsi potongan tersebut.
# Mengabaikan file
Source: https://docs.cursor.com/id/context/ignore-files
Kendalikan akses file dengan .cursorignore dan .cursorindexingignore
## Gambaran Umum
Cursor membaca dan mengindeks codebase proyekmu untuk mendukung fitur-fiturnya. Atur direktori dan file mana yang boleh diakses Cursor pakai file `.cursorignore` di direktori root.
Cursor memblokir akses ke file yang tercantum di `.cursorignore` dari:
* Pengindeksan codebase
* Kode yang bisa diakses oleh [Tab](/id/tab/overview), [Agent](/id/agent/overview), dan [Inline Edit](/id/inline-edit/overview)
* Kode yang bisa diakses lewat [referensi simbol @](/id/context/@-symbols/overview)
Panggilan tool yang dijalankan oleh Agent, seperti terminal dan server MCP, nggak bisa memblokir
akses ke kode yang diatur oleh `.cursorignore`
## Kenapa nge-ignore file?
**Keamanan**: Batasi akses ke API key, kredensial, dan secret. Meski Cursor ngeblokir file yang di-ignore, perlindungan penuh tetap nggak bisa dijamin karena ketidakpastian LLM.
**Performa**: Di codebase besar atau monorepo, exclude bagian yang nggak relevan biar indexing lebih cepat dan penemuan file lebih akurat.
## Global ignore files
Atur pola ignore untuk semua project di user settings biar file sensitif otomatis dikecualikan tanpa perlu konfigurasi per project.
Pola default mencakup:
* File environment: `**/.env`, `**/.env.*`
* Kredensial: `**/credentials.json`, `**/secrets.json`
* Kunci: `**/*.key`, `**/*.pem`, `**/id_rsa`
## Mengonfigurasi `.cursorignore`
Buat file `.cursorignore` di direktori root kamu dengan sintaks `.gitignore`.
Aktifkan `Cursor Settings` > `Features` > `Editor` > `Hierarchical Cursor Ignore` untuk mencari file `.cursorignore` di direktori induk.
**Catatan**: Komentar diawali dengan `#`. Pola yang muncul belakangan akan menimpa yang lebih awal. Pola bersifat relatif terhadap lokasi file.
## Batasi pengindeksan dengan `.cursorindexingignore`
Gunakan `.cursorindexingignore` untuk mengecualikan file hanya dari pengindeksan. File ini tetap bisa diakses oleh fitur AI, tapi nggak akan muncul di pencarian codebase.
Saat pakai pola negasi (diawali `!`), lo nggak bisa menyertakan ulang file kalau direktori induknya dikecualikan pakai \*.
```sh theme={null}
# Abaikan semua file di folder public
public/*
# ✅ Ini berfungsi, karena file berada di tingkat teratas
!public/index.html
# ❌ Ini tidak berfungsi — tidak bisa menyertakan kembali file dari direktori bertingkat
!public/assets/style.css
```
**Solusi sementara**: Kecualikan direktori bertingkat secara eksplisit:
```sh theme={null}
public/assets/*
!public/assets/style.css # File ini sekarang bisa diakses
```
Direktori yang dikecualikan nggak ditelusuri demi performa, jadi pola pada file di dalamnya nggak berpengaruh.
Ini sesuai dengan implementasi .gitignore untuk pola negasi di direktori bertingkat. Buat detail lebih lanjut, cek [dokumentasi resmi Git tentang pola gitignore](https://git-scm.com/docs/gitignore).
[Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) memungkinkan Cursor terhubung ke alat eksternal dan sumber data.
### Kenapa pakai MCP?
MCP menghubungkan Cursor ke sistem dan data eksternal. Daripada ngejelasin struktur proyek berulang kali, integrasiin langsung sama tool yang dipakai.
Tulis server MCP pakai bahasa apa pun yang bisa nge-print ke `stdout` atau nyediain endpoint HTTP — Python, JavaScript, Go, dll.
### Cara kerjanya
Server MCP mengekspos kemampuan melalui protokol, menghubungkan Cursor ke alat atau sumber data eksternal.
Cursor mendukung tiga metode transport:
| Transport | Lingkungan eksekusi | Deployment | Pengguna | Input | Auth |
| :--------------------------------------------------------------- | :------------------ | :---------------------- | :-------------- | :------------------- | :----- |
| **`stdio`** | Lokal | Dikelola oleh Cursor | Satu pengguna | Perintah shell | Manual |
| **`SSE`** | Lokal/Jarak jauh | Dideploy sebagai server | Banyak pengguna | URL ke endpoint SSE | OAuth |
| **`Streamable HTTP`** | Lokal/Jarak jauh | Dideploy sebagai server | Banyak pengguna | URL ke endpoint HTTP | OAuth |
### Dukungan protokol
Cursor mendukung kapabilitas protokol MCP berikut:
| Fitur | Dukungan | Deskripsi |
| :-------------- | :------- | :------------------------------------------------------------------------------------- |
| **Tools** | Didukung | Fungsi yang dieksekusi oleh model AI |
| **Prompts** | Didukung | Pesan dan alur kerja bertemplate untuk pengguna |
| **Resources** | Didukung | Sumber data terstruktur yang dapat dibaca dan dirujuk |
| **Roots** | Didukung | Kueri yang diprakarsai server ke batas URI atau sistem berkas tempat operasi dilakukan |
| **Elicitation** | Didukung | Permintaan yang diprakarsai server untuk informasi tambahan dari pengguna |
## Menginstal server MCP
### Instal sekali klik
Instal server MCP dari koleksi kami dan lakukan autentikasi dengan OAuth.
Jelajahi server MCP yang tersedia
Bikin tombol "Add to Cursor"
### Menggunakan `mcp.json`
Konfigurasikan server MCP kustom dengan file JSON:
```json CLI Server - Node.js theme={null}
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "mcp-server"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json CLI Server - Python theme={null}
{
"mcpServers": {
"server-name": {
"command": "python",
"args": ["mcp-server.py"],
"env": {
"API_KEY": "value"
}
}
}
}
```
```json Remote Server theme={null}
// Server MCP menggunakan HTTP atau SSE - berjalan di server
{
"mcpServers": {
"server-name": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}
```
### Konfigurasi server STDIO
Untuk server STDIO (server command line lokal), atur field berikut di `mcp.json`:
| Field | Wajib | Deskripsi | Contoh |
| :---------- | :---- | :-------------------------------------------------------------------------------------------- | :---------------------------------------- |
| **type** | Ya | Jenis koneksi server | `"stdio"` |
| **command** | Ya | Perintah untuk menjalankan executable server. Harus ada di system path atau pakai path penuh. | `"npx"`, `"node"`, `"python"`, `"docker"` |
| **args** | Nggak | Array argumen yang dikirim ke perintah | `["server.py", "--port", "3000"]` |
| **env** | Nggak | Variabel environment untuk server | `{"API_KEY": "${input:api-key}"}` |
| **envFile** | Nggak | Path ke file environment untuk memuat lebih banyak variabel | `".env"`, `"${workspaceFolder}/.env"` |
### Menggunakan Extension API
Buat pendaftaran server MCP secara terprogram, Cursor nyediain Extension API yang memungkinkan konfigurasi dinamis tanpa perlu ngubah file `mcp.json`. Ini khususnya berguna buat lingkungan enterprise dan workflow setup otomatis.
Pelajari cara nge-register server MCP secara terprogram pakai `vscode.cursor.mcp.registerServer()`
### Lokasi konfigurasi
Bikin `.cursor/mcp.json` di proyek lo buat alat yang khusus proyek.
Bikin `~/.cursor/mcp.json` di direktori home lo buat alat yang tersedia di mana-mana.
### Interpolasi konfigurasi
Gunakan variabel dalam nilai `mcp.json`. Cursor me-resolve variabel di bidang berikut: `command`, `args`, `env`, `url`, dan `headers`.
Sintaks yang didukung:
* `${env:NAME}` variabel environment
* `${userHome}` jalur ke folder home kamu
* `${workspaceFolder}` root proyek (folder yang berisi `.cursor/mcp.json`)
* `${workspaceFolderBasename}` nama root proyek
* `${pathSeparator}` dan `${/}` pemisah jalur OS
Contoh
```json theme={null}
{
"mcpServers": {
"local-server": {
"command": "python",
"args": ["${workspaceFolder}/tools/mcp_server.py"],
"env": {
"API_KEY": "${env:API_KEY}"
}
}
}
}
```
```json theme={null}
{
"mcpServers": {
"remote-server": {
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${env:MY_SERVICE_TOKEN}"
}
}
}
}
```
### Autentikasi
Server MCP menggunakan variabel lingkungan untuk autentikasi. Lewatkan kunci API dan token lewat konfigurasi.
Cursor mendukung OAuth untuk server yang memerlukannya.
## Menggunakan MCP di chat
Composer Agent otomatis pakai tool MCP yang tercantum di `Available Tools` saat relevan. Minta tool tertentu berdasarkan nama atau jelasin apa yang lo butuhin. Aktifin atau nonaktifin tool dari Settings.
### Mengaktifkan/nonaktifkan tool
Aktifkan atau nonaktifkan tool MCP langsung dari antarmuka chat. Klik nama tool di daftar tool untuk menyalakan atau mematikannya. Tool yang dinonaktifkan nggak akan dimuat ke konteks atau tersedia buat Agent.
### Persetujuan tool
Secara default, Agent bakal minta persetujuan sebelum pakai tool MCP. Klik panah di sebelah nama tool buat lihat argumen.
#### Auto-run
Aktifkan auto-run biar Agent bisa pakai tool MCP tanpa perlu konfirmasi. Cara kerjanya mirip perintah terminal. Baca selengkapnya tentang pengaturan Auto-run [di sini](/id/agent/tools#auto-run).
### Respons tool
Cursor menampilkan respons di chat dengan tampilan argumen dan respons yang bisa diperluas:
### Gambar sebagai konteks
Server MCP bisa mengembalikan gambar—screenshot, diagram, dan sebagainya. Kembalikan gambar sebagai string yang dienkode base64:
```js theme={null}
const RED_CIRCLE_BASE64 = "/9j/4AAQSkZJRgABAgEASABIAAD/2w...";
// ^ seluruh base64 dipangkas untuk keterbacaan
server.tool("generate_image", async (params) => {
return {
content: [
{
type: "image",
data: RED_CIRCLE_BASE64,
mimeType: "image/jpeg",
},
],
};
});
```
Lihat [server contoh](https://github.com/msfeldstein/mcp-test-servers/blob/main/src/image-server.js) ini untuk detail implementasi. Cursor menautkan gambar yang dikembalikan ke obrolan. Kalau model mendukung gambar, model bakal menganalisisnya.
## Pertimbangan keamanan
Saat menginstal server MCP, pertimbangkan praktik keamanan berikut:
* **Verifikasi sumber**: Hanya pasang server MCP dari pengembang dan repositori tepercaya
* **Tinjau perizinan**: Periksa data dan API apa yang akan diakses server
* **Batasi kunci API**: Gunakan kunci API dengan batasan dan izin minimum yang dibutuhkan
* **Audit kode**: Untuk integrasi yang krusial, tinjau kode sumber server
Ingat, server MCP bisa mengakses layanan eksternal dan mengeksekusi kode atas namamu. Selalu pahami apa yang dilakukan server sebelum menginstalnya.
## Contoh dunia nyata
Untuk contoh praktis MCP yang benar-benar digunakan, lihat [panduan Web Development](/id/guides/tutorials/web-development) yang menunjukkan cara mengintegrasikan Linear, Figma, dan alat peramban ke dalam workflow pengembangan lo.
## FAQ
Server MCP menghubungkan Cursor ke tool eksternal seperti Google Drive, Notion,
dan layanan lain untuk memasukkan dokumen dan requirement ke alur kerja pengkodean Anda.
{" "}
Lihat log MCP dengan: 1. Buka panel Output di Cursor (Cmd+Shift+U) 2.
Pilih "MCP Logs" dari dropdown 3. Cek error koneksi, masalah autentikasi, atau server
crash. Log menampilkan inisialisasi server, pemanggilan tool, dan pesan error.
{" "}
Bisa! Toggle server on/off tanpa menghapusnya: 1. Buka Settings (Cmd+Shift+J) 2.
Masuk ke Features → Model Context Protocol 3. Klik toggle di samping server mana pun untuk
mengaktifkan/menonaktifkan. Server yang dinonaktifkan tidak akan dimuat atau muncul di chat.
Ini berguna untuk troubleshooting atau mengurangi clutter tool.
{" "}
Jika server MCP gagal: Cursor menampilkan pesan error di chat. Pemanggilan tool ditandai gagal.
Anda bisa mencoba ulang operasi atau memeriksa log untuk detailnya. Server MCP lain tetap bekerja normal.
Cursor mengisolasi kegagalan server agar satu server tidak memengaruhi yang lain.
{" "}
Untuk server berbasis npm: 1. Hapus server dari settings 2. Bersihkan cache npm:
`npm cache clean --force` 3. Tambahkan kembali server untuk mendapatkan versi terbaru. Untuk server kustom,
perbarui file lokal Anda dan restart Cursor.
Bisa, tapi ikuti praktik keamanan terbaik: gunakan environment variables untuk
secret dan jangan pernah hardcode; jalankan server sensitif secara lokal dengan transport `stdio`;
batasi izin API key seminimal mungkin; tinjau kode server sebelum menyambungkan ke sistem sensitif;
pertimbangkan menjalankan server di lingkungan terisolasi.
# Memories
Source: https://docs.cursor.com/id/context/memories
Memories adalah aturan yang otomatis dibuat berdasarkan obrolan lo di Chat. Memories ini berlaku pada proyek lo dan tetap menjaga konteks di seluruh sesi.
## Cara memori dibuat
1. **Observasi sidecar**: Cursor pakai pendekatan sidecar, di mana model lain mengamati obrolan lo dan otomatis mengekstrak memori yang relevan. Ini terjadi pasif di latar belakang saat lo kerja. Memori yang dihasilkan di latar belakang butuh persetujuan lo sebelum disimpan, biar lo tetap punya kontrol dan rasa aman atas apa yang diingat.
2. **Panggilan tool**: Agent bisa langsung bikin memori lewat panggilan tool ketika lo secara eksplisit minta buat nginget sesuatu atau ketika Agent sadar ada informasi penting yang perlu dipertahankan buat sesi berikutnya.
## Kelola memori
Kamu bisa mengelola memori lewat Cursor Settings → Rules.
# Rules
Source: https://docs.cursor.com/id/context/rules
Kendalikan perilaku model Agent dengan instruksi yang reusable dan scoped.
Rules ngasih instruksi level sistem buat Agent dan Inline Edit. Anggap aja ini sebagai konteks, preferensi, atau workflow yang persistent buat proyek lo.
Cursor mendukung empat jenis rules:
Disimpan di `.cursor/rules`, di-version control dan di-scope ke codebase lo.
Global buat environment Cursor lo. Didefinisikan di settings dan selalu diterapkan.
Instruksi Agent dalam format markdown. Alternatif simpel buat `.cursor/rules`.
Masih didukung, tapi deprecated. Mending pake Project Rules.
## Cara kerja rules
Large language models nggak nyimpen memori antar completion. Rules ngasih konteks yang persisten dan bisa dipakai ulang di level prompt.
Saat diterapkan, isi rule bakal disertakan di awal konteks model. Ini kasih panduan yang konsisten buat AI untuk ngasilin kode, ngeinterpretasi edit, atau bantuin workflow.
Rules berlaku untuk [Chat](/id/chat/overview) dan [Inline
Edit](/id/inline-edit/overview). Rules yang aktif bakal muncul di sidebar Agent.
## Aturan proyek
Aturan proyek ada di `.cursor/rules`. Setiap aturan adalah sebuah file dan dilacak dengan kontrol versi. Aturan bisa dibatasi dengan pola path, dipanggil secara manual, atau disertakan berdasarkan relevansi. Subdirektori bisa memiliki direktori `.cursor/rules` sendiri yang cakupannya hanya folder tersebut.
Gunakan aturan proyek untuk:
* Menyandikan pengetahuan domain-spesifik tentang codebase kamu
* Mengotomatiskan alur kerja atau templat khusus proyek
* Menyeragamkan keputusan gaya atau arsitektur
### Anatomi rule
Setiap file rule ditulis dalam **MDC** (`.mdc`), format yang mendukung metadata dan konten. Atur bagaimana rule diterapkan lewat dropdown tipe yang mengubah properti `description`, `globs`, `alwaysApply`.
| Tipe Rule | Deskripsi |
| :--------------------------------------------- | :----------------------------------------------------------------------------------------- |
| `Always` | Selalu disertakan dalam konteks model |
| `Auto Attached` | Disertakan saat file yang cocok dengan pola glob direferensikan |
| `Agent Requested` | Tersedia untuk AI, yang memutuskan apakah akan menyertakannya. Harus menyertakan deskripsi |
| `Manual` | Hanya disertakan saat disebutkan secara eksplisit menggunakan `@ruleName` |
```
---
description: Boilerplate layanan RPC
globs:
alwaysApply: false
---
- Gunakan pola RPC internal kami saat mendefinisikan layanan
- Selalu gunakan snake_case untuk nama layanan.
@service-template.ts
```
### Aturan bertingkat
Susun aturan dengan menaruhnya di direktori `.cursor/rules` di seluruh proyek lo. Aturan bertingkat bakal otomatis nempel saat file di direktori itu direferensiin.
```
project/
.cursor/rules/ # Aturan untuk seluruh proyek
backend/
server/
.cursor/rules/ # Aturan khusus backend
frontend/
.cursor/rules/ # Aturan khusus frontend
```
### Membuat rule
Bikin rule pakai perintah `New Cursor Rule` atau lewat `Cursor Settings > Rules`. Ini bakal bikin file rule baru di `.cursor/rules`. Dari Settings kamu bisa lihat semua rule beserta statusnya.
### Membuat rule
Bikin rule langsung di percakapan pakai perintah `/Generate Cursor Rules`. Berguna kalau kamu udah nentuin perilaku agent dan pengin pakai ulang.
## Praktik terbaik
Aturan yang bagus itu fokus, bisa dieksekusi, dan jelas ruang lingkupnya.
* Jaga aturan tetap di bawah 500 baris
* Pecah aturan besar jadi beberapa aturan yang bisa dikomposisikan
* Sertakan contoh konkret atau file rujukan
* Hindari panduan yang samar. Tulis aturan seperti dok internal yang jelas
* Pakai ulang aturan saat ngeulang prompt di chat
## Contoh
Aturan ini menetapkan standar untuk komponen frontend:
Saat bekerja di direktori components:
* Selalu pakai Tailwind untuk styling
* Pakai Framer Motion untuk animasi
* Ikuti konvensi penamaan komponen
Aturan ini juga menegakkan validasi untuk endpoint API:
Di direktori API:
* Pakai zod untuk semua validasi
* Definisikan return type dengan skema zod
* Ekspor tipe yang dihasilkan dari skema
Aturan ini menyediakan template untuk layanan Express:
Pakai template ini saat bikin layanan Express:
* Ikuti prinsip RESTful
* Sertakan middleware penanganan error
* Siapkan logging yang proper
@express-service-template.ts
Aturan ini mendefinisikan struktur komponen React:
Komponen React harus mengikuti layout berikut:
* Interface Props di bagian atas
* Komponen sebagai named export
* Styles di bagian bawah
@component-template.tsx
Aturan ini mengotomatiskan analisis app:
Saat diminta menganalisis app:
1. Jalankan dev server dengan `npm run dev`
2. Ambil log dari console
3. Sarankan peningkatan performa
Aturan ini membantu generasi dokumentasi:
Bantu menyusun dokumentasi dengan:
* Mengekstrak komentar kode
* Menganalisis README.md
* Menghasilkan dokumentasi markdown
Pertama, bikin properti toggle di `@reactiveStorageTypes.ts`.
Tambahkan nilai default di `INIT_APPLICATION_USER_PERSISTENT_STORAGE` dalam `@reactiveStorageService.tsx`.
Untuk fitur beta, tambahkan toggle di `@settingsBetaTab.tsx`, kalau bukan, tambahkan di `@settingsGeneralTab.tsx`. Toggle bisa ditambahkan sebagai `` untuk checkbox umum. Lihat bagian lain file untuk contoh.
```
{
vsContext.reactiveStorageService.setApplicationUserPersistentStorage(
'myNewProperty',
newVal
);
}}
/>
```
Untuk dipakai di app, import reactiveStorageService dan gunakan propertinya:
```
const flagIsEnabled = vsContext.reactiveStorageService.applicationUserPersistentStorage.myNewProperty
```
Banyak contoh tersedia dari berbagai provider dan framework. Aturan yang dikontribusikan komunitas bisa ditemukan di beragam koleksi dan repositori crowdsourced online.
## AGENTS.md
`AGENTS.md` adalah file markdown sederhana untuk mendefinisikan instruksi agent. Simpan di root proyek sebagai alternatif `.cursor/rules` untuk use case yang straightforward.
Berbeda dari Project Rules, `AGENTS.md` adalah file markdown polos tanpa metadata atau konfigurasi yang kompleks. Pas banget buat proyek yang butuh instruksi sederhana, mudah dibaca, tanpa overhead aturan terstruktur.
```markdown theme={null}
# Instruksi Proyek
## Gaya Kode
- Gunakan TypeScript untuk semua file baru
- Utamakan komponen fungsional di React
- Gunakan snake_case untuk kolom database
## Arsitektur
- Ikuti pola repository
- Letakkan logika bisnis di layer service
```
## Aturan Pengguna
Aturan pengguna adalah preferensi global yang ditetapkan di **Cursor Settings → Rules** dan berlaku di semua proyek. Aturan ini berupa teks biasa dan pas buat ngatur gaya komunikasi yang kamu mau atau konvensi penulisan kode:
```
Balas dengan ringkas. Hindari pengulangan atau kata-kata pengisi yang nggak perlu.
```
## `.cursorrules` (Legacy)
File `.cursorrules` di root project lo masih didukung, tapi bakal ditinggalkan. Disaranin migrasi ke Project Rules buat kontrol, fleksibilitas, dan visibilitas yang lebih baik.
Penyimpanan berkelanjutan untuk konteks proyek dan keputusan dari
percakapan sebelumnya. Secara otomatis dijadikan referensi dalam interaksi berikutnya.
Mulai itu gampang:
1. Kunjungi [cursor.com](https://cursor.com) lalu klik "Download"
2. Jalankan installer setelah selesai diunduh
3. Buka Cursor begitu instalasi selesai
Butuh versi tertentu? Cek semua platform dan metode instalasi di
[cursor.com/downloads](https://cursor.com/downloads)
## Penyiapan pertama kali
Saat kamu membuka Cursor untuk pertama kali, kami bakal ngarahin kamu lewat penyiapan singkat:
* Pilih pintasan keyboard yang familiar
* Pilih tema yang kamu suka
* Atur preferensi terminal kamu
Kamu bisa membuka lagi wizard penyiapan kapan saja dengan menekan Cmd Shift P{" "}
lalu mencari `Cursor: Start Onboarding`.
Baca selengkapnya tentang [Keyboard Shortcuts](/id/kbd), [Themes](/id/settings/themes), dan [Shell Commands](/id/settings/shell)
Lihat pintasan keyboard
Memilih tema di Cursor
Pasang perintah shell
## Pindah dari editor lain?
Kalau kamu sudah pakai editor kode lain, kita bikin proses pindahnya mudah:
Impor pengaturan VS Code secara langsung
Panduan migrasi untuk JetBrains, Eclipse, Neovim, dan Sublime
Panduan migrasi lainnya akan segera hadir.
## Dukungan bahasa
Cursor mendukung semua bahasa pemrograman utama. Berikut beberapa yang populer dengan dukungan AI yang lebih canggih:
}
arrow
/>
}
arrow
/>
}
arrow
/>
}
arrow
/>
Kamu bisa nambahin dukungan untuk lebih banyak bahasa lewat ekstensi, sama kayak di VS Code.
## Bikin akun lo
Walau Cursor bisa dipakai tanpa akun, daftar bakal ngebuka semua fitur AI:
1. Lo bakal diminta buat daftar waktu setup, atau bisa nanti lewat Settings (Cmd Shift J)
2. Setelah daftar, kelola akun lo di [cursor.com/dashboard](https://cursor.com/dashboard)
## Memahami pengindeksan codebase
Saat kamu membuka sebuah project, Cursor mulai mempelajari kodenya. Ini disebut “pengindeksan” dan inilah yang membuat saran AI jadi akurat.
* Pengindeksan mulai otomatis saat kamu membuka sebuah project
* Butuh sekitar 1–15 menit tergantung ukuran project kamu
* Semakin banyak yang dipelajari Cursor tentang kodenya, semakin pintar sarannya
* Tim bisa saling berbagi indeks untuk menghemat waktu
* Kamu bisa cek progres pengindeksan di Settings (Cmd Shift J) → Indexing & Docs
Mau belajar lebih lanjut? Lihat [cara kerja pengindeksan](/id/context/codebase-indexing)
## Langkah selanjutnya
Sekarang Cursor udah terpasang, siap buat ngerasain coding bertenaga AI:
* Ikutin [panduan cepat](/id/get-started/quickstart) buat belajar dasar-dasarnya dalam 5 menit
* Baca [konsep-konsep utama](/id/get-started/concepts) biar paham cara kerja Cursor
* [Jelajahi panduan](/id/guides) buat eksplor apa aja yang bisa kamu bangun dengan Cursor
* Kalau ketemu masalah, [minta bantuan](/id/troubleshooting/common-issues) dari panduan troubleshooting kami
* [Gabung komunitas kami](https://cursor.com/community) buat nyambung dengan pengguna Cursor lainnya
# Quickstart
Source: https://docs.cursor.com/id/get-started/quickstart
Mulai dengan Cursor dalam 5 menit
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Quickstart ini bakal ngebimbing lo lewat sebuah proyek yang pakai fitur inti Cursor. Di akhir, lo bakal familiar dengan Tab, Inline Edit, dan Agent.
## Buka proyek di Cursor
Pakai proyek yang sudah ada atau clone contoh dari kami:
1. Pastikan git sudah terpasang
2. Clone proyek contoh:
```bash theme={null}
git clone git@github.com:voxelize/voxelize.git && \
cd voxelize && \
cursor .
```
1. Buka Cursor
2. Buka folder proyek dengan Cmd O atau `cursor `
Kita bakal demo pakai proyek contoh, tapi lo bisa pakai proyek apa pun yang lo punya secara lokal.
## Autocomplete dengan [Tab](/id/kbd#tab)
Tab adalah model autocomplete yang kami latih sendiri. Ini cara yang pas buat mulai pakai coding berbantuan AI kalau kamu belum terbiasa. Dengan Tab, kamu bisa:
* Melengkapi **banyak baris dan blok** kode
* Melompat **di dalam** dan **antar** file ke saran autocomplete berikutnya
1. Mulai mengetik awal sebuah fungsi:
```javascript theme={null}
function calculate
```
2. Saran Tab muncul otomatis
3. Tekan Tab untuk menerima saran
4. Cursor menyarankan parameter dan body fungsi
## [Inline Edit](/id/inline-edit) pada sebuah pilihan
1. Pilih fungsi yang baru aja kamu buat
2. Tekan Cmd K
3. Ketik "make this function calculate fibonacci numbers"
4. Tekan Return untuk menerapkan perubahan
5. Cursor menambahkan import dan dokumentasi
## Ngobrol dengan [Agent](/id/agent)
1. Buka panel Chat (Cmd I)
2. Tanyain: "Add tests for this function and run them"
3. Agent bakal bikin file test, nulis test case, dan ngejalaninnya buat lo
## Bonus
Fitur lanjutan:
1. Buka panel kontrol Background Agent (Cmd E)
2. Tanyakan: "Find and fix a bug in this project"
3. [Background Agent](/id/background-agent) akan:
* Membuat Virtual Machine (VM) remote
* Menjelajahi proyek lo
* Mendeteksi bug
* Mengusulkan perbaikan
Tinjau dan terapkan perubahan.
{" "}
1. Buka command palette (Cmd Shift P) 2. Cari: "New Cursor
Rule" 3. Kasih nama (mis., `style-guide`) 4. Pilih Rule Type "Always" 5. Tentukan
gaya lo: `Prefer using camelCase for variable names`
1. Kunjungi [direktori MCP](https://docs.cursor.com/tools) kami
2. Pilih tool
3. Klik "Install"
Server juga bisa diinstal secara manual:
1. Buka Cursor Settings (Cmd Shift J)
2. Masuk ke "Tools & Integrations"
3. Klik "New MCP Server"
## Langkah berikutnya
Jelajahi panduan ini untuk belajar lebih lanjut:
Kasih konteks yang efektif biar hasilnya lebih bagus
Pilih model yang pas buat tugas lo
Pelajari semua [konsep Cursor](/id/get-started/concepts) dan mulai berkarya!
# Data Science
Source: https://docs.cursor.com/id/guides/advanced/datascience
Pelajari cara menyiapkan Cursor untuk workflow data science mencakup Python, R, dan SQL dengan notebook, environment remote, dan analisis bertenaga AI
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Cursor menyediakan alat terintegrasi untuk pengembangan data science melalui lingkungan yang dapat direplikasi, dukungan notebook, dan bantuan kode berbasis AI. Panduan ini membahas pola penyiapan penting untuk alur kerja Python, R, dan SQL.
## Pengembangan notebook
Untuk dukungan notebook lengkap, unduh ekstensi Jupyter (id: ms-toolsai.jupyter) yang dipublikasikan oleh ms-toolsai.
Cursor mendukung file `.ipynb` dan `.py` dengan eksekusi sel terintegrasi. Tab, Inline Edit, dan Agent
berfungsi di dalam notebook, sama seperti di file kode lainnya.
Kemampuan utama:
* **Eksekusi sel inline** menjalankan kode langsung di dalam antarmuka editor
* **Tab, Inline Edit, dan Agent** semuanya memahami pustaka data science termasuk pandas, NumPy, scikit-learn, dan perintah SQL magic
## Integrasi database
Database bisa diintegrasikan dengan Cursor lewat dua mekanisme utama: server MCP dan ekstensi.
* **Server MCP** bikin agent lo bisa terhubung ke database lo
* **Ekstensi** ngintegrasiin IDE lo secara lebih luas dengan database lo
### Lewat MCP
Server MCP memungkinkan agent lo buat ngejalanin kueri langsung ke database lo. Ini bikin agent lo bisa milih buat ngekueri database lo, nulis kueri yang sesuai, ngejalanin perintah, dan nganalisis output, semuanya sebagai bagian dari task yang lagi berjalan.
Misalnya, lo bisa nyambungin database Postgres ke instance Cursor lo dengan nambahin [konfigurasi MCP](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) berikut ke Cursor:
```json theme={null}
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
}
```
Untuk info lebih lanjut tentang MCP, lihat [dokumentasi MCP](/id/tools/mcp) kami.
### Via Extensions
Install ekstensi khusus database (PostgreSQL, BigQuery, SQLite, Snowflake) buat ngejalanin query langsung dari editor. Ini ngilangin context switching antar alat dan bikin AI bisa bantu ngeoptimalin query.
```sql theme={null}
-- Cursor ngasih saran buat indeks, window function, dan optimasi kueri
SELECT
user_id,
event_type,
COUNT(*) as jumlah_event,
RANK() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) as peringkat_frekuensi
FROM events
WHERE created_at >= NOW() - INTERVAL '7 hari'
GROUP BY user_id, event_type;
```
Gunakan Agents untuk menganalisis query yang lambat, ngasih saran peningkatan performa, atau ngehasilin kode visualisasi buat hasil query. Cursor paham konteks SQL dan bisa ngerekomendasiin tipe chart yang pas berdasarkan struktur data lo.
## Visualisasi data
Bantuan AI dari Cursor mencakup pustaka visualisasi data seperti Matplotlib, Plotly, dan Seaborn. Agen bisa ngasilin kode buat visualisasi data, bantu lo eksplor data dengan cepat dan mudah, sambil bikin artefak yang bisa direplikasi dan dibagikan.
```python theme={null}
import plotly.express as px
import pandas as pd
# AI menyarankan jenis plot yang relevan berdasarkan kolom data
df = pd.read_csv('sales_data.csv')
fig = px.scatter(df, x='advertising_spend', y='revenue',
color='region', size='customer_count',
title='Pendapatan vs Pengeluaran Iklan per Wilayah')
fig.show()
```
## Pertanyaan yang sering ditanyakan
**Bisa pakai Jupyter notebook yang sudah ada?**
Bisa, Cursor bisa membuka file `.ipynb` dengan eksekusi sel penuh dan dukungan AI completion.
**Gimana cara menangani dataset besar yang nggak muat di memori?**
Pakai library komputasi terdistribusi seperti Dask, atau sambungkan ke cluster Spark lewat koneksi Remote-SSH ke mesin yang lebih besar.
**Apakah Cursor mendukung file R dan SQL?**
Ya, Cursor menyediakan bantuan AI dan penyorotan sintaks untuk skrip R (`.R`) dan file SQL (`.sql`).
**Apa cara yang direkomendasikan buat berbagi environment pengembangan?**
Commit folder `.devcontainer` ke version control. Anggota tim bisa membangun ulang environment secara otomatis saat membuka proyek.
**Gimana cara nge-debug data processing pipeline?**
Pakai debugger terintegrasi Cursor dengan breakpoint di skrip Python, atau manfaatkan Agent buat menganalisis dan ngejelasin transformasi data yang kompleks langkah demi langkah.
## Reprodusibilitas lingkungan
### Container pengembangan
Container pengembangan bantu kamu memastikan runtime dan dependensi tetap konsisten di seluruh anggota tim dan lingkungan deployment. Ini bisa menghilangkan bug yang spesifik terhadap lingkungan dan mengurangi waktu onboarding anggota tim baru.
Untuk pakai container pengembangan, mulai dengan membuat folder `.devcontainer` di root repository kamu. Selanjutnya, buat file `devcontainer.json`, `Dockerfile`, dan `requirements.txt`.
```json theme={null}
// .devcontainer/devcontainer.json
{
"name": "ds-env",
"build": { "dockerfile": "Dockerfile" },
"features": {
"ghcr.io/devcontainers/features/python:1": { "version": "3.11" }
},
"postCreateCommand": "pip install -r requirements.txt"
}
```
```dockerfile theme={null}
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/python:3.11
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install -r requirements.txt
```
```txt theme={null}
# requirements.txt
pandas==2.3.0
numpy
# tambahkan dependensi lain yang kamu butuhkan untuk proyekmu
```
Cursor bakal otomatis mendeteksi devcontainer dan nge-prompt lo buat buka ulang project lo di dalam container. Atau, lo bisa buka ulang manual di container via Command Palette (Cmd+Shift+P) dan cari `Reopen in Container`.
Development container ngasih beberapa keuntungan:
* **Isolasi dependency** mencegah konflik antaproject
* **Build yang dapat direproduksi** memastikan perilaku konsisten di seluruh environment development dan production
* **Onboarding yang simpel** bikin anggota tim baru bisa langsung mulai tanpa setup manual
### Remote development dengan SSH
Kalau analisis lo butuh resource komputasi tambahan, GPU, atau akses ke dataset privat, sambung ke mesin remote sambil tetap ngejaga environment development lokal lo.
1. Sediain instance cloud atau akses server on‑premises dengan resource yang diperlukan
2. Clone repository lo ke mesin remote, termasuk konfigurasi `.devcontainer`
3. Connect lewat Cursor: Cmd+Shift+P → "Remote-SSH: Connect to Host"
Pendekatan ini ngejaga tooling tetap konsisten sambil ngescaled up/down resource komputasi sesuai kebutuhan. Konfigurasi development container yang sama jalan di environment lokal maupun remote.
# Basis Kode Skala Besar
Source: https://docs.cursor.com/id/guides/advanced/large-codebases
Cara bekerja dengan basis kode skala besar di Cursor
Bekerja dengan basis kode skala besar menghadirkan serangkaian tantangan baru dibandingkan proyek yang lebih kecil. Berdasarkan pengalaman kami menskalakan basis kode Cursor sendiri dan wawasan dari pelanggan yang mengelola basis kode masif, kami menemukan beberapa pola berguna untuk menangani kompleksitas yang meningkat.
Di panduan ini, kami bakal ngejelasin beberapa teknik yang kami temukan berguna buat basis kode skala besar.
```mermaid theme={null}
flowchart LR
A[Bangun pemahaman codebase] --> B[Tentukan outcome / Diff]
B --> C[Rencanakan perubahan]
C --> D[Terapkan perubahan]
D --> A
```
# Pakai Chat buat cepat paham kode yang belum familiar
Menavigasi codebase besar, apalagi kalau baru, memang menantang. Kamu sering harus grep, cari, dan klik sana-sini buat nemuin bagian spesifik yang kamu butuhin. Dengan [Chat](/id/chat/overview), kamu bisa langsung tanya buat nyari yang kamu cari dan dapet penjelasan detail tentang cara kerjanya.
Di sini kita minta bantuan buat nemuin detail implementasi indexing codebase di Cursor, dan bahkan minta beberapa contoh biar lebih gampang dipahami.
# Tulis rule untuk pengetahuan domain-spesifik
Kalau kamu lagi onboarding kolaborator baru ke codebase kamu, konteks apa yang bakal kamu kasih supaya mereka bisa mulai ngasih kontribusi yang bermakna?
Jawaban kamu untuk pertanyaan ini kemungkinan besar juga berharga buat Cursor. Di setiap organisasi atau proyek, selalu ada pengetahuan tersirat yang mungkin belum sepenuhnya tertuang di dokumentasi kamu. Memakai rule secara efektif adalah cara terbaik buat memastikan Cursor mendapatkan gambaran yang utuh.
Misalnya, kalau kamu lagi nulis instruksi tentang cara mengimplementasikan fitur atau layanan baru, pertimbangkan buat nulis rule singkat untuk mendokumentasikannya sebagai rujukan ke depannya.
```mdc Templat dasar theme={null}
---
description: Tambahkan layanan frontend VSCode baru
---
1. **Definisi Antarmuka:**
- Definisikan antarmuka layanan baru menggunakan `createDecorator` dan pastikan `_serviceBrand` disertakan untuk menghindari galat.
2. **Implementasi Layanan:**
- Implementasikan layanan dalam file TypeScript baru, memperluas `Disposable`, dan daftarkan sebagai singleton dengan `registerSingleton`.
3. **Kontribusi Layanan:**
- Buat file kontribusi untuk mengimpor dan memuat layanan, lalu daftarkan di entry point utama.
4. **Integrasi Konteks:**
- Perbarui konteks untuk menyertakan layanan baru, sehingga bisa diakses di seluruh aplikasi.
```
Kalau ada pola pemformatan umum yang pengin kamu pastikan dipatuhi Cursor, pertimbangkan buat otomatis melampirkan rules berdasarkan pola glob.
```mdc Pemformatan theme={null}
---
globs: *.ts
---
- Gunakan bun sebagai pengelola paket. Lihat [package.json](mdc:backend/reddit-eval-tool/package.json) untuk skripnya
- Gunakan kebab-case untuk nama file
- Gunakan camelCase untuk nama fungsi dan variabel
- Gunakan UPPERCASE_SNAKE_CASE untuk konstanta yang di-hardcode
- Lebih utamakan `function foo()` daripada `const foo = () =>`
- Gunakan `Array` alih-alih `T[]`
- Gunakan named export alih-alih default export, mis. (`export const variable ...`, `export function `)
```
# Tetap dekat dengan proses penyusunan rencana
Untuk perubahan yang lebih besar, meluangkan waktu dan pemikiran ekstra untuk menyusun rencana yang presisi dan terdefinisi dengan jelas bisa secara signifikan meningkatkan output Cursor.
Kalau ngerasa hasilnya belum sesuai setelah beberapa variasi dari prompt yang sama, coba zoom out dan bikin rencana yang lebih detail dari nol, seolah-olah lagi bikin PRD buat rekan kerja. Sering kali **bagian tersulit adalah mencari tahu perubahan apa** yang harus dibuat—tugas yang memang lebih cocok untuk manusia. Dengan instruksi yang tepat, sebagian implementasi bisa didelegasikan ke Cursor.
Salah satu cara pakai AI untuk membantu proses penyusunan rencana adalah dengan pakai Ask mode. Untuk bikin rencana, nyalain Ask mode di Cursor dan tuangkan konteks apa pun yang kamu punya dari sistem manajemen proyek, dokumen internal, atau catatan lepas. Pikirin file dan dependency apa yang ada di codebase yang sudah kamu tahu mau kamu sertakan. Ini bisa berupa file yang berisi potongan kode yang mau kamu integrasikan, atau bahkan satu folder penuh.
Berikut contoh prompt:
```mdc Prompt perencanaan theme={null}
- bikin rencana gimana kita mau bikin fitur baru (kayak @existingfeature.ts)
- tanya aku (maks 3) kalau ada yang kurang jelas
- jangan lupa cari di codebase
@Past Chats (prompt eksplorasi aku sebelumnya)
ini ada konteks tambahan dari [project management tool]:
[deskripsi tiket yang ditempel]
```
Kita minta model untuk bikin rencana dan ngumpulin konteks dengan nanya ke manusia, merujuk prompt eksplorasi sebelumnya, dan juga deskripsi tiket. Disarankan pakai thinking model seperti `claude-3.7-sonnet`, `gemini-2.5-pro`, atau `o3` karena model-model ini bisa paham intent perubahan dan lebih bagus dalam menyintesis rencana.
Dari sini, kamu bisa nyusun rencana secara iteratif bareng Cursor sebelum mulai implementasi.
```mermaid theme={null}
diagram alir LR
A[Konteks] -- Tanya --> B[Rencana]
B -- Agen --> C[Implementasi]
```
# Pilih tool yang tepat buat tugasnya
Salah satu skill terpenting buat make Cursor secara efektif adalah milih tool yang tepat buat tugasnya. Pikirin apa yang lagi kamu coba capai dan pilih pendekatan yang bikin kamu tetap in flow.
| **Tool** | **Use case** | **Strength** | **Limitation** |
| :------------------------------------------ | :----------------------------- | :---------------------------------------- | :-------------------------- |
| **[Tab](/id/tab/overview)** | Perubahan cepat, manual | Kontrol penuh, cepat | Satu file |
| **[Inline Edit](/id/inline-edit/overview)** | Perubahan terarah di satu file | Edit terfokus | Satu file |
| **[Chat](/id/chat/overview)** | Perubahan besar, multi-file | Otomatis ngumpulin konteks, edit mendalam | Lebih lambat, berat konteks |
Setiap tool punya sweet spot:
* Tab adalah andalan kamu buat edit cepat ketika kamu pengin tetap pegang kendali
* Inline Edit paling pas saat kamu perlu ngelakuin perubahan terfokus di bagian kode tertentu
* Chat cocok banget buat perubahan yang lebih besar ketika kamu butuh Cursor paham konteks yang lebih luas
Saat kamu pakai mode Chat (yang bisa kerasa agak lambat tapi super powerful), bantu dengan ngasih konteks yang bagus. Pakai [@files](/id/context/@-symbols/@-files) buat nunjukin kode serupa yang pengin kamu tiru, atau [@folder](/id/context/@-symbols/@-folders) buat ngasih pemahaman yang lebih baik tentang struktur proyek kamu. Dan jangan ragu buat mecah perubahan besar jadi bagian yang lebih kecil — mulai chat baru bantu bikin semuanya tetap fokus dan efisien.
# Intisari
* Batasi ruang perubahan dan jangan coba ngerjain terlalu banyak sekaligus
* Sertakan konteks yang relevan kapan pun bisa
* Pakai Chat, Inline Edit, & Tab sesuai keunggulannya masing-masing
* Sering bikin chat baru
* Rencanakan dengan [Ask mode](/id/chat/ask), eksekusi dengan [Agent mode](/id/chat/agent)
# Bekerja dengan Dokumentasi
Source: https://docs.cursor.com/id/guides/advanced/working-with-documentation
Cara memanfaatkan dokumentasi secara efektif di Cursor melalui prompting, sumber eksternal, dan konteks internal
export const ChatInput = ({content = []}) => {
const renderContent = () => {
return content.map((item, index) => {
if (item.type === 'mention') {
return
{item.text}
;
}
return item.text;
});
};
return <>
Dokumentasi ngasih konteks yang up-to-date dan akurat. Tanpanya, model bakal pakai data pelatihan yang sudah ketinggalan atau nggak lengkap. Dokumentasi bantu model ngerti hal-hal seperti:
* API dan parameter yang berlaku saat ini
* Praktik terbaik
* Konvensi organisasi
* Istilah-istilah dalam domain
Dan masih banyak lagi. Lanjut baca buat tahu cara pakai dokumentasi langsung di Cursor tanpa harus ganti konteks.
## Batas pengetahuan model
Model bahasa besar dilatih pada data sampai titik waktu tertentu, yang disebut “knowledge cutoff.” Ini berarti:
* Pembaruan library terbaru mungkin belum tercermin
* Framework atau tool baru bisa jadi belum diketahui
* Perubahan API setelah tanggal cutoff akan terlewat
* Best practice mungkin sudah berkembang sejak pelatihan
Contohnya, kalau batas pengetahuan model ada di awal 2024, model nggak akan tahu fitur yang dirilis di akhir 2024, bahkan untuk framework populer.
# Harus pakai tool yang mana?
Pakai pohon keputusan ini buat cepat nentuin pendekatan terbaik buat kebutuhan dokumentasi lo:
```mermaid theme={null}
flowchart TD
A[Informasi apa yang lo butuhin?] --> B[Framework/library publik]
A --> C[Knowledge komunitas terbaru/troubleshooting]
A --> D[Informasi internal perusahaan]
B --> E[Butuh dokumentasi resmi?]
E -->|Ya| F[Pakai @Docs Referensi API, panduan, best practice]
E -->|Tidak| G[Pakai @Web Tutorial komunitas, perbandingan]
C --> H[Pakai @Web Postingan terbaru, issue GitHub]
D --> I[Integrasi MCP yang tersedia?]
I -->|Ya| J[Pakai MCP yang sudah ada Confluence, Google Drive, dll.]
I -->|Tidak| K[Bikin MCP kustom API internal, sistem proprietary]
style F fill:#e1f5fe
style G fill:#e8f5e8
style H fill:#e8f5e8
style J fill:#fff3e0
style K fill:#fce4ec
```
## Model mental
| Tool | Model mental |
| ----------- | ---------------------------------------------- |
| **`@Docs`** | Mirip menjelajah dan membaca dokumentasi resmi |
| **`@Web`** | Mirip mencari solusi di internet |
| **MCP** | Mirip mengakses dokumentasi internal kamu |
# Dokumentasi publik
Dokumentasi eksternal mencakup informasi yang tersedia untuk umum yang mungkin pengetahuan model tentangnya terbatas atau sudah kedaluwarsa. Cursor menyediakan dua cara utama untuk mengakses informasi ini.
## Menggunakan @Docs
`@Docs` menghubungkan Cursor ke dokumentasi resmi dari tool dan framework populer. Pakai ini saat butuh info terbaru dan tepercaya tentang:
* **Referensi API**: Signature fungsi, parameter, tipe return
* **Panduan memulai**: Setup, konfigurasi, penggunaan dasar
* **Praktik terbaik**: Pola yang direkomendasikan dari sumber resmi
* **Debugging khusus framework**: Panduan troubleshooting resmi
## Menggunakan @Web
`@Web` mencari internet secara real-time untuk informasi terbaru, postingan blog, dan diskusi komunitas. Pakai ini pas lo butuh:
* **Tutorial terbaru**: Konten dan contoh dari komunitas
* **Perbandingan**: Artikel yang membandingkan berbagai pendekatan
* **Pembaruan terkini**: Update atau pengumuman yang sangat baru
* **Berbagai perspektif**: Pendekatan berbeda untuk suatu masalah
# Dokumentasi internal
Dokumentasi internal mencakup informasi khusus untuk organisasimu yang belum pernah ditemui model AI saat pelatihan. Ini bisa berupa:
* **API internal**: Layanan kustom dan mikroservis
* **Standar perusahaan**: Konvensi penulisan kode, pola arsitektur
* **Sistem proprietary**: Alat kustom, basis data, alur kerja
* **Pengetahuan domain**: Logika bisnis, persyaratan kepatuhan
## Mengakses dokumentasi internal dengan MCP
Model Context Protocol (MCP) menyediakan cara standar buat ngebawa dokumentasi dan sistem privat lo ke Cursor. MCP bertindak sebagai lapisan tipis antara Cursor dan resource internal lo.
**Kenapa MCP penting:**
* Model nggak bisa nebak konvensi internal lo
* Dokumentasi API untuk layanan kustom nggak tersedia publik
* Business logic dan domain knowledge itu unik buat organisasi lo
* Kebutuhan compliance dan keamanan beda-beda tiap perusahaan
### Integrasi MCP yang umum
| Integrasi | Akses | Contoh |
| ---------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------- |
| **Confluence** | Space Confluence perusahaan | Dokumentasi arsitektur, spesifikasi API untuk layanan internal, standar dan pedoman coding, dokumentasi proses |
| **Google Drive** | Dokumen dan folder bersama | Dokumen spesifikasi, catatan meeting dan keputusan, dokumen desain dan requirement, knowledge base tim |
| **Notion** | Database dan halaman workspace | Dokumentasi proyek, wiki tim, knowledge base, product requirement, spesifikasi teknis |
| **Custom** | Sistem dan database internal | API proprietari, sistem dokumentasi legacy, knowledge base kustom, tool dan workflow khusus |
#### Solusi kustom
Buat kebutuhan unik, lo bisa bikin server MCP kustom yang:
* Nge-scrape situs atau portal internal
* Tersambung ke database proprietari
* Akses sistem dokumentasi kustom
* Narik data dari wiki internal atau knowledge base
Kalau lo bikin server MCP kustom, lo juga bisa ngekspos tools biar Cursor bisa ngupdate dokumentasi
Contoh server MCP kustom buat scraping dokumen internal:
```javascript TypeScript theme={null}
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import TurndownService from "turndown";
// Create an MCP server for scraping internal docs
const server = new McpServer({
name: "internal-docs",
version: "1.0.0"
});
const turndownService = new TurndownService();
// Add tool to scrape internal documentation
server.tool("get_doc",
{ url: z.string() },
async ({ url }) => {
try {
const response = await fetch(url);
const html = await response.text();
// Convert HTML to markdown
const markdown = turndownService.turndown(html);
return {
content: [{ type: "text", text: markdown }]
};
} catch (error) {
return {
content: [{ type: "text", text: `Error scraping ${url}: ${error.message}` }]
};
}
}
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);
```
```python Python theme={null}
# server.py
import os
import asyncio
from mcp.server.fastmcp import FastMCP
import aiohttp
from markdownify import markdownify as md
# Create an MCP server for scraping internal docs
mcp = FastMCP("internal-docs")
@mcp.tool()
async def get_doc(url: str) -> dict:
"""Scrape internal documentation from a URL"""
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
html = await response.text()
# Convert HTML to markdown
markdown = md(html)
return {
"content": [{"type": "text", "text": markdown}]
}
except Exception as error:
return {
"content": [{"type": "text", "text": f"Error scraping {url}: {str(error)}"}]
}
```
# Menjaga dokumentasi tetap mutakhir
Dokumentasi cepat ketinggalan zaman. Cursor bisa bantu lo ngerawat dokumentasi yang up-to-date dan berguna dengan ngembangin serta nge-update-nya berdasarkan kode lo yang sebenarnya dan percakapan lo selama pengembangan.
## Dari kode yang sudah ada
Gunakan Cursor buat bikin dokumentasi langsung dari codebase lo:
## Dari sesi chat
Percakapan lo dengan Cursor punya konteks intent berharga yang bisa diubah jadi dokumentasi.
**Setelah menyelesaikan masalah kompleks:**
**Setelah ada keputusan arsitektur:**
**Setelah sesi debugging:**
## Intisari
* Dokumentasi sebagai konteks bikin Cursor lebih akurat dan mutakhir
* Pakai `@Docs` buat dokumentasi resmi dan `@Web` buat pengetahuan komunitas
* MCP menjembatani jarak antara Cursor dan sistem internal lo
* Hasilkan dokumentasi dari kode dan percakapan biar pengetahuan tetap up-to-date
* Gabungkan sumber dokumentasi eksternal dan internal buat pemahaman yang menyeluruh
# Java
Source: https://docs.cursor.com/id/guides/languages/java
Menyiapkan pengembangan Java dengan JDK, ekstensi, dan alat build
Panduan ini bantu lo ngonfigurasi Cursor buat pengembangan Java, termasuk nyiapin JDK, install ekstensi yang diperlukan, debugging, ngejalanin aplikasi Java, dan integrasi alat build kayak Maven dan Gradle. Panduan ini juga ngebahas fitur alur kerja yang mirip IntelliJ atau VS Code.
Sebelum mulai, pastiin lo udah install Cursor dan update ke versi terbaru.
## Menyiapkan Java untuk Cursor
### Instalasi Java
Sebelum menyiapkan Cursor, kamu perlu punya Java terpasang di mesinmu.
Cursor nggak menyertakan kompiler Java, jadi kamu perlu menginstal JDK kalau
belum ada.
Unduh dan instal JDK (misalnya OpenJDK, Oracle JDK, Microsoft Build of
OpenJDK).
Setel JAVA\_HOME dan tambahkan JAVA\_HOME\bin ke PATH kamu.
Instal via Homebrew (`brew install openjdk`) atau unduh installer.
Pastikan JAVA\_HOME mengarah ke JDK yang terpasang.
Pakai manajer paket kamu (`sudo apt install openjdk-17-jdk` atau yang setara)
atau instal via SDKMAN.
Untuk mengecek instalasi, jalankan:
```bash theme={null}
java -version
javac -version
```
Kalau Cursor nggak mendeteksi JDK kamu, atur sendiri di settings.json:
```json theme={null}
{
"java.jdt.ls.java.home": "/path/to/jdk",
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/path/to/jdk-17",
"default": true
}
]
}
```
Restart Cursor untuk menerapkan perubahan.
### Penyiapan Cursor
Cursor mendukung ekstensi VS Code. Instal yang berikut ini secara manual:
Mencakup dukungan bahasa Java, debugger, test runner, dukungan Maven, dan
manajer proyek
Penting untuk bekerja dengan sistem build Gradle
Diperlukan untuk pengembangan Spring Boot
Diperlukan untuk pengembangan aplikasi Kotlin
### Konfigurasi Alat Build
#### Maven
Pastikan Maven terpasang (`mvn -version`). Instal dari [maven.apache.org](https://maven.apache.org/download.cgi) jika perlu:
1. Unduh arsip biner
2. Ekstrak ke lokasi yang diinginkan
3. Setel variabel lingkungan MAVEN\_HOME ke folder hasil ekstraksi
4. Tambahkan %MAVEN\_HOME%\bin (Windows) atau \$MAVEN\_HOME/bin (Unix) ke PATH
#### Gradle
Pastikan Gradle terpasang (`gradle -version`). Instal dari [gradle.org](https://gradle.org/install/) jika perlu:
1. Unduh distribusi biner
2. Ekstrak ke lokasi yang diinginkan
3. Setel variabel lingkungan GRADLE\_HOME ke folder hasil ekstraksi
4. Tambahkan %GRADLE\_HOME%\bin (Windows) atau \$GRADLE\_HOME/bin (Unix) ke PATH
Atau gunakan Gradle Wrapper yang akan otomatis mengunduh dan memakai versi Gradle yang tepat:
## Menjalankan dan Debugging
Sekarang semuanya sudah siap, saatnya nge-run dan nge-debug kode Java lo.
Tergantung kebutuhan lo, lo bisa pakai cara berikut:
Klik tautan "Run" yang muncul di atas method main mana pun buat cepat ngejalanin
program lo
Buka panel sidebar Run and Debug dan pakai tombol Run buat mulai
aplikasi lo
Jalanin dari command line pakai perintah Maven atau Gradle
Launch aplikasi Spring Boot langsung dari ekstensi Spring Boot Dashboard
## Alur Kerja Java x Cursor
Fitur bertenaga AI dari Cursor bisa secara signifikan ningkatin alur kerja pengembangan Java. Berikut beberapa cara buat ngegunain kemampuan Cursor khusus buat Java:
Saran cerdas buat method, signature, dan boilerplate Java kayak
getter/setter.
Nerapin design pattern, refactor kode, atau ngegenerasi class dengan
inheritance yang bener.
Edit inline cepat buat method, benerin error, atau ngegenerasi unit test tanpa
ganggu flow.
Dapet bantuan soal konsep Java, debug exception, atau paham fitur
framework.
### Contoh Alur Kerja
1. **Generate Java Boilerplate**\
Pakai [Tab completion](/id/tab/overview) buat cepat ngegenerasi constructor, getter/setter, method equals/hashCode, dan pola Java repetitif lainnya.
2. **Debug Exception Java yang Kompleks**\
Pas nemu stack trace Java yang susah dimengerti, highlight dan pakai [Ask](/id/chat/overview) buat jelasin akar masalah dan ngasih saran perbaikan.
3. **Refactor Kode Java Legacy**\
Pakai [Agent mode](/id/chat/agent) buat modernisasi kode Java lama—ubah anonymous class jadi lambda, upgrade ke fitur bahasa Java yang lebih baru, atau nerapin design pattern.
4. **Pengembangan Framework**\
Tambahin dokumentasi ke konteks Cursor dengan @docs, dan ngegenerasi kode spesifik framework langsung di Cursor.
# JavaScript & TypeScript
Source: https://docs.cursor.com/id/guides/languages/javascript
Pengembangan JavaScript dan TypeScript dengan dukungan framework
Selamat datang di pengembangan JavaScript dan TypeScript di Cursor! Editor ini punya dukungan yang sangat baik untuk pengembangan JS/TS lewat ekosistem ekstensi. Berikut yang perlu kamu tahu untuk memaksimalkan penggunaan Cursor.
## Ekstensi Esensial
Meski Cursor bekerja lancar dengan ekstensi apa pun yang kamu pakai, kami rekomendasikan yang ini buat kamu yang baru mulai:
* **ESLint** - Diperlukan untuk kemampuan perbaikan lint berbasis AI di Cursor
* **JavaScript and TypeScript Language Features** - Dukungan bahasa dan IntelliSense yang lebih kaya
* **Path Intellisense** - Pelengkapan jalur cerdas untuk path file
## Fitur Cursor
Cursor ngasih tenaga ke alur kerja JavaScript/TypeScript yang sudah kamu pakai dengan:
* **Tab Completions**: Saran kode kontekstual yang paham struktur proyek kamu
* **Automatic Imports**: Tab bisa otomatis mengimpor library begitu kamu pakai
* **Inline Editing**: Pakai `CMD+K` di baris mana pun untuk ngedit dengan sintaks yang rapi
* **Composer Guidance**: Rencanakan dan edit kode kamu lintas banyak file dengan Composer
### Framework Intelligence dengan @Docs
Fitur @Docs dari Cursor bikin pengembangan JavaScript kamu makin ngebut dengan nambahin sumber dokumentasi kustom yang bisa dirujuk AI. Tambahin dokumentasi dari MDN, Node.js, atau framework favorit kamu biar saran kode jadi lebih akurat dan kontekstual.
Pelajari cara nambah dan ngelola sumber dokumentasi kustom di Cursor.
### Penyelesaian Linting Otomatis
Salah satu fitur unggulan Cursor adalah integrasi mulusnya dengan ekstensi linter.
Pastikan kamu punya linter seperti ESLint yang sudah disetel, dan aktifkan pengaturan 'Iterate on Lints'.
Terus, pas kamu pakai Agent mode di Composer, begitu AI nyoba jawab pertanyaan kamu dan bikin perubahan kode, AI bakal otomatis baca output dari linter dan coba benerin error lint yang mungkin belum ketangkep sebelumnya.
## Dukungan Framework
Cursor bekerja mulus dengan semua framework dan library JavaScript utama, seperti:
### React & Next.js
* Dukungan penuh JSX/TSX dengan saran komponen yang cerdas
* Kecerdasan untuk server component dan rute API di Next.js
* Rekomendasi: ekstensi [**React Developer Tools**](cursor:extension/msjsdiag.vscode-react-native)
### Vue.js
* Dukungan sintaks template dengan integrasi Volar
* Pelengkapan otomatis komponen dan pemeriksaan tipe
* Rekomendasi: [**Vue Language Features**](cursor:extension/vue.volar)
### Angular
* Validasi template dan dukungan decorator TypeScript
* Pembuatan komponen dan service
* Rekomendasi: [**Angular Language Service**](cursor:extension/Angular.ng-template)
### Svelte
* Highlighting sintaks komponen dan pelengkapan cerdas
* Saran untuk reactive statement dan store
* Rekomendasi: [**Svelte for VS Code**](cursor:extension/svelte.svelte-vscode)
### Backend Frameworks (Express/NestJS)
* Kecerdasan untuk route dan middleware
* Dukungan decorator TypeScript untuk NestJS
* Integrasi alat pengujian API
Ingat, fitur AI Cursor bekerja dengan baik di semua framework ini, memahami pola dan best practice mereka untuk ngasih saran yang relevan. AI bisa bantu dari pembuatan komponen sampai refactoring yang kompleks, sambil tetap menghormati pola yang sudah ada di proyek lo.
# Python
Source: https://docs.cursor.com/id/guides/languages/python
Menyiapkan pengembangan Python dengan ekstensi dan alat linting
Panduan ini banyak terinspirasi oleh [Jack Fields](https://x.com/OrdinaryInds)
dan
[artikelnya](https://medium.com/ordinaryindustries/the-ultimate-vs-code-setup-for-python-538026b34d94)
tentang setup VS Code untuk pengembangan Python. Cek artikelnya buat
detail lebih lanjut.
## Prasyarat
Sebelum mulai, pastikan kamu punya:
* [Python](https://python.org) terinstal (disarankan versi 3.8 atau lebih baru)
* [Git](https://git-scm.com/) untuk kontrol versi
* Cursor terinstal dan diperbarui ke versi terbaru
## Ekstensi Esensial
Ekstensi berikut menyiapkan Cursor agar lengkap untuk pengembangan Python. Ekstensi ini ngasih kamu syntax highlighting, linting, debugging, dan unit testing.
Dukungan bahasa inti dari Microsoft
Server bahasa Python yang cepat
Kemampuan debugging yang lebih kaya
Linter dan formatter untuk Python
### Tooling Python Lanjutan
Walaupun ekstensi di atas sebelumnya jadi yang paling populer buat pengembangan Python di Cursor, kami juga nambahin beberapa ekstensi tambahan yang bisa bantu kamu maksimalin workflow Python kamu.
#### `uv` - Pengelola Environment Python
[uv](https://github.com/astral-sh/uv) adalah package manager Python modern yang bisa dipakai untuk bikin dan ngelola virtual environment, sekaligus bisa gantiin pip sebagai package manager default.
Untuk instal uv, jalanin perintah berikut di terminal kamu:
```bash theme={null}
pip install uv
```
#### `ruff` - Linter dan Formatter Python
[Ruff](https://docs.astral.sh/ruff/) adalah linter dan formatter Python modern yang bisa dipakai buat memeriksa kesalahan pemrograman, membantu menegakkan standar penulisan kode, dan menyarankan refactoring. Ruff bisa dipakai bareng Black untuk formatting kode.
Buat memasang Ruff, jalanin perintah berikut di terminal:
```bash theme={null}
pip install ruff
```
## Konfigurasi Cursor
### 1. Interpreter Python
Atur interpreter Python kamu di Cursor:
1. Buka Command Palette (Cmd/Ctrl + Shift + P)
2. Cari "Python: Select Interpreter"
3. Pilih interpreter Python kamu (atau virtual environment kalau kamu memakainya)
### 2. Pemformatan Kode
Siapkan pemformatan kode otomatis dengan Black:
Black adalah pemformat kode yang secara otomatis merapikan kode kamu agar mengikuti
gaya yang konsisten. Black tidak memerlukan konfigurasi dan sudah banyak diadopsi oleh
komunitas Python.
Untuk menginstal Black, jalankan perintah berikut di terminal kamu:
```bash theme={null}
pip install black
```
Lalu, atur Cursor buat pakai Black untuk format kode, dengan nambahin yang berikut ke file `settings.json` lo:
```json theme={null}
{
"python.formatting.provider": "black",
"editor.formatOnSave": true,
"python.formatting.blackArgs": ["--line-length", "88"]
}
```
### 3. Linting
Kita bisa pakai PyLint buat ngecek error pemrograman, bantu menegakkan standar penulisan kode, dan ngasih saran refactoring.
Untuk menginstal PyLint, jalankan perintah berikut di terminal:
```bash theme={null}
pip install pylint
```
```json theme={null}
{
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.lintOnSave": true
}
```
### 4. Pemeriksaan Tipe
Selain linting, kita bisa pakai MyPy buat ngecek error tipe.
Untuk memasang MyPy, jalanin perintah berikut di terminal:
```bash theme={null}
pip install mypy
```
```json theme={null}
{
"python.linting.mypyEnabled": true
}
```
## Debugging
Cursor menyediakan kemampuan debugging yang powerful untuk Python:
1. Pasang breakpoint dengan klik di gutter
2. Buka panel Debug (Cmd/Ctrl + Shift + D)
3. Atur `launch.json` untuk konfigurasi debug kustom
## Fitur Rekomendasi
Saran kode cerdas yang paham konteks dan tindakan lo
Jelajahi dan pahami kode lewat percakapan natural
Tangani tugas pengembangan kompleks dengan bantuan AI
Ambil konteks dari sistem pihak ketiga
Impor modul otomatis saat lo ngoding
Cursor terus nge-review kode lo pakai AI
## Dukungan Framework
Cursor bekerja mulus dengan berbagai framework Python populer:
* **Web Frameworks**: Django, Flask, FastAPI
* **Data Science**: Jupyter, NumPy, Pandas
* **Machine Learning**: TensorFlow, PyTorch, scikit-learn
* **Testing**: pytest, unittest
* **API**: requests, aiohttp
* **Database**: SQLAlchemy, psycopg2
# iOS & macOS (Swift)
Source: https://docs.cursor.com/id/guides/languages/swift
Integrasikan Cursor dengan Xcode untuk pengembangan Swift
Selamat datang di pengembangan Swift di Cursor! Mau bikin app iOS, aplikasi macOS, atau proyek Swift sisi server, semuanya aman. Panduan ini bakal bantu lo nyiapin environment Swift di Cursor, mulai dari dasar sampai fitur yang lebih advanced.
## Alur Dasar
Cara paling sederhana buat pakai Cursor dengan Swift adalah menjadikannya editor kode utama sambil tetap mengandalkan Xcode untuk build dan ngejalanin app. Kamu bakal dapat fitur-fitur keren seperti:
* Pelengkapan kode pintar
* Bantuan ngoding bertenaga AI (coba [CMD+K](/id/inline-edit/overview) di baris mana pun)
* Akses cepat ke dokumentasi lewat [@Docs](/id/context/@-symbols/@-docs)
* Highlighting sintaks
* Navigasi kode dasar
Kalau perlu build atau jalanin app, cukup pindah ke Xcode. Alur kerja ini pas buat developer yang mau manfaatin kapabilitas AI dari Cursor sambil tetap pakai tool Xcode yang familiar buat debugging dan deployment.
### Hot Reloading
Saat pakai workspace atau project Xcode (bukannya buka folder langsung di Xcode), Xcode sering kali bisa ngeabaikan perubahan pada file kamu yang dibuat di Cursor, atau di luar Xcode pada umumnya.
Walau kamu bisa buka foldernya di Xcode buat beresin ini, kamu mungkin perlu tetap pakai project untuk alur kerja pengembangan Swift.
Solusi yang oke adalah pakai [Inject](https://github.com/krzysztofzablocki/Inject), library hot reloading untuk Swift yang memungkinkan app kamu “hot reload” dan ke-update seketika begitu ada perubahan secara real-time. Ini gak kena efek samping dari masalah workspace/project Xcode, dan memungkinkan kamu ngelakuin perubahan di Cursor lalu langsung tercermin di app kamu.
Pelajari lebih lanjut tentang Inject dan cara makainya di project Swift kamu.
## Pengembangan Swift Lanjutan
Bagian panduan ini banyak terinspirasi dari [Thomas
Ricouard](https://x.com/Dimillian) dan
[artikelnya](https://dimillian.medium.com/how-to-use-cursor-for-ios-development-54b912c23941)
tentang penggunaan Cursor untuk pengembangan iOS. Cek artikelnya buat
detail lebih lanjut dan follow dia untuk konten Swift lainnya.
Kalau kamu pengin cuma buka satu editor sekaligus dan mau ngindarin bolak-balik antara Xcode dan Cursor, kamu bisa pakai ekstensi seperti [Sweetpad](https://sweetpad.hyzyla.dev/) buat mengintegrasikan Cursor langsung dengan sistem build inti Xcode.
Sweetpad adalah ekstensi yang powerful yang memungkinkan kamu build, run, dan debug proyek Swift langsung di Cursor, tanpa mengorbankan fitur-fitur Xcode.
Buat mulai pakai Sweetpad, kamu tetap perlu Xcode terpasang di Mac kamu—itu fondasi pengembangan Swift. Kamu bisa mengunduh Xcode dari [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835). Setelah Xcode siap, yuk tingkatkan pengalaman pengembangan kamu di Cursor dengan beberapa tool penting.
Buka terminal kamu dan jalankan:
```bash theme={null}
# Build proyek kamu tanpa perlu membuka Xcode
brew install xcode-build-server
# Memformat rapi output perintah `xcodebuild` di terminal Cursor
brew install xcbeautify
# Mengaktifkan pemformatan lanjutan dan fitur bahasa
brew install swiftformat
```
Selanjutnya, install ekstensi [Swift Language Support](cursor:extension/chrisatwindsurf.swift-vscode) di Cursor. Ini bakal ngasih highlight sintaks dan fitur bahasa dasar yang langsung siap pakai.
Lanjut, kita bisa install ekstensi [Sweetpad](https://sweetpad.hyzyla.dev/) buat ngeintegrasiin Cursor dengan Xcode. Sweetpad ngebungkus banyak shortcut di atas CLI `xcodebuild` (dan banyak lagi), dan memungkinkan kamu buat scan target, pilih destination, build, dan jalanin app kamu layaknya di Xcode. Selain itu, Sweetpad bakal nyiapin project kamu buat Xcode Build Server biar kamu dapet semua fitur yang disebut di atas.
### Cara Pakai Sweetpad
Begitu Sweetpad terpasang, dan kamu punya project Swift yang kebuka di Cursor, pertama jalanin perintah `Sweetpad: Generate Build Server Config`. Ini bakal ngebuat file `buildServer.json` di root project kamu yang memungkinkan Xcode Build Server bekerja dengan project kamu.
Lalu, dari Command Palette atau sidebar Sweetpad, kamu bisa pilih target yang mau kamu build dan jalanin.
{" "}
Kamu perlu build project kamu sekali buat ngaktifin auto-completion, lompat ke definisi,
dan fitur bahasa lainnya.{" "}
Sekarang kamu juga bisa pencet F5 buat build dan jalanin project kamu dengan debugger — kamu mungkin perlu bikin launch configuration dulu, tapi tinggal pilih Sweetpad dari daftar pas diminta!
Kayak banyak ekstensi di Cursor, kamu bisa nge-bind banyak perintah Sweetpad ke shortcut keyboard, biar workflow kamu makin efisien.
Buat belajar lebih lanjut tentang Sweetpad, cek resource berikut:
Website resmi Sweetpad berisi fitur dan instruksi instalasi
Panduan lengkap yang membahas konfigurasi, penggunaan, dan fitur lanjutan
# JetBrains
Source: https://docs.cursor.com/id/guides/migration/jetbrains
Migrasi dari IDE JetBrains ke Cursor dengan alat yang sudah familier
Cursor menawarkan pengalaman ngoding modern bertenaga AI yang bisa menggantikan IDE JetBrains. Meski perpindahannya mungkin terasa berbeda di awal, fondasi Cursor yang berbasis VS Code menghadirkan fitur-fitur canggih dan opsi kustomisasi yang luas.
## Komponen Editor
### Ekstensi
JetBrains IDE adalah alat yang keren, karena sudah dikonfigurasi sebelumnya untuk bahasa dan framework yang dituju.
Cursor berbeda — sebagai kanvas kosong sejak awal, kamu bisa menyesuaikannya sesuka hati, tanpa dibatasi oleh bahasa dan framework yang ditargetkan IDE.
Cursor punya akses ke ekosistem ekstensi yang luas, dan hampir semua fungsionalitas (bahkan lebih!) yang ditawarkan JetBrains IDE bisa direplikasi lewat ekstensi-ekstensi ini.
Lihat beberapa ekstensi populer berikut:
Ekstensi SSH
Kelola banyak proyek
Integrasi Git yang lebih kaya
Lacak perubahan file lokal
Sorotan error inline
Linting kode
Pemformatan kode
Lacak TODO dan FIXME
### Pintasan Keyboard
Cursor punya manajer pintasan keyboard bawaan yang memungkinkan kamu memetakan pintasan favorit ke aksi-aksi.
Dengan ekstensi ini, kamu bisa membawa hampir semua pintasan JetBrains IDE langsung ke Cursor!
Pastikan baca dokumentasi ekstensi untuk tahu cara mengonfigurasinya sesuai selera:
Instal ekstensi ini untuk membawa pintasan keyboard JetBrains IDE ke Cursor.
Pintasan umum yang berbeda:
* Find Action: ⌘/Ctrl+Shift+P (vs. ⌘/Ctrl+Shift+A)
* Quick Fix: ⌘/Ctrl+. (vs. Alt+Enter)
* Go to File: ⌘/Ctrl+P (vs. ⌘/Ctrl+Shift+N)
### Tema
Reka ulang tampilan dan nuansa JetBrains IDE favorit kamu di Cursor dengan tema komunitas ini.
Pilih Darcula Theme standar, atau pilih tema yang cocok dengan penyorotan sintaks alat JetBrains kamu.
Rasakan tema gelap klasik JetBrains Darcula
Dapatkan ikon file dan folder JetBrains yang familiar
### Font
Untuk melengkapi pengalaman ala JetBrains, kamu bisa pakai font resmi JetBrains Mono:
1. Unduh dan instal font JetBrains Mono ke sistem kamu:
2. Restart Cursor setelah menginstal font
3. Buka Settings di Cursor (⌘/Ctrl + ,)
4. Cari "Font Family"
5. Setel font family ke `'JetBrains Mono'`
Biar makin optimal, lo juga bisa nyalain ligatur font dengan nge-set "editor.fontLigatures": true di settings lo.
## Migrasi Spesifik IDE
Banyak pengguna suka JetBrains IDE karena dukungan bawaan untuk bahasa dan framework yang jadi fokusnya. Cursor beda—sebagai kanvas kosong sejak awal, kamu bisa ngustom sesuai selera, tanpa dibatasi bahasa dan framework yang jadi target IDE tersebut.
Cursor sudah punya akses ke ekosistem ekstensi VS Code, dan hampir semua fungsionalitas (bahkan lebih!) yang ditawarkan JetBrains IDE bisa direplikasi lewat ekstensi-ekstensi ini.
Lihat ekstensi yang disarankan untuk tiap JetBrains IDE di bawah.
### IntelliJ IDEA (Java)
Fitur inti bahasa Java
Dukungan debugging Java
Menjalankan dan debugging test Java
Dukungan Maven
Alat manajemen proyek
Perbedaan utama:
* Konfigurasi Build/Run dikelola lewat launch.json
* Alat Spring Boot tersedia lewat ekstensi ["Spring Boot Extension Pack"](cursor:extension/vmware.vscode-boot-dev-pack)
* Dukungan Gradle lewat ekstensi ["Gradle for Java"](cursor:extension/vscjava.vscode-gradle)
### PyCharm (Python)
Dukungan Python inti
Pengecekan tipe yang cepat
Dukungan notebook
Formatter dan linter Python
Perbedaan utama:
* Virtual environment dikelola lewat command palette
* Konfigurasi debugging di launch.json
* Manajemen dependencies lewat requirements.txt atau Poetry
### WebStorm (JavaScript/TypeScript)
Fitur bahasa terbaru
Pengembangan React
Dukungan Vue.js
Pengembangan Angular
Sebagian besar fitur WebStorm sudah built-in di Cursor/VS Code, termasuk:
* Tampilan skrip npm
* Debugging
* Integrasi Git
* Dukungan TypeScript
### PhpStorm (PHP)
Server bahasa PHP
Integrasi Xdebug
Kecerdasan kode
Alat dokumentasi
Perbedaan utama:
* Konfigurasi Xdebug lewat launch.json
* Integrasi Composer lewat terminal
* Alat basis data lewat ekstensi ["SQLTools"](cursor:extension/mtxr.sqltools)
### Rider (.NET)
Dukungan inti C#
Lingkungan pengembangan C# open source
Plugin C# dari JetBrains
Pengelolaan .NET SDK
Perbedaan utama:
* Solution Explorer melalui File Explorer
* Pengelolaan paket NuGet melalui CLI atau ekstensi
* Integrasi test runner melalui Test Explorer
### GoLand (Go)
Ekstensi resmi Go
Perbedaan utama:
* Instalasi alat Go dipicu secara otomatis
* Debugging melalui launch.json
* Pengelolaan paket terintegrasi dengan go.mod
## Tips untuk Transisi yang Mulus
Tekan ⌘/Ctrl + Shift + P buat nyari perintah
Manfaatkan fitur AI Cursor buat pelengkapan kode dan refactoring
Fine-tune file settings.json biar workflow makin optimal
Gunakan terminal bawaan buat operasi command-line
Jelajahi marketplace VS Code buat alat tambahan
Ingat, meskipun beberapa workflow mungkin beda, Cursor nawarin fitur coding berbasis AI yang powerful dan bisa ningkatin produktivitas melampaui kemampuan IDE tradisional.
# VS Code
Source: https://docs.cursor.com/id/guides/migration/vscode
Impor pengaturan dan ekstensi VS Code dengan sekali klik
Cursor dibangun di atas codebase VS Code, jadi kita bisa fokus bikin pengalaman ngoding bertenaga AI yang maksimal sambil tetap mempertahankan lingkungan editor yang familiar. Ini memudahkan kamu buat migrasi pengaturan VS Code yang sudah ada ke Cursor.
## Migrasi Profil
### Impor Sekali Klik
Begini cara dapetin seluruh setup VS Code kamu dalam satu klik:
1. Buka Cursor Settings (⌘/Ctrl + Shift + J)
2. Masuk ke General > Account
3. Di bawah "VS Code Import", klik tombol Import
Ini bakal mindahin:
* Extensions
* Themes
* Settings
* Keybindings
### Migrasi Profil Manual
Kalau kamu pindah perangkat, atau pengen kontrol lebih atas pengaturan kamu, kamu bisa migrasi profil secara manual.
#### Mengekspor Profil
1. Di VS Code kamu, buka Command Palette (⌘/Ctrl + Shift + P)
2. Cari "Preferences: Open Profiles (UI)"
3. Temukan profil yang mau diekspor di sidebar kiri
4. Klik menu 3 titik dan pilih "Export Profile"
5. Pilih untuk mengekspornya ke perangkat lokal kamu atau ke GitHub Gist
#### Mengimpor Profil
1. Di Cursor kamu, buka Command Palette (⌘/Ctrl + Shift + P)
2. Cari "Preferences: Open Profiles (UI)"
3. Klik menu dropdown di sebelah 'New Profile' dan klik 'Import Profile'
4. Tempel URL GitHub Gist atau pilih 'Select File' untuk mengunggah file lokal
5. Klik 'Import' di bagian bawah dialog untuk nyimpen profil
6. Terakhir, di sidebar, pilih profil baru dan klik ikon centang buat ngaktifinnya
## Pengaturan dan Antarmuka
### Menu Pengaturan
Akses via Command Palette (⌘/Ctrl + Shift{" "}
* P), lalu ketik "Cursor Settings"
Akses via Command Palette (⌘/Ctrl + Shift{" "}
* P), lalu ketik "Preferences: Open Settings (UI)"
### Pembaruan Versi
Kami rutin me-rebase Cursor ke versi VS Code terbaru supaya tetap mengikuti
fitur dan perbaikan terkini. Demi stabilitas, Cursor sering memakai versi
VS Code yang sedikit lebih lama.
### Orientasi Activity Bar
Kami bikin horizontal supaya ruang untuk antarmuka chat AI lebih optimal. Kalau lebih suka vertikal:
1. Buka Command Palette (⌘/Ctrl + Shift + P)
2. Cari "Preferences: Open Settings (UI)"
3. Cari `workbench.activityBar.orientation`
4. Set nilainya ke `vertical`
5. Restart Cursor
# Diagram Arsitektur
Source: https://docs.cursor.com/id/guides/tutorials/architectural-diagrams
Pelajari cara bikin diagram arsitektur pakai Mermaid untuk memvisualisasikan struktur sistem dan alur data
Diagram arsitektur bantu lo ngeh gimana sistem lo bekerja. Lo bisa pakai ini buat ngeksplor logika, ngelacak data, dan ngejelasin struktur. Cursor dukung bikin diagram ini langsung pakai tool kayak Mermaid, jadi lo bisa dari kode ke visual cuma dalam beberapa prompt.
## Kenapa diagram penting
Diagram ngebantu ngejelasin gimana data ngalir dan gimana komponen saling berinteraksi. Diagram berguna ketika lo:
* Pengen ngerti flow control di codebase lo
* Perlu ngelacak data lineage dari input sampai output
* Lagi onboarding orang lain atau lagi mendokumentasikan sistem lo
Diagram juga kece buat debugging dan ngebantu lo nanya pertanyaan yang lebih cerdas. Visual ngebantu lo (dan model) ngeliat gambaran besar.
## Dua dimensi yang perlu dipertimbangkan
Ada beberapa sudut pandang yang bisa kamu ambil:
* **Tujuan**: Kamu lagi memetakan logika, alur data, infrastruktur, atau yang lain?
* **Format**: Kamu butuh yang cepat (misalnya diagram Mermaid) atau yang formal (seperti UML)?
## Cara membuat prompt
Mulai dengan tujuan yang jelas. Berikut beberapa cara umum buat nanya:
* **Alur eksekusi**: "Tunjukin gimana request jalan dari controller ke database."
* **Asal-usul data (data lineage)**: "Lacak variabel ini dari titik masuk sampai ke tujuan akhirnya."
* **Struktur**: "Kasih gue view per komponen dari service ini."
Lo bisa tentuin titik awal dan akhir, atau minta Cursor buat nemuin jalur lengkapnya.
## Bekerja dengan Mermaid
Mermaid mudah dipelajari dan bisa dirender langsung di Markdown (dengan ekstensi yang tepat). Cursor bisa menghasilkan diagram seperti:
* `flowchart` untuk logika dan alur
* `sequenceDiagram` untuk interaksi
* `classDiagram` untuk struktur objek
* `graph TD` untuk peta berarah sederhana
```mermaid theme={null}
sequenceDiagram
participant User
participant Server
participant Database
User->>Server: Kirim Formulir
Server->>Database: Simpan Entri
Database-->>Server: Berhasil
Server-->>User: Konfirmasi
```
Kamu bisa pasang [ekstensi Mermaid](https://marketplace.cursorapi.com/items?itemName=bierner.markdown-mermaid) buat nge-preview diagram.
1. Buka tab Extensions
2. Cari Mermaid
3. Pasang
## Strategi diagram
Mulai kecil dulu. Jangan coba memetakan semuanya sekaligus.
* Pilih satu fungsi, rute, atau proses
* Minta Cursor membuat diagram bagian itu dengan Mermaid
* Setelah kamu punya beberapa, minta untuk menggabungkannya
Ini selaras dengan **model C4** – kamu mulai dari level rendah (kode atau komponen) lalu naik ke ringkasan level yang lebih tinggi.
### Alur yang direkomendasikan
1. Mulai dengan diagram detail level rendah
2. Ringkas jadi tampilan level menengah
3. Ulangi sampai mencapai tingkat abstraksi yang kamu inginkan
4. Minta Cursor menggabungkannya jadi satu diagram atau peta sistem
```mermaid theme={null}
graph TD
subgraph Level 1: Komponen tingkat rendah
A1[AuthService] --> A2[TokenValidator]
A1 --> A3[UserDB]
B1[PaymentService] --> B2[BillingEngine]
B1 --> B3[InvoiceDB]
end
subgraph Level 2: Sistem tingkat menengah
A[Sistem Pengguna] --> A1
B[Sistem Penagihan] --> B1
end
subgraph Level 3: Aplikasi tingkat tinggi
App[Aplikasi Utama] --> A
App --> B
end
```
## Ringkasan
* Gunakan diagram untuk memahami alur, logika, dan data
* Mulai dengan prompt kecil dan kembangkan diagram dari sana
* Mermaid adalah format yang paling mudah digunakan di Cursor
* Mulai dari level rendah lalu naikkan abstraksinya, seperti di model C4
* Cursor bisa bantu kamu membuat, menyempurnakan, dan menggabungkan diagram dengan mudah
# Membangun Server MCP
Source: https://docs.cursor.com/id/guides/tutorials/building-mcp-server
Pelajari cara membangun server Model Context Protocol (MCP) dengan integrasi PostgreSQL untuk Cursor
## Pengantar
Server MCP memungkinkan lo menghubungkan sumber data kustom dan membuatnya bisa dipakai langsung di dalam Cursor. Ini khususnya berguna saat lo butuh konteks dari tempat seperti browser, database, atau log error dan sistem. Menyiapkan server MCP itu straightforward, dan dengan Cursor bisa dilakukan cepat.
Di panduan ini, kita bakal ngebahas cara bikin server MCP buat Postgres. Tujuan kita adalah memungkinkan Cursor ngejalanin query SQL langsung ke database Postgres dan ngekspos skema tabel secara terstruktur.
Tutorial ini dirancang buat ngajarin fundamental membangun server MCP.
```mermaid theme={null}
graph LR
A[Pengguna di Cursor] --> B[Cursor]
B <--> C["Server MCP (stdio)"]
C <--> D[(Database Postgres)]
subgraph Mesin Lokal
B
C
end
class B cursor
class C mcp
class D db
```
## Apa itu MCP Server?
[MCP server](/id/context/mcp) adalah proses yang berkomunikasi dengan Cursor dan menyediakan akses ke data atau tindakan eksternal. Ini bisa diimplementasikan dengan beberapa cara, tapi di sini kita bakal pakai metode paling sederhana: server yang berjalan lokal di komputermu lewat [stdio](https://en.wikipedia.org/wiki/Standard_streams) (aliran standar input/output). Ini menghindari pertimbangan keamanan yang rumit dan memungkinkan kita fokus pada logika MCP itu sendiri.
Salah satu use case paling umum untuk MCP adalah akses database. Saat membangun dashboard, menjalankan analisis, atau membuat migrasi, sering kali perlu menjalankan query dan menginspeksi database. Postgres MCP server kita akan mendukung dua kapabilitas inti: menjalankan query sewenang-wenang dan menampilkan daftar skema tabel.
Walaupun kedua tugas ini bisa dilakukan dengan SQL biasa, MCP menawarkan fitur yang bikin keduanya lebih kuat dan lebih umum berguna. Tools menyediakan cara untuk mengekspos tindakan seperti mengeksekusi query, sementara resources memungkinkan kita berbagi konteks terstandardisasi seperti informasi skema. Nanti di panduan ini kita juga akan melihat prompts, yang memungkinkan alur kerja yang lebih canggih.
Di balik layar, kita akan mengandalkan paket postgres dari npm untuk mengeksekusi pernyataan SQL ke database. MCP SDK akan berfungsi sebagai pembungkus di sekitar pemanggilan ini, memungkinkan kita mengintegrasikan fungsionalitas Postgres secara mulus ke dalam Cursor.
## Cara Membangun Server MCP
Langkah pertama untuk membangun server adalah menyiapkan proyek baru. Kita mulai dengan membuat folder baru dan menginisialisasi proyek Bun
```bash theme={null}
> mkdir postgres-mcp-server
> Bun init
```
Dari sini, kita bakal pilih proyek `Blank`. Setelah boilerplate siap, kita perlu install dependency yang diperlukan. `zod` wajib buat nentuin skema i/o di MCP SDK
```bash theme={null}
bun add postgres @modelcontextprotocol/sdk zod
```
Dari sini, kita bakal masuk ke repositori masing-masing library dan ambil tautan ke konten mentah dari README masing-masing. Ini bakal kita pakai sebagai konteks waktu ngebangun server
* `postgres`
* Repo: [https://github.com/porsager/postgres](https://github.com/porsager/postgres),
* README: [https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md](https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md)
* `@modelcontextprotocol/sdk`:
* Repo: [https://github.com/modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)
* README: [https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md](https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md)
Sekarang, kita bakal nentuin gimana perilaku yang kita pengin dari server. Untuk itu, kita bakal bikin `spec.md` dan nulis tujuan tingkat-tingginya
```markdown theme={null}
# Spesifikasi
- Izinkan mendefinisikan DATABASE_URL lewat konfigurasi env MCP
- Query data Postgres lewat tool
- Secara default, buat hanya-baca (readonly)
- Izinkan operasi tulis dengan menyetel ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Akses tabel sebagai `resources`
- Gunakan Zod untuk definisi skema
```
Seperti yang bisa kamu lihat, ini spesifikasi yang cukup ringan. Bebas tambahkan detail lain sesuai kebutuhan. Bersama tautan README, kita bakal menyusun prompt final
```markdown theme={null}
Baca yang berikut dan ikuti @spec.md untuk ngerti apa yang kita mau. Semua dependensi yang diperlukan sudah diinstal
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
```
Dengan tiga komponen ini (spesifikasi, dokumentasi MCP SDK, dan dokumentasi pustaka Postgres), kita bisa pakai Cursor untuk membuat scaffold implementasi server. Cursor bakal bantu kita menyatukan bagiannya, menghasilkan kode yang menghubungkan MCP SDK dengan Postgres.
Setelah beberapa kali prompt bolak-balik, sekarang kita punya versi pertama server MCP yang berjalan. Buat nyoba, kita bisa pakai [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector)
```bash theme={null}
npx @modelcontextprotocol/inspector bun run index.ts
```
## Menguji Server MCP
Setelah implementasi awal selesai, kita bisa mengujinya pakai MCP Inspector. Inspector memberi cara untuk melihat apa saja yang diekspos server dan memverifikasi bahwa tool dan resource berperilaku sesuai ekspektasi. Pastikan query bisa dijalankan dan informasi skema dikembalikan dengan benar.
Kalau semuanya sudah oke, kita bisa menyambungkan server ke Cursor langsung dan mengujinya di lingkungan nyata. Pada tahap ini, Cursor bisa menggunakan server MCP Postgres seolah fitur bawaan, sehingga kita bisa menjalankan query dan menelusuri database secara langsung.
## Langkah Selanjutnya
Menjalankan server MCP secara lokal lewat stdio itu titik awal yang bagus, tapi tim sering butuh akses bersama ke database yang sama lewat server MCP mereka. Dalam skenario ini, men-deploy server MCP sebagai layanan HTTP terpusat jadi perlu.
Server MCP yang di-deploy punya beberapa keunggulan dibanding instance stdio individual:
* **Akses database bersama:** Banyak anggota tim bisa menjalankan query ke instance database yang sama lewat Cursor
* **Konfigurasi terpusat:** Pembaruan skema dan perubahan izin dikelola di satu tempat
* **Keamanan yang lebih baik:** Autentikasi yang tepat, rate limiting, dan kontrol akses bisa diterapkan
* **Observability:** Pola penggunaan dan metrik kinerja bisa dipantau di seluruh tim
Untuk mencapai ini, kamu bakal mengganti metode transport dari stdio ke HTTP.
Walau kita nggak bakal membahas seluruh setup, ini prompt awal yang bagus yang bisa kamu kasih ke Cursor
```
Berdasarkan server MCP yang sudah ada, buat file baru yang mengimplementasikan protokol HTTP.
Pindahkan logika yang digunakan bersama ke mcp-core, dan beri nama setiap implementasi transport sesuai jenisnya (mcp-server-stdio, mcp-server-http)
@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
```
Hasil final bisa dilihat di sini: [pg-mcp-server](https://github.com/ericzakariasson/pg-mcp-server)
```mermaid theme={null}
graph LR
subgraph Team_Network_or_Cloud["VPC"]
SVC["Server MCP (HTTP transport)"] <--> DB[(Postgres DB)]
end
Dev1["Developer 1 di Cursor"] -->|HTTP| SVC
Dev2["Developer 2 di Cursor"] -->|HTTP| SVC
Dev3["Developer 3 di Cursor"] -->|HTTP| SVC
subgraph SVC_Internals["Internal"]
direction TB
T1["Auth dan ACL"]
T2["Rate limiting dan logging"]
T3["Tool: query"]
T4["Resource: table_schemas"]
T5["Prompts"]
T1 --> T2 --> T3
T3 --> T4
T3 --> T5
end
SVC --> SVC_Internals
class SVC svc
class DB db
class T1,T2,T3,T4,T5 internals
class Dev1,Dev2,Dev3 dev
```
# Pengembangan Web
Source: https://docs.cursor.com/id/guides/tutorials/web-development
Cara mengonfigurasi Cursor untuk pengembangan web
export const McpInstallButtonPrimary = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const generateDeepLink = () => {
if (!server || !server.name || !server.install) {
return null;
}
try {
if (typeof server.install === 'string') {
return server.install;
}
if (server.install.url) {
const config = {
...server.install
};
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
if (server.install.command) {
let config = {
command: server.install.command,
...server.install.args && ({
args: server.install.args
}),
...server.install.env && ({
env: server.install.env
})
};
if (config.command && config.args) {
const argsString = config.args.join(" ");
config.command = `${config.command} ${argsString}`;
delete config.args;
}
const jsonString = JSON.stringify(config);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(server.name)}&config=${encodeURIComponent(safeBase64Config)}`;
}
return null;
} catch (e) {
console.error("Error generating deep link:", e);
return null;
}
};
const handleButtonClick = () => {
setShowModal(true);
};
const handleClose = () => {
setShowModal(false);
};
const deepLink = generateDeepLink();
const isDocumentationOnly = typeof server?.install === 'string';
const hasConfirmation = prompt || isDocumentationOnly;
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
;
};
return <>
{hasConfirmation ? :
{showIcon && }
Add to Cursor
}
{hasConfirmation &&
{prompt}
}
>;
};
Pengembangan web butuh iterasi cepat dan loop umpan balik yang ketat antara Cursor dan tool eksternal seperti Figma atau browser. Di Cursor, kami menemukan alur kerja yang mempersempit loop ini. Perumusan tugas yang jelas, reuse komponen, dan pemanfaatan design system membantu menjaga semuanya tetap cepat dan konsisten.
Panduan ini membahas cara menyiapkan Cursor untuk mendukung pengembangan web dan memperketat loop umpan balik.
```mermaid theme={null}
graph LR
A[Proyek] --> B[Desain]
B --> C[Kode]
C -- Pengujian --> D[Verifikasi]
D -- Tanggapan --> C
```
# Mulai mengorkestrasi di Cursor
**Chat** mantap buat nge-bootstrap perubahan. Begitu komponen utama sudah siap, pindah ke **Inline Edit** dan **Tab** bakal bantu kamu tetap dalam flow.
Setelah nyiapin Cursor, kamu bisa mengorkestrasi alur kerja lintas berbagai tool. Di bawah ini contoh demo tentang apa yang bisa dilakukan: game snake yang dibuat dengan nggabungin Linear, Figma, dan tool browser. Walaupun proyek dunia nyata biasanya lebih kompleks, contoh ini nunjukin potensi dari alur kerja terintegrasi ini.
# Sambungkan ke tools manajemen proyek lo
Lo bisa ngintegrasiin Cursor ke software manajemen proyek yang udah lo pake lewat berbagai tooling. Di panduan ini, kita bakal lihat cara ngintegrasiin Linear dengan MCP server mereka.
### Instalasi
Atau tambahin Linear MCP server secara manual ke `mcp.json`:
```jsx theme={null}
{
"mcpServers": {
"Linear": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.linear.app/sse"
]
}
}
}
```
Lalu:
1. Pastikan ngaktifin Linear dari pengaturan MCP
2. Browser bakal kebuka dan lo bakal diminta buat otorisasi dengan Linear
Karena kondisi MCP saat ini, setup bisa butuh beberapa kali percobaan.
Kalau integrasinya nggak jalan, coba "Reload" server dari pengaturan
Cursor.
### Pakai Linear di Cursor
Server MCP Linear nyediain berbagai tools yang bisa dipakai Cursor buat baca dan ngelola issue. Buka pengaturan MCP dan cari server Linear buat lihat daftar semua tools. Buat verifikasi, coba prompt ini di Chat:
```jsx theme={null}
tampilkan semua issue yang terkait dengan proyek ini
```
Kalau integrasinya sudah dikonfigurasi dengan benar, ini bakal menampilkan daftar issue.
# Bawa desain Figma lo
Desain dan mockup itu inti dari pengembangan web. Dengan server MCP resmi buat Figma, lo bisa langsung akses dan kerjain file desain di Cursor. Buat mulai, ikutin instruksi setup di [Figma Dev Mode MCP Server](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
### Instalasi
Lo bisa klik tombol di bawah buat install server MCP.
Atau tambahin manual ke `mcp.json` lo:
```jsx theme={null}
{
"mcpServers": {
"Figma": {
"url": "http://127.0.0.1:3845/sse"
}
}
}
```
### Penggunaan
Server mengekspose beberapa tool yang bisa kamu pakai di prompt. Misalnya, coba minta desain dari seleksi yang sedang dipilih di Figma. Baca selengkapnya di [dokumentasi](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server).
# Jaga scaffolding kode tetap konsisten
Mungkin kamu sudah punya kode yang ada, design system, atau konvensi yang sudah mapan dan ingin dipakai ulang. Saat bekerja dengan model, bakal membantu kalau merujuk pola yang sudah ada di codebase kamu, seperti menu dropdown atau komponen umum lainnya.
Di codebase web besar yang kami kerjakan, kami menemukan bahwa kode deklaratif bekerja sangat baik, terutama untuk React dan JSX.
Kalau kamu punya design system, kamu bisa bantu agent menemukannya dengan menyediakan aturan untuk itu. Berikut file `ui-components.mdc` di mana kami mencoba menegakkan reuse komponen sebisa mungkin:
```mdc components.mdc theme={null}
---
description: Mengimplementasikan desain dan membangun UI
---
- pakai ulang komponen UI yang sudah ada dari `/src/components/ui`. ini adalah primitive yang jadi dasar untuk kita bangun
- buat komponen baru dengan mengorkestrasikan komponen UI kalau kamu nggak menemukan yang sudah ada yang bisa menyelesaikan masalah
- tanya pengguna bagaimana mereka mau lanjut kalau ada komponen atau desain yang belum ada
```
Seiring pustaka komponenmu berkembang, tambahkan aturan baru sesuai kebutuhan. Kalau aturan sudah terlalu banyak, pertimbangkan untuk membaginya ke kategori yang lebih spesifik, misalnya “hanya diterapkan saat bekerja dengan input pengguna.”
# Beri Cursor akses ke browser
Untuk memperluas kapabilitas Cursor, kamu bisa menyiapkan server MCP browser tools, yang memberi akses ke console log dan network request. Setelah dikonfigurasi, kamu bisa memverifikasi perubahan dengan memantau output console dan aktivitas jaringan. Setup ini membantu memastikan implementasimu sesuai dengan intent kamu. Ikuti instruksi di sini untuk menyiapkan server MCP: [https://browsertools.agentdesk.ai/installation](https://browsertools.agentdesk.ai/installation)
Kita lagi ngerjain supaya ini lebih gampang diintegrasikan secara native di Cursor.
# Ringkasan
* Loop umpan balik yang cepat itu krusial di pengembangan web. Pakai Cursor bareng alat seperti Figma, Linear, dan browser biar gerak cepat dan tetap in-flow.
* Server MCP bikin lo bisa mengintegrasikan sistem eksternal langsung ke Cursor, ngurangin context switching dan ningkatin eksekusi tugas.
* Ngegunain ulang komponen dan design system bantu model ngeluarin kode dan output yang lebih bersih dan konsisten.
* Tugas yang jelas dengan ruang lingkup yang terdefinisi ngasih hasil yang lebih bagus. Lebih sadar dalam cara lo nge-prompt dan apa yang lo minta.
* Kalau output-nya belum oke, coba sesuaikan:
* **Instruksi:** Pakai rules, prompt, dan kasih akses ke lebih banyak konteks, misalnya lewat server MCP.
* **Sistem:** Pola, abstraksi, dan kejelasan bikin model lebih gampang paham, bantu, dan kerja lebih otonom.
* Lo bisa ngeluasin konteks model dengan nyertain info runtime kayak console logs, network requests, dan data elemen UI.
* Nggak semua hal perlu diotomasi. Kalau sistem lo jadi terlalu kompleks, balik ke edit yang lebih presisi pakai Tab dan Inline Edit.
* Cursor paling kuat saat jadi co-pilot, bukan autopilot. Pakai buat ningkatin, bukan gantiin, pengambilan keputusan lo sendiri.
# Bekerja dengan Konteks
Source: https://docs.cursor.com/id/guides/working-with-context
Cara bekerja dengan konteks di Cursor
Pertama, apa itu context window? Dan gimana hubungannya dengan ngoding lebih efektif pakai Cursor?
Biar lihat gambaran besarnya dulu: large language model (LLM) adalah model AI yang dilatih buat memprediksi dan menghasilkan teks dengan belajar pola dari dataset yang sangat besar. Ini yang menggerakkan tool seperti Cursor dengan ngerti input kamu dan nyaranin kode atau teks berdasarkan yang pernah dilihat sebelumnya.
Token adalah input dan output dari model-model ini. Token berupa potongan teks, sering kali fragmen kata, yang diproses LLM satu per satu. Model nggak baca satu kalimat penuh sekaligus; mereka memprediksi token berikutnya berdasarkan token-token sebelumnya.
Buat lihat gimana sebuah teks di-tokenize, kamu bisa pakai tokenizer seperti [yang ini](https://tiktokenizer.vercel.app/).
# Apa itu konteks?
Saat kita menghasilkan saran kode di Cursor, “konteks” mengacu pada informasi yang diberikan ke model (dalam bentuk "input tokens") yang kemudian dipakai model untuk memprediksi informasi berikutnya (dalam bentuk “output tokens”).
Ada dua jenis konteks:
1. **Konteks intent** menjelaskan apa yang user pengin dari model. Misalnya, system prompt biasanya berfungsi sebagai instruksi tingkat tinggi tentang gimana user pengin model berperilaku. Kebanyakan "prompting" yang dilakukan di Cursor adalah konteks intent. “Ubah tombol itu dari biru jadi hijau” adalah contoh intent yang dinyatakan; sifatnya preskriptif.
2. **Konteks state** menggambarkan keadaan dunia saat ini. Ngasih Cursor pesan error, log console, gambar, dan potongan kode adalah contoh konteks yang terkait dengan state. Ini deskriptif, bukan preskriptif.
Dua jenis konteks ini bekerja bareng dengan menggambarkan keadaan saat ini dan keadaan yang diinginkan ke depan, sehingga bantu Cursor ngasih saran coding yang berguna.
```mermaid theme={null}
flowchart LR
A["Intent (apa yang kamu mau)"] --> C[Model]
B["State (apa yang benar)"] --> C
C -- Memprediksi --> D["Aksi (apa yang dilakukannya)"]
```
# Memberikan konteks di Cursor
Semakin relevan konteks yang kamu kasih ke model, semakin berguna hasilnya. Kalau konteks yang dikasih di Cursor kurang, model bakal coba nyelesain tanpa informasi yang relevan. Biasanya ini bikin:
1. Halusinasi, di mana model coba ngepasin pola (padahal nggak ada polanya) dan hasilnya jadi nggak terduga. Ini bisa sering kejadian di model kayak `claude-3.5-sonnet` kalau nggak dikasih konteks yang cukup.
2. Agent coba ngumpulin konteks sendiri dengan nyari di codebase, baca file, dan manggil tools. Model dengan kemampuan berpikir yang kuat (kayak `claude-3.7-sonnet`) bisa melangkah cukup jauh dengan strategi ini, dan ngasih konteks awal yang tepat bakal nentuin trajektorinya.
Kabar baiknya, Cursor dibangun dengan kesadaran konteks sebagai inti dan didesain supaya butuh intervensi minimal dari pengguna. Cursor otomatis narik bagian-bagian dari codebase kamu yang diperkirakan relevan oleh model, seperti file yang lagi kamu buka, pola yang secara semantik mirip di file lain, dan informasi lain dari sesi kamu.
Tapi karena ada banyak sumber konteks yang bisa ditarik, ngeset konteks secara manual yang kamu tahu relevan buat task itu cara yang efektif buat ngarahin model ke arah yang benar.
## Simbol @
Cara paling gampang buat ngasih konteks eksplisit adalah pakai simbol @. Ini cocok kalau lo udah tahu persis file, folder, website, atau bagian konteks lain yang mau disertakan. Makin spesifik, makin bagus. Berikut rincian cara bikin konteks jadi lebih presisi:
| Symbol | Example | Use case | Drawback |
| --------- | -------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| `@code` | `@LRUCachedFunction` | Lo tahu fungsi, konstanta, atau simbol mana yang relevan buat output yang lagi lo bikin | Butuh banyak pengetahuan tentang codebase |
| `@file` | `cache.ts` | Lo tahu file mana yang harus dibaca atau diedit, tapi belum pasti di bagian mana di file | Bisa nyertain banyak konteks yang nggak relevan buat tugas tergantung ukuran file |
| `@folder` | `utils/` | Semua atau sebagian besar file di dalam satu folder relevan | Bisa nyertain banyak konteks yang nggak relevan buat tugas yang lagi dikerjain |
## Aturan
Anggap aturan sebagai memori jangka panjang yang pengin kamu atau anggota tim lain bisa akses. Menangkap konteks spesifik domain, termasuk alur kerja, pemformatan, dan konvensi lainnya, adalah titik awal yang bagus buat nulis aturan.
Aturan juga bisa dihasilkan dari percakapan yang sudah ada dengan pakai `/Generate Cursor Rules`. Kalau kamu punya percakapan panjang bolak-balik dengan banyak prompt, kemungkinan ada beberapa arahan atau aturan umum yang berguna yang mungkin pengin kamu pakai lagi nanti.
## MCP
[Model Context Protocol](https://modelcontextprotocol.io/introduction) adalah lapisan ekstensi yang bikin Cursor bisa menjalankan aksi dan ngambil konteks eksternal.
Tergantung setup pengembangan lo, lo mungkin mau pakai tipe server yang berbeda, tapi dua kategori yang menurut kami paling berguna adalah:
* **Dokumentasi internal**: misalnya Notion, Confluence, Google Docs
* **Manajemen proyek**: misalnya Linear, Jira
Kalau lo sudah punya tooling buat ngakses konteks dan ngejalanin aksi lewat API, lo bisa bikin server MCP buat itu. Ini panduan singkat tentang cara bikin [server MCP](https://modelcontextprotocol.io/tutorials/building-mcp-with-llms).
## Mengumpulkan konteks secara mandiri
Salah satu pola ampuh yang banyak dipakai pengguna adalah membiarkan Agent menulis tool berumur pendek yang bisa dijalankan untuk mengumpulkan konteks tambahan. Ini khususnya efektif dalam alur kerja human-in-the-loop, di mana kamu meninjau kode sebelum dieksekusi.
Misalnya, menambahkan pernyataan debugging ke kodenmu, menjalankannya, dan membiarkan model memeriksa output memberi akses ke konteks dinamis yang nggak bisa disimpulkan secara statis.
Di Python, kamu bisa melakukan ini dengan meminta Agent untuk:
1. Menambahkan pernyataan print("debugging: ...") di bagian kode yang relevan
2. Menjalankan kode atau test menggunakan terminal
Agent akan membaca output terminal dan memutuskan langkah berikutnya. Inti idenya adalah memberi Agent akses ke perilaku saat runtime, bukan cuma kode statis.
# Ringkasan
* Konteks adalah dasar coding AI yang efektif, terdiri dari intent (apa yang kamu inginkan) dan state (apa yang sudah ada). Memberikan keduanya membantu Cursor membuat prediksi yang akurat.
* Gunakan konteks yang presisi dengan simbol @ (@code, @file, @folder) untuk mengarahkan Cursor secara tepat, alih-alih hanya mengandalkan pengumpulan konteks otomatis.
* Tangkap pengetahuan yang bisa diulang dalam rules agar bisa dipakai seluruh tim, dan perluas kemampuan Cursor dengan Model Context Protocol untuk menghubungkan sistem eksternal.
* Konteks yang kurang memadai bisa memicu halusinasi atau inefisiensi, sementara terlalu banyak konteks yang tidak relevan akan mengaburkan sinyal. Temukan keseimbangan yang pas untuk hasil optimal.
# Edit Inline
Source: https://docs.cursor.com/id/inline-edit/overview
Edit dan tanya langsung dengan Edit Inline (Cmd/Ctrl+K) di Cursor
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Inline Edit ngebantu lo ngedit kode atau nanya langsung di editor lewat Cmd+K, yang bakal ngebuka input field tempat kode yang lo pilih dan instruksi lo ngejelasin permintaan lo.
## Mode
### Edit Selection
Dengan kode yang dipilih, Cmd+K ngedit kode itu sesuai instruksi lo.
Tanpa seleksi, Cursor bakal ngehasilin kode baru di posisi kursor lo. AI bakal nyertain kode sekitar yang relevan sebagai konteks. Misalnya, nge-trigger di nama fungsi bakal nyertakan seluruh fungsi.
### Quick Question
Tekan Opt+Return di inline editor buat nanya soal kode yang dipilih.
Abis dapet jawaban, ketik "do it" atau frasa serupa buat ngeubah saran jadi kode. Ini bikin lo bisa eksplor ide dulu sebelum ngejalanin.
### Full File Edits
Buat perubahan satu file penuh, pakai Cmd+Shift+Return. Mode ini ngizinin perubahan komprehensif sambil tetap ngejaga kontrol.
### Send to Chat
Buat edit multi-file atau fitur lanjutan, pakai Cmd+L buat ngirim kode yang dipilih ke [Chat](/id/agent/modes#agent). Ini nyediain pengeditan multi-file, penjelasan mendetail, dan kapabilitas AI tingkat lanjut.
## Instruksi lanjutan
Setelah setiap edit, halusin hasilnya dengan menambahkan instruksi lalu tekan Return. AI bakal ngupdate perubahan berdasarkan feedback lo.
Cursor bikin pesan commit dari perubahan yang udah di-stage.
1. Stage file yang mau di-commit
2. Buka tab Git di sidebar
3. Klik ikon sparkle (✨) di samping input pesan commit
Pesan yang dihasilkan pakai perubahan yang di-stage dan riwayat git repository. Kalau lo pakai konvensi kayak [Conventional Commits](https://www.conventionalcommits.org/), pesannya bakal ngikutin pola yang sama.
### Tambahin shortcut
Buat nge-bind ke shortcut keyboard:
1. Buka Keyboard Shortcuts (Cmd+R Cmd+S atau Cmd+Shift+P dan cari "Open Keyboard Shortcuts (JSON)")
2. Tambahin binding ini buat Cmd+M:
```json theme={null}
{
"key": "cmd+m",
"command": "cursor.generateGitCommitMessage"
}
```
3. Simpan
Lo nggak bisa ngustomisasi pembuatan pesan commit. Cursor bakal nyesuaiin sama gaya commit lo yang ada.
## AI Menyelesaikan Konflik
Saat terjadi konflik merge, Cursor Agent bisa bantu menyelesaikannya dengan memahami kedua sisi konflik dan mengusulkan resolusi.
### Cara pakai
1. Saat konflik merge terjadi, kamu akan melihat conflict marker di file kamu
2. Klik tombol **Resolve in Chat** yang muncul di UI konflik merge
3. Agent akan menganalisis kedua versi dan menyarankan resolusi
4. Tinjau perubahan yang diusulkan dan terapkan
# GitHub
Source: https://docs.cursor.com/id/integrations/github
Aplikasi GitHub Cursor resmi untuk agen latar belakang
[Background Agents](/id/background-agent) dan [Bugbot](/id/bugbot) memerlukan aplikasi GitHub Cursor untuk mengklona repositori dan mendorong perubahan.
## Instalasi
1. Buka [Integrations di Dashboard](https://cursor.com/dashboard?tab=integrations)
2. Klik **Connect** di sebelah GitHub
3. Pilih repositori: **All repositories** atau **Selected repositories**
Untuk memutuskan sambungan akun GitHub, kembali ke dashboard Integrations dan klik **Disconnect Account**.
## Menggunakan Agent di GitHub
Integrasi GitHub memungkinkan alur kerja agent di latar belakang langsung dari pull request dan issue. Lo bisa memicu agent untuk membaca konteks, menerapkan perbaikan, dan nge-push commit dengan komentar `@cursor [prompt]` di PR atau issue apa pun.
Kalau lo ngaktifin [Bugbot](/id/bugbot), lo bisa komentar `@cursor fix` buat ngebaca perbaikan yang direkomendasi Bugbot dan nge-trigger agent di latar belakang buat nangani issue tersebut.
## Permissions
Aplikasi GitHub memerlukan izin tertentu untuk bekerja dengan agen latar belakang:
| Permission | Purpose |
| ------------------------- | --------------------------------------------------------- |
| **Repository access** | Nge-clone kode lo dan bikin working branch |
| **Pull requests** | Bikin PR berisi perubahan dari agen buat lo review |
| **Issues** | Ngelacak bug dan task yang ditemukan atau diperbaiki agen |
| **Checks and statuses** | Ngelaporin kualitas kode dan hasil test |
| **Actions and workflows** | Memonitor pipeline CI/CD dan status deployment |
Semua izin mengikuti prinsip least privilege yang diperlukan untuk fungsionalitas agen latar belakang.
## Konfigurasi Daftar Izinkan IP
Kalau organisasi lo pakai fitur daftar izinkan IP GitHub buat ngebatesin akses ke repositori, lo perlu kontak support dulu buat ngaktifin fungsionalitas daftar izinkan IP buat tim lo.
### Hubungi Support
Sebelum ngonfigurasi daftar izinkan IP, kontak [hi@cursor.com](mailto:hi@cursor.com) buat ngaktifin fitur ini buat tim lo. Ini wajib buat kedua metode konfigurasi di bawah.
### Aktifkan konfigurasi daftar izinkan IP untuk GitHub Apps yang terpasang (Direkomendasikan)
Aplikasi GitHub Cursor udah punya daftar IP yang preconfigured. Lo bisa ngaktifin allowlist buat aplikasi yang terpasang biar otomatis mewarisi daftar ini. Ini **pendekatan yang direkomendasikan**, karena memungkinkan kami memperbarui daftar dan organisasi lo bakal nerima pembaruan secara otomatis.
Untuk ngaktifinnya:
1. Buka pengaturan Security organisasi lo
2. Masuk ke pengaturan daftar izinkan IP
3. Centang **"Allow access by GitHub Apps"**
Buat instruksi lengkap, lihat [dokumentasi GitHub](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#allowing-access-by-github-apps).
### Tambahin IP langsung ke allowlist lo
Kalau organisasi lo pakai allowlist yang ditentuin IdP di GitHub atau nggak bisa pakai allowlist yang preconfigured, lo bisa nambahin alamat IP secara manual:
```
184.73.225.134
3.209.66.12
52.44.113.131
```
Daftar alamat IP bisa sesekali berubah. Tim yang pakai allowlist IP bakal dapat pemberitahuan terlebih dulu sebelum alamat IP ditambahkan atau dihapus.
## Pemecahan Masalah
* Install app GitHub dengan akses ke repository
* Cek permission repository buat repo privat
* Verifikasi permission akun GitHub lo
* Kasih app akses write ke pull request
* Cek aturan proteksi branch
* Install ulang kalau instalasi app udah kedaluwarsa
* Cek apakah di-install di level organisasi
* Install ulang dari [github.com/apps/cursor](https://github.com/apps/cursor)
* Hubungi support kalau instalasinya corrupt
# Linear
Source: https://docs.cursor.com/id/integrations/linear
Gunakan Background Agents dari Linear
Pakai [Background Agents](/id/background-agent) langsung dari Linear dengan mendelegasikan isu ke Cursor atau menyebut `@Cursor` di komentar.
## Mulai
### Instalasi
Kamu harus jadi admin Cursor untuk menyambungkan integrasi Linear. Pengaturan tim lainnya tersedia untuk anggota non-admin.
1. Buka [integrasi Cursor](https://www.cursor.com/en/dashboard?tab=integrations)
2. Klik *Connect* di samping Linear
3. Sambungkan workspace Linear kamu dan pilih tim
4. Klik *Authorize*
5. Selesaikan sisa pengaturan Background Agent di Cursor:
* Sambungkan GitHub dan pilih repositori default
* Aktifkan penagihan berbasis penggunaan
* Konfirmasi pengaturan privasi
### Penautan akun
Pertama kali dipakai, kamu akan diminta menautkan akun Cursor dan Linear. Koneksi GitHub diperlukan untuk membuat PR.
## Cara menggunakan
Delegasikan issue ke Cursor atau mention `@Cursor` di komentar. Cursor bakal menganalisis issue dan otomatis nyaring pekerjaan non-development.
### Mendelegasikan issue
1. Buka issue di Linear
2. Klik field assignee
3. Pilih "Cursor"
### Mention Cursor
Mention `@Cursor` di komentar buat nge-assign agen baru atau kasih instruksi tambahan, misalnya: `@Cursor tolong perbaiki bug autentikasi yang dijelaskan di atas`.
## Alur kerja
Background Agent menampilkan status real-time di Linear dan otomatis bikin PR saat selesai. Lacak progres di [dashboard Cursor](https://www.cursor.com/dashboard?tab=background-agents).
### Instruksi tindak lanjut
Lo bisa balas di sesi agent dan pesannya bakal dikirim sebagai tindak lanjut ke agent. Cukup mention `@Cursor` di komentar Linear buat ngasih panduan tambahan ke Background Agent yang lagi jalan.
## Konfigurasi
Atur pengaturan Background Agent dari [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
| Setting | Location | Description |
| :--------------------- | :--------------- | :------------------------------------------------------------------- |
| **Default Repository** | Cursor Dashboard | Repository utama saat nggak ada repository proyek yang dikonfigurasi |
| **Default Model** | Cursor Dashboard | Model AI untuk Background Agents |
| **Base Branch** | Cursor Dashboard | Branch asal untuk membuat PR (umumnya `main` atau `develop`) |
### Opsi konfigurasi
Kamu bisa ngatur perilaku Background Agent lewat beberapa cara:
**Deskripsi issue atau komentar**: Pakai sintaks `[key=value]`, misalnya:
* `@cursor please fix [repo=anysphere/everysphere]`
* `@cursor implement feature [model=claude-3.5-sonnet] [branch=feature-branch]`
**Label issue**: Pakai struktur label induk–anak, di mana label induk adalah key konfigurasi dan label anak adalah valuenya.
**Label proyek**: Struktur induk–anak yang sama seperti label issue, diterapkan di level proyek.
Key konfigurasi yang didukung:
* `repo`: Tentukan repository target (misalnya, `owner/repository`)
* `branch`: Tentukan base branch untuk pembuatan PR
* `model`: Tentukan model AI yang dipakai
### Pemilihan repository
Cursor nentuin repository yang akan dikerjain pakai urutan prioritas ini:
1. **Deskripsi/komentar issue**: Sintaks `[repo=owner/repository]` di teks issue atau komentar
2. **Label issue**: Label repository yang ditempel ke issue Linear tersebut
3. **Label proyek**: Label repository yang ditempel ke proyek Linear
4. **Default repository**: Repository yang disetel di pengaturan Cursor Dashboard
#### Menyiapkan label repository
Buat label repository di Linear dengan langkah berikut:
1. Buka **Settings** di workspace Linear kamu
2. Klik **Labels**
3. Klik **New group**
4. Kasih nama grup "repo" (nggak case-sensitive — harus persis "repo", bukan "Repository" atau variasi lain)
5. Di dalam grup itu, buat label untuk tiap repository pakai format `owner/repo`
Label ini bisa kamu pasang ke issue atau proyek buat nunjukin repository tempat Background Agent bakal kerja.
{/* ### Getting help
Check [agent activity](https://www.cursor.com/dashboard?tab=background-agents) and include request IDs when contacting support.
## Feedback
Share feedback through Linear comments or your Cursor dashboard support channels. */}
# Slack
Source: https://docs.cursor.com/id/integrations/slack
Gunakan Background Agents langsung dari Slack
export const SlackThread = ({messages = []}) => {
const MessageWithMentions = ({text}) => {
const parts = text.split(/(@\w+)/g);
return <>
{parts.map((part, index) => {
if (part.startsWith('@')) {
return
{part}
;
}
return {part};
})}
>;
};
return
;
};
Dengan integrasi Cursor untuk Slack, lo bisa pakai [Background Agents](/id/background-agent) buat ngerjain tugas langsung dari Slack dengan nge-mention plus prompt.
## Mulai
### Instalasi
1. Buka [Cursor integrations](https://www.cursor.com/en/dashboard?tab=integrations)
2. Klik *Connect* di sebelah Slack atau langsung ke [halaman instalasi](https://cursor.com/api/install-slack-app) dari sini
3. Lo bakal diminta buat install aplikasi Cursor untuk Slack di workspace lo.
4. Setelah install di Slack, lo bakal diarahkan balik ke Cursor buat nyelesaiin setup
1. Hubungin GitHub (kalau belum terhubung) dan pilih repo default
2. Aktifin pricing berbasis usage
3. Konfirmasi pengaturan privasi
5. Mulai pakai Background Agents di Slack dengan mention
## Cara menggunakan
Mention dan kasih prompt lo. Ini udah ngurusin sebagian besar use case, tapi lo juga bisa pakai perintah di bawah buat ngekustom agen lo.
Contohnya, mention langsung di percakapan, atau pakai perintah spesifik kayak buat nargetin repository tertentu.
### Perintah
Jalankan buat dapetin daftar perintah terbaru.
| Command | Description |
| :---------------------------------------------------------- | :----------------------------------------------------------------------------------------- |
| | Mulai Background Agent. Di thread yang sudah ada agennya, nambahin instruksi tindak lanjut |
| | Konfigurasi default dan repository default channel |
| | Pakai opsi lanjutan: `branch`, `model`, `repo` |
| | Paksa bikin agen baru di sebuah thread |
| | Tampilkan agen lo yang lagi jalan |
#### Opsi
Kustomisasi perilaku Background Agent dengan opsi berikut:
Pakai opsi dengan beberapa cara:
1. **Format bracket**
2. **Format inline**
##### Prioritas opsi
Kalau nggabungin opsi:
* **Nilai eksplisit** ngeganti default
* **Nilai yang muncul belakangan** ngeganti yang lebih awal kalau duplikat
* **Opsi inline** punya prioritas dibanding default di settings modal
Bot nge-parse opsi dari mana pun di pesan, bikin lo bisa nulis perintah secara natural.
#### Pakai konteks thread
Background Agents paham dan pakai konteks dari diskusi thread yang udah ada. Berguna pas tim lo ngebahas suatu issue dan lo mau agen nge-implement solusi berdasarkan percakapan itu.
Background Agents bakal baca seluruh thread buat konteks saat dipanggil,
ngerti dan ngejalanin solusi berdasarkan diskusi tim.
#### Kapan pakai perintah paksa
**Kapan gue perlu ?**
Di thread yang sudah ada agennya, nambahin instruksi tindak lanjut (cuma jalan kalau lo pemilik agennya). Pakai buat ngeluncurin agen terpisah.
**Kapan gue perlu `Add follow-up` (dari context menu)?**
Pakai context menu (⋯) di respons agen buat instruksi tindak lanjut. Berguna kalau ada banyak agen di satu thread dan lo perlu nentuin yang mana yang mau di-follow up.
### Status update & handoff
Saat Background Agent jalan, pertama lo bakal dapet opsi buat *Open in Cursor*.
Saat Background Agent selesai, kamu bakal dapat notifikasi di Slack dan opsi buat melihat PR yang dibuat di GitHub.
### Mengelola agent
Buat lihat semua agent yang sedang berjalan, jalankan .
Kelola Background Agents lewat menu konteks dengan klik tiga titik (⋯) di pesan agent mana pun.
Opsi yang tersedia:
* **Add follow-up**: Tambahkan instruksi ke agent yang sudah ada
* **Delete**: Hentikan dan arsipkan Background Agent
* **View request ID**: Lihat ID permintaan unik untuk troubleshooting (sertakan saat menghubungi support)
* **Give feedback**: Kasih feedback tentang performa agent
## Konfigurasi
Kelola pengaturan default dan opsi privasi dari [Dashboard → Background Agents](https://www.cursor.com/dashboard?tab=background-agents).
### Pengaturan
#### Model Default
Digunakan ketika tidak ada model yang secara eksplisit ditentukan dengan . Lihat [pengaturan](https://www.cursor.com/dashboard?tab=background-agents) untuk opsi yang tersedia.
#### Repositori Default
Digunakan ketika tidak ada repositori yang ditentukan. Gunakan format berikut:
* `https://github.com/org/repository`
* `org/repository`
Jika kamu mereferensikan repositori yang tidak ada, itu akan terlihat seolah-olah kamu
tidak punya akses. Hal ini muncul di pesan error ketika Background Agent gagal memulai.
#### Base Branch
Branch awal untuk Background Agent. Biarkan kosong untuk menggunakan branch default repositori (biasanya `main`)
### Pengaturan Channel
Konfigurasikan pengaturan default di level channel menggunakan . Pengaturan ini per tim dan akan override default personal kamu untuk channel tersebut.
Sangat berguna ketika:
* Channel yang berbeda mengerjakan repositori yang berbeda
* Tim ingin pengaturan konsisten di semua anggota
* Kamu ingin menghindari menetapkan repositori di setiap perintah
Untuk mengonfigurasi pengaturan channel:
1. Jalankan di channel yang diinginkan
2. Tetapkan repositori default untuk channel tersebut
3. Semua anggota tim yang menggunakan Background Agents di channel itu akan memakai default ini
Pengaturan channel memiliki prioritas di atas default personal, tetapi bisa di-override
oleh opsi eksplisit seperti{" "}
### Privasi
Background Agents mendukung Privacy Mode.
Baca lebih lanjut tentang [Privacy Mode](https://www.cursor.com/privacy-overview) atau kelola [pengaturan privasi](https://www.cursor.com/dashboard?tab=background-agents) kamu.
Privacy Mode (Legacy) tidak didukung. Background Agents memerlukan penyimpanan
kode sementara saat berjalan.
#### Tampilkan Ringkasan Agent
Tampilkan ringkasan agent dan gambar diff. Mungkin berisi path file atau potongan kode. Bisa dinyalakan/dimatikan.
#### Tampilkan Ringkasan Agent di Channel Eksternal
Untuk Slack Connect dengan workspace lain atau channel dengan anggota eksternal seperti Guest, pilih untuk menampilkan ringkasan agent di channel eksternal.
## Permissions
Cursor minta izin Slack berikut biar Background Agents bisa jalan di workspace lo:
| Permission | Description |
| :------------------ | :-------------------------------------------------------------------------------- |
| `app_mentions:read` | Ngedeteksi @mention buat mulai Background Agents dan ngerespons request |
| `channels:history` | Baca pesan sebelumnya di thread buat konteks saat nambahin instruksi lanjutan |
| `channels:join` | Otomatis join ke public channel saat diundang atau diminta |
| `channels:read` | Akses metadata channel (ID dan nama) buat ngepost balasan dan update |
| `chat:write` | Kirim update status, notifikasi selesai, dan tautan PR saat agent kelar |
| `files:read` | Download file yang dishare (log, screenshot, contoh kode) buat konteks tambahan |
| `files:write` | Upload ringkasan visual dari perubahan agent buat review cepat |
| `groups:history` | Baca pesan sebelumnya di private channel buat konteks dalam percakapan multi-turn |
| `groups:read` | Akses metadata private channel buat ngepost respons dan jaga alur percakapan |
| `im:history` | Akses riwayat direct message buat konteks percakapan yang berlanjut |
| `im:read` | Baca metadata DM buat ngenalin peserta dan jaga threading yang bener |
| `im:write` | Mulai direct message buat notifikasi privat atau komunikasi individual |
| `mpim:history` | Akses riwayat group DM buat percakapan multi-participant |
| `mpim:read` | Baca metadata group DM buat nyebut peserta dan pastiin penyampaian yang tepat |
| `reactions:read` | Liat reaksi emoji buat feedback pengguna dan sinyal status |
| `reactions:write` | Nambahin reaksi emoji buat nandain status — ⏳ lagi jalan, ✅ selesai, ❌ gagal |
| `team:read` | Ngenalin detail workspace buat misahin instalasi dan terapin pengaturan |
| `users:read` | Cocokin user Slack dengan akun Cursor buat permission dan akses yang aman |
;
};
Cursor mendukung semua model coding terdepan dari seluruh penyedia model utama.
## Harga model
Paket [Cursor](/id/account/pricing) sudah termasuk penggunaan sesuai tarif API model. Misalnya, kredit penggunaan \$20 yang termasuk di paket Pro bakal kepakai sesuai pilihan model dan harganya.
Batas penggunaan ditampilin di editor berdasarkan konsumsi lo saat ini. Buat lihat semua harga API model, cek dokumentasi penyedia:
* [OpenAI Pricing](https://openai.com/api/pricing/)
* [Anthropic Pricing](https://www.anthropic.com/pricing#api)
* [Google Gemini Pricing](https://ai.google.dev/gemini-api/docs/pricing)
* [xAI Pricing](https://docs.x.ai/docs/models)
## Auto
Mengaktifkan Auto memungkinkan Cursor memilih model premium yang paling cocok untuk tugas saat itu dan paling andal berdasarkan permintaan terkini. Fitur ini bisa mendeteksi penurunan performa output dan otomatis beralih model untuk mengatasinya.
## Jendela konteks
[Jendela konteks](/id/guides/working-with-context) adalah rentang maksimum token (teks dan kode) yang bisa dipertimbangkan LLM sekaligus, mencakup prompt input dan output yang dihasilkan model.
Setiap chat di Cursor punya jendela konteksnya sendiri. Makin banyak prompt, file terlampir, dan respons yang disertakan dalam satu sesi, makin besar jendela konteksnya.
Pelajari lebih lanjut tentang [cara bekerja dengan konteks](/id/guides/working-with-context) di Cursor.
## Max Mode
Biasanya, Cursor pakai window konteks 200k token (\~15.000 baris kode). Max Mode nge-extend window konteks ke maksimum yang tersedia buat beberapa model. Ini bakal sedikit lebih lambat dan lebih mahal. Fitur ini paling relevan buat Gemini 2.5 Flash, Gemini 2.5 Pro, GPT 4.1, dan Grok 4, yang punya window konteks lebih besar dari 200k.
## FAQ
Model di-host di infrastruktur berbasis AS oleh penyedia model, mitra tepercaya, atau langsung oleh Cursor.
Saat Privacy Mode diaktifkan, baik Cursor maupun penyedia model nggak nyimpen data lo. Semua data dihapus setelah setiap request. Buat detailnya, lihat halaman [Privacy](/id/account/privacy), [Privacy Policy](https://cursor.com/privacy), dan [Security](https://cursor.com/security).
# API Keys
Source: https://docs.cursor.com/id/settings/api-keys
Pakai penyedia LLM pilihanmu
Pakai API key kamu untuk ngirim pesan AI tanpa batas dengan biaya sendiri. Setelah disetel, Cursor bakal pakai API key kamu buat manggil penyedia LLM secara langsung.
Buat pakai API key, buka `Cursor Settings` > `Models` dan masukin API key kamu. Klik **Verify**. Setelah tervalidasi, API key kamu aktif.
API key kustom cuma berfungsi dengan model chat standar. Fitur yang butuh model khusus (kayak Tab Completion) bakal tetap pakai model bawaan Cursor.
## Penyedia yang didukung
* **OpenAI** - Hanya model chat standar, non-reasoning. Pemilih model akan menampilkan model OpenAI yang tersedia.
* **Anthropic** - Semua model Claude yang tersedia melalui Anthropic API.
* **Google** - Model Gemini yang tersedia melalui Google AI API.
* **Azure OpenAI** - Model yang dideploy di instance Azure OpenAI Service kamu.
* **AWS Bedrock** - Gunakan AWS access key, secret key, atau IAM role. Berfungsi dengan model yang tersedia dalam konfigurasi Bedrock kamu.
Sebuah external ID unik akan dihasilkan setelah IAM role Bedrock kamu tervalidasi, yang bisa kamu tambahkan ke IAM role trust policy untuk keamanan tambahan.
## FAQ
Kunci API-ku nggak disimpan, tapi dikirim ke server kami di setiap request. Semua request dialihkan lewat backend kami untuk penyusunan prompt final.
# Tab
Source: https://docs.cursor.com/id/tab/overview
Pelengkapan otomatis dengan penyuntingan multi-baris, saran lintas file, dan pelengkapan kode yang kontekstual
export const Kbd = ({children, tooltip, os}) => {
const keysInput = typeof children === 'string' && children.trim() !== '' ? children : null;
if (!keysInput) {
return null;
}
const isModifier = key => {
const modifiers = ['⌘', '⇧', '⌥', '⌃', '⏎', '⌫', '⌦', '⎋', '⇥', '⌁', '←', '→', '↑', '↓', 'Ctrl', 'Shift', 'Alt', 'Cmd', 'Opt', 'Return', 'Backspace', 'Delete', 'Escape', 'Tab', 'Space', 'Enter', 'Esc', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down'];
return modifiers.includes(key.trim());
};
const capitalizeFirstLetter = string => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const isMac = os ? os.toLowerCase() === 'mac' || os.toLowerCase() === 'macos' : typeof navigator !== 'undefined' && (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.userAgent.toUpperCase().indexOf('MAC') >= 0);
const convertToSymbols = shortcut => {
if (isMac) {
return shortcut.replace(/⌘|Cmd|CMD/gi, '⌘').replace(/⌥|Opt|OPT/gi, '⌥').replace(/⌃|Ctrl/gi, '⌃').replace(/⇧|Shift/gi, '⇧').replace(/⏎|Return/gi, '⏎').replace(/⌫|Backspace/gi, '⌫').replace(/⌦|Delete/gi, '⌦').replace(/␛|Escape/gi, '␛').replace(/⇥|Tab/gi, '⇥').replace(/⌁|Space/gi, '⌁').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, '←').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, '→').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, '↑').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, '↓');
} else {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Ctrl').replace(/⌥|Opt|OPT/gi, 'Alt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Enter').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Esc').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.join('+');
}
};
const convertToReadableText = shortcut => {
const converted = shortcut.replace(/⌘|Cmd|CMD/gi, 'Cmd').replace(/⌥|Opt|OPT/gi, 'Opt').replace(/⌃|Ctrl/gi, 'Ctrl').replace(/⇧|Shift/gi, 'Shift').replace(/⏎|Return/gi, 'Return').replace(/⌫|Backspace/gi, 'Backspace').replace(/⌦|Delete/gi, 'Delete').replace(/⎋|Escape/gi, 'Escape').replace(/⇥|Tab/gi, 'Tab').replace(/⌁|Space/gi, 'Space').replace(/←|Arrow\s*Left|ArrowLeft|Left/gi, 'Arrow-Left').replace(/→|Arrow\s*Right|ArrowRight|Right/gi, 'Arrow-Right').replace(/↑|Arrow\s*Up|ArrowUp|Up/gi, 'Arrow-Up').replace(/↓|Arrow\s*Down|ArrowDown|Down/gi, 'Arrow-Down');
const keyList = converted.split(/[\+\s]+/).filter(key => key.trim());
return keyList.map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
};
const displayShortcut = convertToSymbols(keysInput);
const tooltipText = isMac ? tooltip ? `${convertToReadableText(keysInput)}: ${tooltip}` : convertToReadableText(keysInput) : tooltip || null;
const processedKeys = isMac ? displayShortcut.split(/[\+\s]+/).filter(key => key.trim()).map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('') : displayShortcut.split('+').map(key => {
const trimmedKey = key.trim();
return isModifier(trimmedKey) ? trimmedKey : capitalizeFirstLetter(trimmedKey);
}).join('+');
return tooltipText ?
{processedKeys}
:
{processedKeys}
;
};
Tab adalah model Cursor khusus untuk autolengkap. Semakin sering kamu pakai, semakin baik hasilnya karena kamu mengekspresikan intent dengan menerima saran lewat Tab atau menolak saran lewat Escape. Dengan Tab, kamu bisa:
* Memodifikasi banyak baris sekaligus
* Menambahkan statement import saat belum ada
* Melompat di dalam maupun antar-file untuk suntingan terkoordinasi
* Mendapatkan saran berdasarkan perubahan terbaru, error dari linter, dan suntingan yang kamu terima
## Saran
Saat nambahin teks, completion muncul sebagai teks hantu semi-transparan. Saat ngubah kode yang ada, itu muncul sebagai popup diff di sisi kanan baris lo saat ini.
Terima saran dengan Tab, tolak dengan Escape, atau terima per kata pakai Cmd+Arrow Right. Tetap ngetik atau tekan Escape buat nyembunyiin saran.
### Loncat di file
Tab nebak lokasi edit berikutnya di file dan nyaranin lompatan. Setelah nerima edit, tekan Tab lagi buat loncat ke lokasi berikutnya.
### Loncat antar file
Tab nebak edit kontekstual lintas file. Jendela portal muncul di bagian bawah saat lompatan lintas file disaranin.
### Impor otomatis
Di TypeScript dan Python, Tab otomatis nambahin pernyataan import kalau belum ada. Pakai method dari file lain dan Tab bakal nyaranin import-nya. Kalau lo terima, itu bakal ditambah tanpa ganggu flow lo.
Kalau impor otomatis nggak jalan:
* Pastikan proyek lo punya language server atau ekstensi yang tepat
* Tes dengan Cmd . buat cek apakah import muncul di saran *Quick Fix*
### Tab di Peek
Tab bisa dipakai di tampilan peek *Go to Definition* atau *Go to Type Definition*. Berguna buat ngubah signature fungsi dan benerin call site.
Di Vim, pakai bareng `gd` buat loncat ke definisi, ngubah, dan beresin referensi dalam satu alur.
### Partial Accepts
Terima satu kata sekaligus dengan Cmd Right, atau atur keybinding lewat `editor.action.inlineSuggest.acceptNextWord`. Aktifkan di: `Cursor Settings` → `Tab`.
## Pengaturan
| Setting | Deskripsi |
| :-------------------------------- | :----------------------------------------------------------------------------- |
| **Cursor Tab** | Saran multi-baris yang kontekstual di sekitar kursor, berdasarkan edit terbaru |
| **Partial Accepts** | Terima kata berikutnya dari saran lewat Cmd Right |
| **Suggestions While Commenting** | Aktifkan Tab di dalam blok komentar |
| **Whitespace-Only Suggestions** | Izinkan perubahan yang hanya memengaruhi pemformatan |
| **Imports** | Aktifkan impor otomatis untuk TypeScript |
| **Auto Import for Python (beta)** | Aktifkan impor otomatis untuk proyek Python |
### Mengaktifkan/nonaktifkan
Gunakan status bar (kanan bawah) untuk:
* **Snooze**: Nonaktifkan Tab sementara untuk durasi yang dipilih
* **Disable globally**: Nonaktifkan Tab untuk semua file
* **Disable for extensions**: Nonaktifkan Tab untuk ekstensi file tertentu (mis. Markdown atau JSON)
## FAQ
Matikan Tab buat komentar lewat `Cursor Settings` → `Tab Completion`, lalu hapus centang **Trigger in comments**.
Remap aksi menerima dan menolak saran ke tombol apa pun pakai `Accept Cursor Tab Suggestions` di pengaturan `Keyboard Shortcuts`.
Cursor nyertain sebagian kecil kode yang relevan di context window. Context itu dienkripsi dan dikirim ke backend kami. Backend nge-dekripsi dan baca context-nya dengan aman. Habis itu, model Cursor Tab ngeprediksi saran kode dan ngirim balik ke client buat ditampilin di editor.
# Developers
Source: https://docs.cursor.com/id/tools/developers
Buat tautan instalasi untuk Tools & MCP Servers
export const McpInstallLinkGenerator = () => {
const [config, setConfig] = useState("");
const [error, setError] = useState("");
const [showOverlay, setShowOverlay] = useState(null);
const [extractedServerName, setExtractedServerName] = useState("");
const debounceTimerRef = useRef(null);
useEffect(() => {
return () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
};
}, []);
const handleConfigChange = e => {
const configValue = e.target.value;
setConfig(configValue);
setError("");
setExtractedServerName("");
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
}
if (configValue.trim()) {
debounceTimerRef.current = setTimeout(() => {
validateConfigWithValue(configValue);
}, 500);
}
};
const handleBlur = () => {
if (debounceTimerRef.current) {
clearTimeout(debounceTimerRef.current);
debounceTimerRef.current = null;
}
if (config.trim()) {
validateConfig();
}
};
const validateConfig = () => {
return validateConfigWithValue(config);
};
const validateConfigWithValue = configValue => {
try {
if (!configValue.trim()) {
setError("");
setExtractedServerName("");
return false;
}
const parsedConfig = JSON.parse(configValue);
if (typeof parsedConfig !== 'object' || parsedConfig === null) {
throw new Error("Config must be a JSON object");
}
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
if (!serverName) {
throw new Error("No server configuration found");
}
const serverConfig = configToUse[serverName];
if (typeof serverConfig !== 'object' || serverConfig === null) {
throw new Error("Server config must be an object");
}
if (!serverConfig.command && !serverConfig.url) {
throw new Error("Server config must have either 'command' or 'url' property");
}
if (serverConfig.command && typeof serverConfig.command !== 'string') {
throw new Error("'command' must be a string");
}
if (serverConfig.url && typeof serverConfig.url !== 'string') {
throw new Error("'url' must be a string");
}
if (serverConfig.args && !Array.isArray(serverConfig.args)) {
throw new Error("'args' must be an array");
}
if (serverConfig.env && (typeof serverConfig.env !== 'object' || serverConfig.env === null)) {
throw new Error("'env' must be an object");
}
setError("");
setExtractedServerName(serverName);
return true;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
setExtractedServerName("");
return false;
}
};
const INSTALL_BUTTON_IMAGE_URL = {
DARK: "https://cursor.com/deeplink/mcp-install-dark.svg",
LIGHT: "https://cursor.com/deeplink/mcp-install-light.svg"
};
const generateDeepLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
const safeBase64Config = base64Config.replace(/\+/g, '%2B');
const protocol = window.location.hostname === 'localhost' ? 'cursor-dev' : 'cursor';
return `${protocol}://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(safeBase64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const generateWebLink = () => {
if (!config.trim()) {
setError("Config is required");
return null;
}
try {
const parsedConfig = JSON.parse(config);
const configToUse = parsedConfig.mcpServers || parsedConfig;
const serverName = Object.keys(configToUse)[0];
let serverConfig = {
...configToUse[serverName]
};
if (serverConfig.command && serverConfig.args) {
const argsString = serverConfig.args.join(" ");
serverConfig.command = `${serverConfig.command} ${argsString}`;
delete serverConfig.args;
}
const jsonString = JSON.stringify(serverConfig);
const utf8Bytes = new TextEncoder().encode(jsonString);
const base64Config = btoa(Array.from(utf8Bytes).map(b => String.fromCharCode(b)).join(''));
return `https://cursor.com/en/install-mcp?name=${encodeURIComponent(serverName)}&config=${encodeURIComponent(base64Config)}`;
} catch (e) {
setError(e.message || "Invalid JSON configuration");
return null;
}
};
const copyDeepLink = () => {
const link = generateDeepLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('link');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyWebLink = () => {
const link = generateWebLink();
if (link) {
navigator.clipboard.writeText(link);
setShowOverlay('weblink');
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyHtmlLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const htmlLink = ``;
navigator.clipboard.writeText(htmlLink);
setShowOverlay(theme.toLowerCase());
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyMarkdownLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const markdownLink = `[](${link})`;
navigator.clipboard.writeText(markdownLink);
setShowOverlay(`${theme.toLowerCase()}-md`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
const copyJsxLink = theme => {
const link = generateWebLink();
if (link) {
const imageUrl = INSTALL_BUTTON_IMAGE_URL[theme];
const jsxLink = ``;
navigator.clipboard.writeText(jsxLink);
setShowOverlay(`${theme.toLowerCase()}-jsx`);
setTimeout(() => setShowOverlay(null), 1500);
}
};
return
{error &&
{error}
}
{extractedServerName.length > 0 ?
{extractedServerName}
: No server detected}
{showOverlay === 'link' &&
Copied
}
{showOverlay === 'weblink' &&
Copied
}
{showOverlay === 'dark-md' &&
Copied
}
{showOverlay === 'light-md' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark' &&
Copied
}
{showOverlay === 'light' &&
Copied
}
Click to copy. Paste in README
{showOverlay === 'dark-jsx' &&
Copied
}
{showOverlay === 'light-jsx' &&
Copied
}
Click to copy. Paste in JSX components
;
};
# Server MCP
Server MCP bisa diinstal lewat deeplink Cursor. Formatnya sama kayak [`mcp.json`](/id/context/model-context-protocol.mdx) dengan name dan konfigurasi transport.
Tautan instalasi:
```
cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$BASE64_ENCODED_CONFIG
```
| Komponen | Deskripsi |
| :-------------------------- | :----------------------------------------------------------- |
| `cursor://` | Skema protokol |
| `anysphere.cursor-deeplink` | Penangan deeplink |
| `/mcp/install` | Jalur |
| `name` | Parameter kueri untuk nama server |
| `config` | Parameter kueri untuk konfigurasi JSON yang dikodekan base64 |
## Buat tautan instalasi
1. Dapatkan nama dan konfigurasi JSON server
2. `JSON.stringify` konfigurasi lalu enkode ke base64
3. Ganti `$NAME` dan `$BASE64_ENCODED_CONFIG` dengan nama dan konfigurasi yang sudah dienkode
Pembuat tautan bantu:
## Contoh
Coba JSON ini di pembuat tautan instal MCP:
```json Konfigurasi server MCP tunggal theme={null}
{
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
```
Result:
| Format | Contoh |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Text link | [cursor://anysphere.curs...](cursor://anysphere.cursor-deeplink/mcp/install?name=postgres\&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItcG9zdGdyZXMiLCJwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0L215ZGIiXX0=) |
| Dark button | |
| Light button | |
## Instal server
1. Klik tautannya atau tempel di kolom alamat browser
2. Cursor akan menampilkan prompt untuk menginstal server
3. Pakai servernya di Cursor
# Server MCP
Source: https://docs.cursor.com/id/tools/mcp
Jelajahi dan pasang server MCP untuk Cursor
export const McpInstallButton = ({server, showIcon = true, prompt = null}) => {
const [showModal, setShowModal] = useState(false);
const InstallModal = ({isOpen, onClose, deepLink, server, children}) => {
useEffect(() => {
const handleKeyDown = event => {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isOpen, onClose]);
if (!isOpen) return null;
return
Pelacakan issue dan manajemen proyek untuk tim development.
GitHub
Platform kontrol versi dan pengembangan kolaboratif.
Playwright
Pengujian end-to-end pada browser.
Sentry
Pelacakan error dan pemantauan kinerja.
DuckDB
Database OLAP SQL in-process untuk analitik lokal.
Vercel
Kelola proyek dan penayangan (deployment) di Vercel.
GitLab
Platform DevSecOps untuk code, CI/CD, dan security.
Atlassian
Alat manajemen proyek dan kolaborasi, termasuk Jira dan Confluence.
PostHog
Analitik, pelacakan kesalahan, dan fitur flag.
Stripe
API pemrosesan pembayaran.
PayPal
API pembayaran
dbt Labs
dbt CLI, Semantic Layer, dan Discovery API.
Browserbase
Sesi browser headless untuk agen AI.
Netlify
Bangun dan deploy proyek web.
Shopify
Alat untuk mengembangkan aplikasi Shopify.
snyk
Pemindaian kerentanan di codebase lo.
Zapier
Otomatisasikan alur kerja antaraplikasi.
Heroku
Kelola aplikasi dan sumber daya Heroku.
Hugging Face
Akses Hugging Face Hub dan server MCP Gradio.
Wix
Buat dan kelola situs Wix.
Semgrep
Pindai kode untuk mencari kerentanan keamanan.
Plaid
Mengakses data akun keuangan.
Mercado Pago
Buka dokumentasi Mercado Pago.
"}}}} />
LaunchDarkly
Feature flag sebagai layanan.
Context7
Dokumentasi kode yang selalu terbaru.
Dokumentasi AWS
Akses dokumentasi AWS, lakukan pencarian, dan dapatkan rekomendasi.
Endor Labs
Wawasan risiko keamanan untuk kode.
InstantDB
Query dan kelola InstantDB.
Tinybird
API analitik real-time.
MongoDB
Kelola data dan deployment MongoDB.
Neon
Kelola Neon Postgres
SonarQube
Analisis kode pakai SonarQube.
Socket
Analisis dan lindungi dependensi.
Select Star
Katalog data, lineage, dan konteks.
Pipedream
Terhubung ke API dan alur kerja.
/"}}} />
Auth0
Kelola resource Auth0.
MS Learn Docs
Cari dokumentasi Microsoft Learn.
Mercado Libre
Buka dokumentasi Mercado Libre.
Honeycomb
Query data observabilitas dan SLO.
PagerDuty
Kelola insiden dan peringatan.
Graphite
Bikin dan kelola stacked PR.
Railway
Deploy aplikasi, database, dan layanan.
Postman
Kolaborasi dan pengujian API.
Ini adalah kumpulan MCP tools terkurasi untuk developer dari penyedia resmi.
Kalau perusahaan atau tool kamu menyediakan MCP server resmi dan kamu ingin
itu dimasukkan, silakan{" "}
buat PR atau issue di GitHub
{" "}
dan kami akan meninjaunya untuk dimasukkan.
# Masalah Umum
Source: https://docs.cursor.com/id/troubleshooting/common-issues
Solusi untuk masalah umum dan FAQ
Di bawah ini adalah masalah umum dan solusinya.
### Masalah Jaringan
Pertama, cek konektivitas jaringan. Buka `Cursor Settings` > `Network` dan klik `Run Diagnostics`. Ini bakal ngetes koneksi ke server Cursor dan bantu ngidentifikasi masalah jaringan yang mungkin ngefek ke fitur AI, update, atau fungsionalitas online lainnya.
Cursor mengandalkan HTTP/2 buat fitur AI karena paling efisien buat respons streaming. Kalau jaringan lo nggak mendukung HTTP/2, lo mungkin bakal ngalamin kegagalan pengindeksan dan masalah di fitur AI.
Ini sering kejadian di jaringan kantor, VPN, atau kalau pakai proxy kayak Zscaler.
Buat ngatasinnya, aktifin fallback HTTP/1.1 di pengaturan aplikasi (bukan pengaturan Cursor): tekan `CMD/CTRL + ,`, cari `HTTP/2`, terus aktifin `Disable HTTP/2`. Ini maksa pakai HTTP/1.1 dan nge-resolve masalahnya.
Kita berencana nambahin deteksi dan fallback otomatis.
### Masalah Sumber Daya (CPU, RAM, dll.)
Penggunaan CPU atau RAM yang tinggi bisa ngelemotin mesin lo atau munculin peringatan sumber daya.
Walaupun codebase besar butuh lebih banyak resource, penggunaan tinggi biasanya berasal dari ekstensi atau pengaturan.
Kalau lo ngeliat peringatan RAM rendah di **MacOS**, catat bahwa ada bug buat sebagian pengguna yang bisa nampilin nilai yang sangat nggak akurat. Kalau lo nemuin ini, buka Activity Monitor dan cek tab "Memory" buat liat penggunaan memori yang bener.
Kalau lo ngalamin penggunaan CPU atau RAM tinggi, coba langkah-langkah ini:
Ekstensi bisa ngaruh ke performa.
Extension Monitor nunjukin konsumsi resource buat semua ekstensi yang terpasang dan bawaan.
Aktifin Extension Monitor dari `Settings` > `Application` > `Experimental` dan toggle `Extension Monitor: Enabled`. Ini bakal minta lo buat restart Cursor.
Buka: `Cmd/Ctrl + Shift + P` → `Developer: Open Extension Monitor`.
Cursor ngejalanin ekstensi lo di satu atau lebih **extension host**. Biasanya, kebanyakan ekstensi lo bakal jalan di extension host yang sama, artinya ekstensi yang makan waktu CPU banyak bisa “ngesekik” ekstensi tetangganya!
Extension Monitor bakal nunjukin:
* Tiap proses jangka panjang yang diluncurin sama ekstensi (MacOS dan Linux doang).
* **% Ext Host**: Persentase total waktu extension host yang dipakai ekstensi ini. Ngebantu ngidentifikasi ekstensi yang paling banyak makan waktu relatif ke yang lain.
* **Max Blocking**: Durasi blok eksekusi kontinu terpanjang sebuah ekstensi per interval pemantauan.
* **% CPU**:
* Buat ekstensi: Persentase total penggunaan CPU yang dikaitin ke kode ekstensi.
* Buat proses: Persentase total penggunaan CPU yang dikaitin ke proses yang diluncurin (MacOS dan Linux doang).
* **Memory**:
* Buat ekstensi: Jumlah memori heap JS yang dipakai kode ekstensi (alokasi eksternal nggak kehitung).
* Buat proses: Jumlah memori sistem yang dipakai proses yang diluncurin (MacOS dan Linux doang).
Lo juga bisa ngetes dengan jalanin `cursor --disable-extensions` dari command line. Kalau performa membaik, aktifin lagi ekstensi satu per satu buat nemuin mana yang bermasalah.
Coba Extension Bisect buat ngidentifikasi ekstensi yang bermasalah. Baca lebih lanjut [di sini](https://code.visualstudio.com/blogs/2021/02/16/extension-bisect#_welcome-extension-bisect). Catatan: ini paling efektif buat masalah yang muncul langsung, bukan degradasi performa yang bertahap.
Process Explorer nunjukin proses mana yang makan resource.
Buka: Command Palette (`Cmd/Ctrl + Shift + P`) → `Developer: Open Process Explorer`.
Tinjau proses di bawah:
* **`extensionHost`**: Masalah terkait ekstensi
* **`ptyHost`**: Konsumsi resource terminal
Process Explorer nampilin tiap terminal dan perintah yang lagi jalan buat diagnosis.
Buat proses lain yang penggunaan resource-nya tinggi, laporin ke [forum](https://forum.cursor.com/).
Pakai alat pemantauan sistem operasi lo buat nentuin apakah masalahnya spesifik ke Cursor atau ke seluruh sistem.
Kalau masalah masih muncul, coba tes instalasi Cursor yang minimal.
## FAQ Umum
Update baru dirilis bertahap (staged rollout) — pengguna yang dipilih acak dapat duluan. Update-mu biasanya muncul dalam beberapa hari.
Pakai `Sign Out of GitHub` dari command palette `Ctrl/⌘ + Shift + P`.
GitHub Codespaces belum didukung.
SSH ke mesin Mac atau Windows belum didukung. Untuk masalah lain, laporkan ke [forum](https://forum.cursor.com/) lengkap dengan log.
Kalau kamu melihat "SSH is only supported in Microsoft versions of VS Code":
1. Hapus instalasi Remote-SSH:
* Buka tampilan Extensions (`Ctrl + Shift + X`)
* Cari "Remote-SSH"
* Klik ikon gear → "Uninstall"
2. Pasang Anysphere Remote SSH:
* Buka Cursor marketplace
* Cari "SSH"
* Instal ekstensi Anysphere Remote SSH
3. Setelah instalasi:
* Tutup semua instance VS Code dengan koneksi SSH aktif
* Restart Cursor
* Sambungkan lagi via SSH
Pastikan konfigurasi dan key SSH kamu sudah di-setup dengan benar.
Cursor Tab dan Inline Edit pakai HTTP/2 untuk latensi lebih rendah dan pemakaian resource yang lebih hemat. Beberapa proxy kantor (mis. Zscaler) memblokir HTTP/2. Perbaiki dengan set `"cursor.general.disableHttp2": true` di settings (`Cmd/Ctrl + ,`, cari `http2`).
Logout lalu login lagi dari Cursor Settings.
Pelanggan Pro: Klik `Manage Subscription` di [Dashboard](https://cursor.com/dashboard) buat lihat tanggal perpanjangan.
Pengguna gratis: Cek tanggal email Cursor pertamamu. Penggunaan ke-reset bulanan mulai dari tanggal itu.
Ruang disk yang menipis bisa bikin Cursor ngehapus data historis saat update. Biar nggak kejadian:
1. Pastikan ruang disk bebas cukup sebelum update
2. Rutin bersihin file sistem yang nggak perlu
3. Backup percakapan penting sebelum update
Ikuti [panduan ini](https://code.visualstudio.com/docs/setup/uninstall). Ganti "VS Code" atau "Code" dengan "Cursor", dan ".vscode" dengan ".cursor".
Klik `Delete Account` di [Dashboard](https://cursor.com/dashboard). Ini bakal menghapus akun dan semua data terkait secara permanen.
Jalankan `cursor` di terminal. Kalau perintahnya belum ada:
1. Buka command palette `⌘⇧P`
2. Ketik `install command`
3. Pilih `Install 'cursor' command` (opsional: pasang perintah `code` untuk menimpa milik VS Code)
Kalau klik Sign In ngebuka cursor.com tapi kamu tetap nggak masuk, coba matikan firewall atau antivirus—mereka bisa ngeblokir proses sign-in.
Karena belakangan ada peningkatan penyalahgunaan, permintaanmu mungkin diblokir sebagai langkah keamanan. Begini cara beresinnya:
Pertama, cek VPN-mu. Kalau kamu pakai, coba matikan, soalnya VPN kadang memicu sistem keamanan kami.
Kalau masih belum kelar, kamu bisa coba:
* Bikin chat baru
* Tunggu sebentar lalu coba lagi
* Bikin akun baru pakai autentikasi Google atau GitHub
* Upgrade ke Cursor Pro
# Mendapatkan ID Permintaan
Source: https://docs.cursor.com/id/troubleshooting/request-reporting
Cari ID permintaan untuk dukungan teknis
Kalau tim Cursor lagi menyelidiki masalah teknis, kami mungkin akan minta "ID permintaan".
## Apa itu ID permintaan?
ID permintaan secara unik mengidentifikasi setiap request ke Cursor di sistem internal kami.
Contoh format: `8f2a5b91-4d3e-47c6-9f12-5e8d94ca7d23`
## Gimana cara nemuin request ID?
Request ID bakal kebatas kalau Privacy Mode nyala. Matikan Privacy Mode waktu ngelaporin masalah.
Catatan: Pengguna Business plan punya Privacy Mode yang otomatis nyala sama admin organisasinya.
### Ngambil request ID kamu saat ini
Buat ngelaporin masalah di obrolan yang lagi aktif atau baru:
Dengan obrolan kebuka di sidebar Chat, pakai menu konteks (pojok kanan atas) dan pilih `Copy Request ID`.
Kirim request ID yang udah disalin ke kita lewat forum atau email sesuai instruksi.
### Ngambil request ID dari aksi sebelumnya
Dapetin request ID riwayat lewat perintah `Report AI Action`:
1. Buka command palette `⌘⇧P`
2. Ketik `Report AI Action`
3. Pilih opsi `Report AI Action`
Ini bakal nampilin aksi AI terbaru kamu di Chat, CMD+K, dan Apply.
Pilih aksinya dengan nyesuain waktu dan fiturnya. Salin request ID dan kirim ke kita.
# Panduan Pemecahan Masalah
Source: https://docs.cursor.com/id/troubleshooting/troubleshooting-guide
Langkah untuk memperbaiki masalah dan melaporkan bug
Masalah di Cursor bisa berasal dari ekstensi, data aplikasi, atau gangguan sistem. Coba langkah pemecahan masalah berikut.
Langkah untuk melaporkan masalah ke tim Cursor
## Pemecahan Masalah
Pertama, cek apakah Cursor bisa terhubung ke layanannya.
**Jalankan diagnostik jaringan:** Buka `Cursor Settings` > `Network` dan klik `Run Diagnostics`. Ini akan menguji koneksi ke server Cursor dan mengidentifikasi masalah jaringan yang memengaruhi fitur AI, pembaruan, atau fungsionalitas online lainnya.
Kalau diagnostik menunjukkan masalah konektivitas, cek pengaturan firewall, konfigurasi proxy, atau pembatasan jaringan yang memblokir akses Cursor.
Untuk masalah ekstensi:
**Nonaktifkan semua ekstensi sementara:** Jalankan `cursor --disable-extensions` dari command line. Kalau masalahnya hilang, aktifkan lagi ekstensi satu per satu untuk menemukan yang bermasalah.
**Reset data ekstensi:** Copot dan pasang ulang ekstensi yang bermasalah untuk mereset data yang tersimpan. Cek juga pengaturan ekstensi yang tetap bertahan setelah pemasangan ulang.
Tindakan ini akan menghapus data aplikasi, termasuk ekstensi, tema, snippet, dan data terkait instalasi. Ekspor profil dulu biar data ini tetap tersimpan.
Cursor menyimpan data aplikasi di luar aplikasi agar bisa dipulihkan saat pembaruan atau pemasangan ulang.
Untuk menghapus data aplikasi:
**Windows:** Jalankan perintah berikut di Command Prompt:
```txt theme={null}
rd /s /q "%USERPROFILE%\AppData\Local\Programs\Cursor"
rd /s /q "%USERPROFILE%\AppData\Local\Cursor"
rd /s /q "%USERPROFILE%\AppData\Roaming\Cursor"
del /f /q "%USERPROFILE%\.cursor*"
rd /s /q "%USERPROFILE%\.cursor"
```
**MacOS:** Jalankan `sudo rm -rf ~/Library/Application\ Support/Cursor` dan `rm -f ~/.cursor.json` di Terminal.
**Linux:** Jalankan `rm -rf ~/.cursor ~/.config/Cursor/` di Terminal.
Untuk menghapus instalasi Cursor:
Cari "Add or Remove Programs" di Start Menu, temukan "Cursor", klik "Uninstall".
Buka folder Applications, klik kanan "Cursor", pilih "Move to Trash".
**Untuk paket .deb:** `sudo apt remove cursor`
**Untuk paket .rpm:** `sudo dnf remove cursor` atau `sudo yum remove cursor`
**Untuk AppImage:** Hapus file Cursor.appimage dari lokasinya.
Instal ulang dari [halaman Downloads](https://www.cursor.com/downloads). Kalau kamu nggak menghapus data aplikasi, Cursor akan dipulihkan ke keadaan sebelumnya. Kalau dihapus, kamu bakal dapat instalasi yang benar-benar baru.
## Melaporkan Masalah
Kalau langkah-langkah ini nggak membantu, laporkan ke [forum](https://forum.cursor.com/).
Laporkan bug atau masalah di forum Cursor
Biar cepat ditangani, sertakan:
Ambil screenshot, sembunyikan info sensitif.
Dokumentasikan langkah-langkah persis untuk mereproduksi masalah.
Dapatkan info sistem dari:
`Cursor` > `Help` > `About`
Klik untuk melihat panduan mengumpulkan Request ID
Cek developer console:
`Developer: Toggle Developer Tools`
Akses log:
`Developer: Open Logs Folder`
# Selamat datang
Source: https://docs.cursor.com/id/welcome
Kenalan dengan Cursor dan cara mulai pakai
Cursor adalah editor kode bertenaga AI yang paham codebase lo dan bantu lo ngoding lebih cepat lewat bahasa natural. Cukup jelasin apa yang mau lo bikin atau ubah, dan Cursor bakal ngehasilin kodenya buat lo.
Download, install, dan mulai ngebangun dengan Cursor dalam hitungan menit
Tetap up-to-date dengan fitur dan peningkatan terbaru
Pakai Cursor di terminal lo
Pahami konsep dan fitur inti yang ngejalanin Cursor
Jelajahi model AI yang tersedia dan cara milih yang pas
Pelajari best practices dan workflow buat berbagai use case
Dapetin Cursor buat komputer lo
Buat pertanyaan teknis dan berbagi pengalaman, mampir ke forum kita
Buat pertanyaan akun dan billing, email tim support kita
チームの使用イベントを、柔軟なフィルタリング、検索、ページネーションで詳細に取得できる。このエンドポイントは、個々の API 呼び出し、モデルの利用状況、トークン消費量、コストに関するきめ細かなインサイトを提供する。
```
POST /teams/filtered-usage-events
```
#### リクエストボディ
すべての API リクエストには、API キーによる認証が必要。この API は、他のエンドポイントと同じ Admin API の認証方式を使ってる。
詳しい手順は [Admin API authentication](/ja/account/teams/admin-api#authentication) を参照してね。
## ベース URL
すべての API エンドポイントで使用されるのは次のとおり:
```
https://api.cursor.com
```
## レート制限
* エンドポイントごと・チームごとに、1分あたり5リクエスト
## クエリパラメータ
以下のエンドポイントはすべて、クエリ文字列で同じクエリパラメータを受け付ける:
| Parameter | Type | Required | Description | |
| :---------- | :----- | :------- | :-------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| `startDate` | string | date | No | ISO日付文字列、リテラルの "now"、または "7d" のような相対日数(「現在 - 7日」の意味)。デフォルト: 現在 - 7日 |
| `endDate` | string | date | No | ISO日付文字列、リテラルの "now"、または "0d" のような相対日数。デフォルト: 現在 |
| `page` | number | No | ページ番号(1始まり)。デフォルト: 1 | |
| `pageSize` | number | No | 1ページあたりの件数。デフォルト: 100、最大: 1000 | |
| `user` | string | No | 単一ユーザーによる任意のフィルタ。メール(例: [developer@company.com](mailto:developer@company.com))、エンコード済みID(例: user\_abc123...)、または数値ID(例: 42)を受け付ける | |
レスポンスでは、接頭辞 user\_ が付いたエンコード済み外部IDとして userId を返す。これは API 連携で安定して利用できる。
`cursorAuth.allowedTeamId` は、Cursor にログインを許可するチーム ID を制御する設定だ。この設定には、アクセスを許可するチーム ID をカンマ区切りで指定する。
たとえば、`cursorAuth.allowedTeamId` を `"1,3,7"` に設定すると、それらのチーム ID に属するユーザーがログインできる。
許可リストにないチーム ID でログインを試みた場合:
* 即座に強制ログアウトされる
* エラーメッセージが表示される
* 有効なチーム ID が使われるまで、アプリはそれ以上の認証試行をブロックする
組織で許可されるチーム ID を一元管理するには、デバイス管理ソリューションで `AllowedTeamId` ポリシーを構成する。このポリシーは、ユーザーのデバイス上の `cursorAuth.allowedTeamId` 設定を上書きする。ポリシーの値は、許可されたチーム ID をカンマ区切りで並べた文字列だ。
ベータ
Background Agents API は、リポジトリ上で自律的に動作する AI 搭載のコーディングエージェントをプログラムから作成・管理できる API だよ。
この API を使えば、ユーザーのフィードバックへの自動対応、バグ修正、ドキュメント更新などを自動化できるよ。
Background Agents API は現在ベータ版。ぜひフィードバックを聞かせてね!
これで自動コードレビューシステムが動くようになった。次の拡張も検討してみて:
* [CI の失敗を修正](/ja/cli/cookbook/fix-ci)するための追加ワークフローをセットアップ
* ブランチごとに異なるレビュー レベルを設定
* チームの既存のコードレビュー プロセスと統合
* ファイルタイプやディレクトリごとにエージェントの動作をカスタマイズ
致命的な問題が見つかった場合にワークフローを失敗させ、対応されるまで pull request のマージを防げる。
**プロンプトにブロッキング動作を追加**
まず、レビューエージェントのステップを更新して、`BLOCKING_REVIEW` 環境変数を含め、このブロッキング動作をプロンプトに追加する:
```
Blocking behavior:
- If BLOCKING_REVIEW is true and any 🚨 or 🔒 issues were posted: echo "CRITICAL_ISSUES_FOUND=true" >> $GITHUB_ENV
- Otherwise: echo "CRITICAL_ISSUES_FOUND=false" >> $GITHUB_ENV
- Always set CRITICAL_ISSUES_FOUND at the end
```
**ブロッキングチェックのステップを追加**
次に、コードレビューのステップの後にこの新しいステップを追加する:
```yaml theme={null}
- name: Check blocking review results
if: env.BLOCKING_REVIEW == 'true'
run: |
echo "Checking for critical issues..."
echo "CRITICAL_ISSUES_FOUND: ${CRITICAL_ISSUES_FOUND:-unset}"
if [ "${CRITICAL_ISSUES_FOUND:-false}" = "true" ]; then
echo "❌ Critical issues found and blocking review is enabled. Failing the workflow."
exit 1
else
echo "✅ No blocking issues found."
fi
```
# CI 失敗の修正
Source: https://docs.cursor.com/ja/cli/cookbook/fix-ci
GitHub Actions で Cursor CLI を使ってリポジトリの CI 問題を修正する
GitHub Actions 上で Cursor CLI を使って CI の失敗を修正する。このワークフローは失敗を解析し、最小限かつ的確に修正を行い、クイック作成用 PR リンク付きの修正ブランチを作成する。
このワークフローは名前で特定のワークフローを監視する。実際の CI ワークフロー名に合わせて `workflows` のリストを更新してね。
```yaml auto-fix-ci.yml theme={null}
name: Fix CI Failures
on:
workflow_run:
workflows: [Test]
types: [completed]
permissions:
contents: write
pull-requests: write
actions: read
jobs:
attempt-fix:
if: >-
${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.name != 'Fix CI Failures' }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Fix CI failure
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: ci-fix
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- Workflow Run ID: ${{ github.event.workflow_run.id }}
- Workflow Run URL: ${{ github.event.workflow_run.html_url }}
- Fix Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Implement an end-to-end CI fix flow driven by the failing PR, creating a separate persistent fix branch and proposing a quick-create PR back into the original PR's branch.
# Requirements:
1) Identify the PR associated with the failed workflow run and determine its base and head branches. Let HEAD_REF be the PR's head branch (the contributor/origin branch).
2) Maintain a persistent fix branch for this PR head using the Fix Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
3) Attempt to resolve the CI failure by making minimal, targeted edits consistent with the repo's style. Keep changes scoped and safe.
4) You do NOT have permission to create PRs. Instead, post or update a single natural-language PR comment (1–2 sentences) that briefly explains the CI fix and includes an inline compare link to quick-create a PR.
# Inputs and conventions:
- Use `gh api`, `gh run view`, `gh pr view`, `gh pr diff`, `gh pr list`, `gh run download`, and git commands as needed to discover the failing PR and branches.
- Avoid duplicate comments; if a previous bot comment exists, update it instead of posting a new one.
- If no actionable fix is possible, make no changes and post no comment.
# Deliverables when updates occur:
- Pushed commits to the persistent fix branch for this PR head.
- A single natural-language PR comment on the original PR that includes the inline compare link above.
" --force --model "$MODEL" --output-format=text
```
# Secret Audit
Source: https://docs.cursor.com/ja/cli/cookbook/secret-audit
GitHub Actions で Cursor CLI を使ってリポジトリのシークレットを監査する
Cursor CLI を使って、リポジトリのセキュリティ脆弱性とシークレット漏えいを監査しよう。ワークフローは潜在的なシークレットをスキャンし、リスクの高いワークフローパターンを検出して、セキュリティ修正案を提案する。
```yaml auto-secret-audit.yml theme={null}
name: Secrets Audit
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
actions: read
jobs:
secrets-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Scan and propose hardening
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: audit
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- Hardening Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Perform a repository secrets exposure and workflow hardening audit on a schedule, and propose minimal safe fixes.
# Requirements:
1) Scan for potential secrets in tracked files and recent history; support allowlist patterns if present (e.g., .gitleaks.toml).
2) Detect risky workflow patterns: unpinned actions, overbroad permissions, unsafe pull_request_target usage, secrets in forked PR contexts, deprecated insecure commands, missing permissions blocks.
3) Maintain a persistent branch for this run using the Hardening Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
4) Propose minimal edits: redact literals where safe, add ignore rules, pin actions to SHA, reduce permissions, add guardrails to workflows, and add a SECURITY_LOG.md summarizing changes and remediation guidance.
5) Push to origin.
6) If there is at least one open PR in the repo, post or update a single natural-language comment (1–2 sentences) on the most recently updated open PR that briefly explains the hardening changes and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update an existing bot comment if present. If no changes or no open PRs, post nothing.
# Inputs and conventions:
- Use `gh` to list PRs and to post comments. Avoid duplicate comments.
# Deliverables when updates occur:
- Pushed commits to the persistent hardening branch for this run.
- A single natural-language PR comment with the compare link above (only if an open PR exists).
" --force --model "$MODEL" --output-format=text
```
# キーの翻訳
Source: https://docs.cursor.com/ja/cli/cookbook/translate-keys
GitHub Actions で Cursor CLI を使ってリポジトリの翻訳キーを管理する
Cursor CLI を使って i18n の翻訳キーを管理する。このワークフローは、プルリクエストで追加・変更された i18n キーを検出し、既存の翻訳を上書きせずに不足分だけを補完する。
```yaml auto-translate-keys.yml theme={null}
name: Translate Keys
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
i18n:
if: ${{ !startsWith(github.head_ref, 'translate/') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Cursor CLI
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git identity
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: Propose i18n updates
env:
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
MODEL: gpt-5
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: translate
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available. You have write access to repository contents and can comment on pull requests, but you must not create or edit PRs directly.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ github.event.pull_request.number }}
- Head Ref: ${{ github.head_ref }}
- Translate Branch Prefix: ${{ env.BRANCH_PREFIX }}
# Goal:
- Detect i18n keys added or changed in the PR and fill only missing locales in message files. Never overwrite existing translations.
# Requirements:
1) Determine changed keys by inspecting the PR diff (source files and messages files).
2) Compute missing keys per locale using the source/canonical locale as truth.
3) Add entries only for missing keys. Preserve all existing values untouched.
4) Validate JSON formatting and schemas.
5) Maintain a persistent translate branch for this PR head using the Translate Branch Prefix from Context. Create it if missing, update it otherwise, and push changes to origin.
6) Post or update a single PR comment on the original PR written in natural language (1–2 sentences) that briefly explains what was updated and why, and includes an inline compare link to quick-create a PR.
7) Avoid duplicate comments; update a previous bot comment if present.
8) If no changes are necessary, make no commits and post no comment.
# Inputs and conventions:
- Use `gh pr diff` and git history to detect changes.
# Deliverables when updates occur:
- Pushed commits to the persistent translate branch for this PR head.
- A single natural-language PR comment on the original PR with the compare link above.
" --force --model "$MODEL" --output-format=text
```
# ドキュメントの更新
Source: https://docs.cursor.com/ja/cli/cookbook/update-docs
GitHub Actions で Cursor CLI を使ってリポジトリのドキュメントを更新
GitHub Actions で Cursor CLI を使ってドキュメントを更新。方法は2つある: エージェントに全自律で任せるか、エージェントによるファイル変更のみを許可する決定的なワークフロー。
```yaml auto-update-docs.yml theme={null}
name: ドキュメント更新
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: リポジトリのチェックアウト
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cursor CLI のインストール
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: git の設定
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: ドキュメント更新
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "GitHub Actions のランナー上で動作している。
GitHub CLI は `gh` として利用可能で、`GH_TOKEN` で認証済み。Git も利用可能。リポジトリ内容への書き込み権限があり、プルリクエストにコメントできるが、PR の作成や編集は行ってはいけない。
# コンテキスト:
- リポジトリ: ${{ github.repository }}
- オーナー: ${{ github.repository_owner }}
- PR 番号: ${{ github.event.pull_request.number }}
- ベースリファレンス: ${{ github.base_ref }}
- ヘッドリファレンス: ${{ github.head_ref }}
- ドキュメント用ブランチのプレフィックス: ${{ env.BRANCH_PREFIX }}
# 目標:
- 元の PR の増分変更に基づいて、エンドツーエンドのドキュメント更新フローを実装する。
# 要件:
1) 元の PR での変更点を特定し、複数回のプッシュがある場合は、直近のドキュメント更新以降の増分差分を算出する。
2) その増分変更に基づき、関連するドキュメントのみを更新する。
3) コンテキストで指定されたドキュメント用ブランチのプレフィックスを使い、この PR のヘッドに対応する永続的なドキュメント用ブランチを維持する。なければ作成し、あれば更新し、変更を origin にプッシュする。
4) PR を作成する権限はない。代わりに、ドキュメント更新を簡潔に説明し、PR を素早く作成できるインラインの比較リンクを含む、1~2文の自然言語による単一の PR コメントを投稿または更新すること。
# 入力と規約:
- 変更を検出し、直近のドキュメント更新以降の増分範囲を導き出すために、`gh pr diff` と git の履歴を使用する。
- PR を直接作成または編集しない。上記の比較リンク形式を使用する。
- 変更は最小限にし、リポジトリのスタイルに合わせる。ドキュメント更新が不要な場合は、変更もコメント投稿も行わない。
# 更新が発生した場合の成果物:
- この PR のヘッドに対応する永続的なドキュメント用ブランチへのコミットをプッシュする。
- 元の PR に対して、上記のインライン比較リンクを含む自然言語による単一の PR コメント。重複投稿は避け、既存のボットコメントがあればそれを更新する。
" --force --model "$MODEL" --output-format=text
```
```yaml auto-update-docs-deterministic.yml theme={null}
name: ドキュメント更新
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
auto-docs:
if: ${{ !startsWith(github.head_ref, 'docs/') }}
runs-on: ubuntu-latest
steps:
- name: リポジトリのチェックアウト
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cursor CLI のインストール
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: git の設定
run: |
git config user.name "Cursor Agent"
git config user.email "cursoragent@cursor.com"
- name: ドキュメント更新を生成(コミット/プッシュ/コメントなし)
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
run: |
cursor-agent -p "You are operating in a GitHub Actions runner.
The GitHub CLI is available as `gh` and authenticated via `GH_TOKEN`. Git is available.
IMPORTANT: Do NOT create branches, commit, push, or post PR comments. Only modify files in the working directory as needed. A later workflow step is responsible for publishing changes and commenting on the PR.
# Context:
- Repo: ${{ github.repository }}
- Owner: ${{ github.repository_owner }}
- PR Number: ${{ github.event.pull_request.number }}
- Base Ref: ${{ github.base_ref }}
- Head Ref: ${{ github.head_ref }}
# Goal:
- この PR によって導入された増分変更に基づいて、リポジトリのドキュメントを更新する。
# Requirements:
1) 元の PR で何が変わったかを特定する(必要に応じて `gh pr diff` と git の履歴を使用)。永続的なドキュメント用ブランチ `${{ env.BRANCH_PREFIX }}/${{ github.head_ref }}` が存在する場合は、過去の更新を把握するための参照専用として利用してよい。
2) それらの変更に基づいて、関連するドキュメントのみを更新する。編集は最小限に留め、リポジトリのスタイルに合わせる。
3) ブランチの作成、コミット、プッシュ、PR へのコメント投稿はしない。作業ツリー内のファイルのみ更新した状態で残し、公開は後続ステップに任せる。
# Inputs and conventions:
- `gh pr diff` と git の履歴を使って変更点を検出し、それに応じてドキュメント編集の焦点を絞る。
- ドキュメント更新が不要な場合は、変更も出力も行わない。
# Deliverables when updates occur:
- 作業ディレクトリ内の変更済みドキュメントファイルのみ(コミット/プッシュ/コメントなし)。
" --force --model "$MODEL" --output-format=text
- name: ドキュメント用ブランチの公開
id: publish_docs
env:
BRANCH_PREFIX: docs
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
echo "changes_published=false" >> "$GITHUB_OUTPUT"
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
# プッシュ可能なローカルブランチ上にいることを確認
git fetch origin --prune
# 現在の作業ツリーの変更を維持したまま、永続的なドキュメント用ブランチを作成/切り替え
git checkout -B "$DOCS_BRANCH"
# 変更をステージして検出
git add -A
if git diff --staged --quiet; then
echo "公開するドキュメントの変更はありません。コミット/プッシュをスキップします。"
exit 0
fi
COMMIT_MSG="docs: PR #${PR_NUMBER} 向けの更新(${HEAD_REF} @ $(git rev-parse --short HEAD))"
git commit -m "$COMMIT_MSG"
git push --set-upstream origin "$DOCS_BRANCH"
echo "changes_published=true" >> "$GITHUB_OUTPUT"
- name: PR コメントの投稿または更新
if: steps.publish_docs.outputs.changes_published == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: docs
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
HEAD_REF: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
DOCS_BRANCH="${BRANCH_PREFIX}/${HEAD_REF}"
COMPARE_URL="https://github.com/${REPO}/compare/${BASE_REF}...${DOCS_BRANCH}?quick_pull=1&title=docs%3A+updates+for+PR+%23${PR_NUMBER}"
COMMENT_FILE="${RUNNER_TEMP}/auto-docs-comment.md"
{
echo "Cursor がドキュメント用ブランチを更新しました: \`${DOCS_BRANCH}\`"
echo "今すぐ[差分を確認して、このドキュメント更新をマージするための PR をクイック作成](${COMPARE_URL})できるよ。"
echo
echo "_このコメントは、PR の変更に応じて後続の実行で更新されるよ。_"
echo
echo ""
} > "$COMMENT_FILE"
# 直近のボットコメントの編集に失敗した場合(古い gh)、新規コメント作成にフォールバック
if gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE" --edit-last; then
echo "既存の PR コメントを更新しました。"
else
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "新しい PR コメントを投稿しました。"
fi
```
# GitHub Actions
Source: https://docs.cursor.com/ja/cli/github-actions
GitHub Actions やその他の継続的インテグレーションシステムで Cursor CLI を使う方法を学ぶ
GitHub Actions やその他の CI/CD システムで Cursor CLI を使って開発タスクを自動化しよう。
最良の結果を得るには、意図をはっきり伝えるのがオススメ。たとえば、エージェントにファイルを一切編集させたくないなら、「do not write any code」というプロンプトを使えばOK。これは、実装に入る前にタスクを計画するときに特に役立つ。
エージェントは現在、ファイル操作・検索・シェルコマンド実行のツールを備えてる。IDE エージェントと同様に、今後さらに多くのツールが追加されていく。
データベースごとの拡張機能(PostgreSQL、BigQuery、SQLite、Snowflake)をインストールすると、エディタから直接クエリを実行できる。これでツール間のコンテキスト切り替えが不要になり、クエリ最適化に向けたAI支援も使える。
```sql theme={null}
-- Cursor はインデックス、ウィンドウ関数、クエリ最適化の提案を行う
SELECT
user_id,
event_type,
COUNT(*) as event_count,
RANK() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) as frequency_rank
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id, event_type;
```
Agents を使って、遅いクエリの分析、パフォーマンス改善の提案、クエリ結果の可視化コードの生成ができる。Cursor は SQL の文脈を理解しており、データ構造に応じて適切なチャートタイプをおすすめする。
セットアップが完了したら、Java コードを実行してデバッグしよう。
ニーズに合わせて、次の方法が使えるよ:
どの main メソッドの上にも表示される「Run」リンクをクリックして、
プログラムを素早く実行
Run and Debug サイドバーを開いて、Run ボタンで
アプリケーションを起動
コマンドラインから Maven または Gradle のコマンドで実行
Spring Boot Dashboard 拡張機能から
Spring Boot アプリケーションを直接起動
## Java x Cursor ワークフロー
Cursor の AI 機能は、Java の開発ワークフローを大きく底上げしてくれる。ここでは、Java 向けに Cursor の機能を活用するコツを紹介する: