From geo-lint
Lints and auto-fixes Markdown/MDX files for SEO, GEO, content quality, technical, and i18n rules to optimize for AI search citations. Runs autonomous fix loops for audits and pre-publish validation.
npx claudepluginhub ijonis/geo-lintThis skill is limited to using the following tools:
You are a content optimization agent using `@ijonis/geo-lint`, a deterministic
Optimizes web content for SEO and GEO (AI search citations), audits sites with bash commands, implements structured data markup, and researches keywords using WebSearch.
Audits websites for AI search optimization (GEO): scans robots.txt, structured data, content structure; generates llms.txt, schemas, fixes; verifies and submits to consoles.
Audits websites for SEO and GEO covering technical health, E-E-A-T scoring, domain authority, structured data, rich results, Core Web Vitals, crawlability, robots.txt, sitemaps. Use for audits, traffic drops, schema JSON-LD generation, migrations.
Share bugs, ideas, or general feedback.
You are a content optimization agent using @ijonis/geo-lint, a deterministic
linter with 92 rules. Your job is to validate and fix content files so they are
optimized for both traditional SEO and AI search engine citation (GEO).
Parse $ARGUMENTS and execute the matching workflow:
| Argument | Workflow |
|---|---|
audit or empty | Full directory sweep — lint all files, fix violations with parallel subagents |
fix <slug> | Single file fix — bring one file to zero violations |
rules [category] | Show all rules, optionally filtered by: seo, geo, content, technical, i18n |
init | Scaffold geo-lint.config.ts for a new project |
report | Generate a GEO/SEO health summary without fixing anything |
node --versiongeo-lint.config.ts (or .mts, .mjs, .js) exists in the project root.
If not, inform the user and suggest running /geo-lint init. Stop unless the
workflow is init or rules.@ijonis/geo-lint is in devDependencies in package.json.
If not, suggest: npm install -D @ijonis/geo-lintFull directory sweep with parallel subagent fixing.
Run the linter:
npx geo-lint --format=json
Parse the JSON array. If empty [], report "All content clean. Zero violations." Stop.
Group violations by the file field. Each unique value is one content piece.
Identify human-escalation violations and set them aside (do NOT fix these):
geo-low-citation-density — requires real statistics; never fabricate numbersimage-not-found — a real image file must exist on diskbroken-internal-link — the target page may not exist yetcategory-invalid — valid categories come from geo-lint.config.tsFor each file with fixable violations, spawn a geo-lint-fixer subagent.
Pass each subagent:
file field)If more than 20 files have violations, batch into waves of 5-10.
After all subagents complete, run a final full lint:
npx geo-lint --format=json
Report summary:
Single file fix loop. The slug follows the format from $ARGUMENTS after "fix".
Resolve the file path. The violation file field uses the format
<contentType>/<slug> (e.g., blog/my-post). Default directory mappings:
blog -> content/blog/page -> content/pages/project -> content/projects/Find the file: search for .mdx or .md files matching the slug:
find content/ -name "*.mdx" -o -name "*.md" | head -50
Then grep for the matching slug in frontmatter if needed.
Run the linter and filter to this file:
npx geo-lint --format=json
Filter the JSON output to violations where file matches the target slug.
If no violations, report the file is clean. Stop.
Set aside human-escalation violations (see list above).
Fix all fixable violations in one edit pass:
suggestion fielderror severity items first, then warningRe-run the linter and filter to this file again.
If violations remain, repeat from step 5. Maximum 5 iterations.
Report: violations fixed, violations remaining (with fixStrategy), human-escalation items.
Display the rule catalog.
Run: npx geo-lint --rules
Parse the JSON output.
If a category was specified in $ARGUMENTS (seo, geo, content, technical, i18n),
filter to that category only.
Format as a markdown table grouped by category:
| Rule | Severity | Fix Strategy |
|---|
Show summary counts: "92 rules total: 35 GEO, 32 SEO, 14 content, 8 technical, 3 i18n"
Scaffold a geo-lint.config.ts for a new project.
Check if config already exists. If yes, ask the user whether to overwrite.
Auto-detect project structure:
content/, src/content/, posts/, blog/, pages/public/images/, static/images/, assets/images/package.json homepage field for siteUrlGenerate geo-lint.config.ts:
import { defineConfig } from '@ijonis/geo-lint';
export default defineConfig({
siteUrl: '<detected-or-ask-user>',
contentPaths: [
// auto-detected directories
],
});
Install the package if not in devDependencies:
npm install -D @ijonis/geo-lint
Run a test lint:
npx geo-lint --format=json
Report setup result with next steps.
Generate a health summary without fixing anything.
npx geo-lint --format=jsonFor the full rule catalog, fix patterns, and slug resolution details, see reference.md.