@olegkoval/agent-skills 1.0.1 → 1.2.0
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/.claude-plugin/plugin.json +4 -2
- package/.cursor-plugin/index.json +10 -0
- package/README.md +3 -2
- package/catalog/skills.json +44 -0
- package/collections/marketing.json +2 -2
- package/collections/software-development.json +1 -0
- package/package.json +1 -1
- package/packages/marketing/search-console-indexing-audit/SKILL.md +64 -0
- package/packages/marketing/search-console-indexing-audit/adapters/claude/plugin.json +5 -0
- package/packages/marketing/search-console-indexing-audit/adapters/claude/skills/search-console-indexing-audit/SKILL.md +66 -0
- package/packages/marketing/search-console-indexing-audit/adapters/claude/skills/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/marketing/search-console-indexing-audit/adapters/codex/README.md +3 -0
- package/packages/marketing/search-console-indexing-audit/adapters/cursor/plugin.json +6 -0
- package/packages/marketing/search-console-indexing-audit/adapters/cursor/skills/search-console-indexing-audit/SKILL.md +66 -0
- package/packages/marketing/search-console-indexing-audit/adapters/cursor/skills/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/marketing/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/software-development/open-source-publisher/SKILL.md +289 -0
- package/packages/software-development/open-source-publisher/adapters/claude/plugin.json +5 -0
- package/packages/software-development/open-source-publisher/adapters/claude/skills/open-source-publisher/SKILL.md +291 -0
- package/packages/software-development/open-source-publisher/adapters/codex/README.md +3 -0
- package/packages/software-development/open-source-publisher/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/open-source-publisher/adapters/cursor/skills/open-source-publisher/SKILL.md +291 -0
- package/packages/software-development/open-source-publisher/agents/openai.yaml +4 -0
- package/scripts/build-adapters.sh +13 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "olko-agent-skills",
|
|
3
3
|
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools.",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Oleg Koval"
|
|
7
7
|
},
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
"./packages/software-development/promptctl",
|
|
19
19
|
"./packages/music/fill-music-player",
|
|
20
20
|
"./packages/software-development/product-builder",
|
|
21
|
-
"./packages/
|
|
21
|
+
"./packages/software-development/open-source-publisher",
|
|
22
|
+
"./packages/marketing/viral-launch",
|
|
23
|
+
"./packages/marketing/search-console-indexing-audit"
|
|
22
24
|
]
|
|
23
25
|
}
|
|
@@ -46,10 +46,20 @@
|
|
|
46
46
|
"source": "./packages/software-development/product-builder/adapters/cursor",
|
|
47
47
|
"description": "Build a full-stack web application or SaaS product from a user description using production-oriented defaults."
|
|
48
48
|
},
|
|
49
|
+
{
|
|
50
|
+
"name": "olko:open-source-publisher",
|
|
51
|
+
"source": "./packages/software-development/open-source-publisher/adapters/cursor",
|
|
52
|
+
"description": "Prepare an open-source repository for public publishing with a minimal icon, social preview image, GitHub Pages site, README standardization, CI/CD checks, release hygiene, and optional donation setup."
|
|
53
|
+
},
|
|
49
54
|
{
|
|
50
55
|
"name": "olko:viral-launch",
|
|
51
56
|
"source": "./packages/marketing/viral-launch/adapters/cursor",
|
|
52
57
|
"description": "Set up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "olko:search-console-indexing-audit",
|
|
61
|
+
"source": "./packages/marketing/search-console-indexing-audit/adapters/cursor",
|
|
62
|
+
"description": "Analyze Google Search Console Coverage CSV exports and correlate them with sitemap, robots, canonical, redirect, and noindex signals."
|
|
53
63
|
}
|
|
54
64
|
]
|
|
55
65
|
}
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools.</strong></p>
|
|
4
4
|
<p>
|
|
5
5
|
<img src="https://img.shields.io/badge/license-MIT-16a34a" alt="MIT license">
|
|
6
|
-
<img src="https://img.shields.io/badge/skills-
|
|
6
|
+
<img src="https://img.shields.io/badge/skills-11-2563eb" alt="11 skills">
|
|
7
7
|
<img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Copilot-111827" alt="Codex Claude Cursor Copilot">
|
|
8
8
|
<img src="https://img.shields.io/badge/status-public%20catalog-16a34a" alt="Public catalog">
|
|
9
9
|
</p>
|
|
@@ -116,7 +116,7 @@ packages/{category}/{skill}/adapters/
|
|
|
116
116
|
|
|
117
117
|
</details>
|
|
118
118
|
|
|
119
|
-
## All
|
|
119
|
+
## All 11 Skills
|
|
120
120
|
|
|
121
121
|
These packages are the entry points. Each one is a structured workflow with concrete trigger conditions and execution steps. You can reference any skill directly by its `olko:*` lookup name.
|
|
122
122
|
|
|
@@ -143,6 +143,7 @@ These packages are the entry points. Each one is a structured workflow with conc
|
|
|
143
143
|
| Skill | What It Does | Use When |
|
|
144
144
|
|-------|-------------|----------|
|
|
145
145
|
| [viral-launch](packages/marketing/viral-launch/SKILL.md) | Sets up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops | Preparing a repo, product, open-source package, waitlist, or creator tool for public launch |
|
|
146
|
+
| [search-console-indexing-audit](packages/marketing/search-console-indexing-audit/SKILL.md) | Audits Google Search Console Coverage exports against sitemap, robots, canonical, redirect, and noindex signals | Diagnosing GSC indexing issues such as redirects, canonical alternates, and discovered but not indexed pages |
|
|
146
147
|
|
|
147
148
|
### Photography
|
|
148
149
|
|
package/catalog/skills.json
CHANGED
|
@@ -177,6 +177,29 @@
|
|
|
177
177
|
"copilot"
|
|
178
178
|
]
|
|
179
179
|
},
|
|
180
|
+
{
|
|
181
|
+
"name": "open-source-publisher",
|
|
182
|
+
"lookupName": "olko:open-source-publisher",
|
|
183
|
+
"category": "software-development",
|
|
184
|
+
"path": "packages/software-development/open-source-publisher",
|
|
185
|
+
"description": "Prepare an open-source repository for public publishing with a minimal icon, social preview image, GitHub Pages site, README standardization, CI/CD checks, release hygiene, and optional donation setup.",
|
|
186
|
+
"tags": [
|
|
187
|
+
"open-source",
|
|
188
|
+
"github",
|
|
189
|
+
"readme",
|
|
190
|
+
"branding",
|
|
191
|
+
"github-pages",
|
|
192
|
+
"ci",
|
|
193
|
+
"release",
|
|
194
|
+
"social-image"
|
|
195
|
+
],
|
|
196
|
+
"adapters": [
|
|
197
|
+
"codex",
|
|
198
|
+
"claude",
|
|
199
|
+
"cursor",
|
|
200
|
+
"copilot"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
180
203
|
{
|
|
181
204
|
"name": "viral-launch",
|
|
182
205
|
"lookupName": "olko:viral-launch",
|
|
@@ -197,6 +220,27 @@
|
|
|
197
220
|
"cursor",
|
|
198
221
|
"copilot"
|
|
199
222
|
]
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"name": "search-console-indexing-audit",
|
|
226
|
+
"lookupName": "olko:search-console-indexing-audit",
|
|
227
|
+
"category": "marketing",
|
|
228
|
+
"path": "packages/marketing/search-console-indexing-audit",
|
|
229
|
+
"description": "Analyze Google Search Console Coverage CSV exports and correlate them with sitemap, robots, canonical, redirect, and noindex signals.",
|
|
230
|
+
"tags": [
|
|
231
|
+
"seo",
|
|
232
|
+
"google-search-console",
|
|
233
|
+
"indexing",
|
|
234
|
+
"sitemap",
|
|
235
|
+
"canonical",
|
|
236
|
+
"robots"
|
|
237
|
+
],
|
|
238
|
+
"adapters": [
|
|
239
|
+
"codex",
|
|
240
|
+
"claude",
|
|
241
|
+
"cursor",
|
|
242
|
+
"copilot"
|
|
243
|
+
]
|
|
200
244
|
}
|
|
201
245
|
]
|
|
202
246
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "marketing",
|
|
3
|
-
"description": "Skills for project marketing, public launches, positioning, and shareable growth workflows.",
|
|
4
|
-
"packages": ["viral-launch"]
|
|
3
|
+
"description": "Skills for project marketing, public launches, positioning, SEO, indexing, and shareable growth workflows.",
|
|
4
|
+
"packages": ["viral-launch", "search-console-indexing-audit"]
|
|
5
5
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
name: search-console-indexing-audit
|
|
4
|
+
description: Analyze Google Search Console Coverage or indexing CSV exports and correlate them with repo and live-site SEO signals. Use for Chart.csv, Metadata.csv, Critical issues.csv, Non-critical issues.csv, sitemap/robots/canonical indexing problems, "Discovered - currently not indexed", redirect indexing buckets, or requests to fix Google indexing coverage.
|
|
5
|
+
metadata:
|
|
6
|
+
author: Oleg Koval
|
|
7
|
+
tags:
|
|
8
|
+
- seo
|
|
9
|
+
- google-search-console
|
|
10
|
+
- indexing
|
|
11
|
+
- sitemap
|
|
12
|
+
- canonical
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# search-console-indexing-audit
|
|
17
|
+
|
|
18
|
+
Use this skill to turn Google Search Console Coverage exports into a concrete indexing fix plan.
|
|
19
|
+
|
|
20
|
+
## Workflow
|
|
21
|
+
|
|
22
|
+
1. Read the export directory first:
|
|
23
|
+
- `Chart.csv` for indexed/not-indexed trend and impressions
|
|
24
|
+
- `Metadata.csv` for property context such as sitemap scope
|
|
25
|
+
- `Critical issues.csv` and `Non-critical issues.csv` for issue buckets
|
|
26
|
+
2. Run the summarizer when the standard CSV files are present:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir>
|
|
30
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir> --json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
3. Inspect the target repo for SEO sources of truth:
|
|
34
|
+
- sitemap generation and whether listed URLs are canonical, indexable HTML pages
|
|
35
|
+
- robots rules, sitemap URL, and host hints
|
|
36
|
+
- canonical metadata, `metadataBase`, Open Graph URL base, and per-route `noindex`
|
|
37
|
+
- redirects across apex/www, http/https, trailing slash, moved routes, and legacy paths
|
|
38
|
+
4. Check live URLs when network access is available:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
curl -sS -I https://example.com/sitemap.xml
|
|
42
|
+
curl -sS https://example.com/sitemap.xml
|
|
43
|
+
curl -sS https://example.com/robots.txt
|
|
44
|
+
curl -sS https://example.com/page | rg -o '<link rel="canonical"[^>]*>|<meta name="robots"[^>]*>'
|
|
45
|
+
curl -sS -I -L --max-redirs 5 https://example.com/page
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
5. Map GSC buckets to fixes:
|
|
49
|
+
- `Page with redirect`: remove redirected URLs from sitemap and canonicals; submit only final 200 URLs.
|
|
50
|
+
- `Redirect error`: inspect redirect chains, protocol/host loops, blocked destinations, and non-200 final responses.
|
|
51
|
+
- `Alternate page with proper canonical tag`: usually acceptable; verify sitemap does not include alternates.
|
|
52
|
+
- `Discovered - currently not indexed`: improve crawl signals first: clean sitemap, canonical consistency, internal links, content quality, stable 200 responses, and lastmod accuracy.
|
|
53
|
+
- `Excluded by noindex`: verify it is intentional and keep those URLs out of sitemap.
|
|
54
|
+
|
|
55
|
+
## Output
|
|
56
|
+
|
|
57
|
+
Report:
|
|
58
|
+
|
|
59
|
+
- Export summary: date range, indexed/not-indexed trend, issue buckets, and limitations.
|
|
60
|
+
- Likely root cause, with evidence from files or live HTTP responses.
|
|
61
|
+
- Prioritized fixes, smallest reliable change first.
|
|
62
|
+
- Verification steps for local tests, build, live sitemap/robots/canonical checks, and Search Console validation.
|
|
63
|
+
|
|
64
|
+
Call out when the export is aggregate-only and does not contain affected URL examples. Do not infer exact URLs unless the CSVs or live sitemap provide them.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
name: search-console-indexing-audit
|
|
6
|
+
description: Analyze Google Search Console Coverage or indexing CSV exports and correlate them with repo and live-site SEO signals. Use for Chart.csv, Metadata.csv, Critical issues.csv, Non-critical issues.csv, sitemap/robots/canonical indexing problems, "Discovered - currently not indexed", redirect indexing buckets, or requests to fix Google indexing coverage.
|
|
7
|
+
metadata:
|
|
8
|
+
author: Oleg Koval
|
|
9
|
+
tags:
|
|
10
|
+
- seo
|
|
11
|
+
- google-search-console
|
|
12
|
+
- indexing
|
|
13
|
+
- sitemap
|
|
14
|
+
- canonical
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# search-console-indexing-audit
|
|
19
|
+
|
|
20
|
+
Use this skill to turn Google Search Console Coverage exports into a concrete indexing fix plan.
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
1. Read the export directory first:
|
|
25
|
+
- `Chart.csv` for indexed/not-indexed trend and impressions
|
|
26
|
+
- `Metadata.csv` for property context such as sitemap scope
|
|
27
|
+
- `Critical issues.csv` and `Non-critical issues.csv` for issue buckets
|
|
28
|
+
2. Run the summarizer when the standard CSV files are present:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir>
|
|
32
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir> --json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. Inspect the target repo for SEO sources of truth:
|
|
36
|
+
- sitemap generation and whether listed URLs are canonical, indexable HTML pages
|
|
37
|
+
- robots rules, sitemap URL, and host hints
|
|
38
|
+
- canonical metadata, `metadataBase`, Open Graph URL base, and per-route `noindex`
|
|
39
|
+
- redirects across apex/www, http/https, trailing slash, moved routes, and legacy paths
|
|
40
|
+
4. Check live URLs when network access is available:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
curl -sS -I https://example.com/sitemap.xml
|
|
44
|
+
curl -sS https://example.com/sitemap.xml
|
|
45
|
+
curl -sS https://example.com/robots.txt
|
|
46
|
+
curl -sS https://example.com/page | rg -o '<link rel="canonical"[^>]*>|<meta name="robots"[^>]*>'
|
|
47
|
+
curl -sS -I -L --max-redirs 5 https://example.com/page
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
5. Map GSC buckets to fixes:
|
|
51
|
+
- `Page with redirect`: remove redirected URLs from sitemap and canonicals; submit only final 200 URLs.
|
|
52
|
+
- `Redirect error`: inspect redirect chains, protocol/host loops, blocked destinations, and non-200 final responses.
|
|
53
|
+
- `Alternate page with proper canonical tag`: usually acceptable; verify sitemap does not include alternates.
|
|
54
|
+
- `Discovered - currently not indexed`: improve crawl signals first: clean sitemap, canonical consistency, internal links, content quality, stable 200 responses, and lastmod accuracy.
|
|
55
|
+
- `Excluded by noindex`: verify it is intentional and keep those URLs out of sitemap.
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
Report:
|
|
60
|
+
|
|
61
|
+
- Export summary: date range, indexed/not-indexed trend, issue buckets, and limitations.
|
|
62
|
+
- Likely root cause, with evidence from files or live HTTP responses.
|
|
63
|
+
- Prioritized fixes, smallest reliable change first.
|
|
64
|
+
- Verification steps for local tests, build, live sitemap/robots/canonical checks, and Search Console validation.
|
|
65
|
+
|
|
66
|
+
Call out when the export is aggregate-only and does not contain affected URL examples. Do not infer exact URLs unless the CSVs or live sitemap provide them.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Summarize Google Search Console Coverage CSV exports."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import csv
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
STANDARD_FILES = {
|
|
14
|
+
"chart": "Chart.csv",
|
|
15
|
+
"metadata": "Metadata.csv",
|
|
16
|
+
"critical": "Critical issues.csv",
|
|
17
|
+
"non_critical": "Non-critical issues.csv",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def read_rows(path: Path) -> list[dict[str, str]]:
|
|
22
|
+
if not path.exists():
|
|
23
|
+
return []
|
|
24
|
+
with path.open(newline="", encoding="utf-8-sig") as handle:
|
|
25
|
+
return [
|
|
26
|
+
{key: (value or "").strip() for key, value in row.items()}
|
|
27
|
+
for row in csv.DictReader(handle)
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def int_or_none(value: str) -> int | None:
|
|
32
|
+
if value == "":
|
|
33
|
+
return None
|
|
34
|
+
try:
|
|
35
|
+
return int(value.replace(",", ""))
|
|
36
|
+
except ValueError:
|
|
37
|
+
return None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def chart_summary(rows: list[dict[str, str]]) -> dict[str, Any]:
|
|
41
|
+
points = []
|
|
42
|
+
for row in rows:
|
|
43
|
+
points.append(
|
|
44
|
+
{
|
|
45
|
+
"date": row.get("Date", ""),
|
|
46
|
+
"not_indexed": int_or_none(row.get("Not indexed", "")),
|
|
47
|
+
"indexed": int_or_none(row.get("Indexed", "")),
|
|
48
|
+
"impressions": int_or_none(row.get("Impressions", "")),
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
indexed_points = [
|
|
53
|
+
point for point in points if point["indexed"] is not None or point["not_indexed"] is not None
|
|
54
|
+
]
|
|
55
|
+
first = indexed_points[0] if indexed_points else None
|
|
56
|
+
last = indexed_points[-1] if indexed_points else None
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
"date_range": [points[0]["date"], points[-1]["date"]] if points else None,
|
|
60
|
+
"first_indexing_point": first,
|
|
61
|
+
"latest_indexing_point": last,
|
|
62
|
+
"indexed_delta": None if not first or not last else (last["indexed"] or 0) - (first["indexed"] or 0),
|
|
63
|
+
"not_indexed_delta": None
|
|
64
|
+
if not first or not last
|
|
65
|
+
else (last["not_indexed"] or 0) - (first["not_indexed"] or 0),
|
|
66
|
+
"impressions_total": sum(point["impressions"] or 0 for point in points),
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def issue_summary(rows: list[dict[str, str]]) -> list[dict[str, Any]]:
|
|
71
|
+
issues = []
|
|
72
|
+
for row in rows:
|
|
73
|
+
reason = row.get("Reason", "")
|
|
74
|
+
if not reason:
|
|
75
|
+
continue
|
|
76
|
+
issues.append(
|
|
77
|
+
{
|
|
78
|
+
"reason": reason,
|
|
79
|
+
"source": row.get("Source", ""),
|
|
80
|
+
"validation": row.get("Validation", ""),
|
|
81
|
+
"pages": int_or_none(row.get("Pages", "")) or 0,
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
return sorted(issues, key=lambda issue: issue["pages"], reverse=True)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def load_export(export_dir: Path) -> dict[str, Any]:
|
|
88
|
+
files = {key: export_dir / filename for key, filename in STANDARD_FILES.items()}
|
|
89
|
+
metadata_rows = read_rows(files["metadata"])
|
|
90
|
+
return {
|
|
91
|
+
"export_dir": str(export_dir),
|
|
92
|
+
"metadata": {row.get("Property", ""): row.get("Value", "") for row in metadata_rows},
|
|
93
|
+
"chart": chart_summary(read_rows(files["chart"])),
|
|
94
|
+
"critical_issues": issue_summary(read_rows(files["critical"])),
|
|
95
|
+
"non_critical_issues": issue_summary(read_rows(files["non_critical"])),
|
|
96
|
+
"missing_files": [filename for filename in STANDARD_FILES.values() if not (export_dir / filename).exists()],
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def print_markdown(summary: dict[str, Any]) -> None:
|
|
101
|
+
chart = summary["chart"]
|
|
102
|
+
latest = chart["latest_indexing_point"] or {}
|
|
103
|
+
print("# Search Console Coverage Summary")
|
|
104
|
+
print()
|
|
105
|
+
print(f"- Export: `{summary['export_dir']}`")
|
|
106
|
+
if chart["date_range"]:
|
|
107
|
+
print(f"- Date range: {chart['date_range'][0]} to {chart['date_range'][1]}")
|
|
108
|
+
print(f"- Latest indexed: {latest.get('indexed', 'n/a')}")
|
|
109
|
+
print(f"- Latest not indexed: {latest.get('not_indexed', 'n/a')}")
|
|
110
|
+
print(f"- Total impressions in chart: {chart['impressions_total']}")
|
|
111
|
+
if summary["metadata"]:
|
|
112
|
+
print(f"- Metadata: {summary['metadata']}")
|
|
113
|
+
if summary["missing_files"]:
|
|
114
|
+
print(f"- Missing standard files: {', '.join(summary['missing_files'])}")
|
|
115
|
+
|
|
116
|
+
for label, issues in (
|
|
117
|
+
("Critical Issues", summary["critical_issues"]),
|
|
118
|
+
("Non-Critical Issues", summary["non_critical_issues"]),
|
|
119
|
+
):
|
|
120
|
+
print()
|
|
121
|
+
print(f"## {label}")
|
|
122
|
+
if not issues:
|
|
123
|
+
print("- None reported")
|
|
124
|
+
continue
|
|
125
|
+
for issue in issues:
|
|
126
|
+
print(
|
|
127
|
+
f"- {issue['reason']}: {issue['pages']} pages"
|
|
128
|
+
f" ({issue['source']}, validation: {issue['validation']})"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
print()
|
|
132
|
+
print("## Notes")
|
|
133
|
+
print("- Standard Coverage exports are aggregate reports; they may not include affected URL examples.")
|
|
134
|
+
print("- Redirect and canonical buckets should be checked against sitemap URLs and live canonical tags.")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def main() -> None:
|
|
138
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
139
|
+
parser.add_argument("export_dir", type=Path)
|
|
140
|
+
parser.add_argument("--json", action="store_true", help="Print machine-readable JSON")
|
|
141
|
+
args = parser.parse_args()
|
|
142
|
+
|
|
143
|
+
summary = load_export(args.export_dir)
|
|
144
|
+
if args.json:
|
|
145
|
+
print(json.dumps(summary, indent=2, sort_keys=True))
|
|
146
|
+
else:
|
|
147
|
+
print_markdown(summary)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
if __name__ == "__main__":
|
|
151
|
+
main()
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
name: search-console-indexing-audit
|
|
6
|
+
description: Analyze Google Search Console Coverage or indexing CSV exports and correlate them with repo and live-site SEO signals. Use for Chart.csv, Metadata.csv, Critical issues.csv, Non-critical issues.csv, sitemap/robots/canonical indexing problems, "Discovered - currently not indexed", redirect indexing buckets, or requests to fix Google indexing coverage.
|
|
7
|
+
metadata:
|
|
8
|
+
author: Oleg Koval
|
|
9
|
+
tags:
|
|
10
|
+
- seo
|
|
11
|
+
- google-search-console
|
|
12
|
+
- indexing
|
|
13
|
+
- sitemap
|
|
14
|
+
- canonical
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# search-console-indexing-audit
|
|
19
|
+
|
|
20
|
+
Use this skill to turn Google Search Console Coverage exports into a concrete indexing fix plan.
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
1. Read the export directory first:
|
|
25
|
+
- `Chart.csv` for indexed/not-indexed trend and impressions
|
|
26
|
+
- `Metadata.csv` for property context such as sitemap scope
|
|
27
|
+
- `Critical issues.csv` and `Non-critical issues.csv` for issue buckets
|
|
28
|
+
2. Run the summarizer when the standard CSV files are present:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir>
|
|
32
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir> --json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. Inspect the target repo for SEO sources of truth:
|
|
36
|
+
- sitemap generation and whether listed URLs are canonical, indexable HTML pages
|
|
37
|
+
- robots rules, sitemap URL, and host hints
|
|
38
|
+
- canonical metadata, `metadataBase`, Open Graph URL base, and per-route `noindex`
|
|
39
|
+
- redirects across apex/www, http/https, trailing slash, moved routes, and legacy paths
|
|
40
|
+
4. Check live URLs when network access is available:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
curl -sS -I https://example.com/sitemap.xml
|
|
44
|
+
curl -sS https://example.com/sitemap.xml
|
|
45
|
+
curl -sS https://example.com/robots.txt
|
|
46
|
+
curl -sS https://example.com/page | rg -o '<link rel="canonical"[^>]*>|<meta name="robots"[^>]*>'
|
|
47
|
+
curl -sS -I -L --max-redirs 5 https://example.com/page
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
5. Map GSC buckets to fixes:
|
|
51
|
+
- `Page with redirect`: remove redirected URLs from sitemap and canonicals; submit only final 200 URLs.
|
|
52
|
+
- `Redirect error`: inspect redirect chains, protocol/host loops, blocked destinations, and non-200 final responses.
|
|
53
|
+
- `Alternate page with proper canonical tag`: usually acceptable; verify sitemap does not include alternates.
|
|
54
|
+
- `Discovered - currently not indexed`: improve crawl signals first: clean sitemap, canonical consistency, internal links, content quality, stable 200 responses, and lastmod accuracy.
|
|
55
|
+
- `Excluded by noindex`: verify it is intentional and keep those URLs out of sitemap.
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
Report:
|
|
60
|
+
|
|
61
|
+
- Export summary: date range, indexed/not-indexed trend, issue buckets, and limitations.
|
|
62
|
+
- Likely root cause, with evidence from files or live HTTP responses.
|
|
63
|
+
- Prioritized fixes, smallest reliable change first.
|
|
64
|
+
- Verification steps for local tests, build, live sitemap/robots/canonical checks, and Search Console validation.
|
|
65
|
+
|
|
66
|
+
Call out when the export is aggregate-only and does not contain affected URL examples. Do not infer exact URLs unless the CSVs or live sitemap provide them.
|