Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds
Powrót do kolekcji
Przewodnik20 min czytania

Windsurf

Windsurf to rewolucyjne AI-first IDE od Codeium z agentic workflows, Cascade AI i Flows. Kompletny przewodnik po pierwszym edytorze kodu zaprojektowanym od podstaw z myślą o programowaniu z AI.

Windsurf - Kompletny Przewodnik po AI-First IDE

Czym jest Windsurf?

Windsurf to przełomowe IDE (Integrated Development Environment) stworzone przez twórców Codeium - firmy znanej z bezpłatnego asystenta AI do kodowania. W przeciwieństwie do tradycyjnych edytorów, które dodają funkcje AI jako plugin, Windsurf został zaprojektowany od podstaw jako "AI-first" editor, gdzie sztuczna inteligencja jest integralną częścią każdego aspektu pracy programisty.

Windsurf wprowadza koncepcję "agentic IDE" - edytora, w którym AI nie tylko odpowiada na pytania, ale aktywnie współpracuje z programistą, nawiguje po kodzie, wykonuje wielokrokowe zadania i uczy się z kontekstu projektu. To fundamentalna zmiana w podejściu do narzędzi programistycznych.

Dlaczego Windsurf?

Kluczowe zalety Windsurf

  1. Prawdziwie AI-first architektura - AI wbudowane w każdy aspekt, nie jako dodatek
  2. Cascade - autonomiczny agent - Rozumie i nawiguje całe repozytorium
  3. Flows - automatyzacja zadań - Zapisuj i powtarzaj złożone workflow
  4. Darmowy tier - Nieograniczone autouzupełnianie bez opłat
  5. Supercomplete - Kontekstowe uzupełnianie z całego projektu
  6. Szybkość działania - Zoptymalizowany pod kątem wydajności
  7. Prywatność - Opcja lokalnego przetwarzania (self-hosted)

Windsurf vs tradycyjne IDE

AspektWindsurfVS Code + PluginCursor
AI integrationNatywnaDodanaNatywna
Agent capabilitiesCascade (autonomiczny)BrakComposer
Workflow automationFlowsBrakBrak
Darmowy tierNieograniczone autocompleteOgraniczony$20/mies.
Kontekst projektuPełnyOgraniczonyPełny
Wykonywanie komendWbudowaneOgraniczoneWbudowane
Baza koduFork VS CodeVS CodeFork VS Code

Cascade - Rewolucyjny Agent AI

Cascade to serce Windsurf - autonomiczny agent AI, który fundamentalnie różni się od tradycyjnych chatbotów czy asystentów kodu.

Czym różni się Cascade od zwykłego AI?

Tradycyjny AI assistant:

Code
TEXT
User: Jak dodać dark mode?
AI: Oto kod do dark mode... [pokazuje snippet]
User: Gdzie to umieścić?
AI: W pliku ThemeProvider...
User: A jak zaktualizować komponenty?
AI: Musisz... [kolejna instrukcja]

Cascade w Windsurf:

Code
TEXT
User: Dodaj dark mode do aplikacji

Cascade:
1. Analizuję strukturę projektu...
   → Znalazłem Next.js App Router z Tailwind
2. Sprawdzam obecny system stylów...
   → Tailwind z next-themes będzie najlepszy
3. Tworzę konfigurację dark theme...
   → Aktualizuję tailwind.config.ts
4. Dodaję ThemeProvider...
   → Tworzę providers/ThemeProvider.tsx
5. Aktualizuję layout...
   → Modyfikuję app/layout.tsx
6. Dodaję toggle w Header...
   → Tworzę components/ThemeToggle.tsx
7. Testuję zmiany...
   → Sprawdzam w przeglądarce

✓ Dark mode dodany. Zmodyfikowane pliki:
  - tailwind.config.ts
  - providers/ThemeProvider.tsx
  - app/layout.tsx
  - components/ThemeToggle.tsx
  - package.json (dodano next-themes)

Możliwości Cascade

1. Rozumienie całego repozytorium

Code
TEXT
User: Gdzie obsługiwane są płatności w tym projekcie?

Cascade:
Przeanalizowałem strukturę projektu. Płatności są obsługiwane w:

1. API Endpoint: app/api/payments/route.ts
   - Tworzenie sesji Stripe
   - Obsługa webhooków

2. Frontend: components/checkout/CheckoutForm.tsx
   - UI formularza płatności
   - Integracja z Stripe Elements

