# Yayın: kod nasıl yayına girer

Devoplus One'da kod **geliştiricinin makinesinden yayımlanmaz**. Uygulamanın deposu Devoplus'ın dışa kapalı GitLab'ındadır.
Sizin (yapay zeka aracının) o depoya erişiminiz yoktur ve kullanıcıdan da GitLab'a girmesini istemezsiniz: kodu
**Devoplus API'si** depoya yazar, platformun hattı kapılardan geçirir ve yayımlar.

## Akış

1. **Kodu yükleyin.** Dosya sisteminiz ve komut satırınız varsa uygulamanın kök dizininde (`one.manifest.json` yanında)
   `one publish` çalıştırın: projenin tam görüntüsünü yükler ve test ortamına yayını başlatır. Dizin bir git deposuysa
   git'in kuralları (`.gitignore`) uygulanır, değilse yalnız basit `.gitignore` kalıpları; desteklenmeyen bir kalıp
   yüklemeyi durdurur. Dosya sisteminiz yoksa `one_source_upload` aracıyla yalnız değişen dosyaları gönderin (`patch`,
   silinecekler `deletions`'ta); yayın aynı çağrıda başlar.
2. Yükleme yalnız **test ortamına** yapılır ve test dalına tek commit olarak yazılır; commit'te yükleyenin adı ve
   açıklamanız (`message` / `--message`) durur. Sizin belirtecinizle yapılan yüklemenin commit'i yapay zeka işareti taşır
   (kaynak izlenebilirliği); `one_source_upload`'da `agentTool` ile kullandığınız aracın adını verin (ör. `Claude Code`),
   ad doğrulanmaz ve beyan olarak yazılır. Bağımlılıklar (`node_modules`), yerel durum klasörleri, `.gitlab-ci.yml`
   ve sır dosyaları (`.env`, `.env.*`, `.dev.vars`) yüklenmez. Yalnız büyük/küçük harfle ayrışan iki yol (ör.
   `src/App.ts` ile `src/app.ts`) reddedilir: Windows ve macOS'ta ikisi aynı dosyadır.
3. **Hattı izleyin.** `one_pipeline_status` (`one pipeline`) hattın işlerini ve son başarısız işin günlüğünü gösterir.
   Hat düşerse nedeni oradan okuyun, düzeltin ve yeniden yükleyin.
4. Ortam sırası test, uat ve canlıdır. Test'ten uat'a terfiyi, kullanıcının açık onayıyla, siz isteyebilirsiniz (uat
   ortamının oturumuyla `one_publish` `action: "promote"` ya da `one login --env uat` sonrası `one promote`). Kod
   birleştirmesini ve sürüm etiketini (`v<sürüm>`) Devoplus yapar. **Canlıya terfi ve canlıda geri alma insan
   onaylıdır:** uygulamanın sahibi Portal'daki **Devoplus One Uygulamalarım** ekranından, şirket yöneticisi
   Devoplus Console'dan başlatır; sizin belirtecinizle canlıda her
   yayın isteği reddedilir (`ONE-APP-E-099`).

Hattı **uygulama deposu tanımlamaz**: deponuza `.gitlab-ci.yml` ya da başka bir CI dosyası yazmayın, platformun hattı
koşar. `pnpm-lock.yaml` depoya girer; `postinstall` gibi kurulum betikleri eklenmez.

## Kapılar: yayını durduran şeyler

| Kapı | Durdurur | Ne yapmalısınız |
|---|---|---|
| Doğrulama | Geçersiz `one.manifest.json`, eksik `README.md` / `AGENTS.md` | [Manifest](/docs/manifest.md) kurallarına uyun |
| Yapay zeka rehberi | Manifest `agent.tools` beyan ediyor ama `AGENT_GUIDE.md` yok ya da eksik (uyarı değil, hata) | [Rehberi yazın](/docs/ai.md) |
| Veri modeli | `one.data.json` değişmiş ama `one data generate` çalıştırılmamış (migration, tipler ya da anlık görüntü güncel değil) | `one data generate` çalıştırıp üretilen dosyaları depoya ekleyin |
| Arayüz | Satır içi `<script>`, başka adresten betik, satır içi olay işleyicisi (`onclick="..."`), `javascript:` adresi | Betikleri uygulamayla birlikte sunun, olayları köprü/betik dosyasında bağlayın |
| Sır taraması | Depoya girmiş API anahtarı, belirteç, parola, özel anahtar, `.env` / `.dev.vars` | Sır yazmayın; gerçek olmayan bulgu `.one-secrets-ignore`'a parmak izi + gerekçe ile |
| Kod güvenliği | Yüksek önemli güvenlik bulgusu (ör. kullanıcı girdisinin `eval` / `innerHTML`'e gitmesi) | Kodu düzeltin; gerçek olmayan bulgu `.one-sast-ignore`'a parmak izi + gerekçe ile |
| Bağımlılık | Bilinen açığı olan paket | Sürümü yükseltin; günlük taramanın önerdiği yama için aşağıdaki "Bağımlılık açığı" |
| Süreklilik | Uygulanmış bir migration dosyasının değişmesi, sıra dışı migration, `DROP TABLE` / `ALTER ... DROP/RENAME` / WHERE'siz `DELETE` | Yeni numaralı migration ekleyin; eski sütunu bir sonraki sürümde kaldırın |
| SDK beyanı | `one.manifest.json` `sdkVersion` kurulu SDK sürümünden farklı (ONE-RULE-007); SDK 0.3.0 ve sonrasında beyan eksik (ONE-RULE-008) | Alanı elle yazmayın; aşağıdaki "Kural kataloğu ve SDK beyanı" |
| Sürüm | Yayındakinden düşük sürüm | `app.version`'ı artırın |
| Terfi (platform açtıysa) | Canlıya, uat'ta doğrulanmamış sürüm | Önce uat'a dağıtın |

Bir kapı durduğunda hattın çıktısını `one_pipeline_status` ile okuyun, düzeltin ve yeniden yükleyin; kullanıcıya teknik
ayrıntı değil sonucu anlatın ("Güvenlik kontrolü bir sorun buldu, düzeltip yeniden gönderdim").

**Hattan önce reddedilen yayın** (bu denetim platformun uygulamalar arası okuma güncellemesiyle gelir; o yayına alınana kadar
yayın eskisi gibi hatta denetlenir ve başarısız yayında `one_pipeline_status` incelenir): platform her yayın ve terfide, hat başlamadan yayınlanacak commit'teki manifesti denetler
(`ONE-APP-E-164` her uygulamada; `-162` ve `-163` yalnız `exports` beyan eden uygulamada). Bu durumda hat AÇILMAZ,
`one_pipeline_status` incelenecek bir iş göstermez; yanıt doğrudan `409` ve hata kodudur ([manifest](/docs/manifest.md)
"Yayın kuralları"). Geri almada bu denetim yapılmaz:

| Kod | Neden | Ne yapmalısınız |
|---|---|---|
| `ONE-APP-E-163` | Aynı ad ve sürümdeki bir dışa açımın açıklaması, izni ya da şeması değişmiş | Değişikliği yeni bir `version` ile beyan edin; eskisini alan uygulamalar geçene kadar birlikte sunun |
| `ONE-APP-E-162` | Aynı portalda onaylı olarak okunan bir dışa açım sürümü kaldırılmış (yanıt alan uygulamayı adlandırır) | Sürümü geri ekleyin; alan uygulama yeni sürüme geçip onay alana kadar ikisini birlikte sunun |
| `ONE-APP-E-164` | Yayınlanacak commit'teki `one.manifest.json` yok, başka uygulamaya ait ya da `exports` / `imports` geçersiz | Manifesti düzeltip yeniden yükleyin |


**SDK sürümü (uyarı, yayını durdurmaz):** kurulu `@devoplus/one-sdk` asgari sürümden (bugün `0.2.0-next.158`) eskiyse ya
da sürümü okunamıyorsa (kilit dosyası yoksa) hat çıktısında `⚠ SDK:` ile başlayan bir satır görünür. Uyarıyı kalıcı
bırakmayın: SDK'yı güncelleyin (`pnpm add @devoplus/one-sdk@latest` (kurulu SDK ön sürümse `@next`), ardından `npx one upgrade` (sürümü tam sabitler, `one.manifest.json` `sdkVersion` alanını ve `AGENTS.md`'nin platform kuralları bölümünü yazar)), testleri çalıştırın ve
`pnpm-lock.yaml`, `one.manifest.json`, `one.platform-state.json` ve `AGENTS.md`'yi de yükleyin.
Platform bu denetimi ileride zorlayıcı yapabilir; o zaman eski SDK yayını durdurur.

