@olegkoval/agent-skills 1.17.0 → 1.19.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 +4 -3
- package/.cursor-plugin/index.json +5 -0
- package/.grok-plugin/index.json +125 -0
- package/.kiro/steering/qodoloop.md +127 -0
- package/.windsurf/rules/qodoloop.md +126 -0
- package/README.md +30 -6
- package/catalog/skills.json +69 -22
- 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/qodoloop/SKILL.md +134 -0
- package/packages/software-development/qodoloop/adapters/claude/plugin.json +5 -0
- package/packages/software-development/qodoloop/adapters/claude/skills/qodoloop/SKILL.md +135 -0
- package/packages/software-development/qodoloop/adapters/codex/README.md +20 -0
- package/packages/software-development/qodoloop/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/qodoloop/adapters/cursor/skills/qodoloop/SKILL.md +136 -0
- package/packages/software-development/qodoloop/adapters/grok/plugin.json +6 -0
- package/packages/software-development/qodoloop/adapters/grok/skills/qodoloop/SKILL.md +135 -0
- package/packages/software-development/qodoloop/adapters/kiro/steering/qodoloop.md +127 -0
- package/packages/software-development/qodoloop/adapters/windsurf/rules/qodoloop.md +126 -0
- package/packages/software-development/qodoloop/references/graphql-queries.md +151 -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
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,6 +529,31 @@
|
|
|
507
529
|
"cursor",
|
|
508
530
|
"copilot",
|
|
509
531
|
"windsurf",
|
|
532
|
+
"kiro",
|
|
533
|
+
"grok"
|
|
534
|
+
]
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"name": "qodoloop",
|
|
538
|
+
"lookupName": "olko:qodoloop",
|
|
539
|
+
"category": "software-development",
|
|
540
|
+
"path": "packages/software-development/qodoloop",
|
|
541
|
+
"description": "Iteratively drives a GitHub PR to zero unresolved Qodo findings — reads each finding's own Agent Prompt, applies the fix, replies to the thread, resolves it, pushes, and waits for Qodo's next pass.",
|
|
542
|
+
"tags": [
|
|
543
|
+
"code-review",
|
|
544
|
+
"qodo",
|
|
545
|
+
"github",
|
|
546
|
+
"pull-requests",
|
|
547
|
+
"automation",
|
|
548
|
+
"agents"
|
|
549
|
+
],
|
|
550
|
+
"adapters": [
|
|
551
|
+
"claude",
|
|
552
|
+
"codex",
|
|
553
|
+
"cursor",
|
|
554
|
+
"copilot",
|
|
555
|
+
"grok",
|
|
556
|
+
"windsurf",
|
|
510
557
|
"kiro"
|
|
511
558
|
]
|
|
512
559
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@olegkoval/agent-skills",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.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()
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
name: viral-launch
|
|
4
|
+
description: Set up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops without pretending virality is guaranteed.
|
|
5
|
+
license: MIT
|
|
6
|
+
allowed-tools: Bash, Read, Write, WebSearch, WebFetch
|
|
7
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Useful for product repos, open-source packages, SaaS launches, waitlists, and creator tools.
|
|
8
|
+
metadata:
|
|
9
|
+
targets: [_source-only]
|
|
10
|
+
author: Oleg Koval
|
|
11
|
+
tags:
|
|
12
|
+
- marketing
|
|
13
|
+
- launch
|
|
14
|
+
- growth
|
|
15
|
+
- virality
|
|
16
|
+
- positioning
|
|
17
|
+
- github
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
21
|
+
|
|
22
|
+
# viral-launch
|
|
23
|
+
|
|
24
|
+
Use this skill when a user wants to launch a project, make a repo marketable, improve discoverability, or build shareable launch assets.
|
|
25
|
+
|
|
26
|
+
This skill is opinionated: virality is not a promise. The goal is to make the project easy to understand, easy to share, and easy to act on.
|
|
27
|
+
|
|
28
|
+
## Trigger phrases
|
|
29
|
+
|
|
30
|
+
- make this repo launch-ready
|
|
31
|
+
- set this up to go viral
|
|
32
|
+
- prepare a product launch
|
|
33
|
+
- create marketing assets for this project
|
|
34
|
+
- improve the README for launch
|
|
35
|
+
- prepare Product Hunt / Hacker News / X / LinkedIn launch copy
|
|
36
|
+
- set up an open-source repo for growth
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
1. Inspect the project first:
|
|
41
|
+
- product purpose
|
|
42
|
+
- target user
|
|
43
|
+
- core use case
|
|
44
|
+
- current README and docs
|
|
45
|
+
- install or demo path
|
|
46
|
+
- screenshots, videos, or visual proof
|
|
47
|
+
- analytics or waitlist capture if present
|
|
48
|
+
2. Define the launch angle in one sentence:
|
|
49
|
+
- who it is for
|
|
50
|
+
- what painful job it solves
|
|
51
|
+
- why now
|
|
52
|
+
- what makes it different
|
|
53
|
+
3. Make the repo launch-ready:
|
|
54
|
+
- clear README headline and first paragraph
|
|
55
|
+
- demo or quickstart within the first screen
|
|
56
|
+
- installation steps that work from a clean checkout
|
|
57
|
+
- screenshots, GIF, or demo link where possible
|
|
58
|
+
- feature list based on outcomes, not implementation trivia
|
|
59
|
+
- examples for the highest-intent use cases
|
|
60
|
+
- badges only when they add trust
|
|
61
|
+
- license, contributing notes, and issue templates when useful
|
|
62
|
+
4. Create launch assets:
|
|
63
|
+
- short tagline
|
|
64
|
+
- 1-paragraph announcement
|
|
65
|
+
- 5 social post variants
|
|
66
|
+
- Product Hunt tagline and description when relevant
|
|
67
|
+
- Hacker News title candidates when relevant
|
|
68
|
+
- launch email or DM when relevant
|
|
69
|
+
- creator/influencer outreach list criteria, not spam copy
|
|
70
|
+
5. Design share loops:
|
|
71
|
+
- a reason users would show the output to someone else
|
|
72
|
+
- a public artifact worth linking
|
|
73
|
+
- a before/after demo
|
|
74
|
+
- a template, benchmark, checklist, or gallery that can travel
|
|
75
|
+
- referral or waitlist loop only if it fits the product
|
|
76
|
+
6. Define proof and metrics:
|
|
77
|
+
- activation event
|
|
78
|
+
- share event
|
|
79
|
+
- conversion event
|
|
80
|
+
- retention proxy
|
|
81
|
+
- launch-day dashboard or simple tracking checklist
|
|
82
|
+
7. Keep claims grounded:
|
|
83
|
+
- do not invent traction, logos, benchmarks, testimonials, or user counts
|
|
84
|
+
- mark assumptions explicitly
|
|
85
|
+
- prefer specific proof over hype
|
|
86
|
+
- avoid dark patterns and spam
|
|
87
|
+
|
|
88
|
+
## Output format
|
|
89
|
+
|
|
90
|
+
When planning, produce:
|
|
91
|
+
|
|
92
|
+
- Launch angle
|
|
93
|
+
- Repo changes
|
|
94
|
+
- Launch assets
|
|
95
|
+
- Share loops
|
|
96
|
+
- Metrics
|
|
97
|
+
- Risks and assumptions
|
|
98
|
+
- Next actions
|
|
99
|
+
|
|
100
|
+
When editing a repository, make the smallest useful set of changes first, then validate by reading the README from a new user's perspective.
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
|
|
104
|
+
- `references/launch-checklist.md`
|
|
105
|
+
- `references/external-skills.md`
|