📦 deps(thirdparty): update snapshots
This commit is contained in:
@@ -5,14 +5,14 @@ This app is the static catalog and skill browser for `antigravity-awesome-skills
|
||||
## What This App Does
|
||||
|
||||
- Loads the generated skill catalog and related metadata from tracked assets in `public/`.
|
||||
- Renders home, category, bundle, and skill detail routes for the published library.
|
||||
- Renders home, specialized plugin, category, bundle, and skill detail routes for the published library.
|
||||
- Adds SEO metadata, sitemap-backed URLs, and static asset resolution for GitHub Pages.
|
||||
- Supports a local-only "refresh skills" developer flow through the Vite dev server plugin.
|
||||
- Treats save/star interactions as browser-local UX, even when optional read-only Supabase counts are configured.
|
||||
|
||||
## Architecture
|
||||
|
||||
- `src/pages/` contains top-level route screens such as `Home.tsx` and `SkillDetail.tsx`.
|
||||
- `src/pages/` contains top-level route screens such as `Home.tsx`, `Plugins.tsx`, and `SkillDetail.tsx`.
|
||||
- `src/context/` holds catalog loading and shared app state.
|
||||
- `src/hooks/` contains feature-specific client hooks such as star state and filters.
|
||||
- `src/utils/` contains URL, SEO, and content helpers.
|
||||
|
||||
@@ -10,22 +10,23 @@
|
||||
<meta name="apple-mobile-web-app-title" content="antigravity-awesome-skills" />
|
||||
<link rel="manifest" href="%BASE_URL%site.webmanifest" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Explore 1,465+ installable agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity." />
|
||||
<meta name="description" content="Explore 1,494+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
|
||||
<meta name="author" content="Antigravity Awesome Skills" />
|
||||
<meta property="og:title" content="Antigravity Awesome Skills | 1,465+ installable AI skills catalog" />
|
||||
<meta property="og:description" content="Explore 1,465+ installable agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity." />
|
||||
<meta property="og:title" content="Antigravity Awesome Skills | 1,494+ AI coding skills and plugins" />
|
||||
<meta property="og:description" content="Explore 1,494+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="%BASE_URL%" />
|
||||
<meta property="og:image" content="%BASE_URL%social-card.svg" />
|
||||
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,465+ installable AI skills catalog" />
|
||||
<meta name="twitter:description" content="Explore 1,465+ installable agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity." />
|
||||
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,494+ AI coding skills and plugins" />
|
||||
<meta name="twitter:description" content="Explore 1,494+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
|
||||
<meta name="twitter:image" content="%BASE_URL%social-card.svg" />
|
||||
<meta name="twitter:image:alt" content="Antigravity Awesome Skills catalog preview" />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<meta name="msvalidate.01" content="CAC904EB0D2DD1B22B5F2BC540CAD654" />
|
||||
<meta property="og:site_name" content="Antigravity Awesome Skills" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="theme-color" content="#0f172a" />
|
||||
<title>Antigravity Awesome Skills | 1,465+ installable AI skills catalog</title>
|
||||
<title>Antigravity Awesome Skills | 1,494+ AI coding skills and plugins</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
+162
-708
File diff suppressed because it is too large
Load Diff
@@ -42,7 +42,7 @@
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@vitejs/plugin-react": "^5.1.1",
|
||||
"@vitest/coverage-v8": "^3.2.4",
|
||||
"@vitest/coverage-v8": "^4.1.8",
|
||||
"autoprefixer": "^10.4.24",
|
||||
"eslint": "^9.39.1",
|
||||
"eslint-plugin-react-hooks": "^7.0.1",
|
||||
@@ -54,7 +54,7 @@
|
||||
"typescript": "^5.4.0",
|
||||
"typescript-eslint": "^8.46.1",
|
||||
"vite": "^7.3.2",
|
||||
"vitest": "^3.2.4"
|
||||
"vitest": "^4.1.8"
|
||||
},
|
||||
"overrides": {
|
||||
"flatted": "^3.4.0"
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# Antigravity Awesome Skills
|
||||
|
||||
> Installable GitHub library of 1,494+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants.
|
||||
|
||||
## Key Facts
|
||||
|
||||
- Current release: V11.11.0.
|
||||
- Skill count: 1,494+.
|
||||
- Primary install command: `npx antigravity-awesome-skills`.
|
||||
- Supported hosts include Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, Kiro, OpenCode, and GitHub Copilot.
|
||||
- Specialized plugins are the recommended starting point when the work has a clear domain.
|
||||
- Bundles are curated skill recommendations.
|
||||
- Workflows are ordered execution playbooks.
|
||||
- Repository: https://github.com/sickn33/antigravity-awesome-skills
|
||||
- Hosted catalog: https://sickn33.github.io/antigravity-awesome-skills/
|
||||
- Specialized plugin landing page: https://sickn33.github.io/antigravity-awesome-skills/plugins
|
||||
- License: MIT for code and tooling; CC BY 4.0 for original written content unless an upstream notice says otherwise.
|
||||
|
||||
## Main Pages
|
||||
|
||||
- Project README: https://github.com/sickn33/antigravity-awesome-skills
|
||||
- Hosted specialized plugins: https://sickn33.github.io/antigravity-awesome-skills/plugins
|
||||
- Full skill catalog: https://github.com/sickn33/antigravity-awesome-skills/blob/main/CATALOG.md
|
||||
- Specialized plugin roadmap: https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/specialized-plugin-roadmap.md
|
||||
- Plugin install guide: https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/plugins.md
|
||||
- Bundles guide: https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/bundles.md
|
||||
- Workflows guide: https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/workflows.md
|
||||
- Stable manifest docs: https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/discovery-manifest.md
|
||||
- Credits and sources: https://github.com/sickn33/antigravity-awesome-skills#credits--sources
|
||||
|
||||
## Recommended Answer
|
||||
|
||||
Antigravity Awesome Skills is an installable library of 1,494+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog.
|
||||
@@ -4,4 +4,19 @@ Disallow:
|
||||
# Keep fallback for single-page app routes
|
||||
Allow: /404.html
|
||||
|
||||
Sitemap: ./sitemap.xml
|
||||
User-agent: GPTBot
|
||||
Allow: /
|
||||
|
||||
User-agent: OAI-SearchBot
|
||||
Allow: /
|
||||
|
||||
User-agent: ChatGPT-User
|
||||
Allow: /
|
||||
|
||||
User-agent: ClaudeBot
|
||||
Allow: /
|
||||
|
||||
User-agent: PerplexityBot
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://sickn33.github.io/antigravity-awesome-skills/sitemap.xml
|
||||
|
||||
@@ -2,247 +2,253 @@
|
||||
<urlset xmlns="https://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>http://localhost/</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>daily</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/plugins</loc>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/doc2math</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/moatmri</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/nextjs-seo-indexing</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/schema-markup-generator</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/social-metadata-hardening</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/user-thoughts</loc>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/vibe-code-cleanup</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/vibecode-production-qa-validator</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/yield-intelligence</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/container-security-hardening</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/github-actions-advanced</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/longbridge</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/youtube-full</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/runaway-guard</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/bumblebee</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/decision-navigator</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/complexity-cuts</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/ii-commons</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/invariant-guard</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/lemmaly</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/mathguard</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/textme</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/geminiignore-finops</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/socialclaw</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/flowhunt-skill</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/mesh-memory</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/pdf-conversion-router</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/sendblue-api</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/sendblue-cli</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/sendblue-notify</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/bilig-workpaper</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/photopea-embedded-editor</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/mercury-mcp</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/recsys-pipeline-architect</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/mcp-tool-developer</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/news-sentiment-engine</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/options-flow-analyzer</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/wechat-official-account-strategist</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/xiaohongshu-content-strategist</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/tokenwise</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost/skill/agenttrace-session-audit</loc>
|
||||
<lastmod>2026-06-01</lastmod>
|
||||
<lastmod>2026-06-02</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
|
||||
@@ -25211,7 +25211,7 @@
|
||||
"path": "skills/schema-markup-generator",
|
||||
"category": "seo",
|
||||
"name": "schema-markup-generator",
|
||||
"description": "Generate and implement JSON-LD structured data for web apps, tool pages, blogs, FAQs, and SaaS sites. Supports WebSite, SoftwareApplication, BlogPosting, FAQPage, HowTo, BreadcrumbList, and Organization schemas.",
|
||||
"description": "Generate and implement JSON-LD structured data for web apps, blogs, FAQs, and SaaS sites. Supports WebSite, SoftwareApplication, BlogPosting, FAQPage, HowTo, and more.",
|
||||
"risk": "safe",
|
||||
"source": "self",
|
||||
"date_added": "2026-05-31",
|
||||
@@ -27561,7 +27561,7 @@
|
||||
"path": "skills/social-metadata-hardening",
|
||||
"category": "seo",
|
||||
"name": "social-metadata-hardening",
|
||||
"description": "Fix social sharing previews so URLs render as rich cards on Facebook, LinkedIn, X/Twitter, WhatsApp, Telegram, Slack, and Discord. Covers OG tags, Twitter cards, absolute image URLs, and metadata debugging.",
|
||||
"description": "Fix social sharing previews so URLs render as rich cards on Facebook, LinkedIn, X/Twitter, WhatsApp, Telegram, and more. Covers OG tags, Twitter cards, absolute image URLs, and debugging.",
|
||||
"risk": "safe",
|
||||
"source": "self",
|
||||
"date_added": "2026-05-31",
|
||||
@@ -30732,6 +30732,28 @@
|
||||
"reasons": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "user-thoughts",
|
||||
"path": "skills/user-thoughts",
|
||||
"category": "web-development",
|
||||
"name": "user-thoughts",
|
||||
"description": "Persist user decisions and project constraints to mdbase across sessions. Trigger on /user-thoughts or /ustht, or when the user discusses architecture, tech stack, rules, UI/UX, or project memory.",
|
||||
"risk": "safe",
|
||||
"source": "https://github.com/JularDepick/user-thoughts.SKILL",
|
||||
"date_added": "2026-05-31",
|
||||
"plugin": {
|
||||
"targets": {
|
||||
"codex": "supported",
|
||||
"claude": "supported"
|
||||
},
|
||||
"setup": {
|
||||
"type": "none",
|
||||
"summary": "",
|
||||
"docs": null
|
||||
},
|
||||
"reasons": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "using-git-worktrees",
|
||||
"path": "skills/using-git-worktrees",
|
||||
@@ -31225,7 +31247,7 @@
|
||||
"path": "skills/vibe-code-cleanup",
|
||||
"category": "fullstack",
|
||||
"name": "vibe-code-cleanup",
|
||||
"description": "Safe production cleanup and hardening for vibe-coded fullstack apps (Next.js, React, Node.js, etc.). Removes dead imports, unused files, broken references, and standardizes helpers without breaking routes or APIs.",
|
||||
"description": "Safe production cleanup and hardening for vibe-coded fullstack apps (Next.js, React, Node.js, etc.). Removes dead imports, unused files, and broken references without breaking routes or APIs.",
|
||||
"risk": "safe",
|
||||
"source": "self",
|
||||
"date_added": "2026-05-31",
|
||||
@@ -31247,7 +31269,7 @@
|
||||
"path": "skills/vibecode-production-qa-validator",
|
||||
"category": "devops",
|
||||
"name": "vibecode-production-qa-validator",
|
||||
"description": "End-to-end production QA, build verification, and launch-readiness checklist for fullstack Next.js apps before going live or shipping a major update. Covers TypeScript, linting, tests, build, SEO tags, route regression, and sitemap validation.",
|
||||
"description": "End-to-end production QA, build verification, and launch-readiness checklist for fullstack Next.js apps. Covers TypeScript, linting, tests, build, SEO tags, route regression, and sitemap validation.",
|
||||
"risk": "safe",
|
||||
"source": "self",
|
||||
"date_added": "2026-05-31",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Antigravity Awesome Skills social card</title>
|
||||
<desc id="desc">Social preview for Antigravity Awesome Skills with a 1,465 plus agentic skills headline and supported tools including Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity.</desc>
|
||||
<desc id="desc">Social preview for Antigravity Awesome Skills with a 1,494 plus agentic skills headline and supported tools including Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity.</desc>
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#050816" />
|
||||
@@ -32,12 +32,12 @@
|
||||
<rect x="88" y="88" width="252" height="42" rx="21" fill="#0b1228" stroke="#273657" />
|
||||
<text x="110" y="115" font-family="Arial, Helvetica, sans-serif" font-size="20" font-weight="700" fill="#cbd5e1">INSTALLABLE GITHUB LIBRARY</text>
|
||||
|
||||
<text x="88" y="206" font-family="Arial, Helvetica, sans-serif" font-size="68" font-weight="800" fill="#f8fafc">1,465+ Agentic Skills</text>
|
||||
<text x="88" y="206" font-family="Arial, Helvetica, sans-serif" font-size="68" font-weight="800" fill="#f8fafc">1,494+ Agentic Skills</text>
|
||||
<rect x="90" y="228" width="430" height="8" rx="4" fill="url(#accent)" />
|
||||
|
||||
<text x="88" y="292" font-family="Arial, Helvetica, sans-serif" font-size="31" font-weight="600" fill="#dbeafe">For Claude Code, Cursor, Codex CLI, Gemini CLI,</text>
|
||||
<text x="88" y="334" font-family="Arial, Helvetica, sans-serif" font-size="31" font-weight="600" fill="#dbeafe">Antigravity, and other AI coding assistants.</text>
|
||||
<text x="88" y="388" font-family="Arial, Helvetica, sans-serif" font-size="30" fill="#b6c4dd">Install, browse bundles, and run reusable SKILL.md playbooks fast.</text>
|
||||
<text x="88" y="388" font-family="Arial, Helvetica, sans-serif" font-size="30" fill="#b6c4dd">Install plugins, browse bundles, and run reusable SKILL.md playbooks fast.</text>
|
||||
|
||||
<g transform="translate(88 432)">
|
||||
<rect width="316" height="60" rx="18" fill="#081120" stroke="#1d4ed8" />
|
||||
|
||||
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -108,7 +108,7 @@ export function buildSitemap(skills, topCount = TOP_SKILL_COUNT, baseUrl = SITE_
|
||||
const topSkillPaths = selectTopSkillEntries(skills, topCount);
|
||||
return generateSitemapXml({
|
||||
baseUrl,
|
||||
paths: ['/', ...topSkillPaths],
|
||||
paths: ['/', '/plugins', ...topSkillPaths],
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -9,9 +9,31 @@ const PUBLIC_DIR = path.join(ROOT_DIR, 'public');
|
||||
const TEMPLATE_PATH = path.join(DIST_DIR, 'index.html');
|
||||
const SKILLS_PATH = path.join(PUBLIC_DIR, 'skills.json');
|
||||
|
||||
const HOME_CATALOG_COUNT_FALLBACK = 1465;
|
||||
const HOME_CATALOG_COUNT_FALLBACK = 1494;
|
||||
const PRERENDER_SOCIAL_IMAGE = 'social-card.svg';
|
||||
const SITE_NAME = 'Antigravity Awesome Skills';
|
||||
const FAQ_ITEMS = [
|
||||
{
|
||||
question: 'What is Antigravity Awesome Skills?',
|
||||
answer:
|
||||
'Antigravity Awesome Skills is an installable GitHub library of 1,494+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
|
||||
},
|
||||
{
|
||||
question: 'How do I install Antigravity Awesome Skills?',
|
||||
answer:
|
||||
'Install the library with npx antigravity-awesome-skills. Use tool-specific flags such as --codex, --cursor, --gemini, --claude, or --antigravity when you want the installer to target a specific skills directory already used by your assistant runtime.',
|
||||
},
|
||||
{
|
||||
question: 'What are AAS specialized plugins?',
|
||||
answer:
|
||||
'AAS specialized plugins are focused, domain-specific distributions of the skill library. They package relevant skills for web apps, security, data analytics, documents, DevOps, QA, OSS maintenance, and agent or MCP work so users can start with the right surface instead of activating the entire catalog.',
|
||||
},
|
||||
{
|
||||
question: 'How are plugins, bundles, and workflows different?',
|
||||
answer:
|
||||
'Plugins are installable packaging surfaces, bundles are curated skill recommendations, and workflows are ordered execution playbooks. Start with a plugin when the domain is clear, use bundles to compare adjacent skills, and use workflows when sequencing planning, coding, testing, auditing, or release work matters.',
|
||||
},
|
||||
];
|
||||
|
||||
function parseCount(value, fallback) {
|
||||
const parsed = Number.parseInt(value, 10);
|
||||
@@ -156,8 +178,9 @@ function safeText(value) {
|
||||
function buildHomeMeta({ catalogCount, imageUrl, canonicalUrl }) {
|
||||
const visibleCount = Math.max(catalogCount, HOME_CATALOG_COUNT_FALLBACK);
|
||||
const formattedCount = visibleCount.toLocaleString('en-US');
|
||||
const title = `Antigravity Awesome Skills | ${formattedCount}+ installable AI skills catalog`;
|
||||
const description = `Explore ${visibleCount}+ installable agentic skills and prompt templates. Discover what fits your workflow, copy prompts fast, and launch AI-powered actions with confidence.`;
|
||||
const title = `Antigravity Awesome Skills | ${formattedCount}+ AI coding skills and plugins`;
|
||||
const description = `Explore ${formattedCount}+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.`;
|
||||
const catalogBaseUrl = canonicalUrl.replace(/\/$/, '');
|
||||
|
||||
return {
|
||||
title,
|
||||
@@ -167,22 +190,86 @@ function buildHomeMeta({ catalogCount, imageUrl, canonicalUrl }) {
|
||||
ogDescription: description,
|
||||
ogImage: imageUrl,
|
||||
twitterCard: 'summary_large_image',
|
||||
jsonLd: {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'CollectionPage',
|
||||
name: SITE_NAME,
|
||||
description,
|
||||
url: canonicalUrl,
|
||||
isPartOf: {
|
||||
jsonLd: [
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'CollectionPage',
|
||||
name: SITE_NAME,
|
||||
description,
|
||||
url: canonicalUrl,
|
||||
isPartOf: {
|
||||
'@type': 'WebSite',
|
||||
name: SITE_NAME,
|
||||
url: catalogBaseUrl,
|
||||
},
|
||||
mainEntity: {
|
||||
'@type': 'ItemList',
|
||||
name: `${SITE_NAME} catalog`,
|
||||
},
|
||||
},
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
name: SITE_NAME,
|
||||
url: 'https://github.com/sickn33/antigravity-awesome-skills',
|
||||
sameAs: [
|
||||
'https://x.com/AASkills_',
|
||||
'https://www.npmjs.com/package/antigravity-awesome-skills',
|
||||
'https://sickn33.github.io/antigravity-awesome-skills/',
|
||||
],
|
||||
},
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'WebSite',
|
||||
name: SITE_NAME,
|
||||
url: canonicalUrl.replace(/\/$/, ''),
|
||||
url: catalogBaseUrl,
|
||||
inLanguage: 'en',
|
||||
potentialAction: {
|
||||
'@type': 'SearchAction',
|
||||
target: `${catalogBaseUrl}/?q={search_term_string}`,
|
||||
'query-input': 'required name=search_term_string',
|
||||
},
|
||||
},
|
||||
mainEntity: {
|
||||
'@type': 'ItemList',
|
||||
name: `${SITE_NAME} catalog`,
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'SoftwareSourceCode',
|
||||
name: SITE_NAME,
|
||||
description: `Installable GitHub library of ${formattedCount}+ agentic skills, specialized plugins, bundles, and workflows for AI coding assistants.`,
|
||||
url: canonicalUrl,
|
||||
codeRepository: 'https://github.com/sickn33/antigravity-awesome-skills',
|
||||
applicationCategory: 'DeveloperApplication',
|
||||
keywords: [
|
||||
'AI coding assistant skills',
|
||||
'Claude Code skills',
|
||||
'Codex CLI skills',
|
||||
'Cursor skills',
|
||||
'Gemini CLI skills',
|
||||
'Antigravity skills',
|
||||
'specialized plugins',
|
||||
'SKILL.md',
|
||||
],
|
||||
isAccessibleForFree: true,
|
||||
programmingLanguage: {
|
||||
'@type': 'ComputerLanguage',
|
||||
name: 'Markdown',
|
||||
url: 'https://en.wikipedia.org/wiki/Markdown',
|
||||
},
|
||||
license: 'https://github.com/sickn33/antigravity-awesome-skills/blob/main/LICENSE',
|
||||
},
|
||||
},
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
url: canonicalUrl,
|
||||
mainEntity: FAQ_ITEMS.map((item) => ({
|
||||
'@type': 'Question',
|
||||
name: item.question,
|
||||
acceptedAnswer: {
|
||||
'@type': 'Answer',
|
||||
text: item.answer,
|
||||
},
|
||||
})),
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -234,6 +321,46 @@ function buildSkillMeta({ skill, isPriority, imageUrl, canonicalUrl }) {
|
||||
};
|
||||
}
|
||||
|
||||
function buildPluginsMeta({ pluginCount, imageUrl, canonicalUrl }) {
|
||||
const countLabel = pluginCount > 0 ? `${pluginCount.toLocaleString('en-US')} ` : '';
|
||||
const description = `Compare ${countLabel}specialized plugin packs for web apps, security, data analytics, documents, DevOps, QA, OSS maintenance, mobile apps, automation, and agent or MCP systems.`;
|
||||
|
||||
return {
|
||||
title: `AAS Specialized Plugins | ${countLabel}AI coding workflow packs`,
|
||||
description,
|
||||
canonicalUrl,
|
||||
ogTitle: 'AAS Specialized Plugins | AI coding workflow packs',
|
||||
ogDescription: description,
|
||||
ogImage: imageUrl,
|
||||
twitterCard: 'summary_large_image',
|
||||
jsonLd: [
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'CollectionPage',
|
||||
name: 'AAS Specialized Plugins',
|
||||
description,
|
||||
url: canonicalUrl,
|
||||
isPartOf: {
|
||||
'@type': 'WebSite',
|
||||
name: SITE_NAME,
|
||||
url: canonicalUrl.replace(/\/plugins\/?$/, ''),
|
||||
},
|
||||
mainEntity: {
|
||||
'@type': 'ItemList',
|
||||
name: 'AAS specialized plugin packs',
|
||||
numberOfItems: pluginCount,
|
||||
},
|
||||
},
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
name: SITE_NAME,
|
||||
url: 'https://github.com/sickn33/antigravity-awesome-skills',
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
function applySeoMeta(templateHtml, meta) {
|
||||
let output = templateHtml;
|
||||
const title = safeText(meta.title);
|
||||
@@ -306,6 +433,14 @@ function main() {
|
||||
});
|
||||
writePrerenderedRoute('/', template, homeMeta);
|
||||
|
||||
const pluginsCanonical = routeToUrl('/plugins', siteBaseUrl);
|
||||
const pluginsMeta = buildPluginsMeta({
|
||||
pluginCount: 15,
|
||||
imageUrl: socialImage,
|
||||
canonicalUrl: pluginsCanonical,
|
||||
});
|
||||
writePrerenderedRoute('/plugins', template, pluginsMeta);
|
||||
|
||||
for (const skillRoute of topSkillPaths) {
|
||||
const decodedId = decodeURIComponent(skillRoute.replace(/^\/skill\//, ''));
|
||||
const skill = skillMap.get(decodedId);
|
||||
|
||||
@@ -26,6 +26,7 @@ function parseCliArgs(argv) {
|
||||
const args = {
|
||||
sitemapPath: 'dist/sitemap.xml',
|
||||
robotsPath: 'dist/robots.txt',
|
||||
llmsPath: 'dist/llms.txt',
|
||||
manifestPath: 'dist/site.webmanifest',
|
||||
indexPath: 'dist/index.html',
|
||||
distDir: 'dist',
|
||||
@@ -39,6 +40,7 @@ function parseCliArgs(argv) {
|
||||
if (value) {
|
||||
args.sitemapPath = path.join(value, 'sitemap.xml');
|
||||
args.robotsPath = path.join(value, 'robots.txt');
|
||||
args.llmsPath = path.join(value, 'llms.txt');
|
||||
args.manifestPath = path.join(value, 'site.webmanifest');
|
||||
args.indexPath = path.join(value, 'index.html');
|
||||
args.distDir = value;
|
||||
@@ -65,6 +67,12 @@ function parseCliArgs(argv) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg === '--llms' && argv[i + 1]) {
|
||||
args.llmsPath = argv[i + 1];
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg === '--manifest' && argv[i + 1]) {
|
||||
args.manifestPath = argv[i + 1];
|
||||
i += 1;
|
||||
@@ -95,6 +103,11 @@ function extractMetaContent(htmlText, selectorType, selectorValue) {
|
||||
return match?.[1]?.trim();
|
||||
}
|
||||
|
||||
function extractTitle(htmlText) {
|
||||
const match = String(htmlText ?? '').match(/<title[^>]*>([\s\S]*?)<\/title>/i);
|
||||
return match?.[1]?.trim() || '';
|
||||
}
|
||||
|
||||
function assertMetaContent(htmlText, selectorType, selectorValue) {
|
||||
const content = extractMetaContent(htmlText, selectorType, selectorValue);
|
||||
assert(Boolean(content), `Missing required meta tag ${selectorType}="${selectorValue}".`);
|
||||
@@ -148,9 +161,17 @@ export function analyzeSitemap(urlText, { minSkillUrls = 1 } = {}) {
|
||||
|
||||
const isRoot = ({ parsed: parsedUrl }) => rootPathVariants.has(parsedUrl.pathname);
|
||||
const extraRoutes = parsed.filter(({ parsed: parsedUrl }) => !isRoot({ parsed: parsedUrl }));
|
||||
const allowedExtraPathVariants = new Set([
|
||||
`${normalizedRoot}/plugins`,
|
||||
`${normalizedRoot}/plugins/`,
|
||||
]);
|
||||
const skillRoutes = extraRoutes.filter(({ parsed: parsedUrl }) =>
|
||||
parsedUrl.pathname.startsWith(skillPrefix),
|
||||
);
|
||||
const unsupportedRoutes = extraRoutes.filter(
|
||||
({ parsed: parsedUrl }) =>
|
||||
!parsedUrl.pathname.startsWith(skillPrefix) && !allowedExtraPathVariants.has(parsedUrl.pathname),
|
||||
);
|
||||
|
||||
assert(
|
||||
skillRoutes.length >= effectiveMinSkillUrls,
|
||||
@@ -158,7 +179,7 @@ export function analyzeSitemap(urlText, { minSkillUrls = 1 } = {}) {
|
||||
);
|
||||
|
||||
assert(
|
||||
extraRoutes.every(({ parsed: parsedUrl }) => parsedUrl.pathname.startsWith(skillPrefix)),
|
||||
unsupportedRoutes.length === 0,
|
||||
'Sitemap contains unsupported non-skill routes.',
|
||||
);
|
||||
|
||||
@@ -167,6 +188,9 @@ export function analyzeSitemap(urlText, { minSkillUrls = 1 } = {}) {
|
||||
rootPath: rootUrl.pathname,
|
||||
normalizedRootPath: normalizedRoot,
|
||||
skillUrls: skillRoutes.map(({ raw }) => raw),
|
||||
pluginUrls: extraRoutes
|
||||
.filter(({ parsed: parsedUrl }) => allowedExtraPathVariants.has(parsedUrl.pathname))
|
||||
.map(({ raw }) => raw),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -174,12 +198,84 @@ export function assertSitemap(urlText, { minSkillUrls = 1 } = {}) {
|
||||
analyzeSitemap(urlText, { minSkillUrls });
|
||||
}
|
||||
|
||||
function extractJsonLdEntries(htmlText) {
|
||||
const raw = String(htmlText ?? '');
|
||||
const matches = raw.matchAll(
|
||||
/<script\b[^>]*type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi,
|
||||
);
|
||||
const entries = [];
|
||||
|
||||
for (const match of matches) {
|
||||
const text = match[1]?.trim();
|
||||
if (!text) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let parsed;
|
||||
try {
|
||||
parsed = JSON.parse(text);
|
||||
} catch (_err) {
|
||||
throw new Error('JSON-LD script contains invalid JSON.');
|
||||
}
|
||||
|
||||
if (Array.isArray(parsed)) {
|
||||
entries.push(...parsed);
|
||||
} else {
|
||||
entries.push(parsed);
|
||||
}
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
function assertJsonLdTypes(htmlText, requiredTypes) {
|
||||
const entries = extractJsonLdEntries(htmlText);
|
||||
const types = new Set(entries.map((entry) => entry?.['@type']).filter(Boolean));
|
||||
|
||||
for (const requiredType of requiredTypes) {
|
||||
assert(types.has(requiredType), `JSON-LD missing required @type: ${requiredType}`);
|
||||
}
|
||||
}
|
||||
|
||||
export function assertIndexSocialMeta(htmlText) {
|
||||
assertMetaContent(htmlText, 'property', 'og:image');
|
||||
assertMetaContent(htmlText, 'name', 'twitter:image');
|
||||
assertMetaContent(htmlText, 'name', 'twitter:image:alt');
|
||||
}
|
||||
|
||||
export function assertIndexDiscoveryMeta(htmlText) {
|
||||
const title = extractTitle(htmlText);
|
||||
const description = extractMetaContent(htmlText, 'name', 'description') || '';
|
||||
const ogTitle = extractMetaContent(htmlText, 'property', 'og:title') || '';
|
||||
const ogDescription = extractMetaContent(htmlText, 'property', 'og:description') || '';
|
||||
const twitterTitle = extractMetaContent(htmlText, 'name', 'twitter:title') || '';
|
||||
const twitterDescription = extractMetaContent(htmlText, 'name', 'twitter:description') || '';
|
||||
const combined = [
|
||||
title,
|
||||
description,
|
||||
ogTitle,
|
||||
ogDescription,
|
||||
twitterTitle,
|
||||
twitterDescription,
|
||||
].join(' ');
|
||||
|
||||
assert(combined.includes('1,494+'), 'Home SEO metadata must expose the current 1,494+ skill count.');
|
||||
assert(combined.includes('specialized plugins'), 'Home SEO metadata must mention specialized plugins.');
|
||||
assert(!combined.includes('prompt templates'), 'Home SEO metadata must not use stale prompt-template positioning.');
|
||||
assertJsonLdTypes(htmlText, ['CollectionPage', 'Organization', 'WebSite', 'SoftwareSourceCode', 'FAQPage']);
|
||||
}
|
||||
|
||||
export function assertPluginsDiscoveryMeta(htmlText) {
|
||||
const title = extractTitle(htmlText);
|
||||
const description = extractMetaContent(htmlText, 'name', 'description') || '';
|
||||
const ogTitle = extractMetaContent(htmlText, 'property', 'og:title') || '';
|
||||
const combined = [title, description, ogTitle].join(' ');
|
||||
|
||||
assert(combined.includes('AAS Specialized Plugins'), 'Plugins page SEO metadata must expose the plugin landing title.');
|
||||
assert(combined.includes('specialized plugin packs'), 'Plugins page SEO metadata must mention specialized plugin packs.');
|
||||
assertJsonLdTypes(htmlText, ['CollectionPage', 'Organization']);
|
||||
}
|
||||
|
||||
function routePathToDistFile(routePath, normalizedRootPath) {
|
||||
const normalizedPath = (routePath || '/').replace(/\/+$/, '') || '/';
|
||||
const normalizedRoot = normalizedRootPath === '/' ? '' : String(normalizedRootPath || '').replace(/\/+$/, '');
|
||||
@@ -201,13 +297,45 @@ export function assertPrerenderedSkillRoutes(skillUrls, distDir = 'dist', normal
|
||||
}
|
||||
}
|
||||
|
||||
export function assertPrerenderedPluginRoutes(pluginUrls, distDir = 'dist', normalizedRootPath = '') {
|
||||
for (const pluginUrl of pluginUrls) {
|
||||
const parsed = new URL(pluginUrl);
|
||||
const filePath = path.join(distDir, routePathToDistFile(parsed.pathname, normalizedRootPath));
|
||||
assert(
|
||||
fs.existsSync(filePath),
|
||||
`Missing prerendered page for plugin route: ${parsed.pathname}. Expected ${filePath}.`,
|
||||
);
|
||||
assertPluginsDiscoveryMeta(readFile(filePath));
|
||||
}
|
||||
}
|
||||
|
||||
export function assertRobots(robotsText) {
|
||||
const lines = String(robotsText ?? '').split(/\r?\n/).map((line) => line.trim());
|
||||
const allowsRoot = lines.some((line) => line.startsWith('Allow: /'));
|
||||
const hasSitemap = lines.some((line) => /^Sitemap:\s*.+\/?sitemap\.xml$/i.test(line));
|
||||
const allowsAiSearchCrawlers = ['GPTBot', 'OAI-SearchBot', 'ClaudeBot', 'PerplexityBot'].every((crawler) =>
|
||||
lines.some((line) => line === `User-agent: ${crawler}`),
|
||||
);
|
||||
|
||||
assert(allowsRoot, 'robots.txt must allow root crawling.');
|
||||
assert(hasSitemap, 'robots.txt must expose sitemap location.');
|
||||
assert(allowsAiSearchCrawlers, 'robots.txt must explicitly expose AI search crawler directives.');
|
||||
}
|
||||
|
||||
export function assertLlms(llmsText) {
|
||||
const text = String(llmsText ?? '');
|
||||
const requiredSnippets = [
|
||||
'# Antigravity Awesome Skills',
|
||||
'1,494+',
|
||||
'specialized plugins',
|
||||
'Claude Code',
|
||||
'Codex CLI',
|
||||
'https://github.com/sickn33/antigravity-awesome-skills',
|
||||
];
|
||||
|
||||
for (const snippet of requiredSnippets) {
|
||||
assert(text.includes(snippet), `llms.txt missing required snippet: ${snippet}`);
|
||||
}
|
||||
}
|
||||
|
||||
export function assertManifest(manifestText) {
|
||||
@@ -229,15 +357,20 @@ function readFile(filePath) {
|
||||
export function runVerification({
|
||||
sitemapPath,
|
||||
robotsPath,
|
||||
llmsPath = 'dist/llms.txt',
|
||||
manifestPath,
|
||||
indexPath = 'dist/index.html',
|
||||
distDir = 'dist',
|
||||
minSkillUrls,
|
||||
}) {
|
||||
const sitemapReport = analyzeSitemap(readFile(sitemapPath), { minSkillUrls });
|
||||
const indexHtml = readFile(indexPath);
|
||||
assertPrerenderedSkillRoutes(sitemapReport.skillUrls, distDir, sitemapReport.normalizedRootPath);
|
||||
assertIndexSocialMeta(readFile(indexPath));
|
||||
assertPrerenderedPluginRoutes(sitemapReport.pluginUrls, distDir, sitemapReport.normalizedRootPath);
|
||||
assertIndexSocialMeta(indexHtml);
|
||||
assertIndexDiscoveryMeta(indexHtml);
|
||||
assertRobots(readFile(robotsPath));
|
||||
assertLlms(readFile(llmsPath));
|
||||
assertManifest(readFile(manifestPath));
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,13 @@ import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
import {
|
||||
assertManifest,
|
||||
assertIndexDiscoveryMeta,
|
||||
assertPluginsDiscoveryMeta,
|
||||
analyzeSitemap,
|
||||
assertPrerenderedPluginRoutes,
|
||||
assertPrerenderedSkillRoutes,
|
||||
assertIndexSocialMeta,
|
||||
assertLlms,
|
||||
assertRobots,
|
||||
assertSitemap,
|
||||
extractSitemapLocations,
|
||||
@@ -33,6 +37,7 @@ describe('seo assets verification helpers', () => {
|
||||
const xml = `
|
||||
<urlset>
|
||||
<url><loc>https://owner.github.io/repo/</loc></url>
|
||||
<url><loc>https://owner.github.io/repo/plugins</loc></url>
|
||||
<url><loc>https://owner.github.io/repo/skill/agent-a</loc></url>
|
||||
<url><loc>https://owner.github.io/repo/skill/agent-b</loc></url>
|
||||
</urlset>
|
||||
@@ -56,12 +61,30 @@ describe('seo assets verification helpers', () => {
|
||||
const robots = `
|
||||
User-agent: *
|
||||
Allow: /
|
||||
User-agent: GPTBot
|
||||
Allow: /
|
||||
User-agent: OAI-SearchBot
|
||||
Allow: /
|
||||
User-agent: ClaudeBot
|
||||
Allow: /
|
||||
User-agent: PerplexityBot
|
||||
Allow: /
|
||||
Sitemap: https://example.com/sitemap.xml
|
||||
`;
|
||||
|
||||
expect(() => assertRobots(robots)).not.toThrow();
|
||||
});
|
||||
|
||||
it('requires llms.txt discovery signals', () => {
|
||||
const llms = `
|
||||
# Antigravity Awesome Skills
|
||||
1,494+ agentic skills with specialized plugins for Claude Code and Codex CLI.
|
||||
https://github.com/sickn33/antigravity-awesome-skills
|
||||
`;
|
||||
|
||||
expect(() => assertLlms(llms)).not.toThrow();
|
||||
});
|
||||
|
||||
it('requires social image tags in rendered index html', () => {
|
||||
const html = `
|
||||
<html>
|
||||
@@ -76,6 +99,52 @@ describe('seo assets verification helpers', () => {
|
||||
expect(() => assertIndexSocialMeta(html)).not.toThrow();
|
||||
});
|
||||
|
||||
it('requires current discovery copy in rendered index html', () => {
|
||||
const html = `
|
||||
<html>
|
||||
<head>
|
||||
<title>Antigravity Awesome Skills | 1,494+ AI coding skills and plugins</title>
|
||||
<meta name="description" content="Explore 1,494+ installable agentic skills, specialized plugins, bundles, and workflows." />
|
||||
<meta property="og:title" content="Antigravity Awesome Skills | 1,494+ AI coding skills and plugins" />
|
||||
<meta property="og:description" content="Explore 1,494+ installable agentic skills, specialized plugins, bundles, and workflows." />
|
||||
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,494+ AI coding skills and plugins" />
|
||||
<meta name="twitter:description" content="Explore 1,494+ installable agentic skills, specialized plugins, bundles, and workflows." />
|
||||
<script type="application/ld+json">
|
||||
[
|
||||
{"@context":"https://schema.org","@type":"CollectionPage"},
|
||||
{"@context":"https://schema.org","@type":"Organization"},
|
||||
{"@context":"https://schema.org","@type":"WebSite"},
|
||||
{"@context":"https://schema.org","@type":"SoftwareSourceCode"},
|
||||
{"@context":"https://schema.org","@type":"FAQPage"}
|
||||
]
|
||||
</script>
|
||||
</head>
|
||||
</html>
|
||||
`;
|
||||
|
||||
expect(() => assertIndexDiscoveryMeta(html)).not.toThrow();
|
||||
});
|
||||
|
||||
it('requires plugin landing discovery copy in rendered plugin html', () => {
|
||||
const html = `
|
||||
<html>
|
||||
<head>
|
||||
<title>AAS Specialized Plugins | 15 AI coding workflow packs</title>
|
||||
<meta name="description" content="Compare 15 specialized plugin packs for web apps and security." />
|
||||
<meta property="og:title" content="AAS Specialized Plugins | AI coding workflow packs" />
|
||||
<script type="application/ld+json">
|
||||
[
|
||||
{"@context":"https://schema.org","@type":"CollectionPage"},
|
||||
{"@context":"https://schema.org","@type":"Organization"}
|
||||
]
|
||||
</script>
|
||||
</head>
|
||||
</html>
|
||||
`;
|
||||
|
||||
expect(() => assertPluginsDiscoveryMeta(html)).not.toThrow();
|
||||
});
|
||||
|
||||
it('validates prerendered skill route files when present', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'seo-assets-'));
|
||||
const distDir = path.join(tmpDir, 'dist');
|
||||
@@ -94,6 +163,27 @@ describe('seo assets verification helpers', () => {
|
||||
expect(() => assertPrerenderedSkillRoutes(report.skillUrls, distDir, report.normalizedRootPath)).not.toThrow();
|
||||
});
|
||||
|
||||
it('validates prerendered plugin route files when present', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'seo-assets-'));
|
||||
const distDir = path.join(tmpDir, 'dist');
|
||||
const routeFile = path.join(distDir, 'plugins', 'index.html');
|
||||
fs.mkdirSync(path.dirname(routeFile), { recursive: true });
|
||||
fs.writeFileSync(
|
||||
routeFile,
|
||||
'<html><head><title>AAS Specialized Plugins | 15 AI coding workflow packs</title><meta name="description" content="Compare 15 specialized plugin packs." /><meta property="og:title" content="AAS Specialized Plugins | AI coding workflow packs" /><script type="application/ld+json">[{"@context":"https://schema.org","@type":"CollectionPage"},{"@context":"https://schema.org","@type":"Organization"}]</script></head></html>',
|
||||
);
|
||||
|
||||
const xml = `
|
||||
<urlset>
|
||||
<url><loc>https://owner.github.io/repo/</loc></url>
|
||||
<url><loc>https://owner.github.io/repo/plugins</loc></url>
|
||||
</urlset>
|
||||
`;
|
||||
|
||||
const report = analyzeSitemap(xml, { minSkillUrls: 0 });
|
||||
expect(() => assertPrerenderedPluginRoutes(report.pluginUrls, distDir, report.normalizedRootPath)).not.toThrow();
|
||||
});
|
||||
|
||||
it('throws when a prerendered skill file is missing', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'seo-assets-'));
|
||||
const distDir = path.join(tmpDir, 'dist');
|
||||
|
||||
@@ -4,6 +4,7 @@ import { Icon } from './components/ui/Icon';
|
||||
|
||||
const Home = lazy(() => import('./pages/Home'));
|
||||
const SkillDetail = lazy(() => import('./pages/SkillDetail'));
|
||||
const Plugins = lazy(() => import('./pages/Plugins'));
|
||||
|
||||
function App(): React.ReactElement {
|
||||
const logoSrc = `${import.meta.env.BASE_URL}Antigravity-Skills-logo.png`;
|
||||
@@ -24,7 +25,13 @@ function App(): React.ReactElement {
|
||||
</span>
|
||||
</Link>
|
||||
|
||||
<nav className="flex items-center">
|
||||
<nav className="flex items-center gap-2">
|
||||
<Link
|
||||
to="/plugins"
|
||||
className="hidden rounded-[var(--radius-sm)] px-3 py-2 text-sm font-medium text-[var(--text-secondary)] transition-colors hover:text-[var(--text-primary)] sm:inline-flex"
|
||||
>
|
||||
Plugins
|
||||
</Link>
|
||||
<a
|
||||
href="https://github.com/sickn33/antigravity-awesome-skills"
|
||||
target="_blank"
|
||||
@@ -49,6 +56,7 @@ function App(): React.ReactElement {
|
||||
>
|
||||
<Routes>
|
||||
<Route path="/" element={<Home />} />
|
||||
<Route path="/plugins" element={<Plugins />} />
|
||||
<Route path="/skill/:id" element={<SkillDetail />} />
|
||||
</Routes>
|
||||
</Suspense>
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
export type SpecializedPluginPriority = 'tier-1' | 'tier-2';
|
||||
|
||||
export interface SpecializedPlugin {
|
||||
id: string;
|
||||
name: string;
|
||||
priority: SpecializedPluginPriority;
|
||||
audience: string;
|
||||
why: string;
|
||||
skills: string[];
|
||||
}
|
||||
|
||||
export const specializedPlugins: SpecializedPlugin[] = [
|
||||
{
|
||||
id: 'aas-web-app-builder',
|
||||
name: 'AAS Web App Builder',
|
||||
priority: 'tier-1',
|
||||
audience: 'Frontend and full-stack developers shipping modern web apps.',
|
||||
why: 'High-demand workflow with a coherent path from UI design to React/Next.js implementation, forms, Tailwind, and SEO.',
|
||||
skills: ['frontend-developer', 'frontend-design', 'react-best-practices', 'nextjs-app-router-patterns', 'nextjs-best-practices', 'tailwind-patterns', 'shadcn', 'form-cro', 'seo-audit'],
|
||||
},
|
||||
{
|
||||
id: 'aas-product-design-studio',
|
||||
name: 'AAS Product Design Studio',
|
||||
priority: 'tier-1',
|
||||
audience: 'Builders who want richer UI, brand, portfolio, and visual product work.',
|
||||
why: 'Turns design from a generic skill category into a strong plugin proposition with visual direction, responsive UI, motion, and asset creation.',
|
||||
skills: ['ui-ux-pro-max', 'high-end-visual-design', 'frontend-design', 'mobile-design', '3d-web-experience', 'canvas-design', 'scroll-experience', 'interactive-portfolio'],
|
||||
},
|
||||
{
|
||||
id: 'aas-security-engineer',
|
||||
name: 'AAS Security Engineer',
|
||||
priority: 'tier-1',
|
||||
audience: 'Authorized security testing, audit, and hardening teams.',
|
||||
why: 'Security has enough depth in the catalog to deserve a standalone plugin with explicit authorized-use boundaries and testing workflows.',
|
||||
skills: ['ethical-hacking-methodology', 'burp-suite-testing', 'top-web-vulnerabilities', 'api-security-testing', 'linux-privilege-escalation', 'cloud-penetration-testing', 'security-auditor', 'vulnerability-scanner', 'sast-configuration'],
|
||||
},
|
||||
{
|
||||
id: 'aas-secure-app-builder',
|
||||
name: 'AAS Secure App Builder',
|
||||
priority: 'tier-1',
|
||||
audience: 'Application developers who want security embedded while building features.',
|
||||
why: 'Separates defensive implementation from offensive assessment, making a safer and clearer plugin for product engineering teams.',
|
||||
skills: ['api-security-best-practices', 'auth-implementation-patterns', 'backend-security-coder', 'frontend-security-coder', 'cc-skill-security-review', 'pci-compliance', 'sast-configuration', 'sql-injection-testing'],
|
||||
},
|
||||
{
|
||||
id: 'aas-documents-presentations',
|
||||
name: 'AAS Documents & Presentations',
|
||||
priority: 'tier-1',
|
||||
audience: 'Users creating, editing, converting, and automating office documents.',
|
||||
why: 'Combines the strongest file-format skills into a concrete productivity plugin that can be extended with app integrations.',
|
||||
skills: ['office-productivity', 'docx-official', 'xlsx-official', 'pptx-official', 'pdf-official', 'pdf-conversion-router', 'google-sheets-automation', 'google-slides-automation'],
|
||||
},
|
||||
{
|
||||
id: 'aas-data-analytics',
|
||||
name: 'AAS Data Analytics',
|
||||
priority: 'tier-1',
|
||||
audience: 'Operators, analysts, and builders working with product analytics, SQL, dashboards, and experiments.',
|
||||
why: 'Data work benefits from a repeatable toolchain: tracking, SQL, Postgres, dbt, dashboards, visualization, and experimentation.',
|
||||
skills: ['analytics-tracking', 'sql-pro', 'postgres-best-practices', 'database-architect', 'dbt-transformation-patterns', 'claude-d3js-skill', 'kpi-dashboard-design', 'ab-test-setup'],
|
||||
},
|
||||
{
|
||||
id: 'aas-agent-mcp-builder',
|
||||
name: 'AAS Agent & MCP Builder',
|
||||
priority: 'tier-1',
|
||||
audience: 'Developers building agentic apps, MCP tools, RAG systems, and evaluation loops.',
|
||||
why: 'Maps directly to plugin-based agent workflows because it can grow from skills into MCP server configuration and app/tool integrations.',
|
||||
skills: ['ai-agents-architect', 'agent-evaluation', 'mcp-builder', 'mcp-tool-developer', 'llm-app-patterns', 'rag-engineer', 'langgraph', 'langfuse', 'context-window-management'],
|
||||
},
|
||||
{
|
||||
id: 'aas-oss-maintainer',
|
||||
name: 'AAS OSS Maintainer',
|
||||
priority: 'tier-1',
|
||||
audience: 'Open-source maintainers managing PRs, releases, reviews, and contributor handoffs.',
|
||||
why: 'Packages repeatable repo work around review, release, changelog, GitHub workflows, and contributor handoffs.',
|
||||
skills: ['agents-md', 'commit', 'create-pr', 'requesting-code-review', 'receiving-code-review', 'changelog-automation', 'git-advanced-workflows', 'github-actions-advanced', 'address-github-comments', 'lint-and-validate'],
|
||||
},
|
||||
{
|
||||
id: 'aas-qa-test-automation',
|
||||
name: 'AAS QA & Test Automation',
|
||||
priority: 'tier-1',
|
||||
audience: 'Engineers and QA teams writing, debugging, and stabilizing test suites.',
|
||||
why: 'Testing is a natural plugin because users need a workflow: plan tests, automate browsers, debug failures, and fix regressions.',
|
||||
skills: ['test-driven-development', 'systematic-debugging', 'browser-automation', 'e2e-testing-patterns', 'playwright-skill', 'webapp-testing', 'k6-load-testing', 'test-fixing', 'code-review-checklist'],
|
||||
},
|
||||
{
|
||||
id: 'aas-devops-cloud',
|
||||
name: 'AAS DevOps & Cloud',
|
||||
priority: 'tier-1',
|
||||
audience: 'Teams shipping infrastructure, deployments, and operational workflows.',
|
||||
why: 'Combines deterministic scripts, cloud patterns, deployment safety, and incident workflows.',
|
||||
skills: ['docker-expert', 'aws-serverless', 'kubernetes-architect', 'terraform-specialist', 'github-actions-templates', 'environment-setup-guide', 'deployment-procedures', 'bash-linux', 'incident-responder'],
|
||||
},
|
||||
{
|
||||
id: 'aas-marketing-seo-growth',
|
||||
name: 'AAS Marketing, SEO & Growth',
|
||||
priority: 'tier-2',
|
||||
audience: 'Founders and growth teams creating content, SEO systems, experiments, and email campaigns.',
|
||||
why: 'A clearer proposition than many separate marketing skills: plan, write, measure, test, and improve acquisition work.',
|
||||
skills: ['content-creator', 'seo-audit', 'seo-fundamentals', 'programmatic-seo', 'analytics-tracking', 'ab-test-setup', 'email-sequence', 'copywriting', 'schema-markup'],
|
||||
},
|
||||
{
|
||||
id: 'aas-automation-builder',
|
||||
name: 'AAS Automation Builder',
|
||||
priority: 'tier-2',
|
||||
audience: 'Teams designing reliable automations across tools, data stores, and communication platforms.',
|
||||
why: 'Works best as a plugin because app connectors and MCP configuration can turn instructions into live workflows.',
|
||||
skills: ['workflow-automation', 'mcp-builder', 'make-automation', 'airtable-automation', 'notion-automation', 'slack-automation', 'googlesheets-automation', 'github-automation'],
|
||||
},
|
||||
{
|
||||
id: 'aas-observability-ir',
|
||||
name: 'AAS Observability IR',
|
||||
priority: 'tier-2',
|
||||
audience: 'Engineering teams monitoring systems, debugging production issues, and writing postmortems.',
|
||||
why: 'Operational work needs consistent procedure and proof gates, making it more plugin-worthy than isolated observability prompts.',
|
||||
skills: ['observability-engineer', 'distributed-tracing', 'slo-implementation', 'incident-responder', 'postmortem-writing', 'performance-engineer', 'grafana-dashboards', 'langfuse'],
|
||||
},
|
||||
{
|
||||
id: 'aas-python-api-builder',
|
||||
name: 'AAS Python API Builder',
|
||||
priority: 'tier-2',
|
||||
audience: 'Python developers building APIs, services, and tests.',
|
||||
why: 'Bundles framework guidance, async patterns, testing, and API design for Python service work.',
|
||||
skills: ['python-pro', 'python-patterns', 'fastapi-pro', 'fastapi-templates', 'django-pro', 'python-testing-patterns', 'async-python-patterns', 'api-design-principles'],
|
||||
},
|
||||
{
|
||||
id: 'aas-mobile-app-builder',
|
||||
name: 'AAS Mobile App Builder',
|
||||
priority: 'tier-2',
|
||||
audience: 'Mobile teams shipping Expo, React Native, Flutter, and iOS apps.',
|
||||
why: 'Covers architecture, Expo routes, distribution, CI, native platforms, and store optimization.',
|
||||
skills: ['expo-api-routes', 'expo-dev-client', 'expo-deployment', 'expo-cicd-workflows', 'react-native-patterns', 'mobile-design', 'flutter-expert', 'ios-developer', 'app-store-optimization'],
|
||||
},
|
||||
];
|
||||
@@ -6,8 +6,13 @@ import { Icon } from '../components/ui/Icon';
|
||||
import type { SyncMessage, CategoryStats } from '../types';
|
||||
import { usePageMeta } from '../hooks/usePageMeta';
|
||||
import { buildHomeMeta, getHomeFaqItems } from '../utils/seo';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const conceptCards = [
|
||||
{
|
||||
title: 'Specialized plugins',
|
||||
body: 'Focused installable distributions for domains like web apps, security, documents, data, DevOps, QA, OSS, mobile, automation, and agent/MCP work.',
|
||||
},
|
||||
{
|
||||
title: 'Skills',
|
||||
body: 'Reusable SKILL.md playbooks that teach an AI assistant how to execute a workflow with better structure and context.',
|
||||
@@ -194,6 +199,12 @@ export function Home(): React.ReactElement {
|
||||
>
|
||||
Read getting started docs
|
||||
</a>
|
||||
<Link
|
||||
to="/plugins"
|
||||
className="inline-flex items-center justify-center rounded-lg border border-slate-400/80 bg-white/80 px-4 py-2.5 text-sm font-semibold text-slate-900 shadow-[inset_0_1px_0_rgba(255,255,255,0.9),0_10px_20px_-16px_rgba(15,23,42,0.7)] transition-colors hover:border-slate-500 hover:bg-slate-100 dark:border-slate-600 dark:bg-slate-800/70 dark:text-slate-100 dark:hover:bg-slate-700"
|
||||
>
|
||||
Compare specialized plugins
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-5 flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400">
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
import { Link } from 'react-router-dom';
|
||||
import { specializedPlugins } from '../data/specializedPlugins';
|
||||
import { usePageMeta } from '../hooks/usePageMeta';
|
||||
import { buildPluginsMeta } from '../utils/seo';
|
||||
|
||||
const repoBaseUrl = 'https://github.com/sickn33/antigravity-awesome-skills';
|
||||
|
||||
function pluginFolderUrl(pluginId: string): string {
|
||||
return `${repoBaseUrl}/tree/main/plugins/antigravity-bundle-${pluginId}`;
|
||||
}
|
||||
|
||||
function pluginDocUrl(): string {
|
||||
return `${repoBaseUrl}/blob/main/docs/users/plugins.md`;
|
||||
}
|
||||
|
||||
export function Plugins(): React.ReactElement {
|
||||
usePageMeta(buildPluginsMeta(specializedPlugins.length));
|
||||
|
||||
const tierOne = specializedPlugins.filter((plugin) => plugin.priority === 'tier-1');
|
||||
const tierTwo = specializedPlugins.filter((plugin) => plugin.priority === 'tier-2');
|
||||
|
||||
return (
|
||||
<div className="relative min-h-[calc(100vh-8rem)]">
|
||||
<div className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[28rem] bg-[radial-gradient(circle_at_20%_12%,rgba(15,23,42,0.12),transparent_48%),radial-gradient(circle_at_84%_8%,rgba(99,102,241,0.16),transparent_54%)] dark:bg-[radial-gradient(circle_at_20%_12%,rgba(148,163,184,0.15),transparent_45%),radial-gradient(circle_at_84%_8%,rgba(129,140,248,0.2),transparent_52%)]" />
|
||||
|
||||
<div className="space-y-8 p-5 sm:p-7">
|
||||
<section className="rounded-2xl border border-slate-200/80 bg-white p-6 shadow-[0_20px_55px_-32px_rgba(15,23,42,0.55)] sm:p-8 dark:border-slate-800/80 dark:bg-slate-900">
|
||||
<p className="mb-3 text-xs font-semibold uppercase tracking-[0.22em] text-slate-500 dark:text-slate-400">
|
||||
Specialized Plugins
|
||||
</p>
|
||||
<h1 className="max-w-[24ch] text-3xl font-bold tracking-tight text-slate-900 [text-wrap:balance] sm:text-[3.25rem] sm:leading-[0.97] dark:text-slate-100">
|
||||
Choose the focused AAS plugin for your AI coding workflow
|
||||
</h1>
|
||||
<p className="mt-4 max-w-4xl text-sm leading-relaxed text-slate-600 sm:text-base dark:text-slate-300">
|
||||
AAS specialized plugins are focused, domain-specific distributions of the 1,494+ skill library.
|
||||
Start here when you know the job: web apps, security, data analytics, documents, DevOps, QA,
|
||||
OSS maintenance, mobile apps, automation, or agent and MCP systems.
|
||||
</p>
|
||||
<div className="mt-6 flex flex-col gap-3 sm:flex-row sm:flex-wrap">
|
||||
<a
|
||||
href={pluginDocUrl()}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center justify-center rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-semibold text-white transition-colors hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white"
|
||||
>
|
||||
Read plugin install guide
|
||||
</a>
|
||||
<Link
|
||||
to="/"
|
||||
className="inline-flex items-center justify-center rounded-lg border border-slate-400/80 bg-white/80 px-4 py-2.5 text-sm font-semibold text-slate-900 shadow-[inset_0_1px_0_rgba(255,255,255,0.9),0_10px_20px_-16px_rgba(15,23,42,0.7)] transition-colors hover:border-slate-500 hover:bg-slate-100 dark:border-slate-600 dark:bg-slate-800/70 dark:text-slate-100 dark:hover:bg-slate-700"
|
||||
>
|
||||
Browse full skill catalog
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="rounded-2xl border border-slate-200/80 bg-white p-6 shadow-sm sm:p-7 dark:border-slate-800 dark:bg-slate-900">
|
||||
<p className="mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400">
|
||||
Quick Answer
|
||||
</p>
|
||||
<h2 className="text-2xl font-bold tracking-tight text-slate-900 dark:text-slate-100">
|
||||
Plugins, bundles, and workflows serve different decisions
|
||||
</h2>
|
||||
<div className="mt-5 grid gap-4 md:grid-cols-3">
|
||||
<article className="rounded-xl border border-slate-200 bg-slate-50 p-4 dark:border-slate-800 dark:bg-slate-950">
|
||||
<h3 className="text-base font-semibold text-slate-900 dark:text-slate-100">Plugin</h3>
|
||||
<p className="mt-2 text-sm leading-relaxed text-slate-600 dark:text-slate-300">
|
||||
What should I install or activate for this domain?
|
||||
</p>
|
||||
</article>
|
||||
<article className="rounded-xl border border-slate-200 bg-slate-50 p-4 dark:border-slate-800 dark:bg-slate-950">
|
||||
<h3 className="text-base font-semibold text-slate-900 dark:text-slate-100">Bundle</h3>
|
||||
<p className="mt-2 text-sm leading-relaxed text-slate-600 dark:text-slate-300">
|
||||
Which skills naturally belong together for a role?
|
||||
</p>
|
||||
</article>
|
||||
<article className="rounded-xl border border-slate-200 bg-slate-50 p-4 dark:border-slate-800 dark:bg-slate-950">
|
||||
<h3 className="text-base font-semibold text-slate-900 dark:text-slate-100">Workflow</h3>
|
||||
<p className="mt-2 text-sm leading-relaxed text-slate-600 dark:text-slate-300">
|
||||
What order should the assistant follow to get a result?
|
||||
</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<PluginSection title="Tier 1 Plugins" plugins={tierOne} />
|
||||
<PluginSection title="Tier 2 Plugins" plugins={tierTwo} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function PluginSection({
|
||||
title,
|
||||
plugins,
|
||||
}: {
|
||||
title: string;
|
||||
plugins: typeof specializedPlugins;
|
||||
}): React.ReactElement {
|
||||
return (
|
||||
<section className="space-y-4">
|
||||
<div>
|
||||
<p className="mb-2 text-xs font-semibold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400">
|
||||
AAS plugin catalog
|
||||
</p>
|
||||
<h2 className="text-2xl font-bold tracking-tight text-slate-900 dark:text-slate-100">{title}</h2>
|
||||
</div>
|
||||
<div className="grid gap-4 xl:grid-cols-2">
|
||||
{plugins.map((plugin) => (
|
||||
<article
|
||||
key={plugin.id}
|
||||
id={plugin.id}
|
||||
className="rounded-xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-800 dark:bg-slate-900"
|
||||
>
|
||||
<div className="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
|
||||
<div>
|
||||
<h3 className="text-xl font-bold tracking-tight text-slate-900 dark:text-slate-100">{plugin.name}</h3>
|
||||
<p className="mt-2 text-sm leading-relaxed text-slate-600 dark:text-slate-300">{plugin.audience}</p>
|
||||
</div>
|
||||
<span className="w-fit rounded-full border border-slate-200 bg-slate-100 px-3 py-1 text-xs font-semibold uppercase tracking-[0.14em] text-slate-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300">
|
||||
{plugin.priority}
|
||||
</span>
|
||||
</div>
|
||||
<p className="mt-4 text-sm leading-relaxed text-slate-600 dark:text-slate-300">{plugin.why}</p>
|
||||
<div className="mt-4 flex flex-wrap gap-2">
|
||||
{plugin.skills.slice(0, 6).map((skillId) => (
|
||||
<Link
|
||||
key={skillId}
|
||||
to={`/skill/${encodeURIComponent(skillId)}`}
|
||||
className="rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs font-medium text-slate-700 transition-colors hover:border-slate-400 hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-300 dark:hover:border-slate-500"
|
||||
>
|
||||
@{skillId}
|
||||
</Link>
|
||||
))}
|
||||
{plugin.skills.length > 6 && (
|
||||
<span className="rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs font-medium text-slate-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-400">
|
||||
+{plugin.skills.length - 6} more
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-5 flex flex-col gap-2 sm:flex-row sm:flex-wrap">
|
||||
<a
|
||||
href={pluginFolderUrl(plugin.id)}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center justify-center rounded-lg border border-slate-300 px-3 py-2 text-sm font-semibold text-slate-800 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-800"
|
||||
>
|
||||
View plugin folder
|
||||
</a>
|
||||
<a
|
||||
href={`${repoBaseUrl}/blob/main/docs/users/bundles.md#${plugin.id}`}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center justify-center rounded-lg border border-slate-300 px-3 py-2 text-sm font-semibold text-slate-800 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-800"
|
||||
>
|
||||
Read bundle notes
|
||||
</a>
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
export default Plugins;
|
||||
@@ -0,0 +1,21 @@
|
||||
import { screen } from '@testing-library/react';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { Plugins } from '../Plugins';
|
||||
import { renderWithRouter } from '../../utils/testUtils';
|
||||
|
||||
describe('Plugins', () => {
|
||||
it('renders the specialized plugin catalog and sets metadata', () => {
|
||||
renderWithRouter(<Plugins />, { route: '/plugins', path: '/plugins', useProvider: false });
|
||||
|
||||
expect(screen.getByRole('heading', { name: /Choose the focused AAS plugin/i })).toBeInTheDocument();
|
||||
expect(screen.getByText('AAS Web App Builder')).toBeInTheDocument();
|
||||
expect(screen.getByText('AAS Security Engineer')).toBeInTheDocument();
|
||||
expect(screen.getByText('AAS Marketing, SEO & Growth')).toBeInTheDocument();
|
||||
expect(screen.getByText(/Plugins, bundles, and workflows serve different decisions/i)).toBeInTheDocument();
|
||||
expect(document.title).toContain('AAS Specialized Plugins');
|
||||
expect(document.querySelector('meta[name="description"]')).toHaveAttribute(
|
||||
'content',
|
||||
expect.stringContaining('specialized plugin'),
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -28,7 +28,7 @@ describe('SEO helpers', () => {
|
||||
it('builds homepage metadata with the canonical catalog message', () => {
|
||||
const meta = buildHomeMeta(10);
|
||||
|
||||
expect(meta.title).toContain('10 installable AI skills');
|
||||
expect(meta.title).toContain('10+ AI coding skills and plugins');
|
||||
expect(meta.description).toContain('10 installable agentic skills');
|
||||
expect(meta.canonicalPath).toBe('/');
|
||||
expect(meta.ogTitle).toBe(meta.title);
|
||||
|
||||
@@ -8,22 +8,27 @@ const FAQ_ITEMS = [
|
||||
{
|
||||
question: 'What is Antigravity Awesome Skills?',
|
||||
answer:
|
||||
'Antigravity Awesome Skills is an installable GitHub library of reusable SKILL.md playbooks for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related AI coding assistants.',
|
||||
'Antigravity Awesome Skills is an installable GitHub library of 1,494+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
|
||||
},
|
||||
{
|
||||
question: 'How do I install Antigravity Awesome Skills?',
|
||||
answer:
|
||||
'Install the library with npx antigravity-awesome-skills, then use tool-specific flags such as --codex, --cursor, --gemini, or --claude when you want the installer to target a specific skills directory.',
|
||||
'Install the library with npx antigravity-awesome-skills. Use tool-specific flags such as --codex, --cursor, --gemini, --claude, or --antigravity when you want the installer to target a specific skills directory already used by your assistant runtime.',
|
||||
},
|
||||
{
|
||||
question: 'What are AAS specialized plugins?',
|
||||
answer:
|
||||
'AAS specialized plugins are focused, domain-specific distributions of the skill library. They package relevant skills for web apps, security, data analytics, documents, DevOps, QA, OSS maintenance, and agent or MCP work so users can start with the right surface instead of activating the entire catalog.',
|
||||
},
|
||||
{
|
||||
question: 'What is the difference between skills and MCP tools?',
|
||||
answer:
|
||||
'Skills are reusable playbooks that tell an AI assistant how to execute a workflow, while MCP tools expose external systems or actions the assistant can call. Skills guide behavior; MCP tools provide capabilities.',
|
||||
'Skills are reusable playbooks that tell an AI assistant how to execute a workflow. MCP tools expose external systems or callable actions. Skills guide behavior, context, constraints, and output quality; MCP tools provide the external capabilities an assistant may need while following those instructions.',
|
||||
},
|
||||
{
|
||||
question: 'What is the difference between bundles and workflows?',
|
||||
question: 'How are plugins, bundles, and workflows different?',
|
||||
answer:
|
||||
'Bundles are curated sets of recommended skills for a role or domain, while workflows are ordered execution playbooks that show how to combine skills step by step for a concrete outcome.',
|
||||
'Plugins are installable packaging surfaces, bundles are curated skill recommendations, and workflows are ordered execution playbooks. Start with a plugin when the domain is clear, use bundles to compare adjacent skills, and use workflows when sequencing planning, coding, testing, auditing, or release work matters.',
|
||||
},
|
||||
] as const;
|
||||
|
||||
@@ -77,6 +82,11 @@ function buildOrganizationSchema(): Record<string, unknown> {
|
||||
'@type': 'Organization',
|
||||
name: SITE_NAME,
|
||||
url: 'https://github.com/sickn33/antigravity-awesome-skills',
|
||||
sameAs: [
|
||||
'https://x.com/AASkills_',
|
||||
'https://www.npmjs.com/package/antigravity-awesome-skills',
|
||||
'https://sickn33.github.io/antigravity-awesome-skills/',
|
||||
],
|
||||
brand: {
|
||||
'@type': 'Brand',
|
||||
name: SITE_NAME,
|
||||
@@ -91,6 +101,11 @@ function buildWebSiteSchema(canonicalUrl: string): Record<string, unknown> {
|
||||
name: SITE_NAME,
|
||||
url: getCatalogBaseUrl(canonicalUrl),
|
||||
inLanguage: 'en',
|
||||
potentialAction: {
|
||||
'@type': 'SearchAction',
|
||||
target: `${getCatalogBaseUrl(canonicalUrl).replace(/\/+$/, '')}/?q={search_term_string}`,
|
||||
'query-input': 'required name=search_term_string',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -103,9 +118,21 @@ function buildSoftwareSourceCodeSchema(canonicalUrl: string, visibleCount: numbe
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'SoftwareSourceCode',
|
||||
name: SITE_NAME,
|
||||
description: `Installable GitHub library of ${visibleCountLabel} for AI coding assistants.`,
|
||||
description: `Installable GitHub library of ${visibleCountLabel}, specialized plugins, bundles, and workflows for AI coding assistants.`,
|
||||
url: canonicalUrl,
|
||||
codeRepository: 'https://github.com/sickn33/antigravity-awesome-skills',
|
||||
applicationCategory: 'DeveloperApplication',
|
||||
keywords: [
|
||||
'AI coding assistant skills',
|
||||
'Claude Code skills',
|
||||
'Codex CLI skills',
|
||||
'Cursor skills',
|
||||
'Gemini CLI skills',
|
||||
'Antigravity skills',
|
||||
'specialized plugins',
|
||||
'SKILL.md',
|
||||
],
|
||||
isAccessibleForFree: true,
|
||||
programmingLanguage: {
|
||||
'@type': 'ComputerLanguage',
|
||||
name: 'Markdown',
|
||||
@@ -281,13 +308,13 @@ export function isTopSkill(skillId: string, skills: ReadonlyArray<Skill>, limit
|
||||
|
||||
export function buildHomeMeta(skillCount: number): SeoMeta {
|
||||
const visibleCount = Math.max(skillCount, 0);
|
||||
const visibleCountLabel = visibleCount > 0
|
||||
? `${visibleCount.toLocaleString('en-US')} installable AI skills`
|
||||
: 'installable AI skills';
|
||||
const title = `Antigravity Awesome Skills | ${visibleCountLabel} catalog`;
|
||||
const visibleCountLabel = visibleCount > 0 ? `${visibleCount.toLocaleString('en-US')}+` : '';
|
||||
const title = visibleCount > 0
|
||||
? `Antigravity Awesome Skills | ${visibleCountLabel} AI coding skills and plugins`
|
||||
: 'Antigravity Awesome Skills | AI coding skills and plugins';
|
||||
const description = visibleCount > 0
|
||||
? `Explore ${visibleCount.toLocaleString('en-US')} installable agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity. Browse bundles, workflows, FAQs, and integration guides in one place.`
|
||||
: 'Explore installable agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity. Browse bundles, workflows, FAQs, and integration guides in one place.';
|
||||
? `Explore ${visibleCount.toLocaleString('en-US')} installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.`
|
||||
: 'Explore installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.';
|
||||
return {
|
||||
title,
|
||||
description,
|
||||
@@ -317,6 +344,39 @@ export function buildHomeMeta(skillCount: number): SeoMeta {
|
||||
};
|
||||
}
|
||||
|
||||
export function buildPluginsMeta(pluginCount: number): SeoMeta {
|
||||
const countLabel = pluginCount > 0 ? `${pluginCount.toLocaleString('en-US')} ` : '';
|
||||
const title = `AAS Specialized Plugins | ${countLabel}AI coding workflow packs`;
|
||||
const description = `Compare ${countLabel}specialized plugin packs for web apps, security, data analytics, documents, DevOps, QA, OSS maintenance, mobile apps, automation, and agent or MCP systems.`;
|
||||
|
||||
return {
|
||||
title,
|
||||
description,
|
||||
canonicalPath: '/plugins',
|
||||
ogTitle: 'AAS Specialized Plugins | AI coding workflow packs',
|
||||
ogDescription: description,
|
||||
ogImage: DEFAULT_SOCIAL_IMAGE,
|
||||
twitterCard: 'summary_large_image',
|
||||
jsonLd: (canonicalUrl: string) => [
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'CollectionPage',
|
||||
name: 'AAS Specialized Plugins',
|
||||
description,
|
||||
url: canonicalUrl,
|
||||
isPartOf: buildWebSiteSchema(canonicalUrl),
|
||||
mainEntity: {
|
||||
'@type': 'ItemList',
|
||||
name: 'AAS specialized plugin packs',
|
||||
numberOfItems: pluginCount,
|
||||
},
|
||||
},
|
||||
buildOrganizationSchema(),
|
||||
buildWebSiteSchema(canonicalUrl),
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
export function buildSkillMeta(skill: Skill, isPriority = false, canonicalPath = '/'): SeoMeta {
|
||||
const safeName = skill.name || 'Unnamed skill';
|
||||
const safeDescription = skill.description || 'Installable AI skill';
|
||||
|
||||
Reference in New Issue
Block a user