**Kural kataloğu ve SDK beyanı:** hat çıktısının başında `kural kataloğu: revizyon N` satırı uygulanan platform
kurallarının revizyonunu söyler. Kurala uymayan her bulgu kuralın kimliğiyle (`ONE-RULE-nnn`), düzeyiyle (zorunlu, uyarı,
öneri), dosya ve satırla basılır; altındaki `düzeltme:` satırı ne yapmanız gerektiğini yazar. Zorunlu kural yayını
durdurur. `sdkVersion` alanı uygulamanın derlendiği SDK sürümüdür ve elle yazılmaz: SDK 0.3.0 ve sonrasında uygulamanın
kök dizininde `npx one upgrade` çalıştırın, komut kurulu sürümü manifeste yazar; ardından `one.manifest.json`,
`one.platform-state.json`, `AGENTS.md`, `package.json` ve kilit dosyasını birlikte yükleyin. Kurulu SDK 0.3.0'dan eskiyse eksik beyan yalnız uyarıdır; alanı elle
eklemeyin (kurulu sürümden farklı bir beyan yayını durdurur). Ayrıntı: [Manifest](/docs/manifest.md).

**Güncelleme döngüsü (var olan bir uygulamaya yeni sürüm çıkarırken):**

1. SDK'yı uygulamanın paket yöneticisiyle ve izlediği kanalla güncelleyin: `pnpm add @devoplus/one-sdk@latest` (kurulu SDK ön sürümse `@next`).
2. `npx one upgrade --json`: sürümü sabitler, `sdkVersion`'ı ve `AGENTS.md`'nin platform kuralları bölümünü yazar, `one doctor`'u çalıştırır. Rapordaki `previous` değerini (önceki işlenmiş durum) not edin.
3. `one_platform_updates` aracını `previous.sdkVersion` ve `previous.catalogRevision` ile çağırın. Yanıt yeni ve metni değişen kuralları, bugün zorunlu düzeydeki bütün kuralları ve o tarihten bu yana çıkan SDK sürümlerini verir (sürüm ve başlık; ayrıntılı notlar uygulamanın `node_modules/@devoplus/one-sdk/CHANGELOG.md` dosyasında). İlk satırdaki uyarıyı kullanıcıya iletin: liste eski olabilir, yayında esas olan hattın doğrulama çıktısıdır. Aracı `pending` değerleriyle çağırmayın: arada kalan kurallar ve sürümler gösterilmez ve `--complete` bunu reddeder.
4. `npx one doctor` bulgularını düzeltin: önce zorunlular, sonra uyarılar; önerileri kullanıcıya sorun. Bitince yanıtın sonundaki komutu değiştirmeden çalıştırın (`npx one upgrade --complete --from <sdk>@<rev> --catalog-revision <n> --sdk-version <v> --env <ortam>`); komut özetin hesaplandığı durumu taşır, değerleri aynı ortamın sunucusunda doğrular, işlenmiş durumu ilerletir ve hiç geri almaz. Çıktıda "İşlenmiş durum:" satırı yoksa kurulu SDK bu adımı tanımıyor; önce SDK'yı güncelleyin.
5. `one.manifest.json`, `one.platform-state.json`, `AGENTS.md`, `package.json` ve kilit dosyasını kodla birlikte yükleyin; hat aynı taramayı yapar.