3. Utils: lib/stripe.ts
   - Konfiguracja klienta Stripe
   - Funkcje pomocnicze

4. Types: types/payment.ts
   - Interfejsy TypeScript

Czy chcesz, żebym wyjaśnił przepływ płatności?

2. Wykonywanie wielokrokowych zadań

Code
TEXT
User: Stwórz nowy endpoint API do obsługi newslettera z walidacją i zapisem do bazy

Cascade:
Tworzę kompletny endpoint newslettera...

[Krok 1] Tworzę schemat walidacji z Zod
→ lib/validations/newsletter.ts

[Krok 2] Tworzę model Prisma
→ Aktualizuję prisma/schema.prisma
→ Uruchamiam: npx prisma generate

[Krok 3] Tworzę endpoint API
→ app/api/newsletter/subscribe/route.ts

[Krok 4] Dodaję obsługę błędów
→ lib/errors/newsletter-errors.ts

[Krok 5] Tworzę testy
→ __tests__/api/newsletter.test.ts

[Krok 6] Uruchamiam testy
→ npm test newsletter

Gotowe! Newsletter endpoint działa:
POST /api/newsletter/subscribe
Body: { email: "user@example.com", name?: "Jan" }

3. Nawigacja i analiza kodu

Code
TEXT
User: Znajdź wszystkie miejsca gdzie używamy useEffect bez cleanup

Cascade:
Przeszukuję projekt pod kątem useEffect bez cleanup...

Znalazłem 7 problematycznych przypadków:

1. components/Chat.tsx:45
   useEffect(() => {
     socket.on('message', handleMessage)
   }, []) // Brak cleanup dla socket listener

2. hooks/useWindowSize.ts:12
   useEffect(() => {
     window.addEventListener('resize', handler)
   }, []) // Brak cleanup dla event listener

3. components/Timer.tsx:23
   useEffect(() => {
     const id = setInterval(tick, 1000)
   }, []) // Brak clearInterval

[... pozostałe przypadki ...]

Czy naprawić te problemy automatycznie?

4. Uruchamianie komend terminala

Code
TEXT
User: Skonfiguruj projekt do deploymentu na Vercel

Cascade:
Konfiguruję projekt dla Vercel...

[Terminal] Sprawdzam czy Vercel CLI jest zainstalowane
→ vercel --version
→ Nie znaleziono, instaluję...
→ npm install -g vercel

[Terminal] Loguję do Vercel
→ vercel login
→ Otwórz przeglądarkę, aby się zalogować

[Plik] Tworzę vercel.json z konfiguracją
→ Ustawiam Node.js 20, regiony, redirects

[Plik] Aktualizuję .env.example
→ Dodaję zmienne wymagane w produkcji

[Terminal] Linkuję projekt
→ vercel link

[Terminal] Ustawiam zmienne środowiskowe
→ vercel env add DATABASE_URL production

Projekt gotowy do deploymentu!
Uruchom 'vercel --prod' aby wdrożyć.

Tryby pracy Cascade

Write Mode (domyślny)

Cascade może edytować pliki i wykonywać komendy:

Code
TEXT
User: Dodaj paginację do listy produktów

Cascade [Write Mode]:
→ Modyfikuję ProductList.tsx
→ Dodaję hook usePagination
→ Aktualizuję API endpoint
→ Tworzę komponent Pagination

Chat Mode

Cascade tylko odpowiada na pytania, bez modyfikacji:

Code
TEXT
User: [Chat Mode] Wyjaśnij jak działa ten algorytm sortowania

Cascade [Chat Mode]:
Ten algorytm to QuickSort z następującymi optymalizacjami...
[wyjaśnienie bez modyfikacji kodu]

Review Mode

Cascade analizuje kod i sugeruje zmiany bez ich wykonywania:

Code
TEXT
User: [Review] Sprawdź ten PR pod kątem security

Cascade [Review Mode]:
Analiza bezpieczeństwa PR #123:

⚠️ Wysokie ryzyko:
1. SQL Injection w line 45
   Sugerowana poprawka: [kod]

⚠️ Średnie ryzyko:
2. Brak rate limiting na endpoint
   Sugerowana poprawka: [kod]

✓ Zaakceptuj sugestie aby je zastosować

Flows - Automatyzacja Workflow

Flows to unikalna funkcja Windsurf pozwalająca zapisywać powtarzalne zadania jako szablony.

Tworzenie Flow

.windsurf/flows/new-component.yaml
YAML
# .windsurf/flows/new-component.yaml
name: New React Component
description: Tworzy nowy komponent React z testami i storybook
author: team
version: 1.0.0

