
Κανόνες Cursor: Πώς να γράψετε αρχεία .cursor/rules που πραγματικά λειτουργούν
Κάθε χρήστης του Cursor χτυπά στον ίδιο τοίχο. Η AI παράγει κώδικα που τεχνικά λειτουργεί, αλλά αγνοεί τις συμβάσεις του έργου σας, χρησιμοποιεί λάθος διαδρομές εισαγωγής (import paths), ξεπερασμένα μοτίβα και δομεί components με τρόπο εντελώς διαφορετικό από τον υπόλοιπο κώδικά σας. Οι κανόνες του Cursor διορθώνουν αυτό το πρόβλημα παρέχοντας στην AI επίμονο context σχετικά με το πώς λειτουργεί το δικό σας έργο.
Τι είναι οι Κανόνες Cursor και γιατί έχουν σημασία;
Οι κανόνες του Cursor είναι αρχεία markdown που λειτουργούν ως μόνιμη system prompt, η οποία εισάγεται πριν από κάθε αλληλεπίδραση με την AI, chat, autocomplete ή δημιουργία κώδικα. Σκεφτείτε τα ως έγγραφα onboarding για την AI. Αντί να διορθώνετε τα ίδια λάθη σε κάθε session, γράφετε την οδηγία μία φορά και αυτή παραμένει.
Η παλιά προσέγγιση ήταν ένα μοναδικό αρχείο .cursorrules στη ρίζα του έργου σας. Αυτό εξακολουθεί να λειτουργεί, αλλά έχει αποσυρθεί (deprecated). Το τρέχον σύστημα χρησιμοποιεί έναν κατάλογο .cursor/rules/ με μεμονωμένα αρχεία .mdc (Markdown Cursor), καθένα από τα οποία αφορά συγκεκριμένες καταστάσεις. Αυτή είναι μια πολύ καλύτερη ρύθμιση επειδή δεν στριμώχνετε κάθε οδηγία σε ένα γιγάντιο αρχείο· χωρίζετε τους κανόνες ανά αρμοδιότητα και το Cursor φορτώνει μόνο όσους σχετίζονται με αυτό που κάνετε εκείνη τη στιγμή.
Αν έχετε εργαστεί με context engineering για εργαλεία AI, η έννοια είναι οικεία: καλύτερο input context παράγει δραματικά καλύτερο output. Οι κανόνες είναι context engineering για ολόκληρη τη ροή εργασίας ανάπτυξής σας.
Ρύθμιση του πρώτου σας αρχείου κανόνων
Δημιουργήστε τον κατάλογο .cursor/rules/ στη ρίζα του έργου σας:
mkdir -p .cursor/rulesΚάθε κανόνας είναι ένα αρχείο .mdc με YAML frontmatter ακολουθούμενο από περιεχόμενο markdown. Εδώ είναι ο σκελετός:
---
description: "When this rule should apply"
globs: ["src/components/**/*.tsx"]
alwaysApply: false
---
Your instructions go here in plain markdown.Τρία πεδία frontmatter ελέγχουν τα πάντα:
| Πεδίο | Τύπος | Σκοπός |
|---|---|---|
alwaysApply | boolean | Συμπερίληψη σε κάθε αίτημα AI όταν είναι true |
description | string | Βοηθά τον agent να αποφασίσει αν ο κανόνας είναι σχετικός |
globs | string[] | Patterns αρχείων που ενεργοποιούν αυτόν τον κανόνα |
Μπορείτε επίσης να δημιουργήσετε κανόνες μέσω του ίδιου του Cursor, πληκτρολογώντας /create-rule στο chat και περιγράφοντας τι θέλετε. Ωστόσο, η χειροκίνητη συγγραφή τους σας δίνει περισσότερο έλεγχο.
Οι τέσσερις τύποι κανόνων εξηγούνται
Ο τρόπος ενεργοποίησης ενός κανόνα εξαρτάται από τη διαμόρφωση του frontmatter του. Υπάρχουν τέσσερις λειτουργίες και η επιλογή της σωστής έχει σημασία για τον προϋπολογισμό του παραθύρου context.
Always Apply (Πάντα Εφαρμογή)
---
alwaysApply: true
---Φορτώνεται σε κάθε single αίτημα AI. Χρησιμοποιήστε το με φειδώ, για θεμελιώδεις αρχές σε επίπεδο έργου, όπως η δήλωση του tech stack σας ή κρίσιμες συμβάσεις που ισχύουν παντού. Κάθε κανόνας που είναι πάντα ενεργός καταναλώνει tokens από κάθε αλληλεπίδραση, είτε είναι σχετικός είτε όχι.
Auto-Attached (Βασισμένο σε Glob)
---
globs: ["src/api/**/*.ts", "src/routes/**/*.ts"]
alwaysApply: false
---Ενεργοποιείται μόνο όταν επεξεργάζεστε αρχεία που ταιριάζουν με τα patterns glob. Αυτός είναι ο βασικός τύπος κανόνα. Οι συμβάσεις των components React φορτώνονται όταν βρίσκεστε σε αρχεία components, τα patterns API σας φορτώνονται όταν βρίσκεστε σε handlers routes και οι κανόνες δοκιμών φορτώνονται όταν γράφετε tests.
Agent-Requested (Ευφυής)
---
description: "Database migration patterns using Drizzle ORM"
alwaysApply: false
---Χωρίς globs, χωρίς always-apply, μόνο μια περιγραφή. Ο agent του Cursor διαβάζει την περιγραφή και αποφασίζει αν ο κανόνας είναι σχετικός με την τρέχουσα εργασία. Αν του ζητήσετε να γράψει ένα migration, θα τραβήξει αυτόν τον κανόνα. Αν styled ένα κουμπί, θα τον παρακάμψει. Αυτό λειτουργεί εκπληκτικά καλά για κανόνες που δεν χαρτογραφούνται neatly σε διαδρομές αρχείων.
Manual (Χειροκίνητος)
---
---Κανένα πεδίο frontmatter δεν έχει οριστεί (ή empty frontmatter). Αυτοί οι κανόνες ενεργοποιούνται μόνο όταν τους αναφέρετε ρητά με @rule-name στο chat. Καλό για σπάνια χρησιμοποιούμενες αλλά σημαντικές οδηγίες, όπως λίστες ελέγχου deployment ή οδηγοί refactoring που χρειάζεστε μόνο περιστασιακά.
| Τύπος Κανόνα | Πότε Φορτώνεται | Καλύτερο Για |
|---|---|---|
| Always Apply | Κάθε αίτημα | Tech stack, κρίσιμες συμβάσεις |
| Auto-Attached | Άνοιγμα αντίστοιχου αρχείου | Patterns framework, κανόνες τύπου αρχείου |
| Agent-Requested | Αποφασίζει ο agent | Cross-cutting concerns, ροές εργασίας |
| Manual | Αναφορά με @ | Ενιαίες εργασίες, λίστες ελέγχου |
Patterns Glob που πραγματικά λειτουργούν
Τα Globs καθορίζουν ποια αρχεία ενεργοποιούν τους κανόνες auto-attached. Αν τα κάνετε λάθος, οι κανόνες σας είτε δεν ενεργοποιούνται ποτέ είτε ενεργοποιούνται παντού. Εδώ είναι τι λειτουργεί:
# All TypeScript files in src
globs: ["src/**/*.ts", "src/**/*.tsx"]
# Only component files
globs: ["**/components/**/*.tsx"]
# Python files, excluding tests
globs: ["**/*.py", "!**/test_*.py"]
# Multiple specific directories
globs: ["src/api/**", "src/services/**"]Λίγα σημεία προσοχής από πραγματική χρήση:
- Το
src/*ταιριάζει μόνο ένα επίπεδο καταλόγου. Σχεδόν πάντα θέλετεsrc/**/*για αναδρομική αντιστοίχιση. - Το
*.jsδεν θα ταιριάξει αρχεία.jsxή.ts. Να είστε σαφείς με τις επεκτάσεις. - Τα Globs πρέπει να είναι μια λίστα YAML. Η σύνταξη με άγκιστρα όπως
{src,lib}/**/*.tsμπορεί να αποτύχει σιωπηρά, προτιμήστε ξεχωριστές καταχωρήσεις λίστας. - Το πρόθεμα
!αποκλείει patterns, κάτι που είναι χρήσιμο για την αγνόηση generated files ή legacy code.
Πρακτικά παραδείγματα κανόνων
Εδώ είναι όπου η θεωρία συναντά την πραγματικότητα. Αυτοί είναι κανόνες που μπορείτε να βάλετε σε ένα έργο και να δείτε άμεσα καλύτερο output από την AI.
Βασικός κανόνας σε επίπεδο έργου (Always Apply)
---
alwaysApply: true
---
# Project: Acme Dashboard
## Tech Stack
- Next.js 15 (App Router only — no Pages Router)
- TypeScript strict mode
- Tailwind CSS v4
- Drizzle ORM with PostgreSQL
- pnpm for package management
## Critical Conventions
- All components are React Server Components by default
- Use "use client" only when the component needs interactivity
- Import paths use @/ alias mapped to src/
- Error handling: wrap async operations in try/catch, never use .catch()
- No default exports except for pages and layoutsΔιατηρήστε το κάτω από 30 γραμμές. Φορτώνεται με κάθε αίτημα, επομένως κάθε λέξη κοστίζει tokens.
Κανόνας Component React (Auto-Attached)
---
description: "React component patterns and conventions"
globs: ["src/components/**/*.tsx", "src/app/**/*.tsx"]
alwaysApply: false
---
# React Component Rules
## Structure
Every component file follows this order:
1. Imports
2. Type definitions (Props interface)
3. Component function (named export)
4. Sub-components (if any)
## Patterns
Use named exports, not default:
- YES: `export function Button({ label }: ButtonProps)`
- NO: `export default function Button()`
For data fetching in Server Components:
```tsx
// Fetch directly in the component, no useEffect
export async function UserProfile({ id }: { id: string }) {
const user = await db.query.users.findFirst({
where: eq(users.id, id)
});
return <div>{user.name}</div>;
}Anti-Patterns (NEVER do these)
- No useEffect for data fetching in Server Components
- No CSS modules — use Tailwind exclusively
- No barrel exports (index.ts re-exports)
- No prop drilling beyond 2 levels — use context or composition
### Κανόνας API Python (Auto-Attached)
```yaml
---
description: "FastAPI endpoint conventions and patterns"
globs: ["src/api/**/*.py", "src/routes/**/*.py"]
alwaysApply: false
---
# FastAPI Conventions
## Endpoint Structure
- Use APIRouter for route grouping
- Type all request/response models with Pydantic v2
- Dependency injection for database sessions
## Pattern
```python
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/{user_id}", response_model=UserResponse)
async def get_user(
user_id: int,
db: AsyncSession = Depends(get_db)
) -> UserResponse:
user = await db.get(User, user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return UserResponse.model_validate(user)Error Handling
- Always use HTTPException, not raw Response objects
- Log errors with structlog before raising
- Return consistent error shapes: {"detail": "message"}
### Κανόνας Υπηρεσίας Go (Auto-Attached)
```yaml
---
description: "Go service patterns and error handling"
globs: ["**/*.go", "!**/*_test.go"]
alwaysApply: false
---
# Go Conventions
## Error Handling
- Always handle errors immediately — no _ for error returns
- Wrap errors with fmt.Errorf("context: %w", err)
- Use sentinel errors for expected failure cases
## Project Layout
- cmd/ for entrypoints
- internal/ for private packages
- pkg/ for public libraries
## Pattern
```go
func (s *UserService) GetByID(ctx context.Context, id string) (*User, error) {
user, err := s.repo.Find(ctx, id)
if err != nil {
if errors.Is(err, ErrNotFound) {
return nil, fmt.Errorf("user %s: %w", id, ErrNotFound)
}
return nil, fmt.Errorf("fetching user %s: %w", id, err)
}
return user, nil
}
## Διαχείριση του "Token Tax"
Εδώ είναι κάτι που παραλείπουν οι περισσότεροι οδηγοί του Cursor: κάθε κανόνας που γράφετε κοστίζει tokens. Ένα έργο με 20 κανόνες always-on μπορεί να κάψει **2.000+ tokens per request** μόνο σε οδηγίες, πριν η AI κοιτάξει даже τον κώδικά σας.
Αυτό έχει σημασία επειδή το context chat του Cursor είναι περίπου 20.000 tokens στην τυπική λειτουργία. Αν οι κανόνες σας καταναλώνουν το 25% αυτού, έχετε χάσει το ένα τέταρτο του "χώρου σκέψης" της AI για την πραγματική σας ερώτηση. Θα παρατηρήσετε χειρότερη ποιότητα output καθώς οι κανόνες συσσωρεύονται, ειδικά σε μεγαλύτερες συνομιλίες.
Τρεις αρχές διατηρούν υγιή τον προϋπολογισμό token σας:
**1. Χρησιμοποιήστε aggressively κανόνες auto-attached και agent-requested.** Μόνο η δήλωση του stack του έργου σας πρέπει να είναι always-on. Όλα τα άλλα πρέπει να φορτώνονται conditional. Αυτός ο κανόνας component React; Δεν χρειάζεται να βρίσκεται στο context όταν γράφετε SQL migrations.
**2. Γράψτε πυκνά, όχι φλυαρία.** Αντικαταστήστε το "Συνιστάται έντονα οι developers να χρησιμοποιούν interfaces TypeScript αντί για type aliases όταν ορίζουν συμβάσεις public API" με "Προτιμήστε `interface` αντί για `type` για public APIs." Η AI δεν χρειάζεται πειθώ, χρειάζεται οδηγίες.
**3. Εφαρμόστε τον Κανόνα των Τριών.** Κωδικοποιήστε ένα pattern ως κανόνα μόνο αφού η AI το κάνει λάθος τρεις φορές. Αν το Cursor ήδη διαχειρίζεται σωστά τις συμβάσεις ονοματολογίας σας χωρίς κανόνα, παραλείψτε τον κανόνα. Κάθε περιττός κανόνας είναι wasted context.
Μπορείτε να παρακολουθήσετε τη χρήση token στη γραμμή κατάστασης στο κάτω μέρος του panel chat του Cursor. Προσέξτε όταν πλησιάζει το 100%, αυτό είναι το σήμα σας για清理 (pruning).
## Οργάνωση κανόνων για ένα πραγματικό έργο
Ένα production project通常需要 5-8 αρχεία κανόνων. Εδώ είναι μια δομή που λειτουργεί καλά:
```text
.cursor/rules/
base.mdc # Tech stack, always-apply (< 30 lines)
components.mdc # React/Vue patterns, glob to component dirs
api.mdc # Backend conventions, glob to API dirs
database.mdc # ORM patterns, glob to models/migrations
testing.mdc # Test conventions, glob to test files
deployment.mdc # CI/CD patterns, manual trigger
personal.mdc # Your preferences (gitignored)Κάντε commit everything στο version control εκτός από το personal.mdc. Με αυτόν τον τρόπο, όλη η ομάδα σας получает την ίδια συμπεριφορά AI, που είναι και ο σκοπός. Όπως λέει ένας χρήστης του φόρουμ του Cursor, οι καλοί κανόνες σημαίνουν ότι "αποδέχεστε περισσότερες προτάσεις as-is, με output που ταιριάζει στις συμβάσεις σας από την πρώτη προσπάθεια."
Αν εργάζεστε με άλλα εργαλεία κωδικοποίησης AI alongside το Cursor, οι έννοιες μεταφέρονται άμεσα. Το Claude Code χρησιμοποιεί CLAUDE.md, το GitHub Copilot έχει αρχεία οδηγιών και το Windsurf έχει τη δική του μορφή, αλλά η υποκείμενη αρχή είναι identical.
Πώς λειτουργεί η προτεραιότητα των κανόνων
Όταν πολλοί κανόνες εφαρμόζονται στο ίδιο αρχείο, το Cursor ακολουθεί μια clear hierarchy:
| Προτεραιότητα | Πηγή | Συμπεριφορά Override |
|---|---|---|
| 1 (υψηλότερη) | Team Rules (dashboard) | Δεν μπορούν να απενεργοποιηθούν από χρήστες |
| 2 | Project Rules (.cursor/rules) | Παρακάμπτουν τους κανόνες χρήστη |
| 3 | User Rules (ρυθμίσεις Cursor) | Global defaults |
Οι Team Rules είναι διαθέσιμες στα σχέδια Team και Enterprise. Ορίζονται στο dashboard του Cursor από admins και επιβάλλονται σε όλο τον οργανισμό· οι individual developers δεν μπορούν να τις απενεργοποιήσουν.
Μέσα στους κανόνες του έργου, αν δύο κανόνες εφαρμόζονται στο ίδιο αρχείο και συγκρούονται, η συμπεριφορά δεν είναι αυστηρά ορισμένη. Στην πράξη, οι κανόνες που φορτώνονται later tend to take precedence. Η αριθμήση των αρχείων σας (001-base.mdc, 002-components.mdc) σας δίνει predictable ordering.
Συχνά λάθη και πώς να τα διορθώσετε
Αφού διάβασα δεκάδες community threads και δοκίμασα κανόνες across projects, αυτά είναι τα λάθη που μπλέκουν τους ανθρώπους πιο συχνά:
Συγγραφή κανόνων που είναι too vague. Το "Γράψτε clean code" δεν λέει τίποτα στην AI. Το "Χρησιμοποιήστε named exports, όχι default exports. Δομήστε components ως: imports, types, function, sub-components" της δίνει κάτι actionable.
Να κάνετε everything always-apply. Η πρώτη σας instinct είναι να ορίσετε alwaysApply: true σε κάθε κανόνα. Αντισταθείτε. Ελέγξτε τους κανόνες σας quarterly· αν έχετε περισσότερους από 2-3 always-on κανόνες, πιθανώς waste tokens.
Ξεχνώντας να test τους κανόνες. Αφού γράψετε έναν κανόνα, ανοίξτε ένα relevant file και ζητήστε από το Cursor να generate something που πρέπει να ακολουθεί τον κανόνα. Αν δεν το κάνει, το glob pattern σας μπορεί να είναι λάθος ή η οδηγία δεν είναι αρκετά clear.
Μην τεκμηριώνετε anti-patterns. Το να λέτε στην AI τι να κάνει είναι η μισή δουλειά. Το να της λέτε τι να μην κάνει είναι η άλλη μισή. Συμπεριλάβετε μια ενότητα "NEVER do these" σε κάθε κανόνα με explicit examples της wrong approach.
Αγνοώντας τα rule saves στο UI. Ένα γνωστό bug προκαλεί την εξαφάνιση των edits των κανόνων. Αν οι changes vanish, κλείστε completely το Cursor, επιλέξτε "Override" στο popup unsaved changes και reopen.
Κανόνες Cursor vs CLAUDE.md vs AGENTS.md
Το Cursor δεν είναι το μόνο εργαλείο που χρησιμοποιεί instruction files. Εδώ είναι πώς συγκρίνονται οι μορφές για όποιον εργάζεται across multiple AI coding assistants:
| Feature | .cursor/rules | CLAUDE.md | AGENTS.md |
|---|---|---|---|
| Format | MDC with frontmatter | Plain markdown | Plain markdown |
| Glob scoping | Yes | No | Directory-level |
| Rule types | 4 (always, auto, agent, manual) | Always-on | Always-on |
| Token control | Fine-grained | Coarse | Coarse |
| Version control | Yes | Yes | Yes |
| Works in | Cursor only | Claude Code | Multiple tools |
Το πλεονέκτημα του Cursor είναι η granularity. Τα CLAUDE.md και AGENTS.md είναι simpler, φορτώνουν everything always. Το Cursor σας επιτρέπει να φορτώνετε τους right rules στο right time, κάτι που έχει σημασία μόλις το instruction set σας μεγαλώσει beyond a few hundred lines.
Για μια deeper look στο πώς το context shapes το AI output across αυτά τα εργαλεία, ο οδηγός context engineering αναλύει τις αρχές που apply regardless of which editor you use.
FAQ
Είναι deprecated το .cursorrules;
Ναι. Το single αρχείο .cursorrules στη ρίζα του έργου σας εξακολουθεί να λειτουργεί, αλλά το Cursor recommends migrating σε αρχεία .cursor/rules/*.mdc. Η νέα μορφή supports glob patterns, conditional loading και better organization. Μετακινηθείτε splitting το monolithic file σας σε focused rules.
Ποια extension αρχείου πρέπει να χρησιμοποιήσω, .mdc ή .md;
Χρησιμοποιήστε .mdc για αρχεία που include YAML frontmatter (description, globs, alwaysApply). Τα plain .md αρχεία also work στον κατάλογο rules αλλά don't support τα frontmatter metadata που enable conditional loading.
Πόσους κανόνες πρέπει να έχει ένα έργο;
Πέντε έως οκτώ είναι το sweet spot για most projects. Ένας always-on base rule, τρεις έως τέσσερις auto-attached rules scoped by file type και ένας ή δύο manual rules για special tasks. Περισσότεροι από 10 κανόνες usually mean that some can be consolidated or removed.
Επηρεάζουν οι κανόνες του Cursor το autocomplete και το tab completion;
Οι κανόνες apply σε chat και agent interactions. Οι User Rules δεν apply σε inline edits (Cmd/Ctrl+K) και οι κανόνες generally don't impact τις suggestions του Cursor Tab autocomplete. Είναι most effective σε chat και Composer sessions.
Μπορώ να share rules across multiple projects;
Ναι, μέσω του feature Remote Rules του Cursor. Πηγαίνετε στο Cursor Settings > Rules, Commands, επιλέξτε "Remote Rule (GitHub)" και paste ένα repository URL. Οι κανόνες auto-sync όταν update το source repo. Alternatively, maintain a shared rules repo και symlink into each project.
Ποιο είναι το maximum recommended rule length;
Τα docs του Cursor suggest keeping individual rules under 500 lines. Στην πράξη, aim for under 100 lines per rule. Shorter rules are easier to maintain και cost fewer tokens. Αν ένας κανόνας exceeds 150 lines, split it into two focused rules.
Λειτουργούν οι κανόνες με όλα τα AI models στο Cursor;
Οι κανόνες work με every model που supports το Cursor, Claude, GPT-4o, Gemini και others. Οι κανόνες inject ως system-level context regardless of which model you've selected. Η συμπεριφορά του model may vary, but the rules themselves are model-agnostic.
Πώς κάνω debug έναν κανόνα που δεν λειτουργεί;
First, verify ότι το glob pattern matches το αρχείο σας, open the file και check αν ο κανόνας appears στο context panel. Second, test με a direct question που should trigger τον κανόνα. Third, try setting alwaysApply: true temporarily για να confirm ότι το content του κανόνα itself works. Αν ναι, το issue είναι το glob pattern σας.
Πρέπει να κάνω commit το .cursor/rules στο git;
Absolutely. The whole point των project rules είναι team-wide consistency. Commit everything στο .cursor/rules/ εκτός από personal preference files. Add a personal.mdc στο .gitignore για individual settings που shouldn't apply to everyone.
Μπορώ να χρησιμοποιήσω κανόνες Cursor alongside MCP servers;
Ναι, και complement each other well. Οι κανόνες define how η AI should write code, ενώ οι MCP servers give the AI access σε external tools και data. Ένας κανόνας might say "always use our internal API client," ενώ ένας MCP server lets the AI actually query that API during development.
Αν τα AI features είναι στο roadmap σας, αυτή είναι η ειδικότητά μας: η ομάδα AI integration της Techsy takes LLM systems από prototype σε production. Θέλετε μια second opinion στο stack σας; Ζητήστε δωρεάν consultation.