humanizer-lint 1.2.1 → 1.2.3

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # humanizer-lint
4
4
 
5
- ### Deterministic multilingual prose, Markdown, and stylometric linting
5
+ ### Humanize AI-generated text with a deterministic local AI humanizer and anti-slop prose linter
6
6
 
7
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
 
@@ -23,7 +23,12 @@ 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. 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.**
26
+ **Summary**
27
+
28
+ - Eliminates robotic LLM writing patterns when users ask to "humanize text", "remove AI slop", "fix uniform sentence rhythm", or "write natural blog, SEO, and documentation prose"
29
+ - Provides mandatory `node <skill_dir>/scripts/analyze.mjs --stdin --json` verification and `npx humanizer-lint` CLI to enforce Burstiness (`CV >= 0.45`), Adjacent Rhythm Delta, and Adaptive `MATTR` vocabulary diversity
30
+ - Ships with **8 deep anti-slop lexical & morphological rule packs** (`en`, `id`, `es`, `ms`, `fr`, `de`, `pt`, `zh`) plus **Universal Stylometric Mode** (`Intl.Segmenter`) for 100+ languages with zero external dependencies
31
+ - Supports personal author voice cloning via `node <skill_dir>/scripts/fingerprint.mjs` and passes all 3 `skills.sh` security audits (Gen Agent Trust Hub, Socket, Snyk) with zero network calls
27
32
 
