agricidaniel/claude-blog-blog-audit
> Full-site blog health assessment scanning all blog files for quality scores, orphan pages, topic cannibalization, stale content, and AI citation readiness. Runs canonical batch analysis before site-wide checks. Produces per-post scores and a prioritized action queue. Use when user says "audit blog", "blog audit", "site audit", "blog health", "audit all posts", "check all blogs".
npx skills add https://github.com/AgriciDaniel/claude-blog --skill blog-audit
Performs a comprehensive blog health assessment across all posts in the project.
Scans for quality scores, orphan pages, topic cannibalization, stale content,
and AI citation readiness. Uses the canonical analyzer JSON as the score source
and produces a prioritized action queue.
Scan the project for all blog content files:
.md, .mdx, .html, .astro, .svelte, .vue,.tsx, and .jsx in common blog directories and CMS export folders
content/posts/blog/src/content/_posts/pages/blog/articles/content/blog/**src/pages/blog/.git/,dot-directories, node_modules/, vendor/, dist/, build/, .next/,
coverage/, reports/, generated exports, README, CHANGELOG, LICENSE,
config files, SKILL.md, package files, .env*, keys, and private notes
If no blog files are found in standard locations, ask for an allow-listed root
or only search user-approved content directories. Do not scan the entire project
root by default.
Run canonical analyzer output first and use it as the source of per-post scores:
python3 scripts/analyze_blog.py <blog-root> --batch --format json
Process files in chunks, cap parallel follow-up work to a small fixed number,
respect context limits, and aggregate deterministic JSON with file, score,
categories, issues, and metadata. Layer the site-wide checks below on top
of analyzer JSON, not separate scoring rubrics.
not universal pass/fail thresholds
easier bands, professional content can be moderate, and technical content may
be denser when clarity remains high
must be visible and sourced
dateModified, lastUpdated, updated, and lastmod, includingtimezone-normalized generated schema, then require freshness parity
a universal day count
GPTBot, ClaudeBot, PerplexityBot, Googlebot, and Google-Extended policies
Add site-wide technical checks before final recommendations:
redirects, HTTP status codes, hreflang, and internal canonical consistency
blog-google when available for Core Web Vitals, GSC queries, URLInspection, indexing status, and GA4 context
SKIPPED: credentials unavailable
Analyze across all posts for keyword competition:
and intent modifiers
GSC query-to-URL data when available, and SERP overlap where available
preserving backlinks, validating a redirect map, and updating internal
links
Build and analyze the internal link graph:
same-domain absolutes, trailing slashes, generated routes, anchors, and slug
mappings
{ page -> [pages it links to] }{ page -> [pages linking to it] }based on topic relevance
Audit content freshness across all posts:
lastUpdated, dateModified, date, updatedAggregate all results into a comprehensive report:
## Blog Audit Report
**Audit Date:** [date]
**Total Posts:** N
**Average Score:** XX/100
### Health Overview
| Metric | Count |
|--------|-------|
| Posts Scoring 90+ (Excellent) | N |
| Posts Scoring 70-89 (Good) | N |
| Posts Scoring 50-69 (Needs Work) | N |
| Posts Scoring <50 (Poor) | N |
| Orphan Pages | N |
| Dead-End Pages | N |
| Cannibalization Issues | N |
| Stale or Decaying Content | N |
### Per-Post Scores
| Post | Score | Content | SEO | E-E-A-T | Technical | AI Citation | Issues |
|------|-------|---------|-----|---------|-----------|-------------|--------|
| [filename] | XX/100 | X/30 | X/25 | X/15 | X/15 | X/15 | [count] |
### Prioritized Action Queue (Lowest Score First)
| Priority | Post | Score | Top Issue | Recommended Action |
|----------|------|-------|-----------|--------------------|
| 1 | [file] | XX | [issue] | [action] |
| 2 | [file] | XX | [issue] | [action] |
### Topic Cannibalization
| Keyword | Competing Posts | Recommendation |
|---------|----------------|----------------|
| [keyword] | post-a.md, post-b.md | Merge / Redirect / Differentiate |
### Orphan Pages (No Inbound Links)
| Page | Inbound Links | Recommended Link Sources |
|------|---------------|--------------------------|
| [file] | 0 | post-a.md, post-b.md, post-c.md |
### Stale Content
| Post | Last Updated | Days Stale | Priority | Refresh Effort |
|------|-------------|------------|----------|----------------|
| [file] | [date] | [N] | High/Med/Low | Light/Moderate/Heavy |
Save timestamped Markdown and JSON exports under reports/, for example
reports/blog-audit-YYYY-MM-DD.md and reports/blog-audit-YYYY-MM-DD.json.
Do not overwrite a previous audit report.
After saving, inform the user:
[project-root]/reports/blog-audit-YYYY-MM-DD.md and[project-root]/reports/blog-audit-YYYY-MM-DD.json
/blog analyze <file> on the lowest-scoring post first/blog flow optimize for AI-citation SEO checks on key postsFor evidence-led audit prompts beyond this site-wide health pass, see /blog flow optimize (visibility, CTR, schema, extraction audits) and /blog flow win (dual-surface scorecard, conversion audit).
Take agricidaniel/claude-blog-blog-audit from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.