# Tema Geliştirme: Hızlı Başlangıç

> Özel temayı terminalden geliştirip canlıya alma: tecof login, theme init, dev (yerel/bulut), push, önizleme, promote, rollback ve base-moved çözümü.
>
> Kaynak: https://tecof-app-dev.vercel.app/theme-quickstart · Bölüm: Tema geliştirme · Son güncelleme: 2018-10-20

Bu sayfa bir özel temayı terminalden geliştirip canlıya almayı adım adım anlatır: giriş, kodu indirme, yerel ya da bulut geliştirme, push, önizleme, canlıya alma ve geri alma. Kavramlar için [Geliştirici Alanları (Spaces)](/spaces) sayfasına bakın.

**Gerekenler**

| Gereksinim | Not |
| :--- | :--- |
| Node.js 20+ | CLI'ın çalışma zamanı bağımlılığı yoktur; `tecof doctor` sürümü denetler |
| Tecof hesabı ve mağaza ekibi üyeliği | Temanın ait olduğu mağazanın ekibinde olmanız yeterli; partner hesabı gerekmez |
| Özel tema | Katalog temaları salt okunurdur; önce özel temaya kopyalayın ([ayrıntı](/spaces#salt-okunur-alanlar)) |
| Paket | Push, canlıya alma, geri alma ve bulut geliştirme için mağaza paketinde Özel Temalar ve Kod Erişimi açık olmalı ([ayrıntı](/spaces#paket-gereksinimi)) |
| Paket yöneticisi | Temanın kilit dosyasına göre `npm`, `pnpm`, `yarn` ya da `bun` |

---

## 1. CLI'ı Kurun

```bash
npm install -g @tecof/cli
tecof --version
tecof doctor
```

`tecof doctor` Node sürümünü, API erişimini, oturumu, kimlik deposunu, klasör bağını, git'i ve paket yöneticisini denetler; zorunlu bir denetim başarısızsa çıkış kodu 1 olur.

> **Not:** `tecof theme --help` tema komutlarını listelemiyorsa eski bir sürüm kuruludur; `npm install -g @tecof/cli@latest` ile güncelleyin.

---

## 2. Giriş Yapın

```bash
tecof login
```

```text
Tecof'a giriş yapılıyor (https://api.tecof.com)…

  Doğrulama kodu: KQ7M-4XRT
  Tarayıcıda açın ve kodu onaylayın: https://app.tecof.com/cli?code=KQ7M-4XRT

Onay bekleniyor…
✔ Giriş yapıldı: ayse@ornek-ajans.com (Örnek Ajans)
Token deposu: keychain
```

1. CLI onay sayfasını tarayıcıda açar. Açamazsa (ör. SSH oturumunda) adresi kendiniz açın; `--no-browser` tarayıcıyı hiç denemez.
2. Panelde oturumunuz açıkken sayfa doğrulama kodunu, CLI'ın adını, IP adresini, istek zamanını ve yetkilendirilecek hesabı gösterir. Kod terminaldekiyle aynıysa **Onayla ve giriş yap**; isteği siz başlatmadıysanız **Reddet**.
3. Kod 10 dakika geçerlidir. CLI onayı 5 saniyede bir yoklar ve onay gelince token'ı işletim sisteminin anahtarlığına kaydeder ([Kimlik bilgisi deposu](/dev-security#kimlik-bilgisi-deposu)).

```bash
tecof whoami
```

Cihaz oturumu 30 gün geçerlidir; 14 gün kullanılmazsa düşer. Onayladığınız cihazları panelde `https://app.tecof.com/cli?tab=tokens` (**CLI anahtarları**) sayfasında görüp iptal edebilirsiniz. `tecof logout` token'ı sunucuda da iptal eder.

---

## 3. Tema Alanınızı Bulun

```bash
tecof theme ls
```

```text
id                            kind   name   merchant/app        live  last  rolled-back  writable
----------------------------  -----  -----  ------------------  ----  ----  -----------  ------------------
thm_66f1a2b3c4d5e6f7a8b9c0d1  theme  Butik  Butik Mağaza (BTK)  v11   v11                yes
thm_66f1a2b3c4d5e6f7a8b9c0d2  theme  Vita   Butik Mağaza (BTK)  -     -                  no (catalog-theme)
```

Tema ve uygulama alanlarının hepsini `tecof spaces ls` listeler. Alan kimliğini panelde de bulabilirsiniz: **Temalar** → tema kartındaki ⋯ menüsü → **Sürümler** ekranının başlığında, kopyalama düğmesiyle.

---

## 4. Kodu İndirin

```bash
tecof theme init butik --space thm_66f1a2b3c4d5e6f7a8b9c0d1
```

```text
Kaynak indiriliyor (main)…
✔ Hazır: butik → Butik (312 dosya)

Sonraki adımlar:
  cd butik
  npm install
  tecof theme dev
```

`init` klasörü açar, `main` dalının son hâlini indirir (çalıştırılabilir dosya izinleri korunur) ve iki dosya yazar:

| Dosya | İçerik | Git |
| :--- | :--- | :--- |
| `.tecof/space.json` | Klasörün bağlı olduğu alan: `{ "space": "thm_…", "kind": "theme" }` | Commit'leyin; CI alanı bu dosyadan bulur |
| `.tecof/state.json` | Yerel taban: indirilen `main` commit'i, dosya özetleri ve bekleyen staged sürüm | Yerel önbellek; CLI'ın yazdığı `.tecof/.gitignore` onu git dışında tutar |

`.tecof/` klasörü Tecof'a hiçbir zaman gönderilmez. Etkileşimli terminalde `--space` vermezseniz yazılabilir temalar arasından seçim yaparsınız. Klasör boş değilse `--force` gerekir.

Klasör zaten varsa — örneğin başka bir makinede kendi git deponuzdan geldiyse — `.tecof/space.json` sizi alana bağlar ama yerel taban (`state.json`) yoktur. `tecof theme pull` güncel `main` dalını indirip tabanı kaydeder; yerelde farklı olan dosyaların üzerine `--force` olmadan yazmaz. Bağ dosyası hiç yoksa önce `tecof theme link --space thm_…` çalıştırın.

---

## 5. Yerelde Geliştirin

```bash
cd butik
npm install
tecof theme dev
```

```text
✔ .env.local güncellendi (4 değişken: NEXT_PUBLIC_BASE_URL, NEXT_PUBLIC_CDN_URL, NEXT_PUBLIC_MERCHANT_SECRET_KEY, NEXT_PUBLIC_THEME_ID); diğer satırlar korundu.
Başlatılıyor: npm run dev -- --port 3000 (port 3000)
```

`tecof theme dev` temanın canlıda kullandığı genel ortam değişkenlerini `.env.local` dosyasına yazar ve temanın `dev` betiğini başlatır:

| Değişken | Değer |
| :--- | :--- |
| `NEXT_PUBLIC_BASE_URL` | Tecof API adresi |
| `NEXT_PUBLIC_CDN_URL` | Tecof CDN adresi |
| `NEXT_PUBLIC_MERCHANT_SECRET_KEY` | Mağazanın vitrin anahtarı (genel bir değerdir; tarayıcı paketine zaten girer) |
| `NEXT_PUBLIC_THEME_ID` | Tema kimliği |

- `.env.local` içindeki diğer satırlar korunur; dosya `0600` izinle yazılır ve hiçbir zaman push edilmez.
- Paket yöneticisi kilit dosyasından seçilir (`pnpm-lock.yaml`, `yarn.lock`, `bun.lock`, `package-lock.json`). Port `--port` ile değişir; varsayılan `PORT` ortam değişkeni ya da `3000`.

> **Dikkat:** Yerel sunucu, canlı sitenin kullandığı API'ye gerçek mağaza verisiyle bağlanır. Sayfalar, ürünler ve CMS içeriği gerçektir; sepet, form gönderimi ya da sipariş gibi yazma işlemleri gerçek mağazaya gider.

### Bulutta Geliştirme

Yerel ortam kurmadan çalışmak ya da önizlemeyi başkasıyla paylaşmak için:

```bash
tecof theme dev --cloud
```

```text
Bulut geliştirme oturumu açılıyor (thm_66f1a2b3c4d5e6f7a8b9c0d1)…
✔ İlk eşitleme: 2 dosya yazıldı, 0 silindi.

  Önizleme: https://sb-….vercel.run

Değişiklikler izleniyor (Ctrl+C ile çıkış). Sürüme dönüştürmek için: tecof theme push
```

Bulut oturumu Cloud IDE'nin sandbox'ını kullanır: kod `main` dalından açılır, CLI yerel farkınızı yazar, sonra klasörü izleyip değişiklikleri yaklaşık 300 ms'lik gruplar hâlinde oturuma gönderir. Önizleme adresi sıcak yenilemeyle (HMR) güncellenir.

- Yalnız metin dosyaları eşitlenir; görsel ya da font gibi ikili dosyalar `binary-not-supported` ile reddedilir. Onları `tecof theme push` ile gönderin.
- Yerel taban `main` ile aynıysa yalnız farklı dosyalar gönderilir. Taban eskiyse CLI uyarır ve tüm dosyaları gönderir; projede ikili dosya varsa eşitleme durur. Bu uyarıyı görürseniz önce `tecof theme pull` ile tabanı güncelleyin.
- Oturum Cloud IDE ile aynı kredi kurallarına tabidir: açılışta ve açık kaldığı sürece mağazanın kredisinden düşer ([MCP → Kredi](/mcp#kredi)). Oturum 45 dakika sonra kapanır; CLI süreyi uzatmaz, oturum bitince uyarıp çıkar.
- Bir temada aynı anda tek oturum açık olabilir. Aynı temada başka bir kullanıcının Cloud IDE oturumu açıksa `409 session-busy` döner.
- Ctrl+C'de CLI oturumu kapatmayı sorar (varsayılan evet); `--keep` oturumu açık bırakır. Oturum kapanırken taslak kaydedilmez: kaynak gerçeği sizin klasörünüzdür.
- Bulut geliştirme yalnız `tecof login` oturumuyla çalışır; kapsamlı CI token'ı `403 token-scope-insufficient` alır.
- Oturumdaki değişiklikler yalnız `tecof theme push` ile sürüme dönüşür.

---

## 6. Push Edin

```bash
tecof theme push -m "Yeni ana sayfa"
```

```text
Push: thm_66f1a2b3c4d5e6f7a8b9c0d1 → staged
312 dosya tarandı (4.21 MB).
Plan: 3 yüklenecek, 1 silinecek, 309 aynı.
Yükleniyor 3/3 dosya (17.8 KB / 17.8 KB)
Sürüm açıldı: v12 (staged)
Durum: queued
Durum: building
Durum: ready
✔ v12 hazır: https://tecof-theme-butik-3k9x2a1b7-tecof.vercel.app
Önizleme: tecof theme open v12
Canlıya almak için: tecof theme promote v12
```

- Yalnız depoda olmayan içerik yüklenir; değişmeyen dosyalar ve depoda zaten bulunan içerik (ör. taşınan bir dosya) yeniden gönderilmez. Yerelde sildiğiniz dosyalar depodan da silinir.
- Varsayılan hedef **staged**: üretim derlemesi yapılır, alan adı atanmaz, canlı site değişmez.
- `-m` vermezseniz son git commit başlığı, yoksa `tecof theme push` kullanılır. Tecof deposundaki commit mesajı `Yeni ana sayfa [tecof v12 · Ayşe Yılmaz]` biçimindedir.
- CLI derleme bitene kadar bekler (varsayılan 900 saniye; `--wait-timeout` ile değişir, `--no-wait` beklemez). Derleme başarısız olursa son günlük satırlarını basar ve çıkış kodu 1 olur; tüm günlük için `tecof theme logs v12`.
- Değişiklik yoksa sürüm açılmaz: "Değişiklik yok; sürüm açılmadı."
- Gönderilmeyen dosyalar ve sınırlar: [CLI Başvurusu → Yok sayma kuralları](/cli-reference#yok-sayma-kurallari).

Staged adımını atlayıp doğrudan yayınlamak için:

```bash
tecof theme push --prod -m "Acil düzeltme"
```

`--prod` commit'i doğrudan `main` dalına hızlı ileri yazar; derleme bitince sürüm canlıya çıkar ve tek derleme yapılır. Önizleme adımı olmadığı için yıkıcı sayılır ve onay ister.

---

## 7. Önizleyin

```bash
tecof theme open v12
```

```text
Açılıyor: https://tecof-theme-butik-3k9x2a1b7-tecof.vercel.app/?x-vercel-protection-bypass=***&x-vercel-set-bypass-cookie=true
Bağlantıdaki erişim sırrı maskelendi; tam bağlantı için --show-secret kullanın (yalnız yetkili kişilerle paylaşın).
```

- Sürüm adresleri korumalıdır. CLI erişim sırrı taşıyan bir bağlantı alır ve tarayıcıda tam hâliyle açar; terminalde ve `--json` makbuzunda sır maskelenir. Tam bağlantı için `--show-secret`.
- Sürüm vermezseniz (`tecof theme open`) canlı adres açılır.
- Panelde aynı iş **Sürümler** ekranındaki **Önizle** düğmesidir.

Bağlantıyı paylaşmadan önce [Önizleme bağlantıları](/versions-and-rollback#onizleme-baglantilari) bölümünü okuyun: içindeki sır, alanın bütün sürüm adreslerini açar.

---

## 8. Canlıya Alın

```bash
tecof theme promote v12
```

```text
v12 thm_66f1a2b3c4d5e6f7a8b9c0d1 için canlıya alınacak. Devam edilsin mi? (e/H) e
✔ v12 canlıda: https://www.butik-ornek.com
```

- Yeniden derleme yapılmaz; alan adları saniyeler içinde v12'yi gösterir.
- `main` dalı v12'nin commit'ine hızlı ileri alınır; bu klasörün yerel tabanı da v12 olur.
- Vercel `main` dalının bu commit'ini bir kez daha derler. İçerik aynıdır, canlı site etkilenmez ve yeni sürüm numarası açılmaz.
- Vercel isteği sıraya aldıysa sonuç `Aktivasyon: pending` olarak görünür; durumu `tecof theme versions v12` ile izleyin.

---

## 9. Gerekirse Geri Alın

```bash
tecof theme rollback          # bir önceki canlı sürüme
tecof theme rollback v10      # daha önce canlıda olmuş belirli bir sürüme
```

```text
thm_66f1a2b3c4d5e6f7a8b9c0d1 bir önceki canlı sürüme geri alınacak. Devam edilsin mi? (e/H) e
✔ Geri alındı; canlı sürüm: v11
! Yeni değişiklikler canlıda değil; ileri almak için `tecof theme promote vM` ya da yeni yayın.
```

Geri alma yalnız daha önce canlıda olmuş sürümlere yapılır, anlıktır ve `main` dalına dokunmaz. Geri almadan sonra yeni yayınların nasıl canlıya çıktığını [Geri Almadan Sonra Yayınlar](/versions-and-rollback#geri-almadan-sonra-yayinlar) anlatır.

Sürüm geçmişi:

```bash
tecof theme versions
```

```text
ref  status  target      live  source  created           message                          url
---  ------  ----------  ----  ------  ----------------  -------------------------------  ----------------------------------------------------
v12  ready   staged            cli     2026-10-11 09:41  Yeni ana sayfa                   https://tecof-theme-butik-3k9x2a1b7-tecof.vercel.app
v11  ready   production  ●     ide     2026-10-10 17:05  Footer bağlantıları güncellendi  https://tecof-theme-butik-8h2m4q6r1-tecof.vercel.app
v10  ready   staged            cli     2026-10-09 14:22  Ürün kartı                       https://tecof-theme-butik-5t7w9y2c4-tecof.vercel.app
```

---

## Başkası Temayı Değiştirdiyse (base-moved)

Siz çalışırken `main` dalına başka bir değişiklik gidebilir: bir Cloud IDE kaydı, bir AI işi, başka bir geliştiricinin push'u ya da CI. Staged push eski tabanınızın üstüne kurulur ve başarılı olur; fark canlıya alma anında ortaya çıkar:

```text
$ tecof theme promote v12
✖ main ilerledi (şu an 9f8e7d6); bu push eski tabana dayanıyor (base-moved).
```

Çıkış kodu 4'tür; `--json` makbuzunda `next.action` `pull` olur. Canlı siteye ve `main` dalına dokunulmaz. v12'nin tabanı değişmeyeceği için aynı sürümü yeniden denemek işe yaramaz: değişikliklerinizi güncel `main` üstüne taşıyıp yeni bir sürüm açın.

1. `tecof status` ile tabanınızı ve yerel değişikliklerinizi görün.
2. `tecof theme pull` güncel `main` dalını indirir. Birleştirme yapmaz: yerelde değiştirdiğiniz bir dosya `main`dekinden farklıysa hiçbir şey yazmadan durur, dosyaları nedenleriyle listeler ve çıkış kodu 4 olur.
3. Değişikliklerinizi güncel `main` üstüne uygulayın (aşağıdaki örnek), `tecof theme push` ile yeni sürümü (ör. v13) açın, önizleyin ve `tecof theme promote v13` ile canlıya alın.

`--prod` push'ta aynı denetim commit anında yapılır: `main` ilerlediyse sürüm açılmaz, çözüm aynıdır.

**Örnek: yerel git ile güncelleme.** Değişiklikleri birleştirmenin en kolay yolu klasörü kendi git deponuz olarak tutmaktır; `.git/` hiçbir zaman Tecof'a gönderilmez. Aşağıdaki örnek, klasörü `tecof theme init` sonrasında git deposu yaptığınızı, her `pull`dan sonra commit'lediğinizi ve değişikliklerinizin henüz commit'lenmediğini varsayar:

```bash
git stash -u                      # değişikliklerinizi kenara alın; klasör yerel tabana döner
tecof theme pull                  # güncel main'i indirir
git add -A && git commit -m "tecof: main güncellendi"
git stash pop                     # değişikliklerinizi yeniden uygulayın; çakışma varsa çözün
tecof theme push -m "Yeni ana sayfa (güncel main üstüne)"
```

Yerel değişikliklerinizi bırakmayı göze alıyorsanız `tecof theme pull --force` onların üzerine yazar ve uzakta silinmiş dosyaları siler.

---

## Sonraki Adımlar

- [Sürümler, Canlıya Alma ve Geri Alma](/versions-and-rollback) — durumlar, önizleme bağlantıları, canlıya alma ve geri alma kuralları
- [Güvenlik ve CI](/dev-security) — CI token'ları ve GitHub Actions ile otomatik yayın
- [CLI Başvurusu](/cli-reference) — tüm komutlar, çıkış kodları ve makbuzlar
