← AEOTesterCONTENT HISTORY

Update to AEOTester

Snapshot Oct 24, 2026 · 13:55 UTC · version 0.3.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save AEOTester and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Apply AEOTester AI SEO fixes in the current repo - JSON-LD schema markup, llms.txt, robots.txt AI crawler rules, Content Signals, meta and social tags, heading hierarchy, language and viewport tags. Shows a diff and asks before writing anything, then re-audits to show the score change.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 390
    },
    {
      "relative_path": "references/fix-recipes/agent-readiness.controls.md",
      "size_in_bytes": 3834
    },
    {
      "relative_path": "references/fix-recipes/agent-readiness.markdown.md",
      "size_in_bytes": 4430
    },
    {
      "relative_path": "references/fix-recipes/agent-readiness.protocols.md",
      "size_in_bytes": 4090
    },
    {
      "relative_path": "references/fix-recipes/agent-readiness.server-rendered.md",
      "size_in_bytes": 3890
    },
    {
      "relative_path": "references/fix-recipes/ai-access.bot-crawlability.md",
      "size_in_bytes": 3607
    },
    {
      "relative_path": "references/fix-recipes/ai-access.content-signals.md",
      "size_in_bytes": 3110
    },
    {
      "relative_path": "references/fix-recipes/ai-access.llms-txt.md",
      "size_in_bytes": 3229
    },
    {
      "relative_path": "references/fix-recipes/content.accessibility.md",
      "size_in_bytes": 3279
    },
    {
      "relative_path": "references/fix-recipes/content.author.md",
      "size_in_bytes": 3907
    },
    {
      "relative_path": "references/fix-recipes/content.freshness.md",
      "size_in_bytes": 3565
    },
    {
      "relative_path": "references/fix-recipes/content.headings.md",
      "size_in_bytes": 3372
    },
    {
      "relative_path": "references/fix-recipes/content.image-alt.md",
      "size_in_bytes": 3215
    },
    {
      "relative_path": "references/fix-recipes/content.internal-links.md",
      "size_in_bytes": 3059
    },
    {
      "relative_path": "references/fix-recipes/content.quality.md",
      "size_in_bytes": 3199
    },
    {
      "relative_path": "references/fix-recipes/crawlability.http-behavior.md",
      "size_in_bytes": 3274
    },
    {
      "relative_path": "references/fix-recipes/crawlability.https.md",
      "size_in_bytes": 2977
    },
    {
      "relative_path": "references/fix-recipes/crawlability.indexability.md",
      "size_in_bytes": 4384
    },
    {
      "relative_path": "references/fix-recipes/crawlability.sitemap.md",
      "size_in_bytes": 3020
    },
    {
      "relative_path": "references/fix-recipes/meta.description.md",
      "size_in_bytes": 3359
    },
    {
      "relative_path": "references/fix-recipes/meta.language.md",
      "size_in_bytes": 2571
    },
    {
      "relative_path": "references/fix-recipes/meta.open-graph.md",
      "size_in_bytes": 3325
    },
    {
      "relative_path": "references/fix-recipes/meta.title.md",
      "size_in_bytes": 2076
    },
    {
      "relative_path": "references/fix-recipes/meta.twitter-cards.md",
      "size_in_bytes": 2882
    },
    {
      "relative_path": "references/fix-recipes/meta.viewport.md",
      "size_in_bytes": 2554
    },
    {
      "relative_path": "references/fix-recipes/structured-data.present.md",
      "size_in_bytes": 5014
    },
    {
      "relative_path": "references/fix-recipes/structured-data.valid.md",
      "size_in_bytes": 3523
    },
    {
      "relative_path": "scripts/generate-llms-txt.mjs",
      "size_in_bytes": 4125
    },
    {
      "relative_path": "scripts/page-facts.mjs",
      "size_in_bytes": 7471
    }
  ],
  "name": "fix",
  "skill_md_contents": "---\nname: fix\ndescription: Apply AEOTester AI SEO fixes in the current repo - JSON-LD schema markup, llms.txt, robots.txt AI crawler rules, Content Signals, meta and social tags, heading hierarchy, language and viewport tags. Shows a diff and asks before writing anything, then re-audits to show the score change.\nargument-hint: \"[check-id ...] [--yes]\"\ndisable-model-invocation: true\nallowed-tools: Read, Glob, Grep, AskUserQuestion, Bash(node --version), Bash(node ${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/audit.mjs:*), Bash(node ${CLAUDE_PLUGIN_ROOT}/skills/fix/scripts/page-facts.mjs:*), Bash(node ${CLAUDE_PLUGIN_ROOT}/skills/fix/scripts/generate-llms-txt.mjs:*)\n---\n\n# AEOTester fix\n\nFixes the problems `/aeotester:audit` found, in the site's source files.\n\n## Other hosts (Codex, ChatGPT)\n\nThe commands below start with Claude Code's plugin-root variable. A host that does not substitute it (Codex, ChatGPT) leaves it as literal text: replace that prefix with the absolute path of the plugin root, which is the folder two levels above the folder that contains this SKILL.md (it holds `skills/`). Do the same for the skill-folder variable, which is the folder that contains this SKILL.md. Write the resolved path into the command; never run it with the variable unexpanded. Slash commands such as `/aeotester:audit` are Claude Code syntax: elsewhere the user asks for this skill by name or mention, and `$ARGUMENTS` means whatever folder, URL or flags their request names (leave it out if there are none). The scripts need Node 18+ and a shell, so the skill only works in a host that can run them.\n\n## Non-negotiable rules\n\n1. **Diff first, then ask.** Before the first Edit or Write, print every planned change as a unified diff in your reply and get the user's approval. `--yes` in the arguments means the user approved in advance: you skip the question, never the diffs. Print them first, then apply.\n2. **Never commit, push, stash or change git state.** Never delete files.\n3. **Only touch files inside the current repo.** Never edit build output (`dist/`, `_site/`, `out/`, `.next/`, Hugo's `public/`). Fix the source that produces it.\n4. **Never invent facts.** Names, people, job titles, credentials, prices, ratings, dates, addresses and social profiles come from the repo (`page-facts.mjs`) or from the user. If a fix needs a fact you do not have, ask, or skip that fix and say why.\n5. **Policy choices belong to the user:** which AI bots to allow, and the Content-Signal values (search, ai-input, ai-train). Propose a default and ask.\n6. **No network calls.**\n7. **Reference only assets that exist.** An `og:image`, logo or icon URL must point at a file in the repo (check with Glob) or one the page already uses.\n8. **Tools:** read files (recipes included) with Read, find them with Glob and Grep. Use Bash only for the `node` commands below, written exactly as shown (in Claude Code, an unquoted plugin path) so they match the pre-approved commands. Other shell commands may be denied, and a denied command does not mean `node` is unavailable.\n\n## Steps\n\n### 1. Audit\n\nCheck `node --version` (Node 18+ needed). Then run:\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/audit.mjs . --no-report --json -\n```\n\nNote the score as `total / available` (for example 71/127): `available` already leaves out checks that do not apply. Read `site.mode` and `site.stack.id`:\n\n- `report-only` (WordPress and other CMSs): stop. Content lives in the database; point the user to the fix list in `aeotester-report.md` (run `/aeotester:audit` first if it is missing). Do not edit files.\n- `needs-build`: ask whether to run the build command from `site.notes`. Only build if they agree, then audit again.\n- `nextjs`: every fix is assisted. Show the diffs as proposals and apply only the ones the user explicitly approves. Never use `--yes` shortcuts for Next.js.\n- `full`: continue.\n\n### 2. Choose what to fix\n\n- With check ids in the arguments: fix exactly those, auto or assisted.\n- Without: every check where `fixable` is `auto` and `lost` > 0, sorted by points lost. Skip `inconclusive` checks unless the finding is concrete.\n- List assisted checks that lost points at the end, as \"needs your input\", with the command to run them (`/aeotester:fix content.author`). Do not attempt them unasked.\n- Advice is not a fix list: checks with status `advice` (Content Signals) and `advice` entries cost no points and may be deliberate. Mention them once at the end as optional, with the command to apply one (`/aeotester:fix ai-access.content-signals`). Do not apply them unasked.\n- Never touch pages listed in `excludedPages`: they are kept out of search on purpose and were not scored. Do not remove their noindex or add schema, Open Graph or Twitter tags to them.\n\n### 3. Gather facts and recipes\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skills/fix/scripts/page-facts.mjs . [--pages file1.html,file2.html]\n```\n\nFor each chosen check, open its recipe with the Read tool: `${CLAUDE_SKILL_DIR}/references/fix-recipes/<check-id>.md`. Read every recipe for a check you are about to fix and follow it; read only those. For llms.txt, draft with:\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skills/fix/scripts/generate-llms-txt.mjs .\n```\n\nReview the draft before proposing it: drop weak lines (for example \"Click here to learn more\"), keep links useful.\n\n### 4. Find the source\n\nFor static HTML the flagged file is the source. For generated sites (Astro, Hugo, Eleventy, Vite, Next.js), findings point at built HTML; find the layout, partial, component or content file that produces it (Grep for the flagged text or tag). Prefer one change in a shared layout over the same change in many pages.\n\n### 5. Plan and show the diff\n\nPrepare all changes, then show them in one message, before any Edit or Write:\n\n1. A table: file | check | what changes | expected points.\n2. **One fenced `diff` block per file.** A table alone is not a diff. Use unified diff format with a few lines of context, for example:\n\n   ```diff\n   --- a/index.html\n   +++ b/index.html\n   @@ -3,4 +3,6 @@\n      <meta charset=\"utf-8\">\n   -  <title>Home</title>\n   +  <title>Visual bookmarks for research | InsightPins</title>\n   +  <meta name=\"description\" content=\"...\">\n   ```\n\n3. For new files (llms.txt), the full content in a fenced block.\n\nThen ask with AskUserQuestion (in a host without that tool, a plain question): **Apply all**, **Let me choose** (then ask per file or per check), or **Cancel**. With `--yes`, skip the question and apply, but only after the diffs are printed.\n\n### 6. Apply\n\nUse Edit for existing files (never rewrite a whole existing file with Write) and Write only for new files. Match the file's existing indentation and style. Apply only what the user approved.\n\n### 7. Re-audit and report\n\nAlways re-audit; a fix run is not finished without the after score.\n\nFor generated sites, ask whether to rebuild before re-auditing (a re-audit without a rebuild reads the old output). Then:\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/audit.mjs .\n```\n\nThis rewrites `aeotester-report.md`. Report in chat:\n\n- score before -> after as `total / available` with the percentage,\n- what was fixed, per check,\n- what was skipped and why,\n- assisted items still open,\n- a reminder that nothing was committed: review with `git diff`.\n"
}

SHA-256 of public snapshot: 334e9534816e9535db2fa1ac39bc8ffa69526e0610ab40caefc81ae138d54002