Metadata-Version: 2.5
Name: granka
Version: 0.1.0
Summary: Проверка русского текста на норму государственного языка из терминала: заимствования без словарной фиксации, слова с русским аналогом, латиница.
Project-URL: Homepage, https://granka.editors.one
Project-URL: Repository, https://github.com/slvfmts/granka-cli
Project-URL: Issues, https://github.com/slvfmts/granka-cli/issues
Project-URL: Changelog, https://github.com/slvfmts/granka-cli/blob/main/CHANGELOG.md
Author: Slava Ufimtsev
License: MIT
License-File: LICENSE
Keywords: agents,claude,cli,editorial,language,linter,russian
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: Russian
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Text Processing :: Linguistic
Requires-Python: >=3.10
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Description-Content-Type: text/markdown

# granka

Проверка русского текста на **норму государственного языка** прямо из терминала.
Бесплатно, без регистрации, без зависимостей.

Вы пишете текст с локальным агентом, говорите ему «проверь норму» — он зовёт
`granka` и читает разбор. Или запускаете сами, руками.

```
pipx install granka
granka norm article.md
```

Без установки вообще: `uvx granka norm article.md`.

Годится и `pip install granka`, если вы работаете внутри окружения. На маке с
Homebrew команды `pip` может не быть, а установка в системный Python — закрыта;
там берите `pipx` или `uvx`, они для того и сделаны.

```
Гранка · норма государственного языка

Текст: article.md · 328 знаков · тип: публичная потребительская информация

Найдено: 1

  Кешбэк — есть русский аналог · 4 раза
    заменить на: возврат части суммы
    Слово зафиксировано в словаре, но есть общеупотребительный русский аналог —
    по ч.6 ст.1 ФЗ-53 это спорная зона, проверьте уместность.
    строки: 1, 3, 7

Латиница: 2 вхождения (CRM, AI-ассистент) — показать: --latin

Проверено по 10 словарям из 11 в официальном перечне (183 387 ключей).
Латиница свёрнута в счётчик: 2. Это помощник, а не юридическое заключение:
покрытие словарей частичное, часть заимствований проверка не видит.
Пустой результат означает «мы не нашли», а не «нарушений нет».

Осталось сегодня: 29 344 знака (обновится 27.08 в 00:00 UTC).
```

## Что именно проверяется

С 1 марта 2026 года действует статья 10.1 закона о защите прав потребителей:
информация для потребителя должна быть на русском языке. Иностранное слово
допустимо, если у него нет общеупотребительного русского аналога **и** оно
зафиксировано в нормативных словарях (ч. 6 ст. 1 ФЗ-53). Условия действуют
вместе, и второе — вопрос факта, а не вкуса.

Инструмент отвечает именно на вопрос факта:

- **заимствование без словарной фиксации** — слова нет в нормативной базе;
- **слово с русским аналогом** — в словаре есть, но аналог существует;
- **латиница** — допустима только как товарный знак или фирменное наименование.

Ни грамматики, ни орфографии, ни стиля здесь нет.

## Тип текста решает строгость

Статья 10.1 применима к потребительской информации, а не ко всякому тексту.
Поэтому у проверки есть режимы:

```
granka norm offer.md                    # public — потребительская информация (по умолчанию)
granka norm banner.md --type ad         # реклама
granka norm memo.md   --type internal   # внутренний документ
granka norm notes.md  --type other      # прочий текст
```

На внутреннем документе и технической заметке проверка мягче: то же слово даёт
наблюдение, а не юридическую формулировку.

## Ключи

| Ключ | Что делает |
|---|---|
| `--type` | тип текста: `public`, `ad`, `internal`, `other` |
| `--latin` | показать латиницу находками, а не счётчиком |
| `--json` | отдать ответ сервиса целиком |
| `--fail-on-findings` | вернуть код 5, если что-то найдено |
| `--url` | другой адрес сервиса (или переменная `GRANKA_URL`) |

Текст можно передать потоком: `cat article.md | granka norm`.

## Коды возврата

| Код | Что означает |
|---|---|
| 0 | проверка выполнена и получена целиком |
| 1 | ошибка вызова: нет текста, файл не прочитан, испорченный ответ |
| 2 | исчерпан дневной лимит |
| 3 | сервис недоступен, не отвечает или выключен |
| 4 | текст больше, чем принимается за один раз |
| 5 | найдены замечания, и запрошен `--fail-on-findings` |

**Ноль не означает «текст соответствует закону».** Он означает, что проверка
доведена до конца. Отказ никогда не притворяется чистым результатом: если сервис
не ответил, вы увидите код 3 и строку «Проверка НЕ выполнена», а не пустой отчёт.

## Для агентов

В пакете лежит навык для Claude Code — `skills/granka-norm`. Поставить вместе с
плагином:

```
/plugin marketplace add slvfmts/granka-cli
/plugin install granka
```

После этого «проверь норму в этом файле» работает без дополнительных объяснений.

Агенту удобнее `--json`: там те же находки в машинном виде, со смещениями,
основанием по каждому слову и остатком дневного лимита.

## Границы

Покрытие словарей **частичное**: 10 словарей из 11 в официальном перечне,
183 387 ключей. Часть заимствований проверка не видит — пустой отчёт означает
«мы не нашли», а не «нарушений нет». Инструмент не заменяет юриста и не выдаёт
заключений.

## Лимиты и приватность

Бесплатно и без регистрации: 30 000 знаков в сутки на адрес, до 20 000 знаков за
один раз. Остаток и время сброса приходят в каждом ответе.

Текст нигде не сохраняется: проверка идёт локальной функцией на сервере, в базу
уходит только счётчик знаков. Подробно — [PRIVACY.md](PRIVACY.md).

## Лицензия

MIT. Клиент открыт; сервис проверки — https://granka.editors.one.
