Permissions у Claude Code: settings.json і менше permission-prompt-ів » IT-FORMAT
» » » Permissions у Claude Code: settings.json і менше permission-prompt-ів
ВИП. №187· липень 2026· НІЖИН

Новий формат бізнесу — у цифрі, у вашій щоденній роботі.

Автоматизація обліку, власні розробки на BAS/1С, IP-телефонія та відеоспостереження. Пишемо про те, що робимо — і робимо те, про що пишемо.

Популярні

    Permissions у Claude Code: settings.json і менше permission-prompt-ів

    IT-Wiki / Claude Code: команди і автоматизація 14 травня 2026 Переглядів: 99 Автор: Claudia
    Permissions у Claude Code
    Editorial composition · замок і дозволи
    Перед стартом

    Доступ до одного з трьох файлів: ~/.claude/settings.json (user), <repo>/.claude/settings.json (project, у git), .claude/settings.local.json (local, у gitignore). Знання базового JSON. Корисно мати jq для валідації.

    Три рівні налаштувань

    РівеньФайлСкоупУ git?
    User~/.claude/settings.jsonУсі сесії твого користувачаНі (особисті dotfiles)
    Project<repo>/.claude/settings.jsonТільки цей репо, для всіх, хто клонуєТак, командний
    Local.claude/settings.local.jsonЦей репо, тільки у тебеНі (gitignore обов'язково)

    Правила злиття: project переписує user, local переписує project. Тобто більш специфічний рівень виграє. Деякі ключі мерджаться як масиви (наприклад, permissions.allow), деякі — повністю замінюються.

    Структура settings.json

    {
      "model": "claude-opus-4-7",
      "permissions": {
        "allow": ["Bash(git status:*)", "Read(*)", "Glob(*)"],
        "deny":  ["Bash(rm -rf:*)", "Bash(sudo:*)"],
        "ask":   ["Edit(src/**)"]
      },
      "hooks": { ... },
      "mcpServers": { ... },
      "env": { "DEBUG": "1" }
    }

    Ключові блоки:

    • permissions — правила доступу до tools.
    • hooks — shell-команди на події («Hooks»).
    • mcpServers — підключення MCP-серверів (спиця «MCP-сервери»).
    • env — змінні середовища для CC-сесії.
    • model — модель за замовчуванням.

    Patterns у allowlist

    Дозволи описуються як Tool(pattern). Кілька форматів:

    Точкові команди Bash

    "Bash(git status:*)"      // git status з будь-якими аргументами
    "Bash(npm test)"          // тільки точно npm test, без аргументів
    "Bash(npm run *)"         // npm run з будь-яким скриптом
    "Bash(docker ps:*)"       // docker ps...

    Glob по шляхах

    "Read(*.md)"              // читання будь-яких .md
    "Read(src/**/*.ts)"       // .ts у src/
    "Edit(tests/**)"          // редагування файлів у tests/
    "Write(/tmp/**)"          // запис у /tmp

    MCP-tools

    "mcp__claude_ai_Gmail__search_threads"
    "mcp__myserver__publish_post"
    "mcp__*"                  // будь-який MCP-tool (рідко вживаний)

    Wildcards

    Bash(*) — дозволяє ВСЕ. Це антипатерн (хіба що для cron з --dangerously-skip-permissions). Краще явні правила.

    Скіл /fewer-permission-prompts

    Це окремий built-in скіл (доступний як slash), який сканує транскрипт твоєї поточної сесії і пропонує додати у allowlist часті read-only речі — типу git status, git diff, git log, ls, cat. Корисно після першого тижня роботи у новому проекті.

    Запуск: просто /fewer-permission-prompts. Скіл аналізує, які tools ти найчастіше дозволяв, і пропонує JSON-патч до твого settings.json з конкретним allowlist'ом.

    Чого не запускати у sensitive-проєктах: для виробничого репо краще тримати allowlist руками — скіл може запропонувати правило, ширше за бажане.

    Кейси

    1. Базовий мінімум для офісного workflow

    {
      "permissions": {
        "allow": [
          "Read(*)", "Glob(*)", "Grep(*)",
          "Bash(git status:*)", "Bash(git log:*)", "Bash(git diff:*)",
          "Bash(git branch:*)", "Bash(git show:*)",
          "Bash(ls:*)", "Bash(cat:*)", "Bash(head:*)", "Bash(tail:*)",
          "Bash(npm test:*)", "Bash(npm run *)"
        ],
        "deny": [
          "Bash(rm -rf:*)", "Bash(git push --force:*)",
          "Bash(sudo:*)"
        ]
      }
    }

    ~12 allow-правил покриває 90% повсякденних операцій. Deny — три ключові «незворотні дії» (force-push, rm -rf, sudo).

    2. Production-rigid режим

    {
      "permissions": {
        "allow": [
          "Read(*)", "Glob(*)", "Grep(*)"
        ],
        "ask": [
          "Bash(*)", "Edit(*)", "Write(*)"
        ]
      }
    }

    Все, окрім read-only, питає підтвердження. Корисно у production-репо, де модель не повинна нічого писати/виконувати без явного твого «так».

    3. Skill-only режим — CC робить лише те, що покривають скіли

    Цей патерн складніший: ти забороняєш всі небезпечні tools у налаштуваннях, але дозволяєш конкретні MCP-tools, які викликають твої скіли. Виглядає так:

    {
      "permissions": {
        "allow": [
          "Read(*)", "Glob(*)", "Grep(*)",
          "mcp__publisher__publish_post",
          "mcp__dle__list_posts"
        ],
        "deny": [
          "Bash(*)", "Edit(*)", "Write(*)"
        ]
      }
    }

    CC не може стрибнути у shell або писати у файли — тільки читати і викликати специфічні MCP-tools. Корисно для «робочого профілю» агента, який крутиться як сервіс.

    4. Project + Local mix

    У <repo>/.claude/settings.json (для команди):

    {
      "permissions": {
        "allow": ["Read(*)", "Bash(npm test:*)", "Bash(npm run lint)"],
        "deny":  ["Bash(rm -rf:*)", "Bash(npm publish:*)"]
      }
    }

    У <repo>/.claude/settings.local.json (твій локальний доповнення):

    {
      "permissions": {
        "allow": ["Bash(docker compose:*)", "Bash(./scripts/seed-db.sh)"]
      }
    }

    Командна частина у git — для всіх. Локальна — твоя зручність (docker, локальні seeds), не вантажиться у репо.

    Підводні камені

    Що типово плутає

    deny сильніший за allow. Порядок не має значення: якщо команда матчить deny і allow одночасно — deny виграє. Перевір це після додавання нових правил.

    ask ≠ блок. Просто показує підтвердження користувачу. Для CI/cron — використовуй deny, інакше задача зависне на «чекаю відповіді користувача».

    settings.local.json у git — це баг безпеки. Перевір .gitignore. Часто там credentials або шляхи до приватних серверів. git ls-files | grep settings.local має повертати порожнечу.

    Wildcards у Bash небезпечні. Bash(*) = повна свобода. Краще Bash(git:*), Bash(npm:*) — широкі, але обмежені програми. Bash(* status) теж антипатерн (матчить rm status, kill status...).

    Двокрапка у патерні має значення. Bash(git status) матчить тільки точно «git status». Bash(git status:*) — «git status» з будь-якими аргументами. Це різні правила.

    MCP-tools потребують повного шляху. mcp__myserver__publish — не publish, не myserver__publish. Перевірити точне ім'я — у списку tools з slash /mcp.

    /fewer-permission-prompts на проді — обережно. Скіл генерує allowlist на основі минулих сесій. Якщо у минулому ти підтвердив chmod 777 «один раз заради тесту», скіл може запропонувати додати його у allow. Завжди ревʼюти запропонований JSON руками перед apply.

    Cross-refs

    Чек: твій settings.json
    • jq . settings.json не падає (JSON валідний).
    • Є хоча б 5 allow-правил для тих команд, що виконуєш щодня.
    • Deny містить незворотні дії: rm -rf, git push --force, sudo (мінімум).
    • Settings.local.json у gitignore (якщо існує).
    • Жодних wildcard Bash(*), Edit(*) у allow (за винятком підтверджених сценаріїв).
    • Перевірено в реальній сесії — клацань стало менше.
    • Для команди — project-рівень спільний у git; локальні доповнення у settings.local.json.
    Актуальність

    Схема permissions у settings.json для CC станом на травень 2026. Anthropic може додати нові типи правил (наприклад, time-based або conditional). Перевіряти у release notes і через /permissions.

    Опубліковано: 14-05-2026, 18:56 · Автор: Claudia
    Теги
    Вхід
    Опитування

    Якою програмою обліку ви користуєтесь?