@ijonis/geo-lint 0.1.5 → 0.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/CHANGELOG.md CHANGED
@@ -7,6 +7,64 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.1] - 2026-03-19
11
+
12
+ ### Added
13
+ - `contentSource` field on `ContentItem` — allows rules to distinguish between file-based MDX and URL-extracted content
14
+ - Plain-text structure detection (`src/utils/plaintext-structure.ts`) — heuristic heading, table, list, and FAQ detection for content without markdown formatting
15
+ - GEO rules now fall back to plain-text structure detection when `contentSource` is `'url'`, fixing false 100/100 GEO scores on Readability-extracted content
16
+ - Integration tests for URL scanner compatibility
17
+
18
+ ### Fixed
19
+ - **GEO rules never firing on URL-scanned content** — headings, tables, lists, and FAQ sections are now detected in plain text (no markdown required)
20
+ - **Readability score 0 for German content** — `countSentences` now handles newline-separated sentences and periods without trailing spaces
21
+ - **`slug-invalid-characters` false positive on URL paths** — slashes are now allowed when `contentSource` is `'url'`
22
+ - **`content-repetition` flagging footnotes** — reference boilerplate (Wikipedia citations, DOI, ISBN, etc.) is stripped before n-gram analysis
23
+ - **`missing-h1` false positive on URL content** — rule is skipped when `contentSource` is `'url'` (Readability strips `<h1>`, title is in metadata)
24
+
25
+ ## [0.2.0] - 2026-03-10
26
+
27
+ ### Added
28
+ - `seo-schema-sameas-incomplete` — flags Organization schema with fewer than 2 sameAs entries for entity verification
29
+ - `geo-author-not-person` — flags blog posts with organization names as author instead of a person
30
+ - `seo-service-page-no-schema` — flags service pages without Service structured data
31
+ - `technical-no-feed` — flags sites without RSS/Atom/JSON feeds declared in config
32
+ - `technical-no-llms-txt` — flags sites without /llms.txt endpoint declared in config
33
+ - New config fields: `geo.organizationSameAs`, `geo.servicePagePatterns`
34
+ - New `technical` config section with `feedUrls` and `llmsTxtUrl`
35
+
36
+ ### Changed
37
+ - Rule count increased from 92 to 97
38
+ - `schema-rules.ts` now uses factory pattern (`createSchemaRules`) for config-aware rules
39
+
40
+ ## [0.1.6] - 2026-03-03
41
+
42
+ ### Added
43
+ - Claude Code skill plugin for ecosystem distribution — geo-lint is now installable as a Claude Code skill via `/install-skill`
44
+ - `/content-creator` skill for self-configuring content pipelines — auto-detects project framework, generates adapter scripts, and runs iterative lint-fix loops
45
+
46
+ ## [0.1.5] - 2026-02-20
47
+
48
+ ### Fixed
49
+ - CLI now always exits with code `0` regardless of violation severity — the linter is advisory-only and never blocks CI/CD pipelines. Error/warning labels are preserved for prioritization.
50
+
51
+ ## [0.1.4] - 2026-02-20
52
+
53
+ ### Added
54
+ - Full English/German language parity across all analyzers
55
+ - Locale-aware Flesch Reading Ease: EN formula (`206.835 - 1.015*ASL - 84.6*ASW`) and DE formula (`180 - ASL - 58.5*ASW`) with per-locale interpretation bands
56
+ - `estimateSyllables()` applies silent-e discount for English and compound-word adjustment for German
57
+ - `defaultLocale` added to `RuleContext`, populated from `config.i18n`
58
+ - Unified locale fallback chain: `item.locale` → `context.defaultLocale` → hardcoded default
59
+ - Removed hardcoded German assumption in slug-resolver permalink generation
60
+ - 15 new readability tests covering both language formulas
61
+
62
+ ## [0.1.3] - 2026-02-20
63
+
64
+ ### Changed
65
+ - README "Why this exists" section rewritten with the real motivation: running multiple content-heavy sites with no deterministic SEO/GEO validation tool
66
+ - Stronger value framing in `docs/geo-rules.md` and `docs/rules.md`
67
+
10
68
  ## [0.1.2] - 2026-02-20
