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)
|
|
8
|
-
[](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
|
|
9
9
|
[](https://github.com/ilyautov/humanizer-ru/stargazers)
|
|
10
10
|
[](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru)
|
|
11
|
+
[](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).
|
|
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
|
|
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
|
|
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)
|
|
8
|
-
[](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
|
|
9
9
|
[](https://github.com/ilyautov/humanizer-ru/stargazers)
|
|
10
10
|
[](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru)
|
|
11
|
+
[](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).
|
|
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
|
-
|
|
180
|
+
Бандлом из npm, одной командой в нужный профиль (`web`, `tui` или `headless`):
|
|
180
181
|
|
|
181
182
|
```bash
|
|
182
|
-
dsh plugin --profile web add
|
|
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.
|
|
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.
|
|
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(
|
|
76
|
-
markers=scan_markers(
|
|
77
|
-
rhythm=rhythm(
|
|
78
|
-
morph=morph_stats(
|
|
79
|
-
structure=structure_stats(
|
|
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
|
)
|