📦 deps(thirdparty): update snapshots

This commit is contained in:
ci[bot]
2026-06-02 16:01:55 +00:00
parent 8696cd9e52
commit ac7fffe532
834 changed files with 153251 additions and 1426 deletions
@@ -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';