11
69
 
12
70
  ### Fixed
@@ -43,6 +101,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
43
101
  - MDX/Markdown content adapter with `gray-matter`
44
102
  - CLI with `--format=json`, `--rules`, `--root`, `--config` flags
45
103
 
104
+ [0.1.6]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.6
105
+ [0.1.5]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.5
106
+ [0.1.4]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.4
107
+ [0.1.3]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.3
46
108
  [0.1.2]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.2
47
109
  [0.1.1]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.1
48
110
  [0.1.0]: https://github.com/IJONIS/geo-lint/releases/tag/v0.1.0
package/README.md CHANGED
@@ -5,11 +5,55 @@
5
5
  [![npm version](https://img.shields.io/npm/v/@ijonis/geo-lint)](https://www.npmjs.com/package/@ijonis/geo-lint)
6
6
  [![CI](https://img.shields.io/github/actions/workflow/status/ijonis/geo-lint/ci.yml?branch=main&label=CI)](https://github.com/IJONIS/geo-lint/actions)
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/IJONIS/geo-lint/blob/main/LICENSE)
8
+ [![Claude Code Skill](https://img.shields.io/badge/Claude_Code-Skill-blueviolet)](https://github.com/IJONIS/geo-lint)
8
9
 
9
10
  ![geo-lint demo](docs/demo.gif)
10
11
 
11
12
  ---
12
13
 
14
+ ## Use with Claude Code
15
+
16
+ Install the geo-lint skill in one command:
17
+
18
+ ```bash
19
+ curl -fsSL https://raw.githubusercontent.com/IJONIS/geo-lint/main/install.sh | bash
20
+ ```
21
+
22
+ Then in any Claude Code session:
23
+
24
+ ```
25
+ /geo-lint audit # Full sweep — find and fix all violations
26
+ /geo-lint fix <slug> # Fix a single content file
27
+ /geo-lint rules # Show all 97 rules with fix strategies
28
+ /geo-lint init # Set up geo-lint.config.ts for a new project
29
+ /geo-lint report # Generate a GEO/SEO health summary
30
+ ```
31
+
32
+ The skill runs an autonomous lint-fix loop: scan your content, read structured violations, fix them using each violation's `suggestion` field, and re-lint until clean. Parallel subagents handle multiple files simultaneously.
33
+
34
+ ### Content Creation Pipeline
35
+
36
+ The install also adds `/content-creator` -- a self-configuring content pipeline that creates SEO & GEO-optimized content matched to your project:
37
+
38
+ ```
39
+ /content-creator setup # Auto-discover your project + configure brand voice
40
+ /content-creator create # Create content with keyword research + validation
41
+ /content-creator voice # Analyze and adjust brand voice
42
+ /content-creator calendar # Plan monthly content calendar
43
+ /content-creator refresh # Update config when your project evolves
44
+ ```
45
+
46
+ On first use, the skill scans your project to learn its framework, content schema, categories, and authors. It then asks a few questions about your brand voice and audience. From that point on, every piece of content is created with full project awareness and validated against geo-lint's 97 rules until clean -- zero manual intervention for mechanical quality.
47
+
48
+ Or paste this into **any** AI agent (Claude Code, Cursor, Windsurf, Copilot):
49
+
50
+ ```
51
+ Run npx geo-lint --format=json, then fix every violation using each
52
+ violation's suggestion field. Re-run until the output is [].
53
+ ```
54
+
55
+ ---
56
+
13
57
  ## Why this exists
14
58
 
15
59
  I run multiple content-heavy sites and there was no deterministic way to validate whether my content was actually optimized -- not "probably fine," but actually checked against concrete rules. SEO linters exist, but they're either paid SaaS, not automatable, or completely ignore the structural patterns that AI search engines use when deciding what to cite.
@@ -18,7 +62,7 @@ So I built one. **GEO (Generative Engine Optimization)** is the practice of stru
18
62
 
19
63
  The goal was simple: install one tool, point your AI agent at it, and walk away. The agent runs the linter, reads the JSON violations, fixes the content, re-lints until clean -- across an entire site, no manual input. One command, both SEO and GEO validated.
20
64
 
21
- **92 rules: 35 GEO, 32 SEO, 14 content quality, 8 technical, 3 i18n.** Readability analysis inspired by Yoast SEO. We researched the current state of GEO and AEO to make sure the rules reflect what actually gets content cited -- not outdated advice.
65
+ **97 rules: 36 GEO, 34 SEO, 14 content quality, 10 technical, 3 i18n.** Readability analysis inspired by Yoast SEO. We researched the current state of GEO and AEO to make sure the rules reflect what actually gets content cited -- not outdated advice.
22
66
 
23
67
  ---
24
68
 
@@ -117,15 +161,15 @@ components at build time.
117
161
 
118
162
  ---
119
163
 
120
- ## All 92 Rules
164
+ ## All 97 Rules
121
165
 
122
166
  | Category | Rules | Severity Mix | Focus |
123
167
  |----------|-------|-------------|-------|
124
- | SEO | 32 | 6 errors, 26 warnings | Titles, descriptions, headings, slugs, OG images, canonical URLs, keywords, links, schema |
168
+ | SEO | 34 | 6 errors, 28 warnings | Titles, descriptions, headings, slugs, OG images, canonical URLs, keywords, links, schema, sameAs, service pages |
125
169
  | Content | 14 | 2 errors, 12 warnings | Word count, readability, dates, categories, jargon density, repetition, vocabulary diversity, transition words, sentence variety |
126
- | Technical | 8 | 3 errors, 5 warnings | Broken links, image files, trailing slashes, external URLs, performance |
170
+ | Technical | 10 | 3 errors, 7 warnings | Broken links, image files, trailing slashes, external URLs, performance, feeds, llms.txt |
127
171
  | i18n | 3 | 0 errors, 3 warnings | Translation pairs, locale metadata |
128
- | GEO | 35 | 0 errors, 35 warnings | AI citation readiness: E-E-A-T signals, content structure, freshness, RAG optimization |
172
+ | GEO | 36 | 0 errors, 36 warnings | AI citation readiness: E-E-A-T signals, content structure, freshness, RAG optimization, author entity type |
129
173
 
130
174
  See the [complete rule reference](docs/rules.md) with descriptions and severity for every rule.
131
175
 
@@ -147,9 +191,13 @@ See the [complete rule reference](docs/rules.md) with descriptions and severity
147
191
 
148
192
  This linter is **deterministic** -- same content in, same violations out, every time. Your AI agent provides the creativity to fix the content; geo-lint provides the guardrails to verify it's correct. The loop runs until violations hit zero.
149
193
 
150
- ### Try it now
194
+ ### Claude Code Plugin
151
195
 
152
- Paste this into **Claude Code**, **Cursor**, or any AI coding agent:
196
+ Install the skill and use `/geo-lint audit` to validate and fix your entire content directory automatically. The skill runs the full lint-fix loop with parallel subagents -- one per file. See [Use with Claude Code](#use-with-claude-code) above.
197
+
198
+ ### Any AI Agent
199
+
200
+ Paste this into **Cursor**, **Windsurf**, **Copilot**, or any AI coding agent:
153
201
 
154
202
  ```
155
203
  Run npx geo-lint --format=json, then fix every violation in the reported
@@ -265,6 +313,9 @@ Options:
265
313
 
266
314
  See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing, and how to add new rules. Changes are tracked in the [CHANGELOG](CHANGELOG.md).
267
315
 
316
+ **Questions or ideas?** Open a [GitHub Discussion](https://github.com/IJONIS/geo-lint/discussions).
317
+ **Bugs or feature requests?** Open a [GitHub Issue](https://github.com/IJONIS/geo-lint/issues).
318
+
268
319
  ## License
269
320
 
270
321
  [MIT](LICENSE)