Cara Kerja AI Coding Agent Golang: Claude Code, Cursor, Copilot Explained
Penjelasan teknikal mendalam bagaimana AI coding agent bekerja — token processing, context window, tool use, RAG, dan bagaimana Go code di-generate dan di-verify secara akurat.
Anatomy AI Coding Agent: Cara Kerja di Balik Layar
Untuk memahami cara kerja AI coding agent golang, kamu tidak harus jadi ML engineer. Tapi memahami mekanisme dasarnya — bahkan secara high-level — membuat perbedaan besar antara developer yang “tahu cara pakai AI” dan developer yang benar-benar memaksimalkan potensinya. Di artikel ini kita buka hood-nya: dari LLM core, context engine, sampai tool executor yang membuat Claude Code, Cursor, dan Copilot bisa menulis serta memverifikasi kode Go.
02.1 Tiga Komponen Fundamental
Semua AI coding tools yang kita bahas — Claude Code, Cursor, Copilot, Kiro, Windsurf, Gemini — dibangun di atas tiga komponen yang sama. Diagram berikut memetakan ketiga lapisan itu beserta tanggung jawab masing-masing.
1┌─────────────────────────────────────────────────────────────┐
2│ AI Coding Agent │
3├────────────────────┬────────────────────────────────────────┤
4│ 1. LLM Core │ Large Language Model — "otak" agent │
5│ │ Claude, GPT-4o, Gemini, dll │
6│ │ Bertanggung jawab atas reasoning │
7│ │ dan generation │
8├────────────────────┼────────────────────────────────────────┤
9│ 2. Context Engine │ Apa yang di-feed ke LLM sebelum kamu │
10│ │ mengetik satu karakter pun │
11│ │ CLAUDE.md, file-file relevant, │
12│ │ conversation history, RAG results │
13├────────────────────┼────────────────────────────────────────┤
14│ 3. Tool Executor │ Mekanisme agar LLM bisa take action │
15│ │ bukan hanya generate text │
16│ │ read_file, write_file, run_command, │
17│ │ search_codebase, browse_web │
18└────────────────────┴────────────────────────────────────────┘Perhatikan bahwa ketiga lapisan ini bersifat universal: tool mana pun yang kamu pakai, kamu selalu berhadapan dengan LLM core, context engine, dan tool executor.
Key insight: Perbedaan antar tools bukan terutama pada LLM yang digunakan — seringkali LLM-nya sama. Perbedaan terbesar ada pada context engine dan tool executor — bagaimana context di-build dan action apa yang bisa diambil.
02.2 LLM Core: Tidak Semua Berbeda
Fakta yang sering mengejutkan: banyak tools menggunakan LLM yang sama atau serupa. Tabel berikut merangkum LLM default yang dipakai tiap tool populer.
| Tool | LLM yang Digunakan |
|---|---|
| Claude Code | Claude 3.5 Sonnet / Opus (Anthropic) |
| Cursor | Pilihan: Claude 3.5, GPT-4o, Cursor-1 |
| GitHub Copilot | GPT-4o, Claude (tergantung feature) |
| AWS Kiro | Claude via Amazon Bedrock |
| Windsurf | Internal Codeium model + Claude/GPT |
| Gemini Code Assist | Gemini 1.5 Pro / 2.0 |
Artinya: ketika Cursor dan Claude Code menggunakan Claude 3.5 yang sama, perbedaan output bukan dari LLM-nya — tapi dari bagaimana context di-build sebelum request ke LLM tersebut.
Ini adalah insight yang sangat penting. Mengoptimalkan context (via CLAUDE.md, .cursorrules, dll.) jauh lebih impactful daripada sekadar memilih tool dengan LLM “terbaik.”
02.3 Context Engine: Apa yang LLM “Tahu” Sebelum Kamu Bertanya
Ini adalah bagian yang paling membedakan antar tools, dan yang paling sering disalahpahami. Ketika kamu mengetik “Implement CancelOrder handler” ke AI tool, yang diterima LLM bukan hanya tiga kata itu. Cuplikan berikut menggambarkan payload lengkap yang sebenarnya dikirim ke LLM.
1[SYSTEM PROMPT — built by the tool, invisible to you]:
2"You are an expert Go developer working on a production e-commerce system.
3
4[Content dari CLAUDE.md]:
5 Architecture: handler → usecase → repository → domain
6 Error handling: fmt.Errorf("pkg.Method: %w", err)
7 Monetary: int64 cents, never float64
8 Go 1.22, pgx/v5, echo/v4
9 ...
10
11[Auto-injected context — files the tool thinks are relevant]:
12 internal/delivery/http/handler/order_handler.go:
13 [full content of existing order handler]
14
15 internal/domain/order/entity.go:
16 [full content of domain entity]
17
18 internal/usecase/order/create_order.go:
19 [full content of create order as pattern reference]
20
21 go.mod:
22 [module name and dependency versions]
23
24[Optional context — varies by tool]:
25 Recent git diff (Cursor)
26 Open spec files (Claude Code)
27 Recent conversation history"
28
29[USER MESSAGE]:
30"Implement CancelOrder handler"LLM menerima semua ini sekaligus dan menggunakannya untuk generate response yang contextually appropriate — inilah alasan output bisa “tahu” konvensi proyek kamu tanpa kamu jelaskan ulang.
Implikasi langsung: CLAUDE.md yang baik, .cursorrules yang detail, dan conversation history yang relevan secara langsung menentukan kualitas output — jauh lebih dari “model mana yang lebih pintar.”
02.4 Context Window: Batas yang Nyata
Context window adalah batas berapa banyak “teks” (dalam tokens) yang bisa diproses LLM sekaligus. Satu token ≈ 3-4 karakter dalam bahasa Inggris, ≈ 2-3 karakter dalam kode Go. Estimasi berikut memberi gambaran ukuran nyata sebuah proyek dalam satuan token.
1Estimasi ukuran dalam tokens:
2
3Satu file Go medium (300 baris): ~3,000 tokens
4Satu Go package (10 files): ~30,000 tokens
5CLAUDE.md yang comprehensive: ~2,000 tokens
6Santekno Shop full codebase (~10K baris): ~80,000-120,000 tokens
7
8Context windows:
9──────────────────────────────────────────────────────
10Claude Code: 200,000 tokens → fit hampir seluruh medium codebase
11Cursor: ~100,000 tokens → smart selection diperlukan
12Copilot: ~64,000 tokens → hanya beberapa package utama
13Gemini: 1,000,000 tokens → fit hampir semua codebase enterprise
14AWS Kiro: ~200,000 tokens → comparable to Claude Code
15Windsurf: ~100,000 tokens → comparable to CursorDari angka ini terlihat bahwa untuk mengimplementasikan satu fitur, semua tools cukup — context window baru jadi pembeda nyata saat pekerjaan menyentuh banyak file sekaligus.
Implikasi untuk Go developer: untuk implement single feature (cancel order), context yang dibutuhkan biasanya 5,000-15,000 tokens. Context window menjadi differentiator nyata ketika:
- Debugging yang butuh trace cross multiple packages
- Refactoring codebase-wide
- “Find all places where X pattern is used”
- Large codebase dengan banyak interdependencies
02.5 Bagaimana Token Bekerja dan Mengapa Ini Penting
LLM tidak “membaca” teks seperti manusia — teks di-convert ke tokens dulu. Ilustrasi berikut menunjukkan bagaimana satu baris kode Go dipecah menjadi belasan token, lengkap dengan implikasi biayanya.
1Kalimat ini: return fmt.Errorf("pkg.Method: %w", err)
2Di-tokenize menjadi sesuatu seperti:
3["return", " fmt", ".Errorf", "(\"", "pkg", ".", "Method", ":", " %", "w", "\", err", ")"]
4~13 tokens untuk 1 baris kode
5
6Implikasi untuk cost calculation:
7 Claude Sonnet: ~$3/1M input tokens, ~$15/1M output tokens
8
9Implement CancelOrder feature (estimate):
10 Input: system prompt (~5K) + CLAUDE.md (~2K) + relevant code (~10K) = 17K tokens
11 Output: generated code (~3K) + explanation (~500) = 3.5K tokens
12 Cost: 17K × $3/1M + 3.5K × $15/1M ≈ $0.10 per featureDari hitungan ini, untuk heavy user yang implement 20 features per hari, biayanya ~$2/hari atau ~$40/bulan hanya untuk Claude Code API — inilah kenapa flat-rate tools seperti Cursor ($20/bulan) lebih cost-predictable bagi pemakai berat.
02.6 Tool Use: Dari Text Generator ke Action Taker
Yang membedakan AI coding agent dari AI chatbot biasa adalah kemampuan untuk take action — bukan hanya menghasilkan teks, tapi benar-benar membaca file, menulis file, dan menjalankan command. Mekanismenya adalah Function Calling / Tool Use, dan diagram sekuens berikut menelusuri satu permintaan dari awal hingga test hijau.
1Sequence diagram untuk "Implement CancelOrder dan run test-nya":
2
3User: "Implement CancelOrder dan run test-nya"
4 │
5 ▼
6LLM internal reasoning:
7 "Saya perlu baca existing code dulu untuk memahami patterns."
8 │
9 ▼
10LLM output: {
11 "type": "tool_use",
12 "name": "read_file",
13 "input": {"path": "internal/usecase/order/create_order.go"}
14}
15 │
16 ▼
17Tool Executor: baca file, return konten ke LLM
18 │
19 ▼
20LLM: "Baik, saya lihat pattern-nya. Sekarang saya akan implement."
21 {
22 "type": "tool_use",
23 "name": "write_file",
24 "input": {
25 "path": "internal/usecase/order/cancel_order.go",
26 "content": "package order\n\nimport ..."
27 }
28 }
29 │
30 ▼
31Tool Executor: tulis file
32 │
33 ▼
34LLM: "Sekarang jalankan test untuk verifikasi."
35 {
36 "type": "tool_use",
37 "name": "run_command",
38 "input": {"command": "go test ./internal/usecase/order/..."}
39 }
40 │
41 ▼
42Tool Executor: jalankan test, return output ke LLM
43 │
44 ▼
45LLM: "Test pass. Implementation complete."
46 │
47 ▼
48User melihat: hasil finalPerhatikan pola loop-nya: LLM tidak sekadar menjawab sekali, tapi bergantian antara reasoning dan memanggil tool sampai task benar-benar selesai dan terverifikasi.
Perbedaan antar tools dalam tool executor:
- Scope: tools apa saja yang tersedia (read file vs write file vs browse web vs run bash vs query database)
- Autonomy: apakah setiap action perlu explicit approval atau bisa auto-execute
- Error handling: bagaimana tool gagal di-handle dan di-retry
- Security: tools mana yang restricted (misalnya tidak bisa delete files atau akses network)
02.7 Autonomy Spectrum: Dari Suggestion ke Autonomous
Berbeda tools punya tingkat autonomi yang sangat berbeda. Spektrum berikut menempatkan masing-masing tool dari yang paling manual sampai paling autonomous.
1MANUAL ◄─────────────────────────────────────────────► AUTONOMOUS
2
3Copilot Cursor Claude Code AWS Kiro
4(suggestions, (Composer: (Plan mode: (spec-driven,
5 accept/reject show diff first, reason then auto-execute
6 per line) approve to execute, dengan hooks)
7 apply) confirm per
8 major step)Semakin ke kanan, semakin sedikit intervensi manual yang dibutuhkan — tapi juga semakin besar risikonya jika AI salah mengambil arah.
Untuk Go developer: tingkat autonomi yang tepat bergantung pada task. Peta berikut mencocokkan jenis task dengan tingkat autonomi yang aman.
1Task sederhana — autonomous OK:
2 "Add context timeout ke semua repo methods"
3 → AI bisa langsung edit dan verify compile
4
5Task dengan business logic — semi-autonomous:
6 "Implement cancel order"
7 → AI plan dulu, show approach, user approve, baru execute
8
9Task critical/risky — manual preferred:
10 "Refactor payment service"
11 → Review setiap perubahan, jangan auto-apply apapun
12
13Rules of thumb:
14 Reversible task (bisa git reset) → higher autonomy OK
15 Irreversible atau high-impact → lower autonomy, more verificationAturan praktisnya jelas: task yang reversible boleh diberi autonomi tinggi, sedangkan task irreversible atau high-impact butuh lebih banyak checkpoint verifikasi.
02.8 RAG: Retrieval-Augmented Generation untuk Codebase Besar
Ketika codebase lebih besar dari context window (misalnya Cursor dengan ~100K token untuk proyek 500K baris), tools menggunakan RAG. Empat tahap berikut menjelaskan alur RAG dari indexing sampai generation.
1RAG Pipeline untuk AI Coding:
2
3Step 1: INDEXING (dilakukan di background, sekali atau periodic)
4 Seluruh codebase di-parse dan di-chunk menjadi potongan-potongan kecil
5 Setiap chunk di-convert ke vector embedding (representasi numerik)
6 Vectors disimpan di vector database lokal
7
8Step 2: RETRIEVAL (setiap kali ada query)
9 Query kamu di-convert ke vector
10 Vector database mencari chunks yang paling similar
11 Return top-K chunks yang paling relevan
12
13Step 3: AUGMENTATION (inject ke context)
14 Chunks yang retrieved di-inject ke context LLM
15 Bersama CLAUDE.md, conversation history, dan file yang sedang dibuka
16
17Step 4: GENERATION (LLM process)
18 LLM generate response berdasarkan augmented contextInti RAG: alih-alih menjejalkan seluruh codebase, tool hanya menyuntikkan potongan yang paling relevan dengan query kamu — sehingga codebase raksasa tetap muat “diringkas” ke dalam context window.
Sebagai gambaran konkret untuk Santekno Shop dengan Cursor, perhatikan chunk mana yang di-retrieve dan mana yang (dengan benar) diabaikan.
1Query: "Implement error handling di CancelOrder yang konsisten dengan codebase"
2
3RAG retrieves:
4 → internal/usecase/order/create_order.go (similarity: high)
5 → internal/domain/order/errors.go (similarity: very high)
6 → internal/delivery/http/handler/order_handler.go (similarity: high)
7 → internal/repository/postgres/order_repository.go (similarity: medium)
8
9NOT retrieved (correctly):
10 → internal/usecase/product/... (different domain)
11 → internal/kafka/... (different concern)Perhatikan RAG dengan tepat mengabaikan domain product dan kafka yang tidak relevan — tapi ketepatan seperti ini tidak selalu terjadi.
Keterbatasan RAG: RAG tidak sempurna. Bisa miss context yang relevansinya tidak obvious, atau justru include context yang tidak relevan. Ini kenapa explicit @file references dan CLAUDE.md yang baik masih penting bahkan di tools dengan RAG.
02.9 Bagaimana LLM “Belajar” Go
LLM dilatih pada massive dataset yang termasuk public Go repositories di GitHub, Go standard library, dokumentasi resmi, Stack Overflow, hingga conference talks. Blok berikut merangkum area Go yang biasanya dikuasai LLM dengan baik.
1// Standard library — sangat well-represented:
2import (
3 "context"
4 "fmt"
5 "sync"
6 "time"
7)
8
9// Popular packages — well-represented:
10"github.com/labstack/echo/v4"
11"github.com/jackc/pgx/v5"
12"github.com/google/uuid"
13
14// Go patterns yang umum — tahu dengan baik:
15// - Interface definition dan implementation
16// - Error wrapping dengan fmt.Errorf
17// - Context propagation
18// - Struct embedding
19// - Goroutine lifecycleSelama kamu memakai stdlib dan package populer, LLM biasanya menghasilkan kode yang idiomatik tanpa perlu banyak petunjuk tambahan.
Sebaliknya, ada area yang tidak mungkin diketahui LLM dari training data — dan justru di situlah context file berperan. Blok berikut menandai apa yang harus kamu suplai secara eksplisit.
1// Package internal kamu — tidak ada di training data:
2"github.com/santekno/santekno-shop/internal/domain/order"
3
4// Konvensi tim kamu — tidak ada di training data:
5// "Untuk not-found dari repository: return nil, nil"
6// "Error code HTTP: UPPERCASE_SNAKE_CASE"
7
8// Go version terbaru — tergantung training cutoff:
9// range-over-func (Go 1.22), iter.Seq (Go 1.23)
10// "Proyek ini Go 1.22 — jangan pakai fitur 1.23+"Inilah alasan fundamental keberadaan CLAUDE.md: mengisi gap antara apa yang LLM tahu secara umum dan apa yang spesifik untuk proyek kamu.
02.10 Generation Process: Bagaimana Kode Dihasilkan Token by Token
LLM generate output satu token pada satu waktu, dan setiap token dipengaruhi oleh semua token sebelumnya. Ilustrasi berikut menunjukkan proses pemilihan token beserta probabilitasnya.
1Sedang generate cancel_order.go:
2
3Token 1: "package"
4Token 2: " order"
5Token 3: "\n\nimport"
6Token 4: " (\n"
7Token 5: "\t\"context\""
8...
9
10Setiap token dipilih berdasarkan probability distribution.
11Contoh untuk token berikutnya setelah "if err != nil {":
12 → "\n\t\treturn" : 45% probability (error return)
13 → "\n\t\tlog" : 20% probability (logging)
14 → "\n\t\tpanic" : 5% probability (panic — unusual di Go)
15 → lainnya : 30%
16
17LLM memilih "return" karena highest probability
18DAN karena CLAUDE.md bilang "always use explicit error handling, never panic"Yang penting dipahami: pilihan token dipandu bukan hanya oleh probabilitas statistik, tapi juga oleh instruksi di CLAUDE.md yang menggeser distribusi ke arah yang kamu mau.
Selain probabilitas, ada satu knob lagi yang memengaruhi output: temperature. Uraian berikut menjelaskan efeknya terhadap konsistensi.
1Temperature mengontrol "kreativitas" vs "determinism":
2
3Low temperature (0.1): Output sangat deterministic, konsisten
4 Ideal untuk: kode production, test generation
5
6High temperature (0.8): Output lebih varied, kreatif
7 Ideal untuk: brainstorming, documentation
8
9Default kebanyakan tools: 0.2-0.4 untuk coding tasksUntuk kode production, temperature rendah (0.1-0.4) hampir selalu pilihan yang tepat karena mengutamakan konsistensi ketimbang variasi.
02.11 Mengapa AI Coding Agent Kadang Salah
Memahami mode kegagalan membantu kamu mencegah dan pulih dari mereka. Mode pertama adalah hallucination — AI menghasilkan sesuatu yang terlihat benar padahal tidak ada. Contoh berikut memperlihatkan import package palsu vs yang benar.
1// AI generate dengan confidence tinggi:
2import "github.com/pgx/v5/pgxutil" // ← TIDAK ADA package ini
3
4// Yang benar:
5import "github.com/jackc/pgx/v5" // ← exact module path
6
7// Pencegahan: tuliskan exact import paths di CLAUDE.md
8// Recovery: selalu run `go build` setelah AI generationPencegahannya sederhana: tulis exact import path di CLAUDE.md, dan selalu jalankan go build setelah generasi untuk menangkap package palsu.
Mode kedua adalah context overflow — bagian awal context (termasuk CLAUDE.md) “terdorong” keluar dari window pada sesi yang panjang. Blok berikut merangkum gejala dan cara recovery-nya.
1Percakapan yang panjang (>100 exchanges) bisa menyebabkan
2bagian awal context (termasuk CLAUDE.md) "keluar" dari window.
3
4Symptoms:
5 - AI generate float64 untuk monetary (padahal CLAUDE.md bilang int64)
6 - Error handling tidak di-wrap
7 - Package path yang salah
8
9Recovery:
10 - Mulai session baru
11 - Re-state rules yang paling kritis: "Remember: never float64 for money"
12 - Atau: mulai dengan "Read CLAUDE.md and confirm top 3 rules"Kunci mengatasi overflow: begitu kamu melihat gejala di atas, jangan lanjut menambal — mulai sesi baru dan re-state aturan paling kritis.
Mode ketiga adalah ambiguous instruction — AI menginterpretasi prompt berbeda dari maksud kamu. Perbandingan berikut menunjukkan bedanya prompt vague vs spesifik.
1// Prompt: "Implement error handling"
2// AI interpret: generic error handling tanpa context
3
4// Better prompt:
5// "Implement error handling sesuai CLAUDE.md:
6// - Repository not-found: return nil, nil
7// - Error wrap: fmt.Errorf('pkg.Method: %w', err)
8// - Domain errors dari internal/domain/errors/"
9
10// Semakin specific prompt → semakin specific outputAturannya: semakin spesifik prompt kamu, semakin sempit ruang tafsir AI, dan semakin akurat outputnya.
Mode keempat adalah training data bias — AI condong ke pola yang paling sering muncul di data latihnya. Contoh berikut menunjukkan bagaimana bias itu bisa memilih library yang salah.
1// Jika mayoritas training data menggunakan database/sql:
2// AI mungkin generate database/sql code untuk Go
3// Padahal kamu pakai pgx/v5
4
5// Pencegahan di CLAUDE.md:
6// "NEVER use database/sql. ALWAYS use github.com/jackc/pgx/v5"Untuk melawan bias ini, nyatakan larangan dan preferensi library secara eksplisit di CLAUDE.md sehingga AI tidak jatuh ke default statistiknya.
02.12 Context Caching: Optimasi yang Signifikan
Beberapa tools (termasuk Claude Code) mendukung prompt caching — menyimpan bagian prompt yang tidak berubah antar request. Perbandingan berikut menunjukkan penghematan biayanya.
1Tanpa caching (setiap request bayar penuh):
2 CLAUDE.md: 2,000 tokens × $3/1M = $0.006
3 Project context: 10,000 tokens × $3/1M = $0.030
4 User query: 100 tokens × $3/1M = $0.0003
5 Total input: ~$0.036
6
7Dengan prompt caching (claude-sonnet-4):
8 CLAUDE.md (cached): 2,000 tokens × $0.30/1M = $0.0006 (10x cheaper)
9 Project context (cached): 10,000 tokens × $0.30/1M = $0.003
10 User query (not cached): 100 tokens × $3/1M = $0.0003
11 Total input: ~$0.004 (90% cheaper!)Karena Claude Code mengaktifkan caching untuk CLAUDE.md dan system prompt secara otomatis, biaya nyatanya jauh lebih murah dari yang terlihat di pricing page.
02.13 Latency: Mengapa Ada yang Cepat dan Ada yang Lambat
Latency yang kamu rasakan adalah komposisi dari beberapa komponen. Rincian berikut memecah total waktu tunggu menjadi tahap-tahap penyusunnya.
1Total latency =
2 Client-side preparation (build context, RAG retrieval): 50-500ms
3 + Network round-trip ke API server: 50-200ms
4 + Time to First Token (TTFT): 200-800ms
5 + Generation speed: 50-100 tokens/second
6 + Post-processing (format, apply): 10-100ms
7
8Untuk response 500 tokens:
9 ~300ms + ~100ms + ~400ms + 5,000ms + ~50ms ≈ 5.9 detik
10
11Untuk response 100 tokens (simple answer):
12 ~300ms + ~100ms + ~400ms + 1,000ms + ~50ms ≈ 1.85 detikDari breakdown ini terlihat komponen terbesar adalah generation speed — makin panjang output yang diminta, makin lama waktu tunggunya.
Karena itu, cara paling efektif menekan latency di workflow Go adalah membundel pertanyaan terkait ke dalam satu request. Perbandingan berikut menegaskan poinnya.
1# Batch related questions
2# SLOWER:
3> Implement function X
4# [wait ~5s]
5> Now add error handling
6# [wait ~5s]
7# Total: 10s
8
9# FASTER:
10> Implement function X with proper error handling, context timeout, and unit test
11# [wait ~8s]
12# Total: 8s, dan output lebih comprehensiveSatu request yang komprehensif hampir selalu lebih cepat dan lebih lengkap daripada beberapa request kecil yang serial.
02.14 Perbedaan Architecture: Claude Code vs Cursor vs Copilot
Memahami perbedaan architecture membantu kamu memilih tool yang tepat untuk task yang tepat. Diagram pertama menggambarkan alur Claude Code dari terminal sampai API.
1Terminal / Shell
2 │
3 ▼
4Claude Code CLI (Node.js process)
5 │
6 ├── Load CLAUDE.md dari project root dan parent dirs
7 ├── Build context dari git status, recent files
8 ├── Implement tool set: read, write, execute, search
9 │
10 ▼
11Anthropic API (claude-sonnet-4)
12 │
13 ▼
14Response stream → Tool execution loop → Next LLM call → ...Keunggulan Claude Code: sangat powerful untuk autonomous tasks, CLAUDE.md di-load dari setiap directory level (monorepo-friendly), dan tool executor bisa menjalankan arbitrary bash command.
Berbeda dengan itu, Cursor berpusat pada IDE. Diagram berikut menunjukkan bagaimana konteks dibangun dari workspace editor.
1Cursor IDE (Electron, VSCode-based)
2 │
3 ├── Active file + surrounding context (IDE-aware)
4 ├── .cursorrules di-load dari project root
5 ├── RAG index dari workspace (vector embeddings)
6 ├── Recent conversation history
7 │
8 ▼
9LLM Provider API (pluggable: Claude/GPT-4o/Cursor-1)
10 │
11 ▼
12Diff generator → Visual review → Apply to filesKeunggulan Cursor: visual diff sebelum apply, RAG yang bagus untuk large codebase, dan IDE integration yang seamless.
Terakhir, Copilot dioptimalkan untuk suggestion inline dan integrasi GitHub. Diagram berikut memetakan alurnya, termasuk pipeline PR review.
1VS Code Extension / JetBrains Plugin
2 │
3 ├── Active file context (small window)
4 ├── .github/copilot-instructions.md
5 ├── Nearby files (heuristic selection)
6 │
7 ▼
8GitHub Proxy → OpenAI/Anthropic API
9 │
10 ▼
11Inline suggestion atau Chat response
12
13+ PR Review Pipeline:
14 GitHub PR webhook → Copilot analysis → PR commentKeunggulan Copilot: PR review automation native, IDE integration paling mulus, dan akses ke GitHub context (issues, PRs).
02.15 Memory Systems: Short-term vs Long-term
AI coding tools punya berbagai jenis memory dengan umur dan cakupan berbeda. Blok berikut membedakan empat lapisan memory dari yang paling fana sampai yang paling scalable.
1SHORT-TERM MEMORY:
2 Conversation history dalam satu session
3 → Hilang ketika session ditutup
4 → Semua tools punya ini
5
6MEDIUM-TERM MEMORY:
7 Project context files (CLAUDE.md, .cursorrules)
8 → Persist across sessions via files
9 → Developer yang maintain ini secara eksplisit
10
11LONG-TERM MEMORY:
12 Windsurf Cascade: semantic session memory lintas sessions
13 → Lebih dari sekadar file — ingat "apa yang dikerjakan"
14 → Unik di 2026, tools lain belum ada yang comparable
15
16EXTERNAL MEMORY:
17 RAG indexes (Cursor, Copilot Workspace)
18 → Vector database dari codebase
19 → Retrieved on-demand berdasarkan relevanceYang paling praktis untuk kamu kontrol adalah medium-term memory: CLAUDE.md dan .cursorrules adalah satu-satunya lapisan yang benar-benar kamu tulis dan pelihara sendiri.
02.16 Go-Specific: Bagaimana AI Handle Goroutine dan Concurrency
Concurrency adalah area di mana AI coding tools paling sering membuat kesalahan dalam Go. Contoh berikut menyandingkan pola yang salah (goroutine leak) dengan pola yang benar (berbasis context).
1// WRONG — goroutine leak
2go func() {
3 result := heavyOperation()
4 resultCh <- result // Jika tidak ada yang read, goroutine bocor selamanya
5}()
6
7// CORRECT — dengan context dan proper lifecycle
8func (w *Worker) processWithTimeout(ctx context.Context, job Job) error {
9 doneCh := make(chan error, 1)
10
11 go func() {
12 doneCh <- w.process(ctx, job)
13 }()
14
15 select {
16 case err := <-doneCh:
17 return err
18 case <-ctx.Done():
19 return fmt.Errorf("worker.processWithTimeout: context cancelled: %w", ctx.Err())
20 }
21}Perbedaan kuncinya: versi yang benar memberi setiap goroutine kondisi terminasi yang jelas lewat context, sehingga tidak ada goroutine yang menggantung selamanya.
Agar AI tidak mengulang kesalahan ini, tuliskan aturan goroutine safety secara eksplisit di CLAUDE.md seperti berikut.
1## Goroutine Safety
2- Every goroutine must have a clear termination condition
3- Use context.Context for cancellation propagation
4- Buffered channels for "fire and forget" where appropriate
5- sync.WaitGroup for tracking goroutine completion
6- Never share memory without mutex or channel
7
8## Race Condition Prevention
9- Run: go test -race for all concurrent code
10- Prefer channel communication over shared state
11- Use sync/atomic for simple counters
12- Prefer sync.RWMutex over sync.Mutex for read-heavy workloadsDengan aturan ini tertulis eksplisit, AI punya pijakan konkret untuk memilih pola konkuren yang aman alih-alih menebak.
02.17 Post-Processing: Apa yang Terjadi Setelah Generation
Setelah LLM generate output, tiap tool melakukan post-processing yang berbeda. Blok berikut merangkum perilaku masing-masing tool sekaligus best practice verifikasi untuk Go.
1Claude Code:
2 → Apply changes langsung (atau tanya konfirmasi untuk perubahan besar)
3 → Bisa run go build otomatis jika dikonfigurasi
4 → Tidak otomatis format dengan go fmt (user responsibility)
5
6Cursor:
7 → Generate unified diff
8 → Tampilkan visual review interface
9 → Apply hanya setelah approval
10
11GitHub Copilot:
12 → Inline: instant apply (seperti autocomplete)
13 → Chat: show code block, manual apply
14 → PR Review: comment, tidak auto-apply
15
16Windsurf:
17 → Similar ke Cursor: show changes, approve to apply
18
19Best practice setelah ANY AI generation untuk Go:
20 go build ./... # catch compile errors
21 go vet ./... # catch logical issues
22 go test -race ./... # catch race conditions
23 golangci-lint run # catch style issuesApa pun tool-nya, empat perintah verifikasi di baris terakhir itu wajib dijalankan — tool terbaik sekalipun sesekali menghasilkan kode yang tidak compile.
02.18 Debugging AI Output: Workflow yang Efektif
Ketika AI generate kode yang salah, ada urutan langkah yang efektif untuk memperbaikinya. Blok berikut memandu proses debugging dari compiler error sampai race detector.
1# Step 1: Biarkan compiler berbicara
2go build ./...
3# Compiler error biasanya sangat specific dan actionable
4
5# Step 2: Feed error kembali ke AI
6claude
7> go build error:
8> ./internal/usecase/order/cancel_order.go:45:15:
9> undefined: domain.ErrOrderNotFound
10>
11> domain package ada di internal/domain/order/errors.go.
12> Fix this.
13
14# Step 3: Untuk logical error (compile tapi wrong behavior)
15go test ./internal/usecase/order/... -v
16
17# Step 4: Untuk race condition
18go test -race ./...
19
20# Step 5: Jika AI stuck (generate same wrong code berkali-kali)
21> Forget previous implementation. Start from scratch.
22> The requirements are:
23> [re-state requirements dengan lebih clear]Prinsipnya: jadikan compiler dan test sebagai “juru bicara” — umpankan pesan error-nya apa adanya ke AI, karena pesan itu jauh lebih actionable daripada deskripsi manual kamu.
02.19 Token Efficiency Tips untuk Go Developer
Menggunakan AI tools secara efisien berarti lebih sedikit token dengan hasil lebih baik. Tip pertama adalah membundel task terkait ke dalam satu request.
1# INEFFICIENT: 4 separate requests = 4x overhead
2> Implement Execute method
3> Add error handling to Execute
4> Write test for Execute
5> Add godoc comment
6
7# EFFICIENT: 1 request
8> Implement Execute method with:
9> - Proper error handling (fmt.Errorf wrap)
10> - Unit test (testify/suite + gomock)
11> - Godoc commentSatu request yang menggabungkan implementasi, test, dan dokumentasi menghemat overhead context yang berulang di tiap request.
Tip kedua adalah mereferensikan pola yang sudah ada alih-alih menjelaskan dari nol.
1# INEFFICIENT: Explain pattern from scratch
2> Error handling harus wrap dengan fmt.Errorf dan "%w"
3> dan return domain error untuk not-found...
4
5# EFFICIENT: Reference existing code
6> Implement CancelOrder following the EXACT same pattern
7> as CreateOrder at internal/usecase/order/create_order.goMenunjuk file contoh yang konkret lebih hemat token dan lebih akurat daripada mendeskripsikan konvensi dengan kata-kata.
Tip ketiga adalah mempersempit scope agar AI tidak menyentuh file di luar cakupan.
1# AMBIGUOUS: AI mungkin touch terlalu banyak file
2> Implement cancel order feature
3
4# PRECISE: Scope yang jelas
5> Implement internal/usecase/order/cancel_order.go
6> following spec.md ACs 1-6.
7> Only create/modify this one file.Scope yang eksplisit mencegah AI “melebar” ke file lain, sehingga diff-nya kecil dan mudah di-review.
02.20 Ringkasan
AI coding agents dibangun dari tiga komponen: LLM core, context engine, tool executor. Perbedaan antar tools terutama ada di context engine (apa yang di-inject sebelum request) dan tool executor (action apa yang bisa diambil) — bukan pada LLM-nya, yang sering kali sama.
Key takeaways untuk Go developer:
- Context files (CLAUDE.md) adalah lever terpenting untuk output quality
go build+go vet+go test -racewajib setelah setiap AI generation- Hallucination terjadi — never trust, always verify
- Token efficiency: batch tasks, reference patterns, scope yang precise
- Latency: batch related questions dalam satu request lebih efisien dari serial requests
Di artikel berikutnya, kita berhenti berbicara teori dan langsung ke benchmark: keenam tools di-test dengan skenario Go yang identik, dan hasilnya dibagikan secara transparan.