Döngü yarıda kesilirse işlenmiş durum değişmez ve sonraki yükseltme aynı yerden başlar.

**Yüklemeden önce yerelde: `npx one doctor`.** Komut, hattın kataloğa bağlı kapılarını (manifest, veri modeli, arayüz, SDK beyanı) kurulu SDK'nın katalog kopyasıyla yerelde çalıştırır ve bulguları kural kimliği, düzeyi, konumu ve `düzeltme:` satırıyla yazar (hattın çıktısıyla aynı bilgi, biçimi daha kısa); dosyaya dokunmaz, zorunlu bulguda çıkış kodu 1'dir (`--json` ile aynı rapor JSON olarak). Belge ve ajan rehberi kapıları, giriş dosyası denetimi, SDK asgari sürüm denetimi, sır, bağımlılık, kod güvenliği ve süreklilik taramaları yalnız hatta çalışır. `one doctor` temiz dese bile esas olan hattın çıktısıdır: kurulu SDK'nın katalog kopyası hattınkinden eski olabilir. Kullanıcıya bir uygulamanın "uyumlu" olduğunu söylemeyin; söyleyebileceğiniz, hangi kurala bakıldığı ve ne bulunduğudur.

**Silme (uyarı, yayını durdurmaz):** kodda ya da migration'da `DELETE FROM` (kalıcı silme) ya da onay sorulmadan
gönderilen `DELETE` isteği hat çıktısında `⚠ arayüz:` ile başlayan bir satır olarak görünür. Kural yine zorunludur:
yumuşak silin (`deleted_at`), isteği `one.remove(...)` ile gönderin; gerçekten gerekiyorsa ya da uyarı yanlışsa gerekçeli
yorum yazın ([Silme ve pasife alma](/docs/ui-components.md)). Tarama her biçimi yakalamaz, bu yüzden yayını durdurmaz.
Veri modelinde (`one.data.json`) gerekçesiz `"softDelete": false` ise uyarı değildir: veri modeli kapısı yayını durdurur.