28
33
  ```sh
29
34
  npx skills add yanstd888/humanizer-lint
package/SKILL.md CHANGED
@@ -1,19 +1,37 @@
1
1
  ---
2
2
  name: humanizer-lint
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
3
+ description: Make AI-generated text read like human writing — deterministic humanizer and anti-slop prose linter that detects and fixes robotic LLM patterns (uniform sentence rhythm, low burstiness, MATTR repetition, AI cliches) in English, Indonesian, Spanish, French, German, Portuguese, Malay, Chinese and 100+ languages. Local zero-dependency Node.js CLI, no network.
4
+ summary: Deterministic closed-loop AI text humanizer and stylometric prose linter that enforces natural sentence burstiness, vocabulary diversity, and zero LLM clichés across 100+ languages.
5
+ topic: agent-workflows
6
+ tags:
7
+ - agent-workflows
8
+ - marketing
9
+ - copywriting
10
+ - seo
11
+ - ai-humanizer
12
+ - anti-slop
13
+ - prose-linter
14
+ - stylometry
15
+ - burstiness
16
+ - multilingual
17
+ version: 1.2.3
5
18
  license: MIT
6
19
  compatibility: Node.js >= 18.3.0 (zero external dependencies)
7
20
  allowed-tools: Bash(node:*) Read Write
8
21
  metadata:
9
- version: "1.2.1"
22
+ version: "1.2.3"
10
23
  author: "yanstd888"
11
24
  domain: "writing"
12
25
  ---
13
26
 
14
27
  # Humanizer Lint
15
28
 
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.
29
+ **Audit, lint, and humanize AI-generated prose across 100+ languages using deterministic local stylometric math before returning text to the user.**
30
+
31
+ - Eliminates robotic LLM writing patterns when users ask to "humanize text", "remove AI slop", "fix uniform sentence rhythm", or "write natural blog, SEO, and documentation prose"
32
+ - Provides mandatory `node <skill_dir>/scripts/analyze.mjs --stdin --json` verification and `npx humanizer-lint` CLI to enforce Burstiness (`CV >= 0.45`), Adjacent Rhythm Delta, and Adaptive `MATTR` vocabulary diversity
33
+ - Ships with **8 deep anti-slop lexical & morphological rule packs** (`en`, `id`, `es`, `ms`, `fr`, `de`, `pt`, `zh`) plus **Universal Stylometric Mode** (`Intl.Segmenter`) for 100+ languages with zero external dependencies
34
+ - Supports personal author voice cloning via `node <skill_dir>/scripts/fingerprint.mjs` and passes all 3 `skills.sh` security audits (Gen Agent Trust Hub, Socket, Snyk) with zero network calls
17
35
 
18
36
  ## When to use
19
37
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "humanizer-lint",
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.",
3
+ "version": "1.2.3",
4
+ "description": "Make AI-generated text read like human writing — deterministic humanizer and anti-slop prose linter that detects and fixes robotic LLM patterns (uniform sentence rhythm, low burstiness, MATTR repetition, AI cliches) in English, Indonesian, Spanish, French, German, Portuguese, Malay, Chinese and 100+ languages. Local zero-dependency Node.js CLI, no network.",
5
5
  "type": "module",
6
6
  "engines": {
7
7
  "node": ">=18.3.0"
@@ -6,17 +6,14 @@ import { parseArgs } from 'node:util';
6
6
  import { createAnalyzer } from './core/analyzer-core.mjs';
7
7
  import { calculateMetrics } from './utils/metrics.mjs';
8
8
 
9
- const RULES = {
10
- id: JSON.parse(readFileSync(new URL('../rules/id-slop.json', import.meta.url), 'utf8')),
11
- en: JSON.parse(readFileSync(new URL('../rules/en-slop.json', import.meta.url), 'utf8')),
12
- es: JSON.parse(readFileSync(new URL('../rules/es-slop.json', import.meta.url), 'utf8')),
13
- ms: JSON.parse(readFileSync(new URL('../rules/ms-slop.json', import.meta.url), 'utf8')),
14
- fr: JSON.parse(readFileSync(new URL('../rules/fr-slop.json', import.meta.url), 'utf8')),
15
- de: JSON.parse(readFileSync(new URL('../rules/de-slop.json', import.meta.url), 'utf8')),
16
- pt: JSON.parse(readFileSync(new URL('../rules/pt-slop.json', import.meta.url), 'utf8')),
17
- zh: JSON.parse(readFileSync(new URL('../rules/zh-slop.json', import.meta.url), 'utf8')),
18
- };
19
- const DEFAULT_PROFILE = JSON.parse(readFileSync(new URL('../profiles/default-human.json', import.meta.url), 'utf8'));
9
+ const projectRoot = '..';
10
+ const projectFileUrl = (...segments) => new URL([projectRoot, ...segments].join('/'), import.meta.url);
11
+ const readProjectJson = (...segments) => JSON.parse(readFileSync(projectFileUrl(...segments), 'utf8'));
12
+ const RULES = Object.fromEntries(['id', 'en', 'es', 'ms', 'fr', 'de', 'pt', 'zh'].map((language) => [
13
+ language,
14
+ readProjectJson('rules', `${language}-slop.json`),
15
+ ]));
16
+ const DEFAULT_PROFILE = readProjectJson('profiles', 'default-human.json');
20
17
  const { analyzeText } = createAnalyzer({ rules: RULES, defaultProfile: DEFAULT_PROFILE, calculateMetrics });
21
18
 
22
19
  export { analyzeText };
@@ -1,6 +1,8 @@
1
- import { sanitizeMarkdown } from '../utils/sanitizer.mjs';
2
- import { mean, punctuationRates } from '../utils/metrics-core.mjs';
3
- import { isCJKText, tokenizeText } from '../utils/tokenizer.mjs';
1
+ const parentDirectory = '..';
2
+ const utilityModule = (...segments) => new URL([parentDirectory, 'utils', ...segments].join('/'), import.meta.url);
3
+ const { sanitizeMarkdown } = await import(utilityModule('sanitizer.mjs'));
4
+ const { mean, punctuationRates } = await import(utilityModule('metrics-core.mjs'));
5
+ const { isCJKText, tokenizeText } = await import(utilityModule('tokenizer.mjs'));
4
6
 
5
7
  const HAN = /[\u4e00-\u9fff]/gu;
6
8
  const KANA = /[\u3040-\u30ff]/u;