humanizer-ru 3.27.0 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -5,7 +5,7 @@
5
5
  Claude Code / Cowork plugin. Kills AI smell in Russian text. The English [humanizer](https://github.com/blader/humanizer) won't help here. Russian AI markers are their own beast: bureaucratic noun-chains (канцелярит), English-syntax calques, missing particles like "же" and "ведь" that make Russian sound alive.
6
6
 
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
8
- [![Version](https://img.shields.io/badge/version-3.27.0-blueviolet)](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
8
+ [![Version](https://img.shields.io/badge/version-3.28.0-blueviolet)](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
9
9
  [![Stars](https://img.shields.io/github/stars/ilyautov/humanizer-ru?style=social)](https://github.com/ilyautov/humanizer-ru/stargazers)
10
10
  [![skills.sh](https://skills.sh/b/ilyautov/humanizer-ru)](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru)
11
11
  [![npm](https://img.shields.io/npm/v/humanizer-ru?label=npm%20%C2%B7%20dsh)](https://www.npmjs.com/package/humanizer-ru)
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  > [English version](README.en.md) · [中文](README.zh.md)
6
6
 
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
8
- [![Версия](https://img.shields.io/badge/версия-3.27.0-blueviolet)](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
8
+ [![Версия](https://img.shields.io/badge/версия-3.28.0-blueviolet)](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
9
9
  [![Звёзды](https://img.shields.io/github/stars/ilyautov/humanizer-ru?style=social)](https://github.com/ilyautov/humanizer-ru/stargazers)
10
10
  [![skills.sh](https://skills.sh/b/ilyautov/humanizer-ru)](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru)
11
11
  [![npm](https://img.shields.io/npm/v/humanizer-ru?label=npm%20%C2%B7%20dsh)](https://www.npmjs.com/package/humanizer-ru)
@@ -141,9 +141,23 @@ cp -r /tmp/humanizer-ru/skills/humanizer-ru ~/.claude/skills/
141
141
  ```
142
142
 
143
143
  Копируйте папку целиком, а не один SKILL.md: вместе со скиллом едет
144
- детерминированный сканер `scripts/scan.py` (машинная половина режима «Аудит»;
145
- работает при наличии `pip install razdel pymorphy3`, без них скилл просто
146
- проводит аудит вручную).
144
+ детерминированный сканер `scripts/scan.py` (машинная половина режима «Аудит»).
145
+ Ему нужны пакеты `razdel` и `pymorphy3`. Без них скилл проводит аудит вручную
146
+ и обязан сказать об этом; балла «Чистота: N/100» вы не увидите.
147
+
148
+ Как поставить зависимости. На macOS с Python из Homebrew и на Debian/Ubuntu
149
+ голый `pip install` падает с `externally-managed-environment` (PEP 668),
150
+ поэтому любой из трёх способов:
151
+
152
+ ```bash
153
+ uvx ru-humanizer файл.txt # без установки, нужен uv
154
+ pipx install ru-humanizer # команда ru-humanizer в PATH
155
+ python3 -m venv ~/.humanizer-ru && ~/.humanizer-ru/bin/pip install razdel pymorphy3
156
+ ~/.humanizer-ru/bin/python ~/.claude/skills/humanizer-ru/scripts/scan.py файл.txt
157
+ ```
158
+
159
+ Проверка, что сканер живой: `python3 ~/.claude/skills/humanizer-ru/scripts/scan.py --help`
160
+ без строки `[ошибка]`.
147
161
 
148
162
  ### 4. Codex CLI (OpenAI)
149
163
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanizer-ru",
3
- "version": "3.27.0",
3
+ "version": "3.28.0",
4
4
  "description": "Agent skill for DeepSeek Harness: rewrites Russian text to remove 64 markers of AI generation (bureaucratese, calques, ChatGPT fingerprints), with a corpus-calibrated scanner, audit mode and author-voice calibration.",
5
5
  "license": "MIT",
6
6
  "author": "Ilya Utov",
@@ -4,7 +4,7 @@ description: "Качество русского текста для агента
4
4
  license: MIT
5
5
  ---
6
6
 
7
- # Humanizer-RU v3.27.0
7
+ # Humanizer-RU v3.28.0
8
8
 
9
9
  Ты редактор. Убираешь из русского текста следы нейросети и не ломаешь при этом
10
10
  смысл, факты и голос автора. Оба обещания равноправны: текст, который стал «чище»
@@ -50,8 +50,11 @@ license: MIT
50
50
  прогони текст: `python3 <папка скилла>/scripts/scan.py файл.txt` или
51
51
  `echo "текст" | python3 <папка скилла>/scripts/scan.py -`. Для научного,
52
52
  юридического, художественного текста и новостей добавь `--genre academic|legal|fiction|news`:
53
- без жанра сканер ловит учёных чаще, чем нейросети. Запомни балл «было». Пакетов нет:
54
- предложи `pip install razdel pymorphy3` и работай вручную. Балл на глаз не придумывай.
53
+ без жанра сканер ловит учёных чаще, чем нейросети. Запомни балл «было». Пакетов нет или сканер
54
+ упал: скажи пользователю одной строкой, что сканер не запустился и балла не
55
+ будет (как поставить, написано в его ошибке и в README), и работай вручную.
56
+ Молча пропускать сканер нельзя: без балла правка не измерима, а пользователь
57
+ месяцами не узнает, что половина скилла не работает. Балл на глаз не придумывай.
55
58
 
56
59
  **Чтение целиком.** Определи задачу текста, регистр (маркетинг, экспертный, деловой,
57
60
  научный, документация, юридический, художественный) и позицию, которую автор уже
@@ -109,7 +112,7 @@ JOIN (убрать дублирование соседних фраз), SPLIT (
109
112
  | «Играет важную/ключевую роль» | Оставь только то, ПОЧЕМУ важно, если это есть в тексте |
110
113
  | «Можно с уверенностью сказать» | Скажи без преамбулы |
111
114
  | «Подводя итог», «Таким образом,» в начале вывода | Убери или начни вывод с действия. «Устроен таким образом, что» не маркер |
112
- | Длинное тире «—» и короткое «–» вне числовых диапазонов | Запятая, двоеточие, точка, дефис или перестройка. Снимается только по явной просьбе пользователя |
115
+ | Длинное тире «—» и короткое «–» вне числовых диапазонов | Запятая, двоеточие, точка, дефис или перестройка. Убирается всегда; оставить тире можно только по явной просьбе пользователя |
113
116
  | «От X до Y» для несвязанных понятий | Перечисли конкретно или убери |
114
117
  | «Погрузимся в...», «Давайте посмотрим поближе», «И вот здесь начинается самое интересное» | Удали анонс, сразу пиши суть |
115
118
  | «Раскрыть потенциал», «Вывести на новый уровень», «Открывает новые горизонты/перспективы/возможности» | Конкретный результат, если он назван в тексте; иначе удали |
@@ -57,6 +57,9 @@ STERILE_MIN_WORDS = 100
57
57
  # них настоящие авторские обрывки.
58
58
  STACCATO_PENALTY = 8
59
59
  STACCATO_PENALTY_MAX = 14
60
+ # Потолок штрафа за номинальность. Именованный, потому что браузерный сканер
61
+ # морфологии не имеет и объявляет ровно эту величину как неизмеренную.
62
+ NV_PENALTY_MAX = 8
60
63
 
61
64
 
62
65
  @dataclass
@@ -168,7 +171,7 @@ def cleanliness_score(report, genre: str | None = None) -> ScoreResult:
168
171
  # легитимно номинален), поэтому штраф мягкий и низко ограничен.
169
172
  nv = report.morph.noun_verb_ratio
170
173
  if nv > NV_TARGET:
171
- pen = min(8, round((nv - NV_TARGET) / 0.5 * 3))
174
+ pen = min(NV_PENALTY_MAX, round((nv - NV_TARGET) / 0.5 * 3))
172
175
  if pen:
173
176
  score -= pen
174
177
  penalties.append((f"номинальность (сущ./глаг.={nv}, цель ≤{NV_TARGET})", -pen))
@@ -30,8 +30,15 @@ try:
30
30
  from humanizer_metrics.morphology import morph_verdict
31
31
  from humanizer_metrics.structure import structure_verdict
32
32
  except ImportError as exc:
33
- print(f"[ошибка] не хватает зависимостей сканера ({exc.name}).\n"
34
- "Поставьте один раз: pip install razdel pymorphy3", file=sys.stderr)
33
+ print(f"[ошибка] не хватает зависимостей сканера ({exc.name}); балла не будет.\n"
34
+ "Поставьте один раз любым способом:\n"
35
+ " uvx ru-humanizer файл.txt (без установки, нужен uv)\n"
36
+ " pipx install ru-humanizer (даёт команду ru-humanizer)\n"
37
+ " python3 -m venv ~/.humanizer-ru && ~/.humanizer-ru/bin/pip install razdel pymorphy3\n"
38
+ " и запускайте ~/.humanizer-ru/bin/python scan.py файл.txt\n"
39
+ "Голый pip install на macOS с Homebrew и на Debian/Ubuntu падает с\n"
40
+ "externally-managed-environment (PEP 668): системный Python закрыт для pip.",
41
+ file=sys.stderr)
35
42
  raise SystemExit(2)
36
43
 
37
44