## Tek komutla yayın, önizleme, terfi ve geri alma

Kullanıcıdan GitLab'a girmesini istemeyin. Yayını siz istersiniz; isteği Devoplus kaydeder ve hattı kendisi başlatır.
Hattın kapıları (yukarıdaki tablo) bu yolda da aynen çalışır; hiçbiri atlanmaz.

| İş | MCP aracı | Komut |
|---|---|---|
| Kodu yükleyip test ortamına yayınlama (önizleme) | `one_source_upload` | `one publish [--portal <anahtar>] [--message <açıklama>]` |
| Depodaki kodu yeniden yayınlama (yüklemeden) | `one_publish` (`action: "deploy"`) | `one publish --no-upload` |
| Hat ve iş günlüğü | `one_pipeline_status` | `one pipeline [--deployment <kimlik>] [--job <iş>]` |
| Test'ten uat'a terfi | `one_publish` (`action: "promote"`, uat oturumuyla) | `one promote [--portal <anahtar>]` |
| Önceki sürüme geri alma (test, uat) | `one_publish` (`action: "rollback"`, `confirm: true`) | `one rollback [--portal <anahtar>] [--to <x.y.z>] --yes` |
| Yayın isteklerinin durumu | `one_deployments` | `one deployments [--portal <anahtar>]` |
| Bağımlılık taraması ve önerilen yama | `one_dependency_patch` | `one deps patch [--ref test\|uat\|main] [--apply]` |
| Yükseltmeden sonra platform kuralları ve sürüm notları | `one_platform_updates` | `one upgrade --complete --from <sdk>@<rev> --catalog-revision <n> [--sdk-version <v>] [--env <ortam>]` (işlenmiş durumu ilerletir) |

- Komutlar `one login` oturumuyla çalışır; uygulamanın kısa adı `one.manifest.json`'dan okunur (`--app` ile de
  verilir). `--portal` verilmezse istek portal anahtarı taşımaz ve kurulumu sunucu seçer.
- Kodu yalnız uygulamanın **sahibi** (ya da platform yöneticisi) yükleyebilir; depo bütün portalların paylaştığı tek
  projedir. Yayın isteğini sahip ya da o portalın **şirket yöneticisi** gönderebilir; şirket yöneticisinin terfisi dalda
  duran kodu kendi kurulumuna taşır, dalı ilerletmez. Vekalet ya da Yerine Görüntüle oturumunda yükleme ve istek
  gönderilmez. Uygulama başına saatte 60 yükleme yapılabilir.
- **Önizleme = test ortamı.** `deploy` her zaman test ortamına yayınlar. Hat bittiğinde kullanıcıya şunu söyleyin:
  *"Önizleme adresiniz şu: https://<kısa-ad>-<portal>.test-one.devoplus.dev. Test Portal'ından uygulamayı açıp
  bakabilirsiniz."* Bu adres paylaşılabilir önizlemedir.
- **Terfi** yalnız bir önceki ortamda doğrulanmış ve orada başarıyla yayınlanmış kodu taşır (terfi kapısı). Terfiden önce
  kullanıcıdan açık onay alın: *"Test ortamında denediğiniz sürümü uat ortamına taşıyayım mı?"* Aynı sürüm numarasıyla
  farklı kod yüklendiyse terfi durur; `app.version`'ı artırıp yeniden yükleyin.