inputs:
  - name: componentName
    type: string
    description: Nazwa komponentu (PascalCase)
    required: true
  - name: withTests
    type: boolean
    default: true
  - name: withStorybook
    type: boolean
    default: true
  - name: componentType
    type: select
    options:
      - client
      - server
    default: client

steps:
  - name: Create component file
    action: create_file
    path: src/components/{{componentName}}/{{componentName}}.tsx
    template: |
      {{#if (eq componentType "client")}}
      'use client'

      {{/if}}
      import { cn } from '@/lib/utils'

      interface {{componentName}}Props {
        className?: string
        children?: React.ReactNode
      }

      export function {{componentName}}({ className, children }: {{componentName}}Props) {
        return (
          <div className={cn('', className)}>
            {children}
          </div>
        )
      }

  - name: Create index file
    action: create_file
    path: src/components/{{componentName}}/index.ts
    template: |
      export { {{componentName}} } from './{{componentName}}'

  - name: Create test file
    condition: "{{withTests}}"
    action: create_file
    path: src/components/{{componentName}}/{{componentName}}.test.tsx
    template: |
      import { render, screen } from '@testing-library/react'
      import { {{componentName}} } from './{{componentName}}'

      describe('{{componentName}}', () => {
        it('renders children correctly', () => {
          render(<{{componentName}}>Test content</{{componentName}}>)
          expect(screen.getByText('Test content')).toBeInTheDocument()
        })

        it('applies custom className', () => {
          const { container } = render(
            <{{componentName}} className="custom-class">Content</{{componentName}}>
          )
          expect(container.firstChild).toHaveClass('custom-class')
        })
      })

  - name: Create Storybook file
    condition: "{{withStorybook}}"
    action: create_file
    path: src/components/{{componentName}}/{{componentName}}.stories.tsx
    template: |
      import type { Meta, StoryObj } from '@storybook/react'
      import { {{componentName}} } from './{{componentName}}'

      const meta: Meta<typeof {{componentName}}> = {
        title: 'Components/{{componentName}}',
        component: {{componentName}},
        tags: ['autodocs'],
      }

      export default meta
      type Story = StoryObj<typeof {{componentName}}>

      export const Default: Story = {
        args: {
          children: '{{componentName}} content',
        },
      }

  - name: Update barrel export
    action: update_file
    path: src/components/index.ts
    insert_after: "// Components"
    content: |
      export { {{componentName}} } from './{{componentName}}'

Uruchamianie Flow

Code
Bash
# W Command Palette (Cmd+Shift+P)
> Windsurf: Run Flow

# Lub bezpośrednio
> Run Flow: New React Component

# Dialog:
Component Name: ProductCard
With Tests: ✓
With Storybook: ✓
Component Type: client

# Cascade wykonuje Flow:
→ Created src/components/ProductCard/ProductCard.tsx
→ Created src/components/ProductCard/index.ts
→ Created src/components/ProductCard/ProductCard.test.tsx
→ Created src/components/ProductCard/ProductCard.stories.tsx
→ Updated src/components/index.ts

Zaawansowane Flows

Flow z warunkami i pętlami

.windsurf/flows/crud-api.yaml
YAML
# .windsurf/flows/crud-api.yaml
name: CRUD API Endpoints
description: Generuje kompletne API CRUD dla encji

inputs:
  - name: entityName
    type: string
    required: true
  - name: fields
    type: array
    items:
      - name: fieldName
        type: string
      - name: fieldType
        type: select
        options: [string, number, boolean, date]
    required: true
  - name: withAuth
    type: boolean
    default: true

steps:
  # Prisma schema
  - name: Update Prisma Schema
    action: update_file
    path: prisma/schema.prisma
    insert_before: "// END MODELS"
    template: |
      model {{entityName}} {
        id        String   @id @default(cuid())
        {{#each fields}}
        {{this.fieldName}} {{#if (eq this.fieldType "string")}}String{{/if}}{{#if (eq this.fieldType "number")}}Int{{/if}}{{#if (eq this.fieldType "boolean")}}Boolean{{/if}}{{#if (eq this.fieldType "date")}}DateTime{{/if}}
        {{/each}}
        createdAt DateTime @default(now())
        updatedAt DateTime @updatedAt
      }

  # API routes - iteracja
  - name: Create List Endpoint
    action: create_file
    path: app/api/{{lowercase entityName}}s/route.ts
    template: |
      import { prisma } from '@/lib/prisma'
      import { NextResponse } from 'next/server'
      {{#if withAuth}}
      import { auth } from '@/lib/auth'
      {{/if}}

      export async function GET() {
        {{#if withAuth}}
        const session = await auth()
        if (!session) {
          return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
        }
        {{/if}}

        const items = await prisma.{{lowercase entityName}}.findMany()
        return NextResponse.json(items)
      }

      export async function POST(request: Request) {
        {{#if withAuth}}
        const session = await auth()
        if (!session) {
          return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
        }
        {{/if}}

        const data = await request.json()
        const item = await prisma.{{lowercase entityName}}.create({ data })
        return NextResponse.json(item, { status: 201 })
      }

  # Powtórz dla każdego endpointu...

Flow z integracją AI

.windsurf/flows/ai-refactor.yaml
YAML
# .windsurf/flows/ai-refactor.yaml
name: AI-Powered Refactoring
description: Używa Cascade do inteligentnego refaktoringu

inputs:
  - name: targetFile
    type: file
    required: true
  - name: refactorType
    type: select
    options:
      - Extract Functions
      - Add TypeScript Types
      - Improve Performance
      - Add Error Handling
    required: true

steps:
  - name: Analyze with AI
    action: cascade_analyze
    file: "{{targetFile}}"
    prompt: |
      Przeanalizuj ten plik pod kątem: {{refactorType}}.
      Zidentyfikuj wszystkie miejsca wymagające poprawy.

  - name: Apply Refactoring
    action: cascade_refactor
    file: "{{targetFile}}"
    instruction: |
      Na podstawie analizy, wykonaj {{refactorType}}.
      Zachowaj istniejącą funkcjonalność.
      Dodaj komentarze gdzie zmiany są znaczące.

  - name: Verify Changes
    action: run_command
    command: npm test -- --findRelatedTests {{targetFile}}

  - name: Format Code
    action: run_command
    command: npx prettier --write {{targetFile}}

Udostępnianie Flows

Code
YAML
# Flows można udostępniać w team:
# 1. Lokalnie w .windsurf/flows/
# 2. Repozytorium flows firmy
# 3. Windsurf Marketplace

# Instalacja z marketplace:
> Windsurf: Install Flow
> Search: "nextjs api crud"
> Install: "NextJS CRUD Generator by @company"

Supercomplete - Inteligentne Autouzupełnianie

Supercomplete to zaawansowany system autouzupełniania, który rozumie kontekst całego projektu.

Jak działa Supercomplete?

Code
TypeScript
// Tradycyjne autouzupełnianie:
// Sugeruje tylko na podstawie lokalnego kontekstu

const user = {
  na| // Sugeruje: "name", "navigate", "NaN"
}

// Windsurf Supercomplete:
// Rozumie strukturę projektu

// Jeśli w projekcie istnieje:
// types/user.ts: interface User { name: string; email: string; role: 'admin' | 'user' }

const user: User = {
  na| // Sugeruje: "name" (string) - z pełnym typem
}

// Po wybraniu:
const user: User = {
  name: '|' // Sugeruje wartości na podstawie istniejących danych w projekcie
}

Supercomplete w praktyce

Import completion

Code
TypeScript
// Zaczynam pisać:
import { use|

// Supercomplete rozumie projekt i sugeruje:
// → useAuth (z hooks/useAuth.ts)
// → useCart (z hooks/useCart.ts)
// → useToast (z @/components/ui/use-toast)
// → useState (z react)
// → useEffect (z react)

// Kolejność jest inteligentna - najpierw lokalne, potem dependencies

Funkcje z kontekstem

Code
TypeScript
// W pliku components/ProductCard.tsx
// Projekt używa TailwindCSS i shadcn/ui

function ProductCard({ product }: { product: Product }) {
  return (
    <Card className="|
    // Supercomplete sugeruje:
    // → "p-4 hover:shadow-lg" (wzorzec z innych kart w projekcie)
    // → "flex flex-col gap-4" (częsty pattern)

API calls

Code
TypeScript
// Znając strukturę API w projekcie:

async function getProduct(id: string) {
  const response = await fetch|
  // Supercomplete:
  // → fetch(`/api/products/${id}`) - na podstawie istniejących endpointów

Konfiguracja Supercomplete

.windsurf/settings.json
JSON
// .windsurf/settings.json
{
  "supercomplete": {
    "enabled": true,
    "debounceMs": 100,
    "maxSuggestions": 5,
    "contextDepth": "project", // "file" | "directory" | "project"
    "prioritizeLocal": true,
    "learnFromEdits": true,
    "excludePatterns": [
      "node_modules/**",
      "dist/**",
      ".git/**"
    ]
  }
}

Command Palette + AI

Windsurf integruje AI bezpośrednio w Command Palette.

Podstawowe użycie

Code
TEXT
Cmd+K → Otwiera AI Command

Przykłady:
"refactor this to use hooks"
"add error handling"
"convert to TypeScript"
"explain this code"
"add tests for this function"
"make this component responsive"

Inline AI Actions

Code
TypeScript
// Zaznacz kod i naciśnij Cmd+K

function processData(data) {  // ← Zaznaczone
  const result = [];
  for (let i = 0; i < data.length; i++) {
    if (data[i].active) {
      result.push(data[i].value * 2);
    }
  }
  return result;
}

// Cmd+K → "convert to functional style"

// Wynik:
const processData = (data: DataItem[]): number[] =>
  data
    .filter(item => item.active)
    .map(item => item.value * 2);

Multi-file Commands

Code
TEXT
Cmd+Shift+K → AI Command dla wielu plików

"add loading states to all components in components/dashboard"
"update all API calls to use new error handling pattern"
"migrate class components to functional"

Terminal Integration

Cascade ma pełną integrację z terminalem.

Automatyczne wykonywanie komend

Code
TEXT
User: Zainstaluj i skonfiguruj TailwindCSS

Cascade:
[1/4] Instaluję dependencies...
> npm install -D tailwindcss postcss autoprefixer

[2/4] Inicjalizuję Tailwind...
> npx tailwindcss init -p

[3/4] Konfiguruję tailwind.config.js...
→ Aktualizuję plik z odpowiednimi ścieżkami

[4/4] Dodaję dyrektywy do CSS...
→ Aktualizuję globals.css

✓ TailwindCSS skonfigurowany!

Debugging z terminalem

Code
TEXT
User: Testy w auth.test.ts nie przechodzą, pomoż mi je naprawić

Cascade:
[1/3] Uruchamiam testy aby zobaczyć błędy...
> npm test auth.test.ts

Błąd w linii 45: "TypeError: Cannot read property 'user' of undefined"

[2/3] Analizuję problem...
→ Mock dla useSession zwraca undefined zamiast obiektu sesji

[3/3] Naprawiam test...
→ Aktualizuję mock w auth.test.ts

Ponownie uruchamiam testy...
> npm test auth.test.ts

✓ Wszystkie 12 testów przeszły!

Watchowanie i reagowanie

Code
TEXT
User: Uruchom testy w trybie watch i naprawiaj błędy automatycznie

Cascade:
> npm test -- --watch

[Watch] Test failed: ProductCard.test.tsx
→ Analizuję błąd...
→ Brak propsa 'onAddToCart'
→ Aktualizuję test...
→ Test przeszedł!

[Watch] Test failed: useCart.test.ts
→ Analizuję błąd...
→ State nie jest resetowany między testami
→ Dodaję beforeEach z resetem...
→ Test przeszedł!

[Watch] Wszystkie testy przechodzą ✓
Monitoruję dalsze zmiany...

Instalacja i Konfiguracja

Wymagania systemowe

SystemMinimumZalecane
macOS10.15+12.0+
WindowsWindows 10Windows 11
LinuxUbuntu 20.04+Ubuntu 22.04+
RAM8 GB16 GB
Dysk2 GBSSD 5 GB+

Instalacja

macOS

Code
Bash
# Homebrew
brew install --cask windsurf

# Lub pobierz z windsurf.ai
curl -fsSL https://windsurf.ai/install.sh | sh

Windows

Code
POWERSHELL
# Winget
winget install Codeium.Windsurf

# Lub pobierz instalator z windsurf.ai

Linux

Code
Bash
# Ubuntu/Debian
wget -qO- https://windsurf.ai/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/windsurf.gpg
echo "deb [signed-by=/usr/share/keyrings/windsurf.gpg] https://windsurf.ai/apt stable main" | sudo tee /etc/apt/sources.list.d/windsurf.list
sudo apt update && sudo apt install windsurf

# Arch Linux (AUR)
yay -S windsurf-bin

# Flatpak
flatpak install flathub ai.windsurf.Windsurf

Pierwsza konfiguracja

Code
Bash
# 1. Uruchom Windsurf
windsurf

# 2. Zaloguj się do Codeium (darmowe konto)
# → Kliknij "Sign In" w prawym dolnym rogu
# → Autoryzuj przez GitHub/Google/Email

# 3. Skonfiguruj projekt
# → Otwórz folder projektu
# → Windsurf automatycznie zaindeksuje kod

Konfiguracja settings.json

.windsurf/settings.json
JSON
// .windsurf/settings.json (projekt)
// lub ~/.config/windsurf/settings.json (globalna)

{
  // Cascade
  "cascade": {
    "enabled": true,
    "model": "gpt-4-turbo", // lub "claude-3-opus", "custom"
    "temperature": 0.3,
    "maxTokens": 8192,
    "autoApprove": false, // true = automatycznie stosuj zmiany
    "showDiff": true
  },

  // Supercomplete
  "supercomplete": {
    "enabled": true,
    "debounceMs": 150,
    "maxSuggestions": 5,
    "contextDepth": "project"
  },

  // Terminal
  "terminal": {
    "cascadeIntegration": true,
    "autoRunSuggested": false,
    "shell": "/bin/zsh"
  },

  // Prywatność
  "privacy": {
    "telemetry": false,
    "shareUsageData": false,
    "localIndexing": true
  },

  // Wygląd
  "theme": "windsurf-dark",
  "fontSize": 14,
  "fontFamily": "JetBrains Mono"
}

Migracja z VS Code

Code
Bash
# Windsurf automatycznie importuje:
# - Rozszerzenia (większość kompatybilna)
# - Ustawienia
# - Keybindings
# - Snippets

# Ręczna migracja:
windsurf --import-from-vscode

# Lub kopiuj ustawienia:
cp ~/.config/Code/User/settings.json ~/.config/windsurf/

Skróty Klawiszowe

Podstawowe

SkrótAkcja
Cmd+KAI Command (inline)
Cmd+Shift+KAI Command (multi-file)
Cmd+IOtwórz Cascade
Cmd+Shift+ICascade w nowym panelu
Cmd+EnterWyślij do Cascade
EscapeAnuluj akcję AI

Cascade

SkrótAkcja
Cmd+LNowa rozmowa Cascade
Cmd+Shift+LKontynuuj ostatnią rozmowę
Cmd+.Zatrzymaj generowanie
Cmd+YZaakceptuj wszystkie zmiany
Cmd+Shift+YOdrzuć wszystkie zmiany
TabZaakceptuj pojedynczą zmianę

Supercomplete

SkrótAkcja
TabZaakceptuj sugestię
Cmd+]Następna sugestia
Cmd+[Poprzednia sugestia
EscapeOdrzuć sugestię
Cmd+SpaceWymuś sugestię

Flows

SkrótAkcja
Cmd+Shift+FUruchom Flow
Cmd+Shift+RPowtórz ostatni Flow
Cmd+Alt+FEdytuj Flow

Nawigacja

SkrótAkcja
Cmd+PSzybkie otwieranie pliku
Cmd+Shift+PCommand Palette
Cmd+GIdź do linii
Cmd+Shift+OIdź do symbolu
Cmd+TSzukaj symbolu w workspace

Windsurf vs Cursor - Szczegółowe Porównanie

Funkcjonalność

FunkcjaWindsurfCursor
Agent AICascadeComposer
AutonomicznośćPełnaCzęściowa
Flows/AutomatyzacjaTakNie
AutocompleteSupercomplete (Codeium)Własne
Multi-file editNatywneNatywne
Terminal integrationGłębokaPodstawowa
Codebase understandingPełnePełne
Custom modelsTakTak

Cennik

PlanWindsurfCursor
FreeNieograniczone autocompleteOgraniczone
Pro$15/mies.$20/mies.
Teams$30/user/mies.$40/user/mies.
EnterpriseCustomCustom

Jakość AI

AspektWindsurfCursor
Zrozumienie kontekstu⭐⭐⭐⭐⭐⭐⭐⭐⭐
Jakość kodu⭐⭐⭐⭐⭐⭐⭐⭐⭐
Szybkość odpowiedzi⭐⭐⭐⭐⭐⭐⭐⭐⭐
Wielokrokowe zadania⭐⭐⭐⭐⭐⭐⭐⭐
Customizacja⭐⭐⭐⭐⭐⭐⭐⭐⭐

Kiedy wybrać Windsurf?

  • Potrzebujesz autonomicznego agenta do złożonych zadań
  • Chcesz automatyzować workflow z Flows
  • Zależy Ci na darmowym autocomplete
  • Wolisz głęboką integrację z terminalem

Kiedy wybrać Cursor?

  • Priorytetem jest jakość generowanego kodu
  • Potrzebujesz większej kontroli nad AI
  • Ważna jest elastyczność w wyborze modeli
  • Masz większy budżet na narzędzia

Integracja z Narzędziami

Git Integration

Code
TEXT
User: Przygotuj commit z sensownym opisem

Cascade:
Analizuję zmiany w staging area...

Znalezione zmiany:
- components/Cart.tsx: Dodano walidację ilości
- hooks/useCart.ts: Obsługa błędów przy update
- api/cart/route.ts: Nowy endpoint DELETE

Proponowany commit message:
---
feat(cart): add quantity validation and error handling

- Add min/max quantity validation in Cart component
- Implement error handling in useCart hook
- Add DELETE endpoint for removing items
---

Zaakceptować? (Y/n)

Docker Integration

Code
TEXT
User: Stwórz Dockerfile dla tego projektu Next.js

Cascade:
Analizuję strukturę projektu...

→ Next.js 14 z App Router
→ Używa Prisma (wymaga generate)
→ Zmienne środowiskowe: DATABASE_URL, NEXTAUTH_SECRET

Tworzę zoptymalizowany Dockerfile:

[Plik] Dockerfile
[Plik] .dockerignore
[Plik] docker-compose.yml (z PostgreSQL)

Uruchomić budowanie? (docker build -t app .)

CI/CD Integration

.github/workflows/windsurf-review.yml
YAML
# .github/workflows/windsurf-review.yml
name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  cascade-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Windsurf AI Review
        uses: codeium/windsurf-action@v1
        with:
          api-key: ${{ secrets.CODEIUM_API_KEY }}
          review-mode: security,performance,best-practices

      - name: Post Review Comments
        uses: codeium/windsurf-comment@v1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

Best Practices

Efektywna praca z Cascade

Code
Markdown
# 1. Bądź konkretny w poleceniach

❌ "Napraw ten bug"
✅ "Funkcja calculateTotal w Cart.tsx nie uwzględnia rabatów.
   Dodaj obsługę rabatu procentowego z pola discount."

# 2. Podawaj kontekst

❌ "Dodaj formularz"
✅ "Dodaj formularz rejestracji użytkownika zgodny z designem
   w Figma (link). Użyj React Hook Form i Zod do walidacji.
   Pola: email, password, confirmPassword, name."

# 3. Dziel złożone zadania

❌ "Zbuduj cały system autentykacji"
✅ "Krok 1: Skonfiguruj NextAuth z provider GitHub
   Krok 2: Dodaj middleware do protected routes
   Krok 3: Stwórz komponenty Login i Register"

# 4. Używaj Review Mode do nauki

"[Review] Sprawdź mój kod i wyjaśnij co można poprawić"

Organizacja Flows

Code
YAML
# Struktura katalogów
.windsurf/
├── flows/
│   ├── components/       # Generowanie komponentów
│   │   ├── react-component.yaml
│   │   └── page-component.yaml
│   ├── api/             # Generowanie API
│   │   ├── crud-endpoint.yaml
│   │   └── graphql-resolver.yaml
│   ├── testing/         # Generowanie testów
│   │   ├── unit-test.yaml
│   │   └── e2e-test.yaml
│   └── refactoring/     # Refaktoring
│       ├── to-typescript.yaml
│       └── extract-hook.yaml
├── templates/           # Szablony dla flows
│   ├── component.tsx.hbs
│   └── test.tsx.hbs
└── settings.json

Optymalizacja Supercomplete

Code
JSON
// Dla dużych projektów
{
  "supercomplete": {
    "contextDepth": "directory", // Zamiast "project"
    "excludePatterns": [
      "**/*.test.ts",
      "**/*.spec.ts",
      "**/__mocks__/**",
      "**/fixtures/**"
    ],
    "priorityPaths": [
      "src/components/**",
      "src/hooks/**",
      "src/lib/**"
    ]
  }
}

Rozwiązywanie Problemów

Cascade nie rozumie projektu

Code
Bash
# 1. Przeindeksuj projekt
Cmd+Shift+P → "Windsurf: Reindex Project"

# 2. Sprawdź .windsurfignore
# Upewnij się, że nie ignorujesz ważnych plików

# 3. Dodaj CLAUDE.md lub WINDSURF.md z opisem projektu
echo "# Project: E-commerce
Tech: Next.js, Prisma, Tailwind
Structure: app/ (pages), components/, lib/" > WINDSURF.md

Wolne autouzupełnianie

Code
JSON
// Optymalizacja dla wolnych maszyn
{
  "supercomplete": {
    "debounceMs": 300,
    "contextDepth": "file",
    "maxSuggestions": 3
  }
}

Błędy podczas wykonywania komend

Code
Bash
# Sprawdź uprawnienia terminala
# macOS: System Preferences → Security → Full Disk Access → Windsurf

# Sprawdź PATH
# .windsurf/settings.json
{
  "terminal": {
    "env": {
      "PATH": "/usr/local/bin:/usr/bin:$PATH"
    }
  }
}

Cennik Szczegółowy

Plan Free

Cena: $0/miesiąc

Zawiera:

  • Nieograniczone autouzupełnianie Supercomplete
  • Podstawowy dostęp do Cascade (limit dziennych zapytań)
  • Indeksowanie projektu
  • Podstawowe Flows
  • Wsparcie community

Plan Pro

Cena: $15/miesiąc

Zawiera:

  • Wszystko z Free
  • Nieograniczony Cascade
  • Zaawansowane modele AI (GPT-4, Claude)
  • Nieograniczone Flows
  • Priorytetowe wsparcie
  • Analiza kodu w czasie rzeczywistym

Plan Teams

Cena: $30/użytkownika/miesiąc (min. 5 użytkowników)

Zawiera:

  • Wszystko z Pro dla każdego członka
  • Współdzielone Flows w zespole
  • Centralne zarządzanie
  • SSO i SAML
  • Audit logs
  • Dedykowany support

Plan Enterprise

Cena: Custom

Zawiera:

  • Wszystko z Teams
  • Self-hosted deployment
  • Własne modele AI
  • SLA 99.9%
  • Custom integracje
  • On-premise support

FAQ - Najczęściej Zadawane Pytania

Czy Windsurf jest darmowy?

Tak, podstawowa wersja Windsurf z nieograniczonym autouzupełnianiem jest całkowicie darmowa. Plan Pro ($15/mies.) odblokowuje pełne możliwości Cascade i zaawansowane funkcje.

Czy moje dane są bezpieczne?

Windsurf oferuje:

  • Lokalne indeksowanie kodu
  • Opcję self-hosted dla enterprise
  • Szyfrowanie end-to-end dla cloud features
  • SOC 2 Type II compliance
  • GDPR compliance

Czy Windsurf działa offline?

Podstawowe funkcje edytora działają offline. Funkcje AI (Cascade, Supercomplete) wymagają połączenia z internetem, chyba że używasz self-hosted deployment z lokalnymi modelami.

Czy mogę używać własnych modeli AI?

Tak, w planach Pro i wyższych możesz skonfigurować własne modele:

  • OpenAI API
  • Anthropic Claude
  • Azure OpenAI
  • Lokalne modele (Ollama, LM Studio)

Jak Windsurf porównuje się do GitHub Copilot?

AspektWindsurfGitHub Copilot
Agent AICascade (autonomiczny)Brak
FlowsTakNie
Darmowy tierTakNie
IDEDedykowanePlugin
Multi-file editNatywneOgraniczone

Czy mogę migrować projekty z VS Code?

Tak, Windsurf automatycznie importuje:

  • Rozszerzenia (większość kompatybilna)
  • Ustawienia
  • Keybindings
  • Snippets
  • Workspace configurations

Podsumowanie

Windsurf reprezentuje nową generację narzędzi programistycznych, gdzie AI nie jest dodatkiem, ale fundamentalną częścią doświadczenia kodowania. Dzięki Cascade - autonomicznemu agentowi, Flows - automatyzacji workflow i Supercomplete - inteligentnemu autouzupełnianiu, Windsurf pozwala programistom skupić się na rozwiązywaniu problemów zamiast na żmudnych zadaniach.

Kluczowe zalety Windsurf:

  • Cascade - agent AI, który naprawdę rozumie Twój projekt
  • Flows - automatyzacja powtarzalnych zadań
  • Darmowy tier - nieograniczone autocomplete
  • Głęboka integracja - AI w każdym aspekcie IDE
  • Aktywny rozwój - regularne aktualizacje i nowe funkcje

Jeśli szukasz IDE, które nie tylko pomoże Ci pisać kod, ale aktywnie współpracuje przy rozwiązywaniu problemów, Windsurf jest wart wypróbowania.