humanizer-lint 1.1.0 → 1.2.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.md +40 -9
- package/SKILL.md +19 -21
- package/package.json +6 -2
- package/rules/de-slop.json +190 -0
- package/rules/en-slop.json +50 -49
- package/rules/es-slop.json +190 -0
- package/rules/fr-slop.json +190 -0
- package/rules/id-slop.json +58 -57
- package/rules/ms-slop.json +190 -0
- package/rules/pt-slop.json +190 -0
- package/rules/zh-slop.json +190 -0
- package/scripts/analyze.mjs +9 -3
- package/scripts/core/analyzer-core.mjs +51 -24
- package/scripts/utils/tokenizer.mjs +149 -82
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# humanizer-lint
|
|
4
4
|
|
|
5
|
-
### Deterministic prose and
|
|
5
|
+
### Deterministic multilingual prose, Markdown, and stylometric linting
|
|
6
6
|
|
|
7
|
-
Detect repetitive LLM phrasing, uniform sentence rhythm, structural clichés, and voice-profile drift without sending text to an external service.
|
|
7
|
+
Detect repetitive LLM phrasing, uniform sentence rhythm, structural clichés, and voice-profile drift across **8 built-in language packs plus 100+ Universal Stylometry languages** without sending text to an external service.
|
|
8
8
|
|
|
9
9
|
[](https://github.com/yanstd888/humanizer-lint/releases)
|
|
10
10
|
[](https://www.npmjs.com/package/humanizer-lint)
|
|
@@ -23,7 +23,7 @@ Detect repetitive LLM phrasing, uniform sentence rhythm, structural clichés, an
|
|
|
23
23
|
|
|
24
24
|
</div>
|
|
25
25
|
|
|
26
|
-
**humanizer-lint is an open-source natural-text and Markdown prose linter
|
|
26
|
+
**humanizer-lint is an open-source natural-text and Markdown prose linter. Native `Intl.Segmenter` provides local sentence and word boundaries; eight bundled anti-slop packs cover English, Indonesian, Spanish, Malay, French, German, Portuguese, and Mandarin. Other ISO 639-1 inputs use universal stylometric checks. It is a style validator, not an authorship detector.**
|
|
27
27
|
|
|
28
28
|
```sh
|
|
29
29
|
npx skills add yanstd888/humanizer-lint
|
|
@@ -45,6 +45,12 @@ Open a deterministic sample view directly:
|
|
|
45
45
|
| Human sample (ID) | [open](https://humanizer.aiclub.ai.id/?sample=human-id) | `PASS`, score `>= 88` |
|
|
46
46
|
| AI sample (EN) | [open](https://humanizer.aiclub.ai.id/?sample=ai-en) | `FAIL`, score `< 65` |
|
|
47
47
|
| Human sample (EN) | [open](https://humanizer.aiclub.ai.id/?sample=human-en) | `PASS`, score `>= 88` |
|
|
48
|
+
| AI sample (ES) | [open](https://humanizer.aiclub.ai.id/?sample=ai-es) | `FAIL`, score `< 68` |
|
|
49
|
+
| AI sample (MS) | [open](https://humanizer.aiclub.ai.id/?sample=ai-ms) | `FAIL`, score `< 68` |
|
|
50
|
+
| AI sample (FR) | [open](https://humanizer.aiclub.ai.id/?sample=ai-fr) | `FAIL`, score `< 68` |
|
|
51
|
+
| AI sample (DE) | [open](https://humanizer.aiclub.ai.id/?sample=ai-de) | `FAIL`, score `< 68` |
|
|
52
|
+
| AI sample (PT) | [open](https://humanizer.aiclub.ai.id/?sample=ai-pt) | `FAIL`, score `< 68` |
|
|
53
|
+
| AI sample (ZH) | [open](https://humanizer.aiclub.ai.id/?sample=ai-zh) | `FAIL`, score `< 68` |
|
|
48
54
|
|
|
49
55
|
Use `?lang=en` or `?lang=id` to open the playground chrome in a chosen language for that visit; it does not overwrite a saved browser preference.
|
|
50
56
|
|
|
@@ -52,13 +58,26 @@ It works locally with zero runtime dependencies. Instead of rewriting text throu
|
|
|
52
58
|
|
|
53
59
|
It can serve as a CLI text humanizer guardrail, automated writing style linter, or CI/CD documentation linter. The bundled rules flag overused AI clichés such as `delve` and `tapestry` without rewriting the source.
|
|
54
60
|
|
|
61
|
+
## Language support
|
|
62
|
+
|
|
63
|
+
| Tier | Languages | Checks |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Tier 1 — rule packs | `en`, `id`, `es`, `ms`, `fr`, `de`, `pt`, `zh` | Universal stylometric metrics plus lexical, definitional-opening, and structural-cliché packs; Indonesian keeps its morphology rules. |
|
|
66
|
+
| Tier 2 — universal | `universal` or another ISO 639-1 code such as `tr`, `ja`, or `ar` | Universal stylometry through native `Intl.Segmenter`: burstiness, adjacent rhythm delta, adaptive MATTR, paragraph symmetry, repeated starters, and compression ratio. |
|
|
67
|
+
|
|
68
|
+
## Use cases & agent integration
|
|
69
|
+
|
|
70
|
+
Use this local AI text humanizer and prose linter for copywriting, blog posts, SEO articles, technical documentation, Markdown proofreading, academic prose, and natural translation polishing. Tier 1 packs flag native anti-slop phrases in English, Indonesian, Spanish, Malay, French, German, Portuguese, and Mandarin; Tier 2 applies deterministic stylometry to 100+ languages.
|
|
71
|
+
|
|
72
|
+
For a closed-loop agent workflow, install `npx skills add yanstd888/humanizer-lint`, draft without changing facts, run `humanizer-lint --lang auto`, revise only flagged prose, and re-run before returning the text. It works with Claude Code, Cursor, Windsurf, Cline, Codex, and Gemini CLI without a runtime dependency or network text upload.
|
|
73
|
+
|
|
55
74
|
## What it does
|
|
56
75
|
|
|
57
76
|
`humanizer-lint` analyzes prose after removing or neutralizing common non-prose Markdown structures. It then combines lexical rules, sentence-length statistics, structural checks, Indonesian morphology checks, and an optional voice profile into a score from 0 to 100.
|
|
58
77
|
|
|
59
78
|
The project includes:
|
|
60
79
|
|
|
61
|
-
-
|
|
80
|
+
- Eight reviewable lexical and structural rule packs for EN, ID, ES, MS, FR, DE, PT, and ZH.
|
|
62
81
|
- Sentence-length burstiness, adjacent rhythm delta, short/long sentence ratios, and adaptive MATTR.
|
|
63
82
|
- Repetition checks based on paragraph symmetry, repeated sentence starters, and compression ratio.
|
|
64
83
|
- Indonesian nominalization, passive-voice, loanword, and translation-style opening checks.
|
|
@@ -192,12 +211,24 @@ No dependency installation or build step is required.
|
|
|
192
211
|
|
|
193
212
|
## Quick start
|
|
194
213
|
|
|
195
|
-
Analyze one file:
|
|
214
|
+
Analyze one file with auto-detection:
|
|
196
215
|
|
|
197
216
|
```sh
|
|
198
217
|
humanizer-lint --file draft.md --lang auto
|
|
199
218
|
```
|
|
200
219
|
|
|
220
|
+
Force universal stylometry for a language without a bundled pack:
|
|
221
|
+
|
|
222
|
+
```sh
|
|
223
|
+
humanizer-lint --file draft.md --lang universal
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Request an ISO 639-1 language directly:
|
|
227
|
+
|
|
228
|
+
```sh
|
|
229
|
+
humanizer-lint --file draft.md --lang es
|
|
230
|
+
```
|
|
231
|
+
|
|
201
232
|
Return machine-readable JSON:
|
|
202
233
|
|
|
203
234
|
```sh
|
|
@@ -265,14 +296,14 @@ Untuk contoh ini, skor naik dari **38** menjadi **100** setelah frasa template d
|
|
|
265
296
|
### Analyzer
|
|
266
297
|
|
|
267
298
|
```text
|
|
268
|
-
humanizer-lint (--file <path> | --stdin) [--lang
|
|
299
|
+
humanizer-lint (--file <path> | --stdin) [--lang auto|universal|<ISO-639-1>] [--profile <path>] [--json]
|
|
269
300
|
```
|
|
270
301
|
|
|
271
302
|
| Option | Required | Description |
|
|
272
303
|
|---|---:|---|
|
|
273
304
|
| `--file <path>` | One input required | Read one UTF-8 text or Markdown file. |
|
|
274
305
|
| `--stdin` | One input required | Read the complete document from standard input. |
|
|
275
|
-
| `--lang
|
|
306
|
+
| `--lang auto|universal|<ISO-639-1>` | No | Select auto-detection, a bundled Tier 1 pack, or universal stylometry. Default: `auto`. |
|
|
276
307
|
| `--profile <path>` | No | Load a JSON voice profile. |
|
|
277
308
|
| `--json` | No | Print JSON only. Without it, print the terminal report. |
|
|
278
309
|
| `--help` | No | Print command usage. |
|
|
@@ -409,7 +440,7 @@ The real result may contain additional metric properties and violations.
|
|
|
409
440
|
|
|
410
441
|
After installation, an agent can use the skill as a closed verification loop:
|
|
411
442
|
|
|
412
|
-
1. Draft or edit
|
|
443
|
+
1. Draft or edit prose in a supported Tier 1 language or any Universal Stylometry language without changing supported facts.
|
|
413
444
|
2. Run the analyzer against the exact complete draft.
|
|
414
445
|
3. Read every violation and edit only the affected prose or named whole-document gate.
|
|
415
446
|
4. Re-run the analyzer, stopping after three iterations.
|
|
@@ -494,7 +525,7 @@ Yes. Run `npx humanizer-lint --file draft.md --lang auto` for a one-off command,
|
|
|
494
525
|
<details>
|
|
495
526
|
<summary><strong>Which languages are supported?</strong></summary>
|
|
496
527
|
|
|
497
|
-
The configured lexical
|
|
528
|
+
The configured lexical packs support English, Indonesian, Spanish, Malay, French, German, Portuguese, and Mandarin. Other ISO 639-1 languages use universal stylometry through native `Intl.Segmenter`; these checks measure rhythm and repetition without inventing a lexical pack.
|
|
498
529
|
|
|
499
530
|
</details>
|
|
500
531
|
|
package/SKILL.md
CHANGED
|
@@ -1,43 +1,41 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: humanizer-lint
|
|
3
|
-
description: Deterministic AI text humanizer, anti-slop prose linter, and stylometric analyzer (EN
|
|
4
|
-
version: 1.1
|
|
3
|
+
description: Deterministic multilingual AI text humanizer, anti-slop prose linter, copywriting/blog/docs editor, and stylometric analyzer (EN, ID, ES, MS, FR, DE, PT, ZH + 100+ languages via Intl.Segmenter). Fixes robotic LLM tone, uniform sentence rhythm, low burstiness (CV), MATTR vocabulary repetition, and translationese clichés using a local zero-dependency Node.js CLI validator.
|
|
4
|
+
version: 1.2.1
|
|
5
5
|
license: MIT
|
|
6
6
|
compatibility: Node.js >= 18.3.0 (zero external dependencies)
|
|
7
7
|
allowed-tools: Bash(node:*) Read Write
|
|
8
8
|
metadata:
|
|
9
|
-
version: "1.1
|
|
9
|
+
version: "1.2.1"
|
|
10
10
|
author: "yanstd888"
|
|
11
11
|
domain: "writing"
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
# Humanizer Lint
|
|
15
15
|
|
|
16
|
-
Use this skill when writing or
|
|
16
|
+
Use this skill when writing, editing, translating, or humanizing prose, blog posts, SEO articles, copywriting, or technical documentation across **8 deep language rule packs (English, Indonesian, Spanish, Malay, French, German, Portuguese, Mandarin Chinese)** and **100+ languages in Universal Stylometric Mode (`Intl.Segmenter`)**. The local deterministic CLI analyzer is mandatory, uses only Node.js built-ins, and sends zero text over the network.
|
|
17
17
|
|
|
18
18
|
## When to use
|
|
19
19
|
|
|
20
|
-
- Humanize
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
20
|
+
- Humanize agent-generated drafts, articles, essays, copywriting, and documentation in any language (`--lang auto`).
|
|
21
|
+
- Audit and fix uniform sentence rhythm (low Burstiness $CV$ and monotonous 3-sentence windows).
|
|
22
|
+
- Strip LLM stock phrases, filler transitions, and rigid translationese morphology (`EN`, `ID`, `ES`, `MS`, `FR`, `DE`, `PT`, `ZH`).
|
|
23
|
+
- Match a user's personal writing style using a local voice fingerprint profile (`scripts/fingerprint.mjs`).
|
|
24
|
+
- Verify edited prose deterministically (`PASS` / `FAIL`) before returning it to the user.
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
## Supported Languages (Two-Tier Multilingual Architecture)
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
- **Tier 1 — Full Lexical Anti-Slop + Stylometric Math (8 Languages):** `en` (English), `id` (Bahasa Indonesia), `es` (Español), `ms` (Bahasa Melayu), `fr` (Français), `de` (Deutsch), `pt` (Português), `zh` (中文 / Mandarin).
|
|
29
|
+
- **Tier 2 — Universal Stylometric Engine (100+ Languages via `Intl.Segmenter`):** Automatic sentence-length Burstiness ($CV$), Adjacent Rhythm Delta ($\Delta_{adj}$), Adaptive $MATTR$, paragraph symmetry, starter repetition, and compression entropy for Latin, Cyrillic, Arabic, Japanese, Korean, Hindi, Turkish, Vietnamese, and other scripts via `--lang auto` or `--lang universal`.
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
## Agent-SEO Trigger Intents & Search Keywords
|
|
30
32
|
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
- "lint markdown documentation prose"
|
|
36
|
-
- "humanizer bahasa Indonesia"
|
|
37
|
-
- "perbaiki tulisan AI yang kaku"
|
|
38
|
-
- "match author voice profile"
|
|
33
|
+
- **Core Humanizer & Anti-Slop:** `humanizer`, `ai humanizer`, `humanize text`, `anti-slop`, `remove ai slop`, `prose linter`, `stylometric linter`, `bypass robotic ai writing`, `burstiness checker`, `perplexity and burstiness`, `mattr lexical diversity`.
|
|
34
|
+
- **Writing, Copywriting & Docs Workflows:** `writing assistant`, `copywriting linter`, `blog post writer`, `seo article humanizer`, `markdown prose linter`, `technical documentation editor`, `proofreading and editing`, `natural translation polishing`, `voice cloning stylometry`.
|
|
35
|
+
- **Indonesian & Malay Intents:** `humanizer bahasa indonesia`, `cara agar tulisan ai tidak terdeteksi`, `perbaiki tulisan ai yang kaku`, `ubah teks chatgpt jadi natural`, `cek skor tulisan ai`, `parafrase anti-ai`, `semak ayat ai bahasa melayu`.
|
|
36
|
+
- **Global Multilingual Intents:** `humanizador de texto ia` (ES/PT), `humaniseur de texte ia` (FR), `ki-text humanisieren` (DE), `消除AI味 / AI文章人性化` (ZH).
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
Do not use it to alter code, commands, structured data, quotations, legal language, or factual identifiers. The sanitizer excludes common Markdown structures, but the agent must still preserve meaning and supported facts.
|
|
41
39
|
|
|
42
40
|
## Prerequisites
|
|
43
41
|
|
|
@@ -50,7 +48,7 @@ These intents apply across Claude Code, Cursor, Windsurf, Cline, Codex, and Gemi
|
|
|
50
48
|
### 1. Resolve context
|
|
51
49
|
|
|
52
50
|
1. Resolve `<skill_dir>` from this `SKILL.md`; never assume the current working directory.
|
|
53
|
-
2. Determine `
|
|
51
|
+
2. Determine `auto`, `universal`, or a two-letter ISO 639-1 code. `auto` selects a bundled pack when evidence is strong; otherwise it uses `universal`.
|
|
54
52
|
3. If `<skill_dir>/profiles/custom-voice.json` exists, pass it with `--profile`. Otherwise use the bundled default profile.
|
|
55
53
|
4. Keep source facts, names, numbers, dates, quotations, citations, and technical terms unchanged unless the user explicitly requests a factual edit.
|
|
56
54
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanizer-lint",
|
|
3
|
-
"version": "1.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "Multilingual closed-loop AI text humanizer, anti-slop prose linter, and stylometric burstiness (CV) & MATTR validator (EN, ID, ES, MS, FR, DE, PT, ZH + 100+ universal languages via Intl.Segmenter). Zero dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=18.3.0"
|
|
@@ -31,12 +31,16 @@
|
|
|
31
31
|
"skills-sh",
|
|
32
32
|
"agent-skill",
|
|
33
33
|
"ai-humanizer",
|
|
34
|
+
"humanizer",
|
|
34
35
|
"anti-slop",
|
|
35
36
|
"prose-linter",
|
|
36
37
|
"stylometry",
|
|
37
38
|
"burstiness",
|
|
38
39
|
"mattr",
|
|
40
|
+
"multilingual-nlp",
|
|
39
41
|
"indonesian-nlp",
|
|
42
|
+
"copywriting",
|
|
43
|
+
"markdown-linter",
|
|
40
44
|
"claude-code",
|
|
41
45
|
"cursor-skill",
|
|
42
46
|
"windsurf",
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "de",
|
|
3
|
+
"stopwords": [
|
|
4
|
+
"der",
|
|
5
|
+
"die",
|
|
6
|
+
"und",
|
|
7
|
+
"in",
|
|
8
|
+
"den",
|
|
9
|
+
"von",
|
|
10
|
+
"zu",
|
|
11
|
+
"das",
|
|
12
|
+
"mit",
|
|
13
|
+
"sich",
|
|
14
|
+
"des",
|
|
15
|
+
"auf",
|
|
16
|
+
"für",
|
|
17
|
+
"ist",
|
|
18
|
+
"im",
|
|
19
|
+
"dem",
|
|
20
|
+
"nicht",
|
|
21
|
+
"ein",
|
|
22
|
+
"eine",
|
|
23
|
+
"als"
|
|
24
|
+
],
|
|
25
|
+
"patterns": [
|
|
26
|
+
{
|
|
27
|
+
"id": "DE001",
|
|
28
|
+
"type": "SLOP_PHRASE",
|
|
29
|
+
"pattern": "in\\s+der\\s+heutigen\\s+schnelllebigen\\s+Welt",
|
|
30
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "DE002",
|
|
34
|
+
"type": "SLOP_PHRASE",
|
|
35
|
+
"pattern": "es\\s+ist\\s+wichtig\\s+zu\\s+beachten",
|
|
36
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "DE003",
|
|
40
|
+
"type": "SLOP_PHRASE",
|
|
41
|
+
"pattern": "zusammenfassend\\s+lässt\\s+sich\\s+sagen",
|
|
42
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "DE004",
|
|
46
|
+
"type": "SLOP_PHRASE",
|
|
47
|
+
"pattern": "darüber\\s+hinaus",
|
|
48
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "DE005",
|
|
52
|
+
"type": "SLOP_PHRASE",
|
|
53
|
+
"pattern": "nicht\\s+zuletzt",
|
|
54
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "DE006",
|
|
58
|
+
"type": "SLOP_PHRASE",
|
|
59
|
+
"pattern": "spielt\\s+eine\\s+entscheidende\\s+Rolle",
|
|
60
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "DE007",
|
|
64
|
+
"type": "SLOP_PHRASE",
|
|
65
|
+
"pattern": "ein\\s+Beweis\\s+dafür",
|
|
66
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "DE008",
|
|
70
|
+
"type": "SLOP_PHRASE",
|
|
71
|
+
"pattern": "in\\s+einer\\s+sich\\s+ständig\\s+verändernden",
|
|
72
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "DE009",
|
|
76
|
+
"type": "SLOP_PHRASE",
|
|
77
|
+
"pattern": "nicht\\s+nur",
|
|
78
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "DE010",
|
|
82
|
+
"type": "SLOP_PHRASE",
|
|
83
|
+
"pattern": "sondern\\s+auch",
|
|
84
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "DE011",
|
|
88
|
+
"type": "SLOP_PHRASE",
|
|
89
|
+
"pattern": "im\\s+digitalen\\s+Zeitalter",
|
|
90
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "DE012",
|
|
94
|
+
"type": "SLOP_PHRASE",
|
|
95
|
+
"pattern": "es\\s+lässt\\s+sich\\s+nicht\\s+leugnen",
|
|
96
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "DE013",
|
|
100
|
+
"type": "SLOP_PHRASE",
|
|
101
|
+
"pattern": "es\\s+ist\\s+erwähnenswert",
|
|
102
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "DE014",
|
|
106
|
+
"type": "SLOP_PHRASE",
|
|
107
|
+
"pattern": "in\\s+der\\s+heutigen\\s+Zeit",
|
|
108
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "DE015",
|
|
112
|
+
"type": "SLOP_PHRASE",
|
|
113
|
+
"pattern": "eine\\s+Vielzahl\\s+von",
|
|
114
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "DE016",
|
|
118
|
+
"type": "SLOP_PHRASE",
|
|
119
|
+
"pattern": "in\\s+der\\s+modernen\\s+Welt",
|
|
120
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "DE017",
|
|
124
|
+
"type": "SLOP_PHRASE",
|
|
125
|
+
"pattern": "den\\s+Weg\\s+ebnen",
|
|
126
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "DE018",
|
|
130
|
+
"type": "SLOP_PHRASE",
|
|
131
|
+
"pattern": "die\\s+Spielregeln\\s+ändern",
|
|
132
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "DE019",
|
|
136
|
+
"type": "SLOP_PHRASE",
|
|
137
|
+
"pattern": "nahtlos",
|
|
138
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "DE020",
|
|
142
|
+
"type": "SLOP_PHRASE",
|
|
143
|
+
"pattern": "ganzheitlicher\\s+Ansatz",
|
|
144
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "DE021",
|
|
148
|
+
"type": "SLOP_PHRASE",
|
|
149
|
+
"pattern": "wertvolle\\s+Einblicke",
|
|
150
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "DE022",
|
|
154
|
+
"type": "SLOP_PHRASE",
|
|
155
|
+
"pattern": "in\\s+der\\s+sich\\s+entwickelnden\\s+Landschaft",
|
|
156
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "DE023",
|
|
160
|
+
"type": "SLOP_PHRASE",
|
|
161
|
+
"pattern": "am\\s+Ende\\s+des\\s+Tages",
|
|
162
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "DE024",
|
|
166
|
+
"type": "SLOP_PHRASE",
|
|
167
|
+
"pattern": "ohne\\s+Zweifel",
|
|
168
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"id": "DE025",
|
|
172
|
+
"type": "SLOP_PHRASE",
|
|
173
|
+
"pattern": "von\\s+entscheidender\\s+Bedeutung",
|
|
174
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "DE026",
|
|
178
|
+
"type": "DEFINITIONAL_OPENING",
|
|
179
|
+
"pattern": "^(?:Im Kontext von|Im Bereich von|In der Welt von) [\\w\\s]+,",
|
|
180
|
+
"scope": "paragraph-start",
|
|
181
|
+
"fixInstruction": "Start with the specific subject or event instead of a generic framing clause."
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "DE027",
|
|
185
|
+
"type": "STRUCTURAL_CLICHE",
|
|
186
|
+
"pattern": "\\bnicht\\s+nur\\b[\\s\\S]{0,100}?\\bsondern\\s+auch\\b",
|
|
187
|
+
"fixInstruction": "State both claims directly without the stock paired construction."
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}
|
package/rules/en-slop.json
CHANGED
|
@@ -1,49 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
"language": "en",
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
{"id":"
|
|
6
|
-
{"id":"
|
|
7
|
-
{"id":"
|
|
8
|
-
{"id":"
|
|
9
|
-
{"id":"
|
|
10
|
-
{"id":"
|
|
11
|
-
{"id":"
|
|
12
|
-
{"id":"
|
|
13
|
-
{"id":"
|
|
14
|
-
{"id":"
|
|
15
|
-
{"id":"
|
|
16
|
-
{"id":"
|
|
17
|
-
{"id":"
|
|
18
|
-
{"id":"
|
|
19
|
-
{"id":"
|
|
20
|
-
{"id":"
|
|
21
|
-
{"id":"
|
|
22
|
-
{"id":"
|
|
23
|
-
{"id":"
|
|
24
|
-
{"id":"
|
|
25
|
-
{"id":"
|
|
26
|
-
{"id":"
|
|
27
|
-
{"id":"
|
|
28
|
-
{"id":"
|
|
29
|
-
{"id":"
|
|
30
|
-
{"id":"
|
|
31
|
-
{"id":"
|
|
32
|
-
{"id":"
|
|
33
|
-
{"id":"
|
|
34
|
-
{"id":"
|
|
35
|
-
{"id":"
|
|
36
|
-
{"id":"
|
|
37
|
-
{"id":"
|
|
38
|
-
{"id":"
|
|
39
|
-
{"id":"
|
|
40
|
-
{"id":"
|
|
41
|
-
{"id":"
|
|
42
|
-
{"id":"
|
|
43
|
-
{"id":"
|
|
44
|
-
{"id":"
|
|
45
|
-
{"id":"
|
|
46
|
-
{"id":"
|
|
47
|
-
{"id":"
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
{
|
|
2
|
+
"language": "en",
|
|
3
|
+
"stopwords": ["the", "and", "of", "to", "in", "is", "that", "for", "it", "with", "as", "on", "are", "this", "by", "be", "at", "or", "from", "an"],
|
|
4
|
+
"patterns": [
|
|
5
|
+
{"id":"EN001","type":"SLOP_PHRASE","pattern":"\\bdelve\\b","fixInstruction":"Name the exact action or subject instead."},
|
|
6
|
+
{"id":"EN002","type":"SLOP_PHRASE","pattern":"\\btapestry\\b","fixInstruction":"Replace the metaphor with a concrete description."},
|
|
7
|
+
{"id":"EN003","type":"SLOP_PHRASE","pattern":"\\btestament\\b","fixInstruction":"State the evidence directly."},
|
|
8
|
+
{"id":"EN004","type":"SLOP_PHRASE","pattern":"\\bunderscore(?:s|d|ing)?\\b","fixInstruction":"State what the evidence shows."},
|
|
9
|
+
{"id":"EN005","type":"SLOP_PHRASE","pattern":"\\bpivotal\\b","fixInstruction":"Describe the actual consequence without inflated significance."},
|
|
10
|
+
{"id":"EN006","type":"SLOP_PHRASE","pattern":"\\bcrucial\\b","fixInstruction":"Explain why the item matters in this context."},
|
|
11
|
+
{"id":"EN007","type":"SLOP_PHRASE","pattern":"\\bfoster(?:s|ed|ing)?\\b","fixInstruction":"Name the concrete behavior or outcome."},
|
|
12
|
+
{"id":"EN008","type":"SLOP_PHRASE","pattern":"\\blandscape\\b","fixInstruction":"Name the field or conditions directly."},
|
|
13
|
+
{"id":"EN009","type":"SLOP_PHRASE","pattern":"\\brealm\\b","fixInstruction":"Name the actual domain."},
|
|
14
|
+
{"id":"EN010","type":"SLOP_PHRASE","pattern":"\\bbeacon\\b","fixInstruction":"Replace the metaphor with a supported fact."},
|
|
15
|
+
{"id":"EN011","type":"SLOP_PHRASE","pattern":"\\bsymphony\\b","fixInstruction":"Describe the relationship without a decorative metaphor."},
|
|
16
|
+
{"id":"EN012","type":"SLOP_PHRASE","pattern":"\\bunlock(?:s|ed|ing)?\\b","fixInstruction":"Name what becomes possible and how."},
|
|
17
|
+
{"id":"EN013","type":"SLOP_PHRASE","pattern":"\\belevate(?:s|d|ing)?\\b","fixInstruction":"State the measurable improvement."},
|
|
18
|
+
{"id":"EN014","type":"SLOP_PHRASE","pattern":"\\bunleash(?:es|ed|ing)?\\b","fixInstruction":"Describe the actual capability or result."},
|
|
19
|
+
{"id":"EN015","type":"SLOP_PHRASE","pattern":"\\bgame[- ]changer\\b","fixInstruction":"State the specific change and its effect."},
|
|
20
|
+
{"id":"EN016","type":"SLOP_PHRASE","pattern":"\\bparadigm shift\\b","fixInstruction":"Describe what changed in concrete terms."},
|
|
21
|
+
{"id":"EN017","type":"SLOP_PHRASE","pattern":"\\bmoreover\\b","fixInstruction":"Connect the sentences by their actual relationship."},
|
|
22
|
+
{"id":"EN018","type":"SLOP_PHRASE","pattern":"\\bfurthermore\\b","fixInstruction":"Connect the sentences by their actual relationship."},
|
|
23
|
+
{"id":"EN019","type":"SLOP_PHRASE","pattern":"\\bin conclusion\\b","fixInstruction":"End on the final concrete point."},
|
|
24
|
+
{"id":"EN020","type":"SLOP_PHRASE","pattern":"\\bit is important to note\\b","fixInstruction":"Remove the announcement and state the fact."},
|
|
25
|
+
{"id":"EN021","type":"SLOP_PHRASE","pattern":"\\bit is worth noting\\b","fixInstruction":"Remove the announcement and state the fact."},
|
|
26
|
+
{"id":"EN022","type":"SLOP_PHRASE","pattern":"\\bin today['’]s fast-paced\\b","fixInstruction":"Name the current condition precisely."},
|
|
27
|
+
{"id":"EN023","type":"SLOP_PHRASE","pattern":"\\bever-evolving\\b","fixInstruction":"Name the change and its time frame."},
|
|
28
|
+
{"id":"EN024","type":"SLOP_PHRASE","pattern":"\\bseamless(?:ly)?\\b","fixInstruction":"Describe the missing step, delay, or transition precisely."},
|
|
29
|
+
{"id":"EN025","type":"SLOP_PHRASE","pattern":"\\brobust\\b","fixInstruction":"Name the failure mode or capacity the system handles."},
|
|
30
|
+
{"id":"EN026","type":"SLOP_PHRASE","pattern":"\\bcutting[- ]edge\\b","fixInstruction":"Name the specific technical capability."},
|
|
31
|
+
{"id":"EN027","type":"SLOP_PHRASE","pattern":"\\brevolutionary\\b","fixInstruction":"Describe the concrete difference without promotional language."},
|
|
32
|
+
{"id":"EN028","type":"SLOP_PHRASE","pattern":"\\bnext[- ]generation\\b","fixInstruction":"Name the new behavior or version."},
|
|
33
|
+
{"id":"EN029","type":"SLOP_PHRASE","pattern":"\\btransformative\\b","fixInstruction":"State what changed and for whom."},
|
|
34
|
+
{"id":"EN030","type":"SLOP_PHRASE","pattern":"\\bjourney\\b","fixInstruction":"Name the process or sequence directly."},
|
|
35
|
+
{"id":"EN031","type":"SLOP_PHRASE","pattern":"\\bempower(?:s|ed|ing)?\\b","fixInstruction":"Name the action users can now take."},
|
|
36
|
+
{"id":"EN032","type":"SLOP_PHRASE","pattern":"\\bharness(?:es|ed|ing)?\\b","fixInstruction":"State how the resource is used."},
|
|
37
|
+
{"id":"EN033","type":"SLOP_PHRASE","pattern":"\\bnavigate(?:s|d|ing)? the complexities\\b","fixInstruction":"Name the specific difficulty and response."},
|
|
38
|
+
{"id":"EN034","type":"SLOP_PHRASE","pattern":"\\bholistic approach\\b","fixInstruction":"List the parts included in the approach."},
|
|
39
|
+
{"id":"EN035","type":"SLOP_PHRASE","pattern":"\\bvaluable insights\\b","fixInstruction":"State the finding itself."},
|
|
40
|
+
{"id":"EN036","type":"SLOP_PHRASE","pattern":"\\bplays? a (?:key|vital|crucial) role\\b","fixInstruction":"Describe the action or consequence directly."},
|
|
41
|
+
{"id":"EN037","type":"SLOP_PHRASE","pattern":"\\bthe future looks bright\\b","fixInstruction":"End on a supported plan or concrete fact."},
|
|
42
|
+
{"id":"EN038","type":"SLOP_PHRASE","pattern":"\\bexciting times (?:lie|are) ahead\\b","fixInstruction":"Replace optimism with a supported next step."},
|
|
43
|
+
{"id":"EN039","type":"SLOP_PHRASE","pattern":"\\bstands as a testament\\b","fixInstruction":"State the evidence directly."},
|
|
44
|
+
{"id":"EN040","type":"SLOP_PHRASE","pattern":"\\bmarking a (?:pivotal|significant) moment\\b","fixInstruction":"State what happened and its direct effect."},
|
|
45
|
+
{"id":"EN041","type":"STRUCTURAL_CLICHE","pattern":",\\s+[a-z]+ing\\s+(?:a|the|its|their|this|that)\\s+[a-z]+","fixInstruction":"Split or rewrite the participial tail as a supported clause."},
|
|
46
|
+
{"id":"EN042","type":"STRUCTURAL_CLICHE","pattern":"\\bnot only[\\s\\S]{0,100}?but also\\b","fixInstruction":"State both claims directly without the binary formula."},
|
|
47
|
+
{"id":"EN043","type":"STRUCTURAL_CLICHE","pattern":"\\bit['’]s not just about[\\s\\S]{0,100}?it['’]s about\\b","fixInstruction":"State the positive claim directly."},
|
|
48
|
+
{"id":"EN044","type":"STRUCTURAL_CLICHE","pattern":"(?:—|--)","maxOccurrences":1,"perWords":250,"fixInstruction":"Replace repeated dashes with the punctuation that matches the relationship."}
|
|
49
|
+
]
|
|
50
|
+
}
|