@olegkoval/agent-skills 1.17.0 → 1.18.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/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.grok-plugin/index.json +120 -0
- package/README.md +26 -3
- package/catalog/skills.json +46 -23
- package/package.json +3 -2
- package/packages/marketing/search-console-indexing-audit/adapters/grok/plugin.json +6 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/SKILL.md +69 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/marketing/viral-launch/adapters/grok/plugin.json +6 -0
- package/packages/marketing/viral-launch/adapters/grok/skills/viral-launch/SKILL.md +105 -0
- package/packages/music/fill-music-player/adapters/grok/plugin.json +6 -0
- package/packages/music/fill-music-player/adapters/grok/skills/fill-music-player/SKILL.md +111 -0
- package/packages/photography/gallery/adapters/grok/plugin.json +6 -0
- package/packages/photography/gallery/adapters/grok/skills/gallery/SKILL.md +237 -0
- package/packages/software-development/apple-store-submit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/apple-store-submit/adapters/grok/skills/apple-store-submit/SKILL.md +158 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/plugin.json +6 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/skills/cloudflare-block-countries/SKILL.md +177 -0
- package/packages/software-development/crash-course/adapters/grok/plugin.json +6 -0
- package/packages/software-development/crash-course/adapters/grok/skills/crash-course/SKILL.md +271 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/plugin.json +6 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/skills/docs-index-keeper/SKILL.md +65 -0
- package/packages/software-development/gh-cli/adapters/grok/plugin.json +6 -0
- package/packages/software-development/gh-cli/adapters/grok/skills/gh-cli/SKILL.md +2200 -0
- package/packages/software-development/git-commit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/git-commit/adapters/grok/skills/git-commit/SKILL.md +133 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/plugin.json +6 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/skills/macos-menubar-app/SKILL.md +238 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/plugin.json +6 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/skills/mvp-oneshot/SKILL.md +176 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/skills/obsidian-pr-sync/SKILL.md +154 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/skills/obsidian-task-rollover/SKILL.md +198 -0
- package/packages/software-development/open-source-publisher/adapters/grok/plugin.json +6 -0
- package/packages/software-development/open-source-publisher/adapters/grok/skills/open-source-publisher/SKILL.md +471 -0
- package/packages/software-development/product-builder/adapters/grok/plugin.json +6 -0
- package/packages/software-development/product-builder/adapters/grok/skills/product-builder/SKILL.md +224 -0
- package/packages/software-development/promptctl/adapters/grok/plugin.json +6 -0
- package/packages/software-development/promptctl/adapters/grok/skills/promptctl/SKILL.md +90 -0
- package/packages/software-development/relay/adapters/grok/plugin.json +6 -0
- package/packages/software-development/relay/adapters/grok/skills/relay/SKILL.md +117 -0
- package/packages/software-development/review-past-performance/adapters/grok/plugin.json +6 -0
- package/packages/software-development/review-past-performance/adapters/grok/skills/review-past-performance/SKILL.md +212 -0
- package/packages/software-development/self-critique/adapters/grok/plugin.json +6 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/SKILL.md +149 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/scripts/critique-nudge.mjs +57 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/plugin.json +6 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/SKILL.md +59 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/skills/skill-budget-audit/SKILL.md +146 -0
- package/packages/software-development/starter-rules/adapters/grok/plugin.json +6 -0
- package/packages/software-development/starter-rules/adapters/grok/skills/starter-rules/SKILL.md +73 -0
- package/scripts/build-adapters.sh +47 -4
- package/scripts/validate-catalog.sh +10 -0
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"name": "Oleg Koval"
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools."
|
|
7
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools."
|
|
8
8
|
},
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "olko-agent-skills",
|
|
12
12
|
"source": "./",
|
|
13
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools."
|
|
13
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools."
|
|
14
14
|
}
|
|
15
15
|
]
|
|
16
16
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "olko-agent-skills",
|
|
3
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools.",
|
|
4
|
-
"version": "1.
|
|
3
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools.",
|
|
4
|
+
"version": "1.17.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Oleg Koval"
|
|
7
7
|
},
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-skills",
|
|
3
|
+
"plugins": [
|
|
4
|
+
{
|
|
5
|
+
"name": "olko:self-critique",
|
|
6
|
+
"source": "./packages/software-development/self-critique/adapters/grok",
|
|
7
|
+
"description": "Adversarially critique your own last answer: spawn a critic agent that verifies claims against live sources, finds the related issue or pattern you missed, then loop until satisfied and report where you were wrong, iterations-to-satisfy, the numeric improvement, and a final score."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"name": "olko:docs-index-keeper",
|
|
11
|
+
"source": "./packages/software-development/docs-index-keeper/adapters/grok",
|
|
12
|
+
"description": "Keep a Markdown docs index in sync through pre-commit, CI, or one-off maintenance flows."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "olko:semantic-release-beta",
|
|
16
|
+
"source": "./packages/software-development/semantic-release-beta/adapters/grok",
|
|
17
|
+
"description": "Set up semantic-release-npm-github-publish with stable main releases and prerelease beta releases on a beta branch."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "olko:gh-cli",
|
|
21
|
+
"source": "./packages/software-development/gh-cli/adapters/grok",
|
|
22
|
+
"description": "Use the GitHub CLI effectively for repositories, PRs, Actions, releases, and more."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "olko:git-commit",
|
|
26
|
+
"source": "./packages/software-development/git-commit/adapters/grok",
|
|
27
|
+
"description": "Create conventional commits with diff-aware staging and message generation."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "olko:gallery",
|
|
31
|
+
"source": "./packages/photography/gallery/adapters/grok",
|
|
32
|
+
"description": "Create photo galleries with AI-assisted layout curation and sequencing."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "olko:promptctl",
|
|
36
|
+
"source": "./packages/software-development/promptctl/adapters/grok",
|
|
37
|
+
"description": "Use promptctl for template-based prompt engineering, scoring, and workflow automation."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "olko:fill-music-player",
|
|
41
|
+
"source": "./packages/music/fill-music-player/adapters/grok",
|
|
42
|
+
"description": "Fill a portable music player with a curated random selection from a source music library while balancing formats, artists, albums, and capacity."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "olko:product-builder",
|
|
46
|
+
"source": "./packages/software-development/product-builder/adapters/grok",
|
|
47
|
+
"description": "Build a full-stack web application or SaaS product from a user description using production-oriented defaults."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "olko:mvp-oneshot",
|
|
51
|
+
"source": "./packages/software-development/mvp-oneshot/adapters/grok",
|
|
52
|
+
"description": "Turn a rough product idea into a shippable one-week MVP in one pass via a four-role prompt chain: scope a build prompt, ruthlessly trim it, plan the build, and self-review the vertical slice."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "olko:starter-rules",
|
|
56
|
+
"source": "./packages/software-development/starter-rules/adapters/grok",
|
|
57
|
+
"description": "Load and enforce hard rules for every oleg-koval/* starter: 300-line files, E2E tests, pre-commit hooks, Vertical Slice architecture, no comments, KISS/DRY/SOLID."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "olko:review-past-performance",
|
|
61
|
+
"source": "./packages/software-development/review-past-performance/adapters/grok",
|
|
62
|
+
"description": "Self-improvement loop that pulls the last 24h of ICM memories, git history, and skill analytics to detect repeated mistakes, slow workflows, and missing coverage, then proposes 1-3 concrete improvements."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "olko:relay",
|
|
66
|
+
"source": "./packages/software-development/relay/adapters/grok",
|
|
67
|
+
"description": "Use claude-relay to run long or rate-limit-prone tasks autonomously across subscription accounts."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "olko:open-source-publisher",
|
|
71
|
+
"source": "./packages/software-development/open-source-publisher/adapters/grok",
|
|
72
|
+
"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, optional donation setup, and optional motion previews for generated static images."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "olko:viral-launch",
|
|
76
|
+
"source": "./packages/marketing/viral-launch/adapters/grok",
|
|
77
|
+
"description": "Set up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "olko:search-console-indexing-audit",
|
|
81
|
+
"source": "./packages/marketing/search-console-indexing-audit/adapters/grok",
|
|
82
|
+
"description": "Analyze Google Search Console Coverage CSV exports and correlate them with sitemap, robots, canonical, redirect, and noindex signals."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "olko:cloudflare-block-countries",
|
|
86
|
+
"source": "./packages/software-development/cloudflare-block-countries/adapters/grok",
|
|
87
|
+
"description": "Block specific countries via Cloudflare WAF Custom Rules using the Cloudflare API. Handles creating new rulesets and updating existing ones across single or multiple zones."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "olko:obsidian-pr-sync",
|
|
91
|
+
"source": "./packages/software-development/obsidian-pr-sync/adapters/grok",
|
|
92
|
+
"description": "Fetch open GitHub PRs assigned to you or requesting your review, and write a grouped, age-sorted '## PRs to review' section into today's Obsidian daily note. Idempotent — re-running replaces the section."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "olko:obsidian-task-rollover",
|
|
96
|
+
"source": "./packages/software-development/obsidian-task-rollover/adapters/grok",
|
|
97
|
+
"description": "Bullet-journal end-of-day task migration: copy unchecked tasks from today's Obsidian daily note to the next workday's note under '## Carried over', and mark them [>] in the source. Skips weekends, idempotent."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "olko:apple-store-submit",
|
|
101
|
+
"source": "./packages/software-development/apple-store-submit/adapters/grok",
|
|
102
|
+
"description": "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "olko:macos-menubar-app",
|
|
106
|
+
"source": "./packages/software-development/macos-menubar-app/adapters/grok",
|
|
107
|
+
"description": "Build a production-quality macOS menubar or notch app in SwiftUI — MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "olko:skill-budget-audit",
|
|
111
|
+
"source": "./packages/software-development/skill-budget-audit/adapters/grok",
|
|
112
|
+
"description": "Diagnose and fix Claude Code skill context budget overflow — identify heavy plugin bundles, remove domain-specific ones, and restore skill discoverability."
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "olko:crash-course",
|
|
116
|
+
"source": "./packages/software-development/crash-course/adapters/grok",
|
|
117
|
+
"description": "Expert tutor for rapid, source-grounded learning of any topic: a timed 4-hour sprint plus cheat-sheet, learning-ladder, quiz-me, Feynman, and resource-curation modes."
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
package/README.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1>agent skills</h1>
|
|
3
|
-
<p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Copilot, Windsurf, Kiro, and other skill-aware tools.</strong></p>
|
|
3
|
+
<p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, 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
6
|
<img src="https://img.shields.io/badge/skills-23-2563eb" alt="23 skills">
|
|
7
|
-
<img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro-111827" alt="Codex Claude Cursor Copilot Windsurf Kiro">
|
|
7
|
+
<img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Grok%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro-111827" alt="Codex Claude Cursor Grok Copilot Windsurf Kiro">
|
|
8
8
|
<img src="https://img.shields.io/badge/status-public%20catalog-16a34a" alt="Public catalog">
|
|
9
9
|
</p>
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
Agent-agnostic skill collection for Codex, Claude, Cursor, and other skill-aware tools.
|
|
12
|
+
Agent-agnostic skill collection for Codex, Claude, Cursor, Grok, and other skill-aware tools.
|
|
13
13
|
|
|
14
14
|
These skills are opinionated by design. They encode working defaults, preferred tools, and repeatable workflows instead of trying to be neutral snippets. Treat them as starting points with taste: useful out of the box, easy to inspect, and specific enough for an agent to execute consistently.
|
|
15
15
|
|
|
@@ -76,6 +76,27 @@ claude --plugin-dir /path/to/agent-skills
|
|
|
76
76
|
|
|
77
77
|
</details>
|
|
78
78
|
|
|
79
|
+
<details>
|
|
80
|
+
<summary><b>Grok</b></summary>
|
|
81
|
+
|
|
82
|
+
Grok (xAI) supports plugins via marketplace or direct path. Add this catalog as a marketplace source:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
grok plugin marketplace add oleg-koval/agent-skills
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Or for local development / direct use:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
grok agent --plugin-dir /path/to/agent-skills
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Skills are available via their `olko:*` names or through the installed plugin. Grok discovers `plugin.json` + `skills/` (and falls back to `.claude-plugin/` manifests for compatibility).
|
|
95
|
+
|
|
96
|
+
The repo generates `.grok-plugin/index.json` for structured plugin discovery.
|
|
97
|
+
|
|
98
|
+
</details>
|
|
99
|
+
|
|
79
100
|
<details>
|
|
80
101
|
<summary><b>Cursor</b></summary>
|
|
81
102
|
|
|
@@ -204,6 +225,7 @@ When adding or changing a skill:
|
|
|
204
225
|
| Claude Code | `.claude-plugin/marketplace.json` | Marketplace plugin registry |
|
|
205
226
|
| Claude Code | `.claude-plugin/plugin.json` | Plugin manifest |
|
|
206
227
|
| Cursor | `.cursor-plugin/index.json` | Plugin index |
|
|
228
|
+
| Grok | `.grok-plugin/index.json` | Plugin index (plus `.claude-plugin/` compatibility) |
|
|
207
229
|
| GitHub Copilot | `.github/copilot-instructions.md` | Repository instructions |
|
|
208
230
|
| GitHub Copilot | `.github/prompts/*.prompt.md` | Per-skill prompt files |
|
|
209
231
|
| Windsurf | `.windsurf/rules/*.md` | Cascade rules |
|
|
@@ -223,6 +245,7 @@ packages/{category}/{skill}/
|
|
|
223
245
|
├── codex/
|
|
224
246
|
├── claude/
|
|
225
247
|
├── cursor/
|
|
248
|
+
├── grok/
|
|
226
249
|
├── windsurf/
|
|
227
250
|
└── kiro/
|
|
228
251
|
```
|
package/catalog/skills.json
CHANGED
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"codex",
|
|
20
20
|
"claude",
|
|
21
21
|
"cursor",
|
|
22
|
-
"copilot"
|
|
22
|
+
"copilot",
|
|
23
|
+
"grok"
|
|
23
24
|
]
|
|
24
25
|
},
|
|
25
26
|
{
|
|
@@ -41,7 +42,8 @@
|
|
|
41
42
|
"cursor",
|
|
42
43
|
"copilot",
|
|
43
44
|
"windsurf",
|
|
44
|
-
"kiro"
|
|
45
|
+
"kiro",
|
|
46
|
+
"grok"
|
|
45
47
|
]
|
|
46
48
|
},
|
|
47
49
|
{
|
|
@@ -64,7 +66,8 @@
|
|
|
64
66
|
"cursor",
|
|
65
67
|
"copilot",
|
|
66
68
|
"windsurf",
|
|
67
|
-
"kiro"
|
|
69
|
+
"kiro",
|
|
70
|
+
"grok"
|
|
68
71
|
]
|
|
69
72
|
},
|
|
70
73
|
{
|
|
@@ -86,7 +89,8 @@
|
|
|
86
89
|
"cursor",
|
|
87
90
|
"copilot",
|
|
88
91
|
"windsurf",
|
|
89
|
-
"kiro"
|
|
92
|
+
"kiro",
|
|
93
|
+
"grok"
|
|
90
94
|
]
|
|
91
95
|
},
|
|
92
96
|
{
|
|
@@ -106,7 +110,8 @@
|
|
|
106
110
|
"cursor",
|
|
107
111
|
"copilot",
|
|
108
112
|
"windsurf",
|
|
109
|
-
"kiro"
|
|
113
|
+
"kiro",
|
|
114
|
+
"grok"
|
|
110
115
|
]
|
|
111
116
|
},
|
|
112
117
|
{
|
|
@@ -127,7 +132,8 @@
|
|
|
127
132
|
"cursor",
|
|
128
133
|
"copilot",
|
|
129
134
|
"windsurf",
|
|
130
|
-
"kiro"
|
|
135
|
+
"kiro",
|
|
136
|
+
"grok"
|
|
131
137
|
]
|
|
132
138
|
},
|
|
133
139
|
{
|
|
@@ -148,7 +154,8 @@
|
|
|
148
154
|
"cursor",
|
|
149
155
|
"copilot",
|
|
150
156
|
"windsurf",
|
|
151
|
-
"kiro"
|
|
157
|
+
"kiro",
|
|
158
|
+
"grok"
|
|
152
159
|
]
|
|
153
160
|
},
|
|
154
161
|
{
|
|
@@ -170,7 +177,8 @@
|
|
|
170
177
|
"cursor",
|
|
171
178
|
"copilot",
|
|
172
179
|
"windsurf",
|
|
173
|
-
"kiro"
|
|
180
|
+
"kiro",
|
|
181
|
+
"grok"
|
|
174
182
|
]
|
|
175
183
|
},
|
|
176
184
|
{
|
|
@@ -192,7 +200,8 @@
|
|
|
192
200
|
"cursor",
|
|
193
201
|
"copilot",
|
|
194
202
|
"windsurf",
|
|
195
|
-
"kiro"
|
|
203
|
+
"kiro",
|
|
204
|
+
"grok"
|
|
196
205
|
]
|
|
197
206
|
},
|
|
198
207
|
{
|
|
@@ -216,7 +225,8 @@
|
|
|
216
225
|
"cursor",
|
|
217
226
|
"copilot",
|
|
218
227
|
"windsurf",
|
|
219
|
-
"kiro"
|
|
228
|
+
"kiro",
|
|
229
|
+
"grok"
|
|
220
230
|
]
|
|
221
231
|
},
|
|
222
232
|
{
|
|
@@ -240,7 +250,8 @@
|
|
|
240
250
|
"cursor",
|
|
241
251
|
"copilot",
|
|
242
252
|
"windsurf",
|
|
243
|
-
"kiro"
|
|
253
|
+
"kiro",
|
|
254
|
+
"grok"
|
|
244
255
|
]
|
|
245
256
|
},
|
|
246
257
|
{
|
|
@@ -263,7 +274,8 @@
|
|
|
263
274
|
"cursor",
|
|
264
275
|
"copilot",
|
|
265
276
|
"windsurf",
|
|
266
|
-
"kiro"
|
|
277
|
+
"kiro",
|
|
278
|
+
"grok"
|
|
267
279
|
]
|
|
268
280
|
},
|
|
269
281
|
{
|
|
@@ -279,7 +291,8 @@
|
|
|
279
291
|
"claude-relay"
|
|
280
292
|
],
|
|
281
293
|
"adapters": [
|
|
282
|
-
"claude"
|
|
294
|
+
"claude",
|
|
295
|
+
"grok"
|
|
283
296
|
]
|
|
284
297
|
},
|
|
285
298
|
{
|
|
@@ -304,7 +317,8 @@
|
|
|
304
317
|
"cursor",
|
|
305
318
|
"copilot",
|
|
306
319
|
"windsurf",
|
|
307
|
-
"kiro"
|
|
320
|
+
"kiro",
|
|
321
|
+
"grok"
|
|
308
322
|
]
|
|
309
323
|
},
|
|
310
324
|
{
|
|
@@ -327,7 +341,8 @@
|
|
|
327
341
|
"cursor",
|
|
328
342
|
"copilot",
|
|
329
343
|
"windsurf",
|
|
330
|
-
"kiro"
|
|
344
|
+
"kiro",
|
|
345
|
+
"grok"
|
|
331
346
|
]
|
|
332
347
|
},
|
|
333
348
|
{
|
|
@@ -352,7 +367,8 @@
|
|
|
352
367
|
"hermes",
|
|
353
368
|
"copilot",
|
|
354
369
|
"windsurf",
|
|
355
|
-
"kiro"
|
|
370
|
+
"kiro",
|
|
371
|
+
"grok"
|
|
356
372
|
]
|
|
357
373
|
},
|
|
358
374
|
{
|
|
@@ -374,7 +390,8 @@
|
|
|
374
390
|
"cursor",
|
|
375
391
|
"copilot",
|
|
376
392
|
"windsurf",
|
|
377
|
-
"kiro"
|
|
393
|
+
"kiro",
|
|
394
|
+
"grok"
|
|
378
395
|
]
|
|
379
396
|
},
|
|
380
397
|
{
|
|
@@ -396,7 +413,8 @@
|
|
|
396
413
|
"cursor",
|
|
397
414
|
"copilot",
|
|
398
415
|
"windsurf",
|
|
399
|
-
"kiro"
|
|
416
|
+
"kiro",
|
|
417
|
+
"grok"
|
|
400
418
|
]
|
|
401
419
|
},
|
|
402
420
|
{
|
|
@@ -418,7 +436,8 @@
|
|
|
418
436
|
"cursor",
|
|
419
437
|
"copilot",
|
|
420
438
|
"windsurf",
|
|
421
|
-
"kiro"
|
|
439
|
+
"kiro",
|
|
440
|
+
"grok"
|
|
422
441
|
]
|
|
423
442
|
},
|
|
424
443
|
{
|
|
@@ -442,7 +461,8 @@
|
|
|
442
461
|
"cursor",
|
|
443
462
|
"copilot",
|
|
444
463
|
"windsurf",
|
|
445
|
-
"kiro"
|
|
464
|
+
"kiro",
|
|
465
|
+
"grok"
|
|
446
466
|
]
|
|
447
467
|
},
|
|
448
468
|
{
|
|
@@ -466,7 +486,8 @@
|
|
|
466
486
|
"cursor",
|
|
467
487
|
"copilot",
|
|
468
488
|
"windsurf",
|
|
469
|
-
"kiro"
|
|
489
|
+
"kiro",
|
|
490
|
+
"grok"
|
|
470
491
|
]
|
|
471
492
|
},
|
|
472
493
|
{
|
|
@@ -484,7 +505,8 @@
|
|
|
484
505
|
"performance"
|
|
485
506
|
],
|
|
486
507
|
"adapters": [
|
|
487
|
-
"claude"
|
|
508
|
+
"claude",
|
|
509
|
+
"grok"
|
|
488
510
|
]
|
|
489
511
|
},
|
|
490
512
|
{
|
|
@@ -507,7 +529,8 @@
|
|
|
507
529
|
"cursor",
|
|
508
530
|
"copilot",
|
|
509
531
|
"windsurf",
|
|
510
|
-
"kiro"
|
|
532
|
+
"kiro",
|
|
533
|
+
"grok"
|
|
511
534
|
]
|
|
512
535
|
}
|
|
513
536
|
]
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@olegkoval/agent-skills",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools.",
|
|
8
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools.",
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"packages",
|
|
26
26
|
".claude-plugin",
|
|
27
27
|
".cursor-plugin",
|
|
28
|
+
".grok-plugin",
|
|
28
29
|
".windsurf",
|
|
29
30
|
".kiro",
|
|
30
31
|
"scripts",
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
license: MIT
|
|
6
|
+
allowed-tools: Bash, Read, Write
|
|
7
|
+
compatibility: Codex, Claude Code, Cursor, Pi, Hermes, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools.
|
|
8
|
+
metadata:
|
|
9
|
+
targets: [_source-only]
|
|
10
|
+
author: Oleg Koval
|
|
11
|
+
tags:
|
|
12
|
+
- seo
|
|
13
|
+
- google-search-console
|
|
14
|
+
- indexing
|
|
15
|
+
- sitemap
|
|
16
|
+
- canonical
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
20
|
+
|
|
21
|
+
# search-console-indexing-audit
|
|
22
|
+
|
|
23
|
+
Use this skill to turn Google Search Console Coverage exports into a concrete indexing fix plan.
|
|
24
|
+
|
|
25
|
+
## Workflow
|
|
26
|
+
|
|
27
|
+
1. Read the export directory first:
|
|
28
|
+
- `Chart.csv` for indexed/not-indexed trend and impressions
|
|
29
|
+
- `Metadata.csv` for property context such as sitemap scope
|
|
30
|
+
- `Critical issues.csv` and `Non-critical issues.csv` for issue buckets
|
|
31
|
+
2. Run the summarizer when the standard CSV files are present:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir>
|
|
35
|
+
python3 <skill-dir>/scripts/summarize_gsc_coverage.py <export-dir> --json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
3. Inspect the target repo for SEO sources of truth:
|
|
39
|
+
- sitemap generation and whether listed URLs are canonical, indexable HTML pages
|
|
40
|
+
- robots rules, sitemap URL, and host hints
|
|
41
|
+
- canonical metadata, `metadataBase`, Open Graph URL base, and per-route `noindex`
|
|
42
|
+
- redirects across apex/www, http/https, trailing slash, moved routes, and legacy paths
|
|
43
|
+
4. Check live URLs when network access is available:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
curl -sS -I https://example.com/sitemap.xml
|
|
47
|
+
curl -sS https://example.com/sitemap.xml
|
|
48
|
+
curl -sS https://example.com/robots.txt
|
|
49
|
+
curl -sS https://example.com/page | rg -o '<link rel="canonical"[^>]*>|<meta name="robots"[^>]*>'
|
|
50
|
+
curl -sS -I -L --max-redirs 5 https://example.com/page
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
5. Map GSC buckets to fixes:
|
|
54
|
+
- `Page with redirect`: remove redirected URLs from sitemap and canonicals; submit only final 200 URLs.
|
|
55
|
+
- `Redirect error`: inspect redirect chains, protocol/host loops, blocked destinations, and non-200 final responses.
|
|
56
|
+
- `Alternate page with proper canonical tag`: usually acceptable; verify sitemap does not include alternates.
|
|
57
|
+
- `Discovered - currently not indexed`: improve crawl signals first: clean sitemap, canonical consistency, internal links, content quality, stable 200 responses, and lastmod accuracy.
|
|
58
|
+
- `Excluded by noindex`: verify it is intentional and keep those URLs out of sitemap.
|
|
59
|
+
|
|
60
|
+
## Output
|
|
61
|
+
|
|
62
|
+
Report:
|
|
63
|
+
|
|
64
|
+
- Export summary: date range, indexed/not-indexed trend, issue buckets, and limitations.
|
|
65
|
+
- Likely root cause, with evidence from files or live HTTP responses.
|
|
66
|
+
- Prioritized fixes, smallest reliable change first.
|
|
67
|
+
- Verification steps for local tests, build, live sitemap/robots/canonical checks, and Search Console validation.
|
|
68
|
+
|
|
69
|
+
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()
|