{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://unpkg.com/@7n/rules/schemas/n-rules.json",
  "title": "n-rules project config",
  "description": "Конфігурація правил і skills для CLI @7n/rules (файл .n-rules.json у корені репозиторію).",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "format": "uri",
      "description": "Посилання на JSON Schema для автодоповнення та валідації в IDE; очікувано https://unpkg.com/@7n/rules/schemas/n-rules.json"
    },
    "rules": {
      "type": "array",
      "description": "Ідентифікатори правил без префікса n- (відповідають файлам n-<id>.mdc).",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "skills": {
      "type": "array",
      "description": "Ідентифікатори skills без префікса n- (у пакеті — підкаталог skills/<id>/, у проєкті після синку — .cursor/skills/n-<id>/). Якщо відсутній, CLI доповнить списком skills з пакету.",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "plugins": {
      "type": "array",
      "description": "npm-пакети-плагіни з додатковими правилами (rules/<id>/ за контрактом ядра). Якщо поле відсутнє — CLI автоматично визначає CI-провайдера (файли CI, потім repository.url) і дописує сюди результат. Порожній масив — плагіни вимкнено.",
      "items": {
        "type": "string",
        "pattern": "^(@[a-z0-9-~][a-z0-9-._~]*/)?[a-z0-9-~][a-z0-9-._~]*$"
      }
    },
    "wasmPlugins": {
      "type": "array",
      "description": "Wasm-плагіни plugin contract v3 (n-rules:plugin@3.0.0, docs/specs/2026-07-31-plugin-contract-v3-wasm-component.md §3.3/§3.4). Кожен запис — АБО dev-форма (name+path на вже зібраний .wasm-компонент, лише поза CI), АБО канонічний hash-пін дистрибуції (name+url+sha256, спека §3.4 рішення Ж). Окреме поле від `plugins` (Plugin API v2, npm-пакети) — різні формати запису й різний конвеєр резолву.",
      "items": {
        "type": "object",
        "oneOf": [
          {
            "additionalProperties": false,
            "required": ["name", "path"],
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1,
                "description": "Ідентифікатор плагіна (лише для diagnostics-повідомлень)."
              },
              "path": {
                "type": "string",
                "minLength": 1,
                "description": "Repo-relative (від кореня консюмер-репо) чи абсолютний шлях до зібраного .wasm-компонента. Dev-петля: без hash-перевірки, дозволена лише поза CI."
              }
            }
          },
          {
            "additionalProperties": false,
            "required": ["name", "url", "sha256"],
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1,
                "description": "Ідентифікатор плагіна (лише для diagnostics-повідомлень)."
              },
              "url": {
                "type": "string",
                "minLength": 1,
                "description": "Джерело завантаження .wasm-компонента (GitHub Releases/OCI/npm-дзеркало тощо — транспорт-агностично, спека §3.4)."
              },
              "sha256": {
                "type": "string",
                "pattern": "^[0-9a-f]{64}$",
                "description": "Очікуваний sha256-hex (64 hex-символи, нижній регістр) вмісту .wasm — модель довіри retrieval-контуру."
              }
            }
          }
        ]
      }
    },
    "disable-rules": {
      "type": "array",
      "description": "Список rule id (без префікса n-), які не потрібно автододавати в `.n-rules.json` під час запуску CLI.",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "disable-skills": {
      "type": "array",
      "description": "Список skill id (без префікса n-), які не потрібно автододавати в `.n-rules.json` під час запуску CLI.",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "ignore": {
      "type": "array",
      "description": "Директорії, що повністю виключаються з обходу check-скриптів CLI (npx @7n/rules fix ...) і AI-модифікацій (AI не редагує, не видаляє, не створює файли). Шляхи відносно кореня репозиторію (posix). Приклади: vendored Helm-чарти, генеровані маніфести, legacy-дерева. Стандартні виключення (node_modules, .git, dist, coverage, .turbo, .next) застосовуються завжди — додавати їх не треба.",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "git": {
      "type": "object",
      "additionalProperties": false,
      "description": "Git policy проєкту. Відсутній блок еквівалентний baseBranch/releaseBranches = main.",
      "properties": {
        "baseBranch": {
          "type": "string",
          "minLength": 1,
          "description": "Головна integration-гілка і перший кандидат бази delta; за замовчуванням main."
        },
        "releaseBranches": {
          "type": "array",
          "minItems": 1,
          "description": "Довгоживучі release/integration гілки; разом з baseBranch утворюють delta та protected набір. За замовчуванням [main].",
          "items": { "type": "string", "minLength": 1 }
        }
      }
    },
    "version": {
      "type": "string",
      "description": "Застаріле поле, ігнорується CLI. Правила завжди копіюються з каталогу mdc/ установленого пакету (node_modules або кеш npx); змініть версію через оновлення залежності."
    },
    "claude-config": {
      "type": "boolean",
      "description": "Чи синхронізувати `.claude/settings.json` (hooks + permissions, merge зі збереженням користувацьких полів) і slash-команди checks. За замовчуванням true.",
      "default": true
    },
    "coverage": {
      "type": "object",
      "description": "Пороги гейта покриття/мутаційного тестування (концерн coverage правила test). Відсутнє поле — дефолти 80/80 %.",
      "additionalProperties": false,
      "properties": {
        "coverageThreshold": {
          "type": "number",
          "description": "Мінімальний line coverage у відсотках (делта-гейт per-file і повний вимір).",
          "default": 80
        },
        "mutationThreshold": {
          "type": "number",
          "description": "Мінімальний mutation score у відсотках (лише повний вимір: lint --full / lint test).",
          "default": 80
        },
        "classifyConfidenceThreshold": {
          "type": "number",
          "description": "Confidence-поріг LLM-класифікації survived-мутантів (allowed gaps). ≤1 — увімкнено; дефолт 1.1 = вимкнено (rollout-mode).",
          "default": 1.1
        }
      }
    },
    "storybook": {
      "type": "object",
      "additionalProperties": false,
      "description": "Конфігурація канону Storybook (storybook-* концерни правила test, test.mdc).",
      "properties": {
        "detectApps": {
          "type": "boolean",
          "description": "Хвиля 2a: чи додавати у скоуп канону Storybook app-проєкти (vue у dependencies, не бібліотека, + src/pages/) на додачу до Vue component library пакетів хвилі 1. За замовчуванням false.",
          "default": false
        },
        "optOut": {
          "type": "array",
          "description": "Root dir пакетів, виключених зі скоупу канону Storybook (той самий формат, що повертає workspace-роутинг — '.' для кореня, 'packages/ui' тощо).",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      }
    }
  },
  "required": [
    "rules"
  ]
}
