# Onoxsoft Plugin Manifest Spec v1.0

Every plugin must include a `plugin.json` at the root of its zip archive:

```json
{
    "slug": "onox-cloudflare-dns",
    "name": "Cloudflare DNS Sync",
    "version": "1.2.0",
    "description": "Domain DNS kayıtlarını Cloudflare ile senkronize eder",
    "description_tr": "Domain DNS kayıtlarını Cloudflare ile senkronize eder",
    "author": {
        "name": "Onoxsoft Topluluk",
        "email": "plugins@onox.com.tr",
        "website": "https://onox.com.tr"
    },
    "homepage": "https://github.com/onox/cloudflare-dns-plugin",
    "license": "MIT",
    "minimum_panel_version": "0.18.0",
    "tags": ["dns", "cloudflare", "automation"],
    "category": "dns",
    "screenshots": ["screenshots/main.png", "screenshots/settings.png"],
    "icon": "icon.svg",
    "hooks": {
        "dns.record.created": "handlers/OnRecordCreated.php",
        "dns.record.updated": "handlers/OnRecordUpdated.php",
        "dns.record.deleted": "handlers/OnRecordDeleted.php"
    },
    "settings_schema": {
        "api_token": {
            "label": "Cloudflare API Token",
            "type": "password",
            "required": true,
            "description": "Cloudflare DNS Edit yetkili API token"
        },
        "zone_id": {
            "label": "Cloudflare Zone ID",
            "type": "string",
            "required": false
        },
        "auto_sync": {
            "label": "Otomatik Senkronizasyon",
            "type": "boolean",
            "default": true
        }
    },
    "sidebar_items": {
        "customer": [
            { "label": "Cloudflare DNS", "icon": "CloudIcon", "route": "/panel/plugins/cloudflare-dns" }
        ],
        "admin": []
    },
    "routes": [
        { "method": "GET", "path": "/cloudflare-dns/zones", "handler": "ZonesController@index" },
        { "method": "POST", "path": "/cloudflare-dns/sync", "handler": "SyncController@trigger" }
    ],
    "permissions": [
        "dns:read",
        "dns:write",
        "http:outbound"
    ]
}
```

Permissions are enforced by the sandbox runtime — plugins can only call APIs they've declared.

## Field Reference

| Alan | Zorunlu | Açıklama |
|------|---------|----------|
| `slug` | evet | Benzersiz makine adı. Kural: `^[a-z][a-z0-9_-]*$` |
| `name` | evet | İnsan okunabilir isim |
| `version` | evet | Semantic version (ör. `1.2.0`) |
| `description` | hayır | İngilizce açıklama |
| `description_tr` | hayır | Türkçe açıklama (UI'de gösterilir) |
| `author` | hayır | `name`, `email`, `website` alanları |
| `minimum_panel_version` | evet | Minimum gereken panel sürümü |
| `category` | hayır | `dns`, `billing`, `migration`, `integration`, `compliance`, `cluster` |
| `hooks` | hayır | Olay adı → handler PHP dosya yolu |
| `settings_schema` | hayır | Ayarlar formu şeması (aşağıya bkz.) |
| `sidebar_items` | hayır | `admin` ve `customer` bağlamları için sidebar öğeleri |
| `routes` | hayır | Plugin HTTP route'ları |
| `permissions` | hayır | Sandbox izin listesi |
| `uninstall` | hayır | Kaldırma sırasında çalışacak handler dosyası |

## Settings Schema Tipleri

| Tip | Açıklama |
|-----|----------|
| `string` | Tek satır metin |
| `password` | Şifreli metin girişi |
| `boolean` | Açma/kapama toggle |
| `number` | Sayısal değer |
| `select` | Seçim listesi (options dizisi gerekir) |
| `textarea` | Çok satırlı metin |

## İzinler

| İzin | Açıklama |
|------|----------|
| `dns:read` | DNS kayıtlarını okuma |
| `dns:write` | DNS kayıtlarını yazma/silme |
| `http:outbound` | Dışarıya HTTP isteği gönderme |
| `db:read` | Veritabanı okuma (kısıtlı) |
| `mail:send` | E-posta gönderme |
| `billing:read` | Fatura verilerini okuma |
| `billing:write` | Fatura oluşturma/düzenleme |
