humanizer-ru 3.19.0 → 3.19.1

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,9 +5,10 @@
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.19.0-blueviolet)](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
8
+ [![Version](https://img.shields.io/badge/version-3.19.1-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
+ [![npm](https://img.shields.io/npm/v/humanizer-ru?label=npm%20%C2%B7%20dsh)](https://www.npmjs.com/package/humanizer-ru)
11
12
 
12
13
  <p align="center">
13
14
  <a href="https://humanizer-ru.aifrontier.tech/">
@@ -59,7 +60,7 @@ Workspace admins can roll the skill out to the whole team via **Admin Console
59
60
  npx skills add https://github.com/ilyautov/humanizer-ru/tree/main/skills/humanizer-ru
60
61
  ```
61
62
 
62
- The CLI drops `SKILL.md` into `~/.claude/skills/humanizer-ru/` and registers the skill on [skills.sh](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru). Point at the full skill-folder path: the short `ilyautov/humanizer-ru` form resolves to the repo root, which has no `SKILL.md` (removed in v3.14.2), so the install either fails or pulls in the whole repository.
63
+ The CLI drops `SKILL.md` into `~/.claude/skills/humanizer-ru/` and registers the skill on [skills.sh](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru). The short form works too: `npx skills add ilyautov/humanizer-ru` discovers the skill inside the repository and offers it for install; add `--skill humanizer-ru` to install without prompts.
63
64
 
64
65
  **API (`/v1/messages` and equivalents):** pass the skill via the `container.skills` parameter. See your client's docs.
65
66
 
@@ -129,12 +130,14 @@ Generic path for native readers: drop the skill folder into the directory the ag
129
130
 
130
131
  DeepSeek Harness reads the same Agent Skills format. Two ways to install.
131
132
 
132
- As a bundle, one command into the profile you use (`web`, `tui` or `headless`):
133
+ As an npm bundle, one command into the profile you use (`web`, `tui` or `headless`):
133
134
 
134
135
  ```bash
135
- dsh plugin --profile web add github:ilyautov/humanizer-ru
136
+ dsh plugin --profile web add humanizer-ru
136
137
  ```
137
138
 
139
+ The same bundle straight from GitHub, for a specific branch or the freshest main: `dsh plugin --profile web add github:ilyautov/humanizer-ru`.
140
+
138
141
  The bundle is text only: `package.json` with a `dsh.bundle` field and `cordis.patch.yml`, which mounts the stock `dsh-skill-filesystem` provider on the package's `skills/` folder. No executable code, no build step. Verify without running a model: `dsh --profile web --dump-config` shows a `# == humanizer-ru` layer. Remove with `dsh plugin --profile web remove humanizer-ru`.
139
142
 
140
143
  As a copy into the user skill root:
@@ -167,7 +170,7 @@ Triggers: "очеловечь", "убери следы нейросети", "с
167
170
  Before:
168
171
  > В современном мире искусственный интеллект играет всё более важную роль в различных сферах деятельности. Стоит отметить, что данная технология является мощным инструментом для оптимизации рабочих процессов.
169
172
 
170
- After:
173
+ After (author's facts):
171
174
  > За последний год я внедрил AI-инструменты в три проекта. Два ускорились вдвое. Третий развалился, потому что команда перестала проверять то, что выдаёт модель. AI работает, когда понимаешь его ограничения.
172
175
 
173
176
  Five hard bans triggered in two sentences. Typical.
package/README.md CHANGED
@@ -5,9 +5,10 @@
5
5
  > [English version](README.en.md)
6
6
 
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
8
- [![Версия](https://img.shields.io/badge/версия-3.19.0-blueviolet)](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
8
+ [![Версия](https://img.shields.io/badge/версия-3.19.1-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
+ [![npm](https://img.shields.io/npm/v/humanizer-ru?label=npm%20%C2%B7%20dsh)](https://www.npmjs.com/package/humanizer-ru)
11
12
 
12
13
  <p align="center">
13
14
  <a href="https://humanizer-ru.aifrontier.tech/">
@@ -100,7 +101,7 @@
100
101
  npx skills add https://github.com/ilyautov/humanizer-ru/tree/main/skills/humanizer-ru
101
102
  ```
102
103
 
103
- CLI кладёт `SKILL.md` в `~/.claude/skills/humanizer-ru/` и регистрирует скилл в индексе [skills.sh](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru). Указывайте полный путь к папке скилла: короткая форма `ilyautov/humanizer-ru` смотрит в корень репозитория, где `SKILL.md` нет (убран в v3.14.2), и установка либо падает, либо тащит весь репозиторий.
104
+ CLI кладёт `SKILL.md` в `~/.claude/skills/humanizer-ru/` и регистрирует скилл в индексе [skills.sh](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru). Короткая форма тоже работает: `npx skills add ilyautov/humanizer-ru` находит скилл в репозитории и предлагает его к установке, а с флагом `--skill humanizer-ru` ставит без вопросов.
104
105
 
105
106
  **Через API (`/v1/messages` и аналоги):** передайте скилл параметром `container.skills`. Детали в документации вашего клиента.
106
107
 
@@ -176,12 +177,14 @@ RESULT: PASS install-smoke
176
177
 
177
178
  DeepSeek Harness читает тот же формат Agent Skills, и скилл ставится двумя способами.
178
179
 
179
- Бандлом, одной командой в нужный профиль (`web`, `tui` или `headless`):
180
+ Бандлом из npm, одной командой в нужный профиль (`web`, `tui` или `headless`):
180
181
 
181
182
  ```bash
182
- dsh plugin --profile web add github:ilyautov/humanizer-ru
183
+ dsh plugin --profile web add humanizer-ru
183
184
  ```
184
185
 
186
+ Тот же бандл прямо из GitHub, если нужна конкретная ветка или свежий main: `dsh plugin --profile web add github:ilyautov/humanizer-ru`.
187
+
185
188
  Бандл текстовый: `package.json` с полем `dsh.bundle` и `cordis.patch.yml`, который монтирует штатный провайдер `dsh-skill-filesystem` на папку `skills/` пакета. Исполняемого кода в бандле нет, сборка при установке не нужна. Проверить без запуска модели: `dsh --profile web --dump-config` покажет слой `# == humanizer-ru`. Удаление: `dsh plugin --profile web remove humanizer-ru`.
186
189
 
187
190
  Копией в пользовательский корень скиллов:
@@ -242,7 +245,7 @@ python skills/humanizer-ru/scripts/scan.py статья.txt --genre academic #
242
245
  До:
243
246
  > В современном мире искусственный интеллект играет всё более важную роль в различных сферах деятельности. Стоит отметить, что данная технология является мощным инструментом для оптимизации рабочих процессов.
244
247
 
245
- После:
248
+ После (факты автора):
246
249
  > За последний год я внедрил AI-инструменты в три проекта. Два ускорились вдвое. Третий развалился, потому что команда перестала проверять то, что выдаёт модель. AI работает, когда понимаешь его ограничения.
247
250
 
248
251
  Пять жёстких банов сработали в двух предложениях. Типичная картина.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanizer-ru",
3
- "version": "3.19.0",
3
+ "version": "3.19.1",
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.19.0
7
+ # Humanizer-RU v3.19.1
8
8
 
9
9
  Ты редактор. Превращаешь стерильный AI-текст в живую русскую речь. Убираешь маркеры нейросети и возвращаешь в текст автора: мнение, ритм, характер.
10
10
 
@@ -291,7 +291,7 @@ license: MIT
291
291
  Было:
292
292
  > В современном мире искусственный интеллект играет всё более важную роль в различных сферах деятельности. Стоит отметить, что данная технология является мощным инструментом для оптимизации рабочих процессов. Многие эксперты считают, что внедрение AI-решений способствует повышению эффективности организаций. Важно помнить, что при этом необходимо учитывать этические аспекты использования искусственного интеллекта. Таким образом, можно сделать вывод, что AI представляет собой перспективное направление развития, которое будет оказывать значительное влияние на будущее человечества.
293
293
 
294
- Стало:
294
+ Стало (факты автора):
295
295
  > За последний год я внедрил AI-инструменты в три проекта. Два ускорились вдвое. Третий развалился, потому что команда перестала проверять то, что выдаёт модель. Вот что я вынес: AI работает, когда понимаешь его ограничения. Не работает, когда веришь на слово.
296
296
 
297
297
  ### Описание продукта
@@ -11,6 +11,7 @@
11
11
 
12
12
  from __future__ import annotations
13
13
 
14
+ import re
14
15
  from dataclasses import dataclass
15
16
 
16
17
  from .burstiness import RhythmStats, rhythm, rhythm_verdict
@@ -69,12 +70,58 @@ class Report:
69
70
  }
70
71
 
71
72
 
73
+ # --- Код и цитаты не текст автора ------------------------------------------
74
+ # Сканер считал баны внутри блоков кода и внутри коротких цитат в ёлочках:
75
+ # статья про сам скилл с фразой «в современном мире» в кавычках получала
76
+ # «рерайт», а технический пост с примером кода терял баллы за чужой листинг.
77
+ # Код вырезается целиком (тройные и одиночные обратные кавычки). Цитата
78
+ # вырезается, только если она короткая: так цитируют слово или оборот. Длинная
79
+ # цитата в ёлочках это прямая речь или пересказ, её маркеры на совести автора,
80
+ # и в художественном тексте диалоги остаются под сканером.
81
+ #
82
+ # Замена сохраняет длину и переводы строк, чтобы номера строк в отчёте
83
+ # совпадали с файлом; заглушка не буква, поэтому фразовые регексы через неё
84
+ # не склеиваются («От «В современном мире…» до клише» не станет «От до»).
85
+ GAP = "·"
86
+ QUOTE_MAX_WORDS = 12
87
+ _FENCED = re.compile(r"(?s)```.*?```")
88
+ _INLINE_CODE = re.compile(r"`[^`\n]*`")
89
+ _QUOTE = re.compile(r"«[^«»]*»")
90
+
91
+
92
+ def _blank(match: re.Match[str]) -> str:
93
+ return re.sub(r"[^\n]", GAP, match.group(0))
94
+
95
+
96
+ def _blank_short_quote(match: re.Match[str]) -> str:
97
+ inner = match.group(0)[1:-1]
98
+ if len(inner.split()) <= QUOTE_MAX_WORDS:
99
+ return _blank(match)
100
+ return match.group(0)
101
+
102
+
103
+ def mask_code_and_quotes(text: str) -> str:
104
+ """Текст для лексического сканера: код и короткие цитаты заглушены,
105
+ смещения и номера строк сохранены."""
106
+ text = _FENCED.sub(_blank, text)
107
+ text = _INLINE_CODE.sub(_blank, text)
108
+ return _QUOTE.sub(_blank_short_quote, text)
109
+
110
+
111
+ def strip_code(text: str) -> str:
112
+ """Текст для ритма и морфологии: код удалён, проза оставлена как есть."""
113
+ text = _FENCED.sub("", text)
114
+ return _INLINE_CODE.sub("", text)
115
+
116
+
72
117
  def analyze(text: str) -> Report:
73
118
  """Полный детерминированный прогон текста."""
119
+ lexical = mask_code_and_quotes(text)
120
+ prose = strip_code(text)
74
121
  return Report(
75
- hard_bans=scan_hard_bans(text),
76
- markers=scan_markers(text),
77
- rhythm=rhythm(text),
78
- morph=morph_stats(text),
79
- structure=structure_stats(text),
122
+ hard_bans=scan_hard_bans(lexical),
123
+ markers=scan_markers(lexical),
124
+ rhythm=rhythm(prose),
125
+ morph=morph_stats(prose),
126
+ structure=structure_stats(prose),
80
127
  )