- **Geri alma** uygulamayı önceki sürüme (ya da `--to` ile verilen sürüme) döndürür. Kod **sürüm etiketinden** alınır;
  etiketi siz yazmazsınız: Devoplus her terfide terfi eden commit'e `v<sürüm>` etiketini kendisi yazar (sürüm
  `one.manifest.json` içindeki `app.version`). Test'e yüklenip hiç terfi etmemiş sürüme dönülemez; `--to` verilmezse dalın
  ucundaki sürümden küçük en büyük etiket seçilir. Geri alınan kod da bütün kapılardan yeniden geçer. Veritabanı da o sürümün yapısına
  dönmek zorundaysa dönülen noktadan sonra kaydedilen veriler **kaybolur**; bu geri alınamaz. Kullanıcıya bunu sade dille
  söyleyin ve açık onay almadan göndermeyin (araçta `confirm: true`, komutta `--yes`).
- Ortamınız seçenekli soru kartı gösterebiliyorsa terfi ve geri alma onayını kartla alın ("Evet, taşıyın" / "Hayır,
  bekleyin"). Uyarıyı önce metinle yazın; "Evet" şıkkını önerilen olarak işaretlemeyin ([keşif görüşmesi](/docs/discovery.md)).
- Yanıt *"Yayın hattı bu ortamda yapılandırılmamış"* derse kullanıcıya yalnız bunu söyleyin. Ne zaman açılacağına ya da
  kime iletildiğine dair bir şey söylemeyin; bu bilinmiyor.
- İsteğin sonucunu `one_deployments` / `one deployments` ile, hattın işlerini ve günlüğünü `one_pipeline_status` /
  `one pipeline` ile izleyin; hat durursa günlüğü okuyun, düzeltin, yeniden yükleyin.

## Bağımlılık açığı: günlük tarama ve yama

Devoplus uygulamanın bağımlılıklarını her gün bilinen güvenlik açıklarına karşı tarar (test dalı; uat ve main varsa
onlar da). Açık bulunursa ve düzeltilmiş sürüm varsa platform bir yama önerir (`package.json` ve `pnpm-lock.yaml`).
Yama **kendiliğinden uygulanmaz** ve depoda birleştirme isteği açılmaz: kodun doğru kaynağı yerel kopyadır, depoya
kendiliğinden yazılan bir yama bir sonraki tam görüntü yüklemesiyle geri alınırdı. Yamayı siz uygularsınız:

1. `one_dependency_patch` (`one deps patch`) ile bulguları ve yamayı okuyun. `ref` verilmezse test; yama yalnız test
   için önerilir, uat ve main yalnız taranır (oradaki açık test'te düzeltilip terfi edilince kapanır).
2. Yamayı yerel kopyada uygulayın: komut satırınız varsa uygulamanın kök dizininde `one deps patch --apply`. Komut
   yalnız bu iki dosyayı değiştirir, commit atmaz; bu dosyalarda kaydedilmemiş değişiklik varsa, git yoksa ya da yama
   yerel koda uymuyorsa hiçbir dosyaya dokunmaz. Komut satırınız yoksa diff'i iki dosyaya kendiniz uygulayın.
3. Bağımlılıkları kurun, `pnpm test` ve `one build` çalıştırın.
4. Kodu her zamanki yoldan yükleyin (`one publish` ya da `one_source_upload`); yayın başlar ve hattın kapıları yine
   çalışır.

Yama uymuyorsa ya da hiç yoksa bulgulardaki paketleri düzeltildiği sürüme elle yükseltin. Düzeltilmiş sürümü olmayan
paket için kullanıcıya durumu sade dille anlatın. Sonuç yoksa (`available: false`) notlardaki nedeni söyleyin; bulgu
uydurmayın. Bulguları yalnız uygulamanın sahibi ya da platform yöneticisi görebilir. Kullanıcıya: *"Bağımlılıklardan
birinde bilinen bir güvenlik açığı vardı; güncelledim, testleri çalıştırdım ve test ortamına gönderdim."*

## Yayından sonra

- Uygulamanın görünmesi için kurulum ve menü izni gerekir ([başlangıç](/docs/getting-started.md) §5).
- Olay ve hata kayıtları platform günlüğündedir (`logEvent`, `logError`); kişisel veri ya da sır yazmayın.
- Uygulama yayına girdikten sonra kullanım ve hatalar [kullanım ve hata panosunda](/docs/health.md) görünür; kullanıcı
  bir sorun bildirdiğinde önce oraya bakın.
- Yedekleme platform ekibinin işidir; kullanıcıdan bir adım beklenmez.
