From 9dc81e18a76adb9a8dca6460adc4db6d29e9bfe9 Mon Sep 17 00:00:00 2001 From: "ci[bot]" Date: Sat, 4 Jul 2026 16:04:20 +0000 Subject: [PATCH] :package: deps(thirdparty): update snapshots --- .../.claude-plugin/marketplace.json | 120 +++---- .../.claude-plugin/plugin.json | 4 +- .../.github/workflows/ci.yml | 3 + antigravity-awesome-skills/CATALOG.md | 10 +- antigravity-awesome-skills/CHANGELOG.md | 43 +++ antigravity-awesome-skills/README.md | 27 +- antigravity-awesome-skills/SOURCE.md | 4 +- .../apps/web-app/index.html | 12 +- .../apps/web-app/public/llms.txt | 8 +- .../apps/web-app/public/sitemap.xml | 182 +++++----- .../apps/web-app/public/skills.json.backup | 46 +++ .../apps/web-app/public/social-card.svg | 2 +- .../apps/web-app/scripts/generate-sitemap.js | 16 +- .../web-app/scripts/generate-sitemap.test.js | 16 +- .../apps/web-app/scripts/prerender-routes.js | 7 +- .../web-app/scripts/verify-seo-assets.test.js | 12 +- .../web-app/src/utils/__tests__/seo.test.ts | 6 +- .../apps/web-app/src/utils/seo.ts | 11 +- .../assets/star-history.png | Bin 50901 -> 50932 bytes antigravity-awesome-skills/data/aliases.json | 2 +- antigravity-awesome-skills/data/bundles.json | 5 +- antigravity-awesome-skills/data/catalog.json | 62 +++- .../data/plugin-compatibility.json | 50 ++- .../data/skills_index.json | 46 +++ .../docs/integrations/jetski-cortex.md | 6 +- .../jetski-gemini-loader/README.md | 2 +- .../docs/maintainers/repo-growth-seo.md | 6 +- .../docs/maintainers/skills-update-guide.md | 2 +- .../docs/users/bundles.md | 2 +- .../docs/users/claude-code-skills.md | 2 +- .../docs/users/gemini-cli-skills.md | 2 +- .../docs/users/getting-started.md | 2 +- .../docs/users/kiro-integration.md | 2 +- .../docs/users/usage.md | 8 +- .../docs/users/visual-guide.md | 8 +- antigravity-awesome-skills/package-lock.json | 4 +- antigravity-awesome-skills/package.json | 4 +- .../.claude-plugin/plugin.json | 4 +- .../skills/app-store-optimization/SKILL.md | 7 + .../skills/context-kit/SKILL.md | 135 +++++++ .../skills/wp-site-health-auditor/SKILL.md | 335 ++++++++++++++++++ .../references/catalog.md | 134 +++++++ .../.codex-plugin/plugin.json | 4 +- .../skills/app-store-optimization/SKILL.md | 7 + .../skills/wp-site-health-auditor/SKILL.md | 335 ++++++++++++++++++ .../references/catalog.md | 134 +++++++ .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../skills/app-store-optimization/SKILL.md | 7 + .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../skills/app-store-optimization/SKILL.md | 7 + .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../skills/app-store-optimization/SKILL.md | 7 + .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../skills/app-store-optimization/SKILL.md | 7 + .../skills/context-kit/SKILL.md | 135 +++++++ .../skills/wp-site-health-auditor/SKILL.md | 335 ++++++++++++++++++ .../references/catalog.md | 134 +++++++ antigravity-awesome-skills/skills_index.json | 46 +++ .../tools/scripts/pr_preflight.cjs | 4 + .../tools/scripts/tests/pr_preflight.test.js | 46 +++ ui-ux-pro-max/.github/workflows/release.yml | 2 +- .../.github/workflows/smoke-stacks.yml | 14 +- ui-ux-pro-max/README.md | 7 +- ui-ux-pro-max/SOURCE.md | 4 +- ui-ux-pro-max/cli/assets/data/products.csv | 4 +- .../cli/assets/data/stacks/angular.csv | 88 ++--- .../cli/assets/data/stacks/astro.csv | 22 +- .../cli/assets/data/stacks/laravel.csv | 48 +-- ui-ux-pro-max/cli/assets/data/styles.csv | 6 +- ui-ux-pro-max/cli/assets/data/typography.csv | 147 ++++---- ui-ux-pro-max/cli/package.json | 7 +- ui-ux-pro-max/cli/scripts/build.mjs | 32 ++ ui-ux-pro-max/cli/src/commands/init.ts | 10 +- ui-ux-pro-max/cli/src/utils/template.ts | 10 +- ui-ux-pro-max/scripts/smoke-domains.sh | 52 +++ ui-ux-pro-max/scripts/validate-csv.py | 91 +++++ .../src/ui-ux-pro-max/data/products.csv | 4 +- .../src/ui-ux-pro-max/data/stacks/angular.csv | 88 ++--- .../src/ui-ux-pro-max/data/stacks/astro.csv | 22 +- .../src/ui-ux-pro-max/data/stacks/laravel.csv | 48 +-- .../src/ui-ux-pro-max/data/styles.csv | 142 ++++---- .../src/ui-ux-pro-max/data/typography.csv | 147 ++++---- 194 files changed, 3039 insertions(+), 755 deletions(-) create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/context-kit/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/references/catalog.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md create mode 100644 antigravity-awesome-skills/skills/context-kit/SKILL.md create mode 100644 antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md create mode 100644 antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md create mode 100644 antigravity-awesome-skills/tools/scripts/tests/pr_preflight.test.js create mode 100644 ui-ux-pro-max/cli/scripts/build.mjs create mode 100755 ui-ux-pro-max/scripts/smoke-domains.sh create mode 100755 ui-ux-pro-max/scripts/validate-csv.py diff --git a/antigravity-awesome-skills/.claude-plugin/marketplace.json b/antigravity-awesome-skills/.claude-plugin/marketplace.json index 9b558f5c..0d815046 100644 --- a/antigravity-awesome-skills/.claude-plugin/marketplace.json +++ b/antigravity-awesome-skills/.claude-plugin/marketplace.json @@ -6,12 +6,12 @@ }, "metadata": { "description": "Claude Code marketplace entries for the plugin-safe Antigravity Awesome Skills library and its compatible editorial bundles.", - "version": "13.9.0" + "version": "13.10.0" }, "plugins": [ { "name": "antigravity-awesome-skills", - "version": "13.9.0", + "version": "13.10.0", "description": "Expose the plugin-safe Claude Code subset of Antigravity Awesome Skills through a single marketplace entry.", "author": { "name": "sickn33 and contributors", @@ -31,7 +31,7 @@ }, { "name": "antigravity-bundle-essentials", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Essentials\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -51,7 +51,7 @@ }, { "name": "antigravity-bundle-security-engineer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Security Engineer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -71,7 +71,7 @@ }, { "name": "antigravity-bundle-security-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Security Developer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -91,7 +91,7 @@ }, { "name": "antigravity-bundle-web-wizard", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Web Wizard\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -111,7 +111,7 @@ }, { "name": "antigravity-bundle-web-designer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Web Designer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -131,7 +131,7 @@ }, { "name": "antigravity-bundle-full-stack-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Full-Stack Developer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -151,7 +151,7 @@ }, { "name": "antigravity-bundle-agent-architect", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Agent Architect\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -171,7 +171,7 @@ }, { "name": "antigravity-bundle-llm-application-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"LLM Application Developer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -191,7 +191,7 @@ }, { "name": "antigravity-bundle-indie-game-dev", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Indie Game Dev\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -211,7 +211,7 @@ }, { "name": "antigravity-bundle-python-pro", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Python Pro\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -231,7 +231,7 @@ }, { "name": "antigravity-bundle-typescript-javascript", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"TypeScript & JavaScript\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -251,7 +251,7 @@ }, { "name": "antigravity-bundle-systems-programming", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Systems Programming\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -271,7 +271,7 @@ }, { "name": "antigravity-bundle-startup-founder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Startup Founder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -291,7 +291,7 @@ }, { "name": "antigravity-bundle-business-analyst", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Business Analyst\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -311,7 +311,7 @@ }, { "name": "antigravity-bundle-marketing-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Marketing & Growth\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -331,7 +331,7 @@ }, { "name": "antigravity-bundle-devops-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"DevOps & Cloud\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -351,7 +351,7 @@ }, { "name": "antigravity-bundle-observability-monitoring", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Observability & Monitoring\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -371,7 +371,7 @@ }, { "name": "antigravity-bundle-data-analytics", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Data & Analytics\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -391,7 +391,7 @@ }, { "name": "antigravity-bundle-data-engineering", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Data Engineering\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -411,7 +411,7 @@ }, { "name": "antigravity-bundle-creative-director", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Creative Director\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -431,7 +431,7 @@ }, { "name": "antigravity-bundle-qa-testing", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"QA & Testing\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -451,7 +451,7 @@ }, { "name": "antigravity-bundle-aas-web-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Web App Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -471,7 +471,7 @@ }, { "name": "antigravity-bundle-aas-product-design-studio", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Product Design Studio\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -491,7 +491,7 @@ }, { "name": "antigravity-bundle-aas-security-engineer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Security Engineer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -511,7 +511,7 @@ }, { "name": "antigravity-bundle-aas-secure-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Secure App Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -531,7 +531,7 @@ }, { "name": "antigravity-bundle-aas-documents-presentations", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Documents & Presentations\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -551,7 +551,7 @@ }, { "name": "antigravity-bundle-aas-data-analytics", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Data Analytics\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -571,7 +571,7 @@ }, { "name": "antigravity-bundle-aas-agent-mcp-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Agent & MCP Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -591,7 +591,7 @@ }, { "name": "antigravity-bundle-aas-oss-maintainer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS OSS Maintainer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -611,7 +611,7 @@ }, { "name": "antigravity-bundle-aas-qa-test-automation", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS QA & Test Automation\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -631,7 +631,7 @@ }, { "name": "antigravity-bundle-aas-devops-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS DevOps & Cloud\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -651,7 +651,7 @@ }, { "name": "antigravity-bundle-aas-marketing-seo-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Marketing, SEO & Growth\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -671,7 +671,7 @@ }, { "name": "antigravity-bundle-aas-automation-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Automation Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -691,7 +691,7 @@ }, { "name": "antigravity-bundle-aas-observability-ir", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Observability IR\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -711,7 +711,7 @@ }, { "name": "antigravity-bundle-aas-python-api-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Python API Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -731,7 +731,7 @@ }, { "name": "antigravity-bundle-aas-mobile-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Mobile App Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -751,7 +751,7 @@ }, { "name": "antigravity-bundle-mobile-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Mobile Developer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -771,7 +771,7 @@ }, { "name": "antigravity-bundle-integration-apis", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Integration & APIs\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -791,7 +791,7 @@ }, { "name": "antigravity-bundle-architecture-design", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Architecture & Design\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -811,7 +811,7 @@ }, { "name": "antigravity-bundle-ddd-evented-architecture", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"DDD & Evented Architecture\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -831,7 +831,7 @@ }, { "name": "antigravity-bundle-automation-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Automation Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -851,7 +851,7 @@ }, { "name": "antigravity-bundle-revops-crm-automation", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"RevOps & CRM Automation\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -871,7 +871,7 @@ }, { "name": "antigravity-bundle-commerce-payments", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Commerce & Payments\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -891,7 +891,7 @@ }, { "name": "antigravity-bundle-odoo-erp", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Odoo ERP\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -911,7 +911,7 @@ }, { "name": "antigravity-bundle-azure-ai-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Azure AI & Cloud\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -931,7 +931,7 @@ }, { "name": "antigravity-bundle-expo-react-native", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Expo & React Native\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -951,7 +951,7 @@ }, { "name": "antigravity-bundle-apple-platform-design", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Apple Platform Design\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -971,7 +971,7 @@ }, { "name": "antigravity-bundle-makepad-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Makepad Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -991,7 +991,7 @@ }, { "name": "antigravity-bundle-seo-specialist", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"SEO Specialist\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1011,7 +1011,7 @@ }, { "name": "antigravity-bundle-documents-presentations", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Documents & Presentations\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1031,7 +1031,7 @@ }, { "name": "antigravity-bundle-oss-maintainer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"OSS Maintainer\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1051,7 +1051,7 @@ }, { "name": "antigravity-bundle-aas-accessibility-inclusive-ux", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Accessibility & Inclusive UX\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1071,7 +1071,7 @@ }, { "name": "antigravity-bundle-aas-api-platform-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS API Platform Builder\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1091,7 +1091,7 @@ }, { "name": "antigravity-bundle-aas-saas-launch-revenue", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS SaaS Launch & Revenue\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1111,7 +1111,7 @@ }, { "name": "antigravity-bundle-aas-ai-product-evaluation-ops", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS AI Product & Evaluation Ops\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1131,7 +1131,7 @@ }, { "name": "antigravity-bundle-aas-data-engineering-platform", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Data Engineering Platform\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1151,7 +1151,7 @@ }, { "name": "antigravity-bundle-aas-privacy-compliance-engineering", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Privacy & Compliance Engineering\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", @@ -1171,7 +1171,7 @@ }, { "name": "antigravity-bundle-aas-localization-international-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Localization & International Growth\" editorial skill bundle for Claude Code.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/.claude-plugin/plugin.json b/antigravity-awesome-skills/.claude-plugin/plugin.json index 2e93c510..c7928114 100644 --- a/antigravity-awesome-skills/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "antigravity-awesome-skills", - "version": "13.9.0", - "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,848 supported skills.", + "version": "13.10.0", + "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,850 supported skills.", "author": { "name": "sickn33 and contributors", "url": "https://github.com/sickn33/antigravity-awesome-skills" diff --git a/antigravity-awesome-skills/.github/workflows/ci.yml b/antigravity-awesome-skills/.github/workflows/ci.yml index de3771bf..97feceed 100644 --- a/antigravity-awesome-skills/.github/workflows/ci.yml +++ b/antigravity-awesome-skills/.github/workflows/ci.yml @@ -31,6 +31,9 @@ jobs: with: node-version: "lts/*" + - name: Install npm dependencies + run: npm ci + - name: Fetch base branch run: git fetch origin "${{ github.base_ref }}" diff --git a/antigravity-awesome-skills/CATALOG.md b/antigravity-awesome-skills/CATALOG.md index 2fa53f56..0005757b 100644 --- a/antigravity-awesome-skills/CATALOG.md +++ b/antigravity-awesome-skills/CATALOG.md @@ -1,8 +1,8 @@ # Skill Catalog -Generated at: 2026-07-03T08:28:21.000Z +Generated at: 2026-07-04T15:00:26.000Z -Total skills: 1896 +Total skills: 1898 ## architecture (113) @@ -869,7 +869,7 @@ Total skills: 1896 | `yann-lecun-filosofia` | Sub-skill filosΓ³fica e pedagΓ³gica de Yann LeCun. | persona, ai-philosophy, open-source, education | persona, ai-philosophy, open-source, education, yann, lecun, filosofia, sub, skill, filos, fica, pedag | | `youtube-notetaker` | Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer. | dair-academy, ai, workflow | dair-academy, ai, workflow, youtube, notetaker, turn, talks, local, study, notes, slides, transcripts | -## general (510) +## general (511) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -972,6 +972,7 @@ Total skills: 1896 | `context-compression` | When agent sessions generate millions of tokens of conversation history, compression becomes mandatory. The naive approach is aggressive compression to minim... | compression | compression, context, agent, sessions, generate, millions, tokens, conversation, history, becomes, mandatory, naive | | `context-engineering` | Optimizes agent context setup. Use when starting a new session, when agent output quality degrades, when switching between tasks, or when you need to configu... | engineering | engineering, context, optimizes, agent, setup, starting, new, session, output, quality, degrades, switching | | `context-fundamentals` | Context is the complete state available to a language model at inference time. It includes everything the model can attend to when generating responses: syst... | fundamentals | fundamentals, context, complete, state, available, language, model, inference, time, includes, everything, attend | +| `context-kit` | Evaluate, adapt, and safely install Context Kit personal context artifacts for Claude Code or adjacent agent workflows. | personal-context, claude-code, memory, knowledge-management, agent-workflows | personal-context, claude-code, memory, knowledge-management, agent-workflows, context, kit, evaluate, adapt, safely, install, personal | | `context-management-context-restore` | Use when working with context management context restore | restore | restore, context, working | | `context-management-context-save` | Use when working with context management context save | save | save, context, working | | `context-optimization` | Context optimization extends the effective capacity of limited context windows through strategic compression, masking, caching, and partitioning. The goal is... | optimization | optimization, context, extends, effective, capacity, limited, windows, through, strategic, compression, masking, caching | @@ -1571,7 +1572,7 @@ Total skills: 1896 | `workflow-automation` | Workflow automation is the infrastructure that makes AI agents reliable. Without durable execution, a network hiccup during a 10-step payment flow means lost... | | automation, infrastructure, makes, ai, agents, reliable, without, durable, execution, network, hiccup, during | | `youtube-full` | Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI β€” no yt-dlp, no Google API key, works from any cloud server. | youtube, transcripts, video-search, channels, playlists, api, transcriptapi | youtube, transcripts, video-search, channels, playlists, api, transcriptapi, full, fetch, search, videos, browse | -## security (200) +## security (201) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -1772,6 +1773,7 @@ Total skills: 1896 | `wordpress` | Complete WordPress development workflow covering theme development, plugin creation, WooCommerce integration, performance optimization, and security hardenin... | wordpress | wordpress, complete, development, covering, theme, plugin, creation, woocommerce, integration, performance, optimization, security | | `wordpress-penetration-testing` | Assess WordPress installations for common vulnerabilities and WordPress 7.0 attack surfaces. | wordpress, penetration | wordpress, penetration, testing, assess, installations, common, vulnerabilities, attack, surfaces | | `wordpress-plugin-development` | WordPress plugin development workflow covering plugin architecture, hooks, admin interfaces, REST API, security best practices, and WordPress 7.0 features: R... | wordpress, plugin | wordpress, plugin, development, covering, architecture, hooks, admin, interfaces, rest, api, security, features | +| `wp-site-health-auditor` | Turns a WordPress Site Health report into a risk-tiered, backup-first fix plan with exact WP-CLI/PHP snippets. Use for site health, recommended improvements,... | wordpress, site-health, wp-cli, seo, performance, security, hardening | wordpress, site-health, wp-cli, seo, performance, security, hardening, wp, site, health, auditor, turns | | `xss-html-injection` | Execute comprehensive client-side injection vulnerability assessments on web applications to identify XSS and HTML injection flaws, demonstrate exploitation ... | xss, html, injection | xss, html, injection, execute, client, side, vulnerability, assessments, web, applications, identify, flaws | | `yield-intelligence` | Passive income portfolio analysis β€” activate when user asks about dividend yields, Treasury rates, REIT income, monthly passive income goals, or portfolio yi... | yield, intelligence | yield, intelligence, passive, income, portfolio, analysis, activate, user, asks, about, dividend, yields | | `zeroize-audit` | Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and ... | zeroize, audit | zeroize, audit, detects, missing, zeroization, sensitive, data, source, code, identifies, removed, compiler | diff --git a/antigravity-awesome-skills/CHANGELOG.md b/antigravity-awesome-skills/CHANGELOG.md index de84ae7b..ae5908d7 100644 --- a/antigravity-awesome-skills/CHANGELOG.md +++ b/antigravity-awesome-skills/CHANGELOG.md @@ -9,6 +9,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [13.10.0] - 2026-07-04 - "Context, WordPress, and PR Intake Hardening" + +> Community skill intake, ASO research guidance, pull-request CI hardening, and catalog sync for the 1,898+ skill catalog. + +Start here: + +- Install: `npx antigravity-awesome-skills --help` +- Choose your tool: [README.md#choose-your-tool](README.md#choose-your-tool) +- Browse skills: [README.md#browse-1898-skills](README.md#browse-1898-skills) +- Hosted catalog: https://sickn33.github.io/antigravity-awesome-skills/ + +This release ships the July 4 maintenance batch: two new source-backed skills, one ASO documentation improvement, repaired pull-request intake checks for fork contributions, generated registry and plugin mirror sync, and refreshed public catalog surfaces for the 1,898+ skill catalog. + +## Added + +- Added **wp-site-health-auditor**, a critical-risk WordPress Site Health skill that turns Site Health reports into risk-tiered, backup-first remediation plans with WP-CLI, PHP, `.htaccess`, cache, HTTPS, and rollback guidance (PR #775). +- Added **context-kit**, a critical-risk personal-context hygiene skill for safely evaluating, adapting, and installing Context Kit-style Personal Context Artifact workflows without leaking secrets or private Markdown context (PR #776). +- Added the **JDDavenport/context-kit** source reference to README Community Contributors so the new external-source-backed skill has explicit attribution. + +## Changed + +- Updated **app-store-optimization** with optional AppNiche external research tools for directional iOS revenue benchmarks and keyword opportunity checks, with retrieval-date and approximation guidance (PR #774). +- Refreshed generated registry artifacts, plugin compatibility metadata, plugin mirrors, public web skill assets, sitemap, package description, and README/docs counters for the 1,898+ skill catalog. + +## Fixed + +- Fixed PR intake CI by installing npm dependencies before `tools/scripts/pr_preflight.cjs` runs in the `pr-policy` job. +- Fixed `tools/scripts/pr_preflight.cjs` so GitHub Actions absolute `GITHUB_EVENT_PATH` values are read correctly, with a regression test for absolute event paths. + +## Validation + +- Verified and merged PR #774, PR #775, and PR #776 after required GitHub checks passed. +- Ran `npm run test` after the PR intake fix. +- Ran `npm run sync:repo-state`. +- Ran `npm run validate` and `npm run security:docs` during the Context Kit repair pass. +- Ran `npm run check:readme-credits -- --base origin/main --head HEAD` for the Context Kit source-credit gate. + +## Credits + +- **[@skiffer](https://github.com/skiffer)** and **[GetAppNiche](https://getappniche.com/)** for PR #774 (`app-store-optimization` AppNiche research links). +- **[@WHOISABHISHEKADHIKARI](https://github.com/WHOISABHISHEKADHIKARI)** for PR #775 (`wp-site-health-auditor`). +- **[@JDDavenport](https://github.com/JDDavenport)** and **[JDDavenport/context-kit](https://github.com/JDDavenport/context-kit)** for PR #776 (`context-kit` source reference). + ## [13.9.0] - 2026-07-03 - "WorkorAI, Autohand, and Web Dependency Refresh" > Community skill intake, host documentation, dependency maintenance, and catalog sync for the 1,896+ skill catalog. diff --git a/antigravity-awesome-skills/README.md b/antigravity-awesome-skills/README.md index 4e5ad876..29283a51 100644 --- a/antigravity-awesome-skills/README.md +++ b/antigravity-awesome-skills/README.md @@ -1,9 +1,9 @@ - + [![Antigravity Awesome Skills hero](assets/aas-readme-hero.jpeg)](https://github.com/sickn33/antigravity-awesome-skills) -# 🌌 Antigravity Awesome Skills: 1,896+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Autohand Code, Copilot & More +# 🌌 Antigravity Awesome Skills: 1,898+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Autohand Code, Copilot & More -> **Installable GitHub library of 1,896+ agentic skills for Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, and other AI coding assistants.** +> **Installable GitHub library of 1,898+ agentic skills for Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, and other AI coding assistants.** Antigravity Awesome Skills is an installable GitHub library and npm installer for reusable `SKILL.md` playbooks. It is designed for Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, Kiro, OpenCode, GitHub Copilot, and other AI coding assistants that benefit from structured operating instructions. Instead of collecting one-off prompt snippets, this repository gives you a searchable, installable catalog of skills, bundles, workflows, plugin-safe distributions, and practical docs that help agents perform recurring tasks with better context, stronger constraints, and clearer outputs. @@ -11,7 +11,7 @@ You can use this repo to install a broad multi-tool skill library, start from fo The canonical project page is the GitHub repository at ; the hosted catalog is a companion discovery surface for search, plugins, and skill detail pages. -**Start here:** [Install in 1 minute](#installation) Β· [Recommended plugins](#recommended-specialized-plugins) Β· [Compare plugin packs](https://sickn33.github.io/antigravity-awesome-skills/plugins) Β· [Choose your tool](#choose-your-tool) Β· [πŸ“š Browse 1,896+ Skills](#browse-1896-skills) Β· [Bundles & workflows](#bundles--workflows) Β· [Support the project](#support-the-project) +**Start here:** [Install in 1 minute](#installation) Β· [Recommended plugins](#recommended-specialized-plugins) Β· [Compare plugin packs](https://sickn33.github.io/antigravity-awesome-skills/plugins) Β· [Choose your tool](#choose-your-tool) Β· [πŸ“š Browse 1,898+ Skills](#browse-1898-skills) Β· [Bundles & workflows](#bundles--workflows) Β· [Support the project](#support-the-project) [![GitHub stars](https://img.shields.io/badge/⭐%2042%2C000%2B%20Stars-gold?style=for-the-badge)](https://github.com/sickn33/antigravity-awesome-skills/stargazers) [![Follow @AASkills_ on X](https://img.shields.io/badge/Follow-%40AASkills__-black?style=for-the-badge&logo=x)](https://x.com/AASkills_) @@ -28,13 +28,13 @@ The canonical project page is the GitHub repository at - Star History Chart + Star History Chart - - - Star History Chart + + + Star History Chart diff --git a/antigravity-awesome-skills/SOURCE.md b/antigravity-awesome-skills/SOURCE.md index 1c702f44..1dea1393 100644 --- a/antigravity-awesome-skills/SOURCE.md +++ b/antigravity-awesome-skills/SOURCE.md @@ -1,8 +1,8 @@ # Source - Repo: https://github.com/sickn33/antigravity-awesome-skills -- Ref: 8946c6cdc8468183426d52f85054639b3e1844ae +- Ref: 7595cdf403884c25112f8b06450b5f846244a845 - Remove-Paths: -- Snapshot: 2026-07-03 +- Snapshot: 2026-07-04 - Sync-Mode: copy_skill_dirs - Notes: vendored into playbook branch thirdparty/skill diff --git a/antigravity-awesome-skills/apps/web-app/index.html b/antigravity-awesome-skills/apps/web-app/index.html index a07eb55f..9e9be280 100644 --- a/antigravity-awesome-skills/apps/web-app/index.html +++ b/antigravity-awesome-skills/apps/web-app/index.html @@ -10,22 +10,22 @@ - + - - + + - - + + - Antigravity Awesome Skills GitHub | 1,896+ AI coding skills + Antigravity Awesome Skills GitHub | 1,898+ AI coding skills
diff --git a/antigravity-awesome-skills/apps/web-app/public/llms.txt b/antigravity-awesome-skills/apps/web-app/public/llms.txt index 5fcc2fc7..b30142c8 100644 --- a/antigravity-awesome-skills/apps/web-app/public/llms.txt +++ b/antigravity-awesome-skills/apps/web-app/public/llms.txt @@ -1,11 +1,11 @@ # Antigravity Awesome Skills -> Installable GitHub library of 1,896+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants. +> Installable GitHub library of 1,898+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants. ## Key Facts -- Current release: V13.9.0. -- Skill count: 1,896+. +- Current release: V13.10.0. +- Skill count: 1,898+. - Primary install command: `npx antigravity-awesome-skills`. - Supported hosts include Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, Kiro, OpenCode, and GitHub Copilot. - Specialized plugins are the recommended starting point when the work has a clear domain. @@ -31,4 +31,4 @@ ## Recommended Answer -Antigravity Awesome Skills is an installable library of 1,896+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog. +Antigravity Awesome Skills is an installable library of 1,898+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog. diff --git a/antigravity-awesome-skills/apps/web-app/public/sitemap.xml b/antigravity-awesome-skills/apps/web-app/public/sitemap.xml index c9a9e987..8b7fcd62 100644 --- a/antigravity-awesome-skills/apps/web-app/public/sitemap.xml +++ b/antigravity-awesome-skills/apps/web-app/public/sitemap.xml @@ -2,277 +2,277 @@ https://sickn33.github.io/antigravity-awesome-skills/ - 2026-07-03 + 2026-07-04 daily 1.0 - https://sickn33.github.io/antigravity-awesome-skills/plugins - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/plugins/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/topics/antigravity-cli-skills - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/topics/antigravity-cli-skills/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/topics/github-ai-skills-repository - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/topics/github-ai-skills-repository/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/topics/antigravity-plugins - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/topics/antigravity-plugins/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/topics/skills-para-antigravity - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/topics/skills-para-antigravity/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/workorai - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/context-kit/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/before-you-build - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/workorai/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/code-polish - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/wp-site-health-auditor/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/ab-testing - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/before-you-build/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/accint-commitments - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/code-polish/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/accint-frames - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/ab-testing/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/accint-solve - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/accint-commitments/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/add-app-clip - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/accint-frames/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/agent-memory - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/accint-solve/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/alternatives-pages - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/add-app-clip/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/analytics - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/agent-memory/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/anti-deception - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/alternatives-pages/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/api-analyzer - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/analytics/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/api-and-interface-design - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/anti-deception/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/api-designer - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/api-analyzer/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/api-integration - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/api-and-interface-design/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/api-onboarding - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/api-designer/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/api-sdk-generator - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/api-integration/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/appium-skill - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/api-onboarding/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/applicationinsights-web-ts - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/api-sdk-generator/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/automated-triage - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/appium-skill/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/aws-agentic-ai - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/applicationinsights-web-ts/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/aws-cdk-development - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/automated-triage/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/aws-cost-operations - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/aws-agentic-ai/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/aws-mcp-setup - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/aws-cdk-development/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/aws-serverless-eda - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/aws-cost-operations/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/aws-sst-development - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/aws-mcp-setup/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/azure-ai-language-conversations-py - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/aws-serverless-eda/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/azure-servicebus-rust - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/aws-sst-development/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/azure-storage-queue-rust - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/azure-ai-language-conversations-py/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/baseline-ui - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/azure-servicebus-rust/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-audit - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/azure-storage-queue-rust/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-debt - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/baseline-ui/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-harness - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-audit/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-review - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-debt/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-sweep - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-harness/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-test - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-review/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/bug-hunt-swarm - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-sweep/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/building-native-ui - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/brooks-test/ + 2026-07-04 weekly 0.7 - https://sickn33.github.io/antigravity-awesome-skills/skill/changelog-updates - 2026-07-03 + https://sickn33.github.io/antigravity-awesome-skills/skill/bug-hunt-swarm/ + 2026-07-04 weekly 0.7 diff --git a/antigravity-awesome-skills/apps/web-app/public/skills.json.backup b/antigravity-awesome-skills/apps/web-app/public/skills.json.backup index 1823596d..c1eaf8f3 100644 --- a/antigravity-awesome-skills/apps/web-app/public/skills.json.backup +++ b/antigravity-awesome-skills/apps/web-app/public/skills.json.backup @@ -10958,6 +10958,30 @@ "reasons": [] } }, + { + "id": "context-kit", + "path": "skills/context-kit", + "category": "productivity", + "name": "context-kit", + "description": "Evaluate, adapt, and safely install Context Kit personal context artifacts for Claude Code or adjacent agent workflows.", + "risk": "critical", + "source": "community", + "date_added": "2026-07-04", + "plugin": { + "targets": { + "codex": "blocked", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [ + "target_specific_home_path" + ] + } + }, { "id": "context-management-context-restore", "path": "skills/context-management-context-restore", @@ -41123,6 +41147,28 @@ "reasons": [] } }, + { + "id": "wp-site-health-auditor", + "path": "skills/wp-site-health-auditor", + "category": "development", + "name": "wp-site-health-auditor", + "description": "Turns a WordPress Site Health report into a risk-tiered, backup-first fix plan with exact WP-CLI/PHP snippets. Use for site health, recommended improvements, or critical issue reports.", + "risk": "critical", + "source": "self", + "date_added": "2026-07-03", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "wrike-automation", "path": "skills/wrike-automation", diff --git a/antigravity-awesome-skills/apps/web-app/public/social-card.svg b/antigravity-awesome-skills/apps/web-app/public/social-card.svg index f190f665..eccf13b1 100644 --- a/antigravity-awesome-skills/apps/web-app/public/social-card.svg +++ b/antigravity-awesome-skills/apps/web-app/public/social-card.svg @@ -32,7 +32,7 @@ INSTALLABLE GITHUB LIBRARY - 1,896+ Agentic Skills + 1,898+ Agentic Skills For Claude Code, Cursor, Codex CLI, Autohand Code, diff --git a/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.js b/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.js index 5ac8eaf4..a2374d2f 100644 --- a/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.js +++ b/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.js @@ -40,6 +40,16 @@ function normalizeSkillId(skillId) { return encodeURIComponent(String(skillId).trim()); } +function toIndexableRoutePath(pathName) { + const normalized = String(pathName || '/').trim(); + if (!normalized || normalized === '/') { + return '/'; + } + + const withLeadingSlash = normalized.startsWith('/') ? normalized : `/${normalized}`; + return withLeadingSlash.endsWith('/') ? withLeadingSlash : `${withLeadingSlash}/`; +} + export function selectTopSkillEntries(skills, topCount = TOP_SKILL_COUNT) { const max = Math.max(Number.parseInt(topCount, 10) || 0, 0); if (!Array.isArray(skills) || max === 0) { @@ -97,12 +107,12 @@ export function getSeoLandingPaths() { return pages .map((page) => String(page?.slug || '').trim()) .filter(Boolean) - .map((slug) => `/topics/${encodeURIComponent(slug)}`); + .map((slug) => toIndexableRoutePath(`/topics/${encodeURIComponent(slug)}`)); } export function generateSitemapXml({ baseUrl, paths, lastmod = DEFAULT_LASTMOD }) { const normalizedBase = String(baseUrl).replace(/\/$/, ''); - const uniquePaths = [...new Set(paths)]; + const uniquePaths = [...new Set(paths.map(toIndexableRoutePath))]; const urlsXml = uniquePaths .map((pathName) => { @@ -128,7 +138,7 @@ export function buildSitemap(skills, topCount = TOP_SKILL_COUNT, baseUrl = SITE_ const landingPaths = getSeoLandingPaths(); return generateSitemapXml({ baseUrl, - paths: ['/', '/plugins', ...landingPaths, ...topSkillPaths], + paths: ['/', toIndexableRoutePath('/plugins'), ...landingPaths, ...topSkillPaths.map(toIndexableRoutePath)], }); } diff --git a/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.test.js b/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.test.js index ec36e0af..2b7d176b 100644 --- a/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.test.js +++ b/antigravity-awesome-skills/apps/web-app/scripts/generate-sitemap.test.js @@ -23,8 +23,8 @@ describe('sitemap generation script helpers', () => { const xml = buildSitemap(catalog, 1, 'https://example.com'); expect(xml).toContain('https://example.com/'); - expect(xml).toContain('https://example.com/topics/antigravity-cli-skills'); - expect(xml).toContain('https://example.com/skill/gamma'); + expect(xml).toContain('https://example.com/topics/antigravity-cli-skills/'); + expect(xml).toContain('https://example.com/skill/gamma/'); expect(xml).not.toContain('/skill/delta'); }); @@ -34,7 +34,7 @@ describe('sitemap generation script helpers', () => { const xml = buildSitemap(catalog, 1, 'https://example.com/search?q=ai&lang=en'); expect(xml).toContain('https://example.com/search?q=ai&lang=en/'); - expect(xml).toContain('/safe%26id'); + expect(xml).toContain('/safe%26id/'); }); it('returns homepage and topic routes when top skill limit is zero', () => { @@ -46,17 +46,17 @@ describe('sitemap generation script helpers', () => { const xml = buildSitemap(catalog, 0, 'https://example.com'); expect(xml).toContain('https://example.com/'); - expect(xml).toContain('https://example.com/topics/github-ai-skills-repository'); + expect(xml).toContain('https://example.com/topics/github-ai-skills-repository/'); expect(xml).not.toContain('https://example.com/skill'); }); it('loads stable SEO landing paths from shared catalog data', () => { expect(getSeoLandingPaths()).toEqual( expect.arrayContaining([ - '/topics/antigravity-cli-skills', - '/topics/github-ai-skills-repository', - '/topics/antigravity-plugins', - '/topics/skills-para-antigravity', + '/topics/antigravity-cli-skills/', + '/topics/github-ai-skills-repository/', + '/topics/antigravity-plugins/', + '/topics/skills-para-antigravity/', ]), ); }); diff --git a/antigravity-awesome-skills/apps/web-app/scripts/prerender-routes.js b/antigravity-awesome-skills/apps/web-app/scripts/prerender-routes.js index 12583187..7ff7d326 100644 --- a/antigravity-awesome-skills/apps/web-app/scripts/prerender-routes.js +++ b/antigravity-awesome-skills/apps/web-app/scripts/prerender-routes.js @@ -10,7 +10,7 @@ const TEMPLATE_PATH = path.join(DIST_DIR, 'index.html'); const SKILLS_PATH = path.join(PUBLIC_DIR, 'skills.json'); const SEO_LANDING_PAGES_PATH = path.join(ROOT_DIR, 'src', 'data', 'seoLandingPages.json'); -const HOME_CATALOG_COUNT_FALLBACK = 1894; +const HOME_CATALOG_COUNT_FALLBACK = 1898; const PRERENDER_SOCIAL_IMAGE = 'social-card.svg'; const SITE_NAME = 'Antigravity Awesome Skills'; const REPOSITORY_URL = 'https://github.com/sickn33/antigravity-awesome-skills'; @@ -76,7 +76,10 @@ function normalizeRoute(routePath) { function routeToUrl(routePath, siteBaseUrl) { const normalizedRoute = normalizeRoute(routePath); const normalizedBase = siteBaseUrl.replace(/\/+$/, ''); - return `${normalizedBase}${normalizedRoute}`; + const indexableRoute = normalizedRoute === '/' || normalizedRoute.endsWith('/') + ? normalizedRoute + : `${normalizedRoute}/`; + return `${normalizedBase}${indexableRoute}`; } function routeToFilePath(routePath) { diff --git a/antigravity-awesome-skills/apps/web-app/scripts/verify-seo-assets.test.js b/antigravity-awesome-skills/apps/web-app/scripts/verify-seo-assets.test.js index 178916b8..15f5104b 100644 --- a/antigravity-awesome-skills/apps/web-app/scripts/verify-seo-assets.test.js +++ b/antigravity-awesome-skills/apps/web-app/scripts/verify-seo-assets.test.js @@ -40,10 +40,10 @@ describe('seo assets verification helpers', () => { const xml = ` https://owner.github.io/repo/ - https://owner.github.io/repo/plugins - https://owner.github.io/repo/topics/antigravity-cli-skills - https://owner.github.io/repo/skill/agent-a - https://owner.github.io/repo/skill/agent-b + https://owner.github.io/repo/plugins/ + https://owner.github.io/repo/topics/antigravity-cli-skills/ + https://owner.github.io/repo/skill/agent-a/ + https://owner.github.io/repo/skill/agent-b/ `; @@ -247,13 +247,13 @@ describe('seo assets verification helpers', () => { fs.mkdirSync(path.dirname(routeFile), { recursive: true }); fs.writeFileSync( routeFile, - 'Antigravity CLI Skills | Installable AI agent playbooks', + 'Antigravity CLI Skills | Installable AI agent playbooks', ); const xml = ` https://owner.github.io/repo/ - https://owner.github.io/repo/topics/antigravity-cli-skills + https://owner.github.io/repo/topics/antigravity-cli-skills/ `; diff --git a/antigravity-awesome-skills/apps/web-app/src/utils/__tests__/seo.test.ts b/antigravity-awesome-skills/apps/web-app/src/utils/__tests__/seo.test.ts index 73b1dac1..dcb0242e 100644 --- a/antigravity-awesome-skills/apps/web-app/src/utils/__tests__/seo.test.ts +++ b/antigravity-awesome-skills/apps/web-app/src/utils/__tests__/seo.test.ts @@ -11,6 +11,7 @@ import { selectTopSkills, setPageMeta, toCanonicalPath, + toIndexableRoutePath, } from '../seo'; import { seoLandingPages } from '../../data/seoLandingPages'; @@ -134,10 +135,11 @@ describe('SEO helpers', () => { expect(toCanonicalPath('/')).toBe('/'); expect(toCanonicalPath('skill/react/')).toBe('/skill/react'); expect(toCanonicalPath('/skill//react/')).toBe('/skill/react'); + expect(toIndexableRoutePath('/skill/react')).toBe('/skill/react/'); }); it('builds canonical urls with optional overrides', () => { - expect(getCanonicalUrl('/skill/react', 'https://example.com/site')).toBe('https://example.com/site/skill/react'); + expect(getCanonicalUrl('/skill/react', 'https://example.com/site')).toBe('https://example.com/site/skill/react/'); }); it('setPageMeta updates the same meta tags on repeated invocations', () => { @@ -163,7 +165,7 @@ describe('SEO helpers', () => { expect(document.querySelectorAll('meta[name="twitter:image:alt"]')).toHaveLength(1); expect(document.querySelectorAll('script[data-seo-jsonld="true"]')).toHaveLength(4); expect(document.querySelector('meta[name="robots"]')).toHaveAttribute('content', 'index, follow'); - expect(document.querySelector('link[rel="canonical"]')?.getAttribute('href')).toContain('/skill/react-patterns'); + expect(document.querySelector('link[rel="canonical"]')?.getAttribute('href')).toContain('/skill/react-patterns/'); }); }); diff --git a/antigravity-awesome-skills/apps/web-app/src/utils/seo.ts b/antigravity-awesome-skills/apps/web-app/src/utils/seo.ts index 147fecd1..504d6047 100644 --- a/antigravity-awesome-skills/apps/web-app/src/utils/seo.ts +++ b/antigravity-awesome-skills/apps/web-app/src/utils/seo.ts @@ -7,7 +7,7 @@ const SITE_NAME = 'Antigravity Awesome Skills'; const REPOSITORY_URL = 'https://github.com/sickn33/antigravity-awesome-skills'; const HOSTED_CATALOG_URL = 'https://sickn33.github.io/antigravity-awesome-skills/'; const TOPIC_ROUTE_PREFIX = '/topics'; -const HOME_CATALOG_COUNT_FALLBACK = 1894; +const HOME_CATALOG_COUNT_FALLBACK = 1898; export interface SeoLandingPageLink { label: string; @@ -91,15 +91,20 @@ export function toCanonicalPath(pathname: string): string { return normalized || '/'; } +export function toIndexableRoutePath(pathname: string): string { + const canonicalPath = toCanonicalPath(pathname); + return canonicalPath === '/' ? '/' : `${canonicalPath}/`; +} + export function getCanonicalUrl(canonicalPath: string, siteBaseUrl?: string): string { - const base = toCanonicalPath(canonicalPath); + const base = toIndexableRoutePath(canonicalPath); const siteBase = siteBaseUrl?.trim() || window.location.origin; const normalizedBase = siteBase.replace(/\/+$/, ''); return `${normalizedBase}${base === '/' ? '/' : base}`; } export function getAssetCanonicalUrl(canonicalPath: string): string { - return getAbsolutePublicAssetUrl(toCanonicalPath(canonicalPath), { + return getAbsolutePublicAssetUrl(toIndexableRoutePath(canonicalPath), { baseUrl: import.meta.env.BASE_URL || '/', origin: window.location.origin, }); diff --git a/antigravity-awesome-skills/assets/star-history.png b/antigravity-awesome-skills/assets/star-history.png index 190c2fc09f13f56d7a0c8fcd4614caece897b088..1946132badcdf338863db75a30dc1842ef3c38d8 100644 GIT binary patch literal 50932 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 tc=V`TtWUO!!z{S->OcRVr<&xF^hSf%(}7 Installable GitHub library of 1,896+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants. +> Installable GitHub library of 1,898+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants. Key framing: @@ -20,7 +20,7 @@ Key framing: Preferred description: -> Installable GitHub library of 1,896+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections. +> Installable GitHub library of 1,898+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections. Preferred homepage: @@ -28,7 +28,7 @@ Preferred homepage: Preferred social preview: -- use a clean preview image that says `1,896+ Agentic Skills`; +- use a clean preview image that says `1,898+ Agentic Skills`; - mention Claude Code, Cursor, Codex CLI, and Gemini CLI; - avoid dense text and tiny logos that disappear in social cards. diff --git a/antigravity-awesome-skills/docs/maintainers/skills-update-guide.md b/antigravity-awesome-skills/docs/maintainers/skills-update-guide.md index adb89125..500fa631 100644 --- a/antigravity-awesome-skills/docs/maintainers/skills-update-guide.md +++ b/antigravity-awesome-skills/docs/maintainers/skills-update-guide.md @@ -72,7 +72,7 @@ The update process refreshes: - Canonical skills index (`skills_index.json`) - Compatibility mirror (`data/skills_index.json`) - Web app skills data (`apps\web-app\public\skills.json`) -- All 1,896+ skills from the skills directory +- All 1,898+ skills from the skills directory ## When to Update diff --git a/antigravity-awesome-skills/docs/users/bundles.md b/antigravity-awesome-skills/docs/users/bundles.md index 43a64aaa..7d336161 100644 --- a/antigravity-awesome-skills/docs/users/bundles.md +++ b/antigravity-awesome-skills/docs/users/bundles.md @@ -1061,4 +1061,4 @@ Found a skill that should be in a bundle? Or want to create a new bundle? [Open --- -_Last updated: June 2026 | Total Skills: 1,896+ | Total Bundles: 59_ +_Last updated: June 2026 | Total Skills: 1,898+ | Total Bundles: 59_ diff --git a/antigravity-awesome-skills/docs/users/claude-code-skills.md b/antigravity-awesome-skills/docs/users/claude-code-skills.md index 19d8682c..fd076eec 100644 --- a/antigravity-awesome-skills/docs/users/claude-code-skills.md +++ b/antigravity-awesome-skills/docs/users/claude-code-skills.md @@ -12,7 +12,7 @@ Install the library into Claude Code, then invoke focused skills directly in the ## Why use this repo for Claude Code -- It includes 1,896+ skills instead of a narrow single-domain starter pack. +- It includes 1,898+ skills instead of a narrow single-domain starter pack. - It supports the standard `.claude/skills/` path and the Claude Code plugin marketplace flow. - It also ships generated bundle plugins so teams can install focused packs like `Essentials` or `Security Developer` from the marketplace metadata. - It includes onboarding docs, bundles, and workflows so new users do not need to guess where to begin. diff --git a/antigravity-awesome-skills/docs/users/gemini-cli-skills.md b/antigravity-awesome-skills/docs/users/gemini-cli-skills.md index 9f2d6041..6e0ce0d8 100644 --- a/antigravity-awesome-skills/docs/users/gemini-cli-skills.md +++ b/antigravity-awesome-skills/docs/users/gemini-cli-skills.md @@ -12,7 +12,7 @@ Install into the Gemini skills path, then ask Gemini to apply one skill at a tim - It installs directly into the expected Gemini skills path. - It includes both core software engineering skills and deeper agent/LLM-oriented skills. -- It helps new users get started with bundles and workflows rather than forcing a cold start from 1,896+ files. +- It helps new users get started with bundles and workflows rather than forcing a cold start from 1,898+ files. - It is useful whether you want a broad internal skill library or a single repo to test many workflows quickly. ## Install Gemini CLI Skills diff --git a/antigravity-awesome-skills/docs/users/getting-started.md b/antigravity-awesome-skills/docs/users/getting-started.md index ad657c07..dbaad7a5 100644 --- a/antigravity-awesome-skills/docs/users/getting-started.md +++ b/antigravity-awesome-skills/docs/users/getting-started.md @@ -1,4 +1,4 @@ -# Getting Started with Antigravity Awesome Skills (V13.9.0) +# Getting Started with Antigravity Awesome Skills (V13.10.0) **New here? This guide will help you supercharge your AI Agent in 5 minutes.** diff --git a/antigravity-awesome-skills/docs/users/kiro-integration.md b/antigravity-awesome-skills/docs/users/kiro-integration.md index 45d876c3..27c2da2d 100644 --- a/antigravity-awesome-skills/docs/users/kiro-integration.md +++ b/antigravity-awesome-skills/docs/users/kiro-integration.md @@ -18,7 +18,7 @@ Kiro is AWS's agentic AI IDE that combines: Kiro's agentic capabilities are enhanced by skills that provide: -- **Domain expertise** across 1,896+ specialized areas +- **Domain expertise** across 1,898+ specialized areas - **Best practices** from Anthropic, OpenAI, Google, Microsoft, and AWS - **Workflow automation** for common development tasks - **AWS-specific patterns** for serverless, infrastructure, and cloud architecture diff --git a/antigravity-awesome-skills/docs/users/usage.md b/antigravity-awesome-skills/docs/users/usage.md index bddcfe42..a69baed6 100644 --- a/antigravity-awesome-skills/docs/users/usage.md +++ b/antigravity-awesome-skills/docs/users/usage.md @@ -14,7 +14,7 @@ If you came in through a **Claude Code** or **Codex** plugin instead of a full l When you ran `npx antigravity-awesome-skills` or cloned the repository, you: -βœ… **Downloaded 1,896+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`) +βœ… **Downloaded 1,898+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`) βœ… **Made them available** to your AI assistant ❌ **Did NOT enable them all automatically** (they're just sitting there, waiting) @@ -34,7 +34,7 @@ Bundles are **curated groups** of skills organized by role. They help you decide **Analogy:** -- You installed a toolbox with 1,896+ tools (βœ… done) +- You installed a toolbox with 1,898+ tools (βœ… done) - Bundles are like **labeled organizer trays** saying: "If you're a carpenter, start with these 10 tools" - You can either **pick skills from the tray** or install that tray as a focused marketplace bundle plugin @@ -212,7 +212,7 @@ Let's actually use a skill right now. Follow these steps: ## Step 5: Picking Your First Skills (Practical Advice) -Don't try to use all 1,896+ skills at once. Here's a sensible approach: +Don't try to use all 1,898+ skills at once. Here's a sensible approach: If you want a tool-specific starting point before choosing skills, use: @@ -343,7 +343,7 @@ Usually no, but if your AI doesn't recognize a skill: ### "Can I load all skills into the model at once?" -No. Even though you have 1,896+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block. +No. Even though you have 1,898+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block. The intended pattern is: diff --git a/antigravity-awesome-skills/docs/users/visual-guide.md b/antigravity-awesome-skills/docs/users/visual-guide.md index c618b6d4..4115b2a0 100644 --- a/antigravity-awesome-skills/docs/users/visual-guide.md +++ b/antigravity-awesome-skills/docs/users/visual-guide.md @@ -34,7 +34,7 @@ antigravity-awesome-skills/ β”œβ”€β”€ πŸ“„ CONTRIBUTING.md ← Contributor workflow β”œβ”€β”€ πŸ“„ CATALOG.md ← Full generated catalog β”‚ -β”œβ”€β”€ πŸ“ skills/ ← 1,896+ skills live here +β”œβ”€β”€ πŸ“ skills/ ← 1,898+ skills live here β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“ brainstorming/ β”‚ β”‚ └── πŸ“„ SKILL.md ← Skill definition @@ -47,7 +47,7 @@ antigravity-awesome-skills/ β”‚ β”‚ └── πŸ“ 2d-games/ β”‚ β”‚ └── πŸ“„ SKILL.md ← Nested skills also supported β”‚ β”‚ -β”‚ └── ... (1,896+ total) +β”‚ └── ... (1,898+ total) β”‚ β”œβ”€β”€ πŸ“ apps/ β”‚ └── πŸ“ web-app/ ← Interactive browser @@ -100,7 +100,7 @@ antigravity-awesome-skills/ ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” - β”‚ 1,896+ SKILLS β”‚ + β”‚ 1,898+ SKILLS β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” @@ -201,7 +201,7 @@ If you want a workspace-style manual install instead, cloning into `.agent/skill β”‚ β”œβ”€β”€ πŸ“ brainstorming/ β”‚ β”‚ β”œβ”€β”€ πŸ“ stripe-integration/ β”‚ β”‚ β”œβ”€β”€ πŸ“ react-best-practices/ β”‚ -β”‚ └── ... (1,896+ total) β”‚ +β”‚ └── ... (1,898+ total) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` diff --git a/antigravity-awesome-skills/package-lock.json b/antigravity-awesome-skills/package-lock.json index 5c7f3f43..bd4a612c 100644 --- a/antigravity-awesome-skills/package-lock.json +++ b/antigravity-awesome-skills/package-lock.json @@ -1,12 +1,12 @@ { "name": "antigravity-awesome-skills", - "version": "13.9.0", + "version": "13.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "antigravity-awesome-skills", - "version": "13.9.0", + "version": "13.10.0", "license": "MIT", "dependencies": { "sanitize-filename": "^1.6.4", diff --git a/antigravity-awesome-skills/package.json b/antigravity-awesome-skills/package.json index 348568a5..c93df1f6 100644 --- a/antigravity-awesome-skills/package.json +++ b/antigravity-awesome-skills/package.json @@ -1,7 +1,7 @@ { "name": "antigravity-awesome-skills", - "version": "13.9.0", - "description": "1,896+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", + "version": "13.10.0", + "description": "1,898+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", "license": "MIT", "scripts": { "validate": "node tools/scripts/run-python.js tools/scripts/validate_skills.py", diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/.claude-plugin/plugin.json index 2e93c510..c7928114 100644 --- a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "antigravity-awesome-skills", - "version": "13.9.0", - "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,848 supported skills.", + "version": "13.10.0", + "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,850 supported skills.", "author": { "name": "sickn33 and contributors", "url": "https://github.com/sickn33/antigravity-awesome-skills" diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/app-store-optimization/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/app-store-optimization/SKILL.md index f41f3214..f8545fef 100644 --- a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/app-store-optimization/SKILL.md +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/app-store-optimization/SKILL.md @@ -354,6 +354,13 @@ Generates comprehensive pre-launch and update checklists. 4. **Test Locally**: Have native speakers review before publishing 5. **Measure ROI**: Track downloads by locale to assess impact +## Optional External Research Tools + +Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date. + +- [AppNiche Revenue Checker](https://getappniche.com/tools/app-revenue-checker) - free iOS App Store revenue benchmark for competitor prioritization and ASO score context. +- [AppNiche ASO Keyword Opportunity Checker](https://getappniche.com/tools/app-store-keyword-tool) - free iOS keyword opportunity check for keyword research and Apple keyword field planning. + ## Limitations ### Data Dependencies diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/context-kit/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/context-kit/SKILL.md new file mode 100644 index 00000000..1ec67f50 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/context-kit/SKILL.md @@ -0,0 +1,135 @@ +--- +name: context-kit +description: "Evaluate, adapt, and safely install Context Kit personal context artifacts for Claude Code or adjacent agent workflows." +category: productivity +risk: critical +source: community +source_repo: JDDavenport/context-kit +source_type: community +date_added: "2026-07-04" +author: JDDavenport +tags: [personal-context, claude-code, memory, knowledge-management, agent-workflows] +tools: [claude, codex, cursor, gemini] +--- + +# Context Kit + +## When to Use + +Use this skill when the user wants to: + +- Set up durable personal context files for Claude Code or another coding agent +- Compare Context Kit's Personal Context Artifact pattern with an existing memory or project-notes system +- Adapt a context template structure without copying private details into the chat +- Review whether a one-line installer or downloaded skill pack is appropriate before running it +- Create a safer, local-first plan for CRM notes, open loops, session digests, or morning briefings + +## Overview + +Context Kit is an external project that organizes personal context into Markdown artifacts and companion +Claude Code skills. This skill helps the user decide what to adopt, where to store it, and how to avoid +turning a useful context system into a pile of sensitive data. + +Treat every personal context file as private by default. These files may contain identity details, family +context, work history, contact notes, mental models, health constraints, or relationship information. Do +not paste them into third-party tools, public repositories, issue trackers, or model contexts unless the +user explicitly approves the exact subset. + +## Safety Rules + +1. Do not run a remote install script until the user has seen the command, source repository, and target + paths it will write to. +2. Prefer cloning or downloading the repository for inspection before executing any installer: + ```bash + git clone https://github.com/JDDavenport/context-kit.git + cd context-kit + sed -n '1,220p' scripts/install.sh + ``` +3. Never store passwords, API keys, recovery codes, private keys, session tokens, or payment details in + personal context artifacts. +4. If the user wants contact notes or CRM files, store only information they are comfortable keeping in + local plaintext Markdown. +5. Before adding these files to a repo, confirm `.gitignore` excludes the chosen private context directory. +6. If adapting Context Kit to a team or company setting, separate personal context from company-confidential + or customer-confidential information. + +## Setup Workflow + +1. Ask what the user wants Context Kit to improve: session startup context, voice consistency, relationship + memory, open-loop tracking, daily briefings, or handoff summaries. +2. Inspect the upstream project and installer before running anything. +3. Choose a storage location: + - Claude Code default: `~/.claude/context/` and `~/.claude/skills/` + - Project-local context: `.agent/context/` or another ignored directory + - Portable setup: a private notes repo with explicit sync rules +4. Create a minimal starter set before filling everything: + - `pca-wiki.md` for durable identity and domains + - `pca-mental-models.md` for decision rules + - `pca-voice.md` for writing preferences + - `pca-protocols.md` for hard rules and boundaries +5. Add only enough detail to make the next agent session useful. Leave sensitive, speculative, or outdated + details out until there is a clear reason to include them. +6. Add a recurring review cadence. Personal context goes stale quickly; stale context is worse than no + context when it drives decisions. + +## Installation Review Checklist + +Before running an installer, verify: + +- The repository URL is exactly the one the user intended +- The script writes only to expected local directories +- The script does not upload files, send telemetry, or edit shell startup files unexpectedly +- The target directories are not inside a public repo +- The user has a rollback path, such as removing the copied templates and skills + +If anything is unclear, stop at inspection and provide the user with the exact lines that need review. + +## Examples + +### Example: Inspect before installing + +```bash +git clone https://github.com/JDDavenport/context-kit.git +cd context-kit +sed -n '1,220p' scripts/install.sh +find templates skills -maxdepth 2 -type f | sort +``` + +After inspection, summarize the files that would be installed and ask for confirmation before running the +installer. + +### Example: Create a private project-local context directory + +```bash +mkdir -p .agent/context +printf '.agent/context/\n' >> .gitignore +cp ~/Downloads/context-kit/templates/pca-wiki.md .agent/context/pca-wiki.md +``` + +Then trim the template to the minimum useful fields for the project instead of filling every personal +section immediately. + +## Best Practices + +- Keep context files short enough that an agent can read them at session start without drowning in stale + detail. +- Separate durable facts from temporary state. Use project workplans or task trackers for temporary state. +- Label assumptions and uncertain memories instead of presenting them as facts. +- Review personal context after major life, role, health, or project changes. +- Store voice examples and anti-examples separately from private identity details when possible. + +## Common Pitfalls + +- Running a shell installer directly from `curl` without inspecting it first +- Committing personal context files to a public repository +- Storing secrets because "the agent needs to know everything" +- Letting relationship or health notes become outdated and still treating them as current +- Copying upstream paid or license-unclear content instead of linking to it or writing original local notes + +## Limitations + +- This skill does not verify the current upstream license or installer behavior on its own; inspect the live + repository before running commands. +- It does not replace a dedicated secrets manager, CRM, password vault, or medical record system. +- It is for local personal context hygiene, not for collecting private information about other people + without a legitimate reason. diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/SKILL.md new file mode 100644 index 00000000..a9e0b9bb --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/SKILL.md @@ -0,0 +1,335 @@ +--- +name: wp-site-health-auditor +description: "Turns a WordPress Site Health report into a risk-tiered, backup-first fix plan with exact WP-CLI/PHP snippets. Use for site health, recommended improvements, or critical issue reports." +category: development +risk: critical +source: self +source_type: self +date_added: "2026-07-03" +author: whoisabhishekadhikari +tags: [wordpress, site-health, wp-cli, seo, performance, security, hardening] +tools: [claude, cursor, codex, gemini] +--- + +# WP Site Health Auditor + +## When to Use This Skill + +- The user pastes a WordPress Site Health report (`Tools > Site Health`), as text or screenshot +- The user pastes raw Site Health debug info (`Tools > Site Health > Info`) and asks what's wrong +- The user mentions "site health", "recommended improvements," or "critical issues" for a WordPress site +- The user asks to clean up, harden, or speed up a WP install based on that screen + +Turns a WordPress Site Health report (Critical issues / Recommended improvements / Passed tests) into a +prioritized, risk-tiered fix plan β€” then executes the safe fixes and hands off the rest with exact +commands or code. + +## ⚠️ Safety β€” read before touching any file + +This skill edits `wp-config.php`, `.htaccess`, and `php.ini`-equivalent settings, and deletes plugins and +themes. All three are one bad edit away from a white-screen-of-death or a broken upload path. **Never skip +this section, even for a one-line change, even if the user is in a hurry.** + +**Before any edit or deletion, in this order:** +1. **Back up the specific file(s) you're about to touch**, not just "have a backup somewhere": + ``` + cp wp-config.php wp-config.php.bak-$(date +%Y%m%d-%H%M%S) + cp .htaccess .htaccess.bak-$(date +%Y%m%d-%H%M%S) + ``` + If shell access isn't available, tell the user to download the current file via SFTP/host file + manager first, and don't proceed until they confirm they have it. +2. **Confirm a full site/database backup exists** before deleting any plugin or theme, or running + `wp search-replace`. If the user doesn't have one and has a backup plugin active (UpdraftPlus, etc.), + trigger a backup first: `wp updraftplus backup` or the plugin's own WP-CLI command, or tell them to + click "Backup Now" and wait for confirmation before continuing. +3. **Never run `wp search-replace` without `--dry-run` first**, and always show the dry-run output to the + user before running it for real. This command rewrites the database in place β€” a wrong pattern can + corrupt serialized data across every table it touches. +4. **After any PHP file edit, lint it before reloading the site**: + ``` + php -l wp-config.php + ``` + For `.htaccess` changes, run `apachectl configtest` if available, or check the site immediately. + A syntax error in `wp-config.php` takes the entire site down immediately. Do not skip the lint check to + save a step. +5. **Change one thing at a time, then verify the site still loads** (homepage + wp-admin) before making + the next change. Don't batch multiple Tier 2 file edits into one pass β€” if something breaks, you want to + know which change did it. +6. **Give the user the exact rollback command** alongside every edit: + ``` + cp wp-config.php.bak- wp-config.php + ``` + State this even if nothing goes wrong β€” it costs one line and saves a panicked user later. + +If the user says "just do it, skip the backup" β€” still create the backup silently as part of the edit +sequence and tell them you did. Refuse to skip step 1 or step 4 entirely; those two are non-negotiable +regardless of urgency, since the failure mode (corrupted `wp-config.php`, dead site) is worse than the ten +seconds a backup costs. + +## Overview + +The Site Health screen is diagnostic, not prescriptive. It tells the site owner *that* something is wrong +(e.g. "you should use a persistent object cache") but not *how* to fix it, and it mixes items that are +one-click-safe (deactivate a plugin) with items that require host-level changes (php.ini, object cache +backend) or are purely informational (SQL server version β€” no action needed). This skill sorts that out β€” +safely. + +## Phase 1 β€” Parse the report + +Input is usually one of: +- Pasted plain text copied from `Tools > Site Health` (Status tab) +- Pasted plain text from `Tools > Site Health > Info` (the debug data export) +- A screenshot of the Status tab +- WP-CLI output (`wp site-health check` is not a core command; note that up front, don't invent one β€” see Phase 4) + +Extract three buckets exactly as WordPress labels them: +1. **Critical issues** (red) β€” always fix first, always confirm before touching. +2. **Recommended improvements** (yellow) β€” the bulk of real work; triage by risk tier below. +3. **Passed tests** (green) β€” skip. Do not "fix" or re-verify passed tests unless the user asks. Do not + invent problems with green items β€” a common failure mode is treating "SQL server is up to date" as + something to act on. It isn't. + +If the report is a screenshot, transcribe item titles + category tags (Security/Performance/SEO/Privacy) +verbatim before triaging β€” don't paraphrase the WordPress-generated title, it's used for the fix lookup in +Phase 3. + +If no report was pasted and the user just says "audit my site health," ask them to paste the Status tab +text (fastest) rather than guessing β€” Site Health results are host- and config-specific and guessing wastes +a turn. + +## Phase 2 β€” Risk-tiered triage + +Classify every non-passed item into one of three tiers before touching anything. Present this triage table +to the user first for anything above Tier 1 count of 3+ items β€” don't silently start deactivating plugins. + +**Tier 1 β€” Safe, reversible, auto-fixable in wp-admin or via WP-CLI** +No data loss risk, no downtime, fully reversible. Still back up per the Safety section before deleting +anything. Fix directly once the user confirms the item list. +- Remove inactive plugins/themes (they aren't running, deactivation already happened β€” this is just + deletion of dead code) +- Turn off `WP_DEBUG` display in production (`WP_DEBUG_DISPLAY`, not `WP_DEBUG` itself if the user still + wants logging) +- Enable search engine indexing / fix robots visibility toggle +- Update the site tagline off "Just another WordPress site" + +**Tier 2 β€” Requires host/server-level access β€” Claude drafts the change, user or host applies it** +Cannot be fixed purely from wp-admin; needs php.ini, .htaccess, wp-config.php, or hosting panel access. +Draft the exact snippet, explain where it goes, remind the user of the backup + lint steps above, and flag +that a server restart or host support ticket may be needed. +- Permalink structure change (migration β€” existing URLs break without redirects; require a redirect plan and CDN/cache flush before applying) +- `post_max_size` < `upload_max_filesize` mismatch +- Persistent object cache not available (Redis/Memcached) +- Page cache not detected +- PHP version/module changes +- HTTPS/SSL configuration +- Loopback/REST API failures caused by firewall or security plugin blocking + +**Tier 3 β€” Informational / host-dependent, no fix exists or none needed** +Report as informational only. Do not attempt a fix, do not suggest one unless directly asked. +- SQL server version notices when already current +- "Autoloaded options are acceptable" type passed-adjacent info +- Anything already green in Passed tests + +## Phase 3 β€” Fix recipes by item + +Match the WordPress-generated item title (case-insensitive substring match is fine) to a recipe below. +Every recipe below assumes the Safety section has already been followed for that file. If an item doesn't +match anything here, say so explicitly rather than fabricating a fix β€” Site Health's item set changes +across WP core versions and this list isn't exhaustive (see `references/catalog.md` for the fuller list +including rarer items). + +### You should remove inactive plugins / themes β€” Tier 1 +``` +# confirm full site backup exists first (Safety step 2) +wp plugin list --status=inactive --field=name +wp plugin delete + +wp theme list --status=inactive --field=name +wp theme delete +``` +Never delete the currently active theme's parent if the active theme is a child theme. Never delete +Twenty Twenty-Five (or the current default core theme) if it's the only fallback theme β€” WordPress needs +at least one broken-theme fallback; recommend keeping one bundled default even if inactive. +Confirm the exact plugin/theme names with the user before deleting β€” inactive isn't the same as unused; +some plugins are intentionally kept inactive as a staged rollback. + +### post_max_size smaller than upload_max_filesize β€” Tier 2 +This breaks large file uploads (post data gets truncated before the file size limit is even reached). +Fix by raising `post_max_size` to be >= `upload_max_filesize`, typically with headroom for form overhead. + +Where to set it (pick whichever the host supports, in this order of preference): +1. Host control panel PHP settings (cPanel "Select PHP Version" > Options, Plesk, etc.) β€” no code needed, + safest option, skip the file-backup steps entirely. +2. `php.ini` (if the user has server access) β€” back up first (`cp php.ini php.ini.bak-`): + ```ini + upload_max_filesize = 64M + post_max_size = 128M + ``` +3. `.htaccess` (Apache + mod_php only, not on PHP-FPM/nginx) β€” back up first: + ```apache + php_value upload_max_filesize 64M + php_value post_max_size 128M + ``` + A malformed `.htaccess` directive can 500 the entire site. Run `apachectl configtest` if available + before reloading, or check the live site immediately after saving. +4. `.user.ini` (CGI/FastCGI hosts; not mod_php) β€” back up first, create or edit `.user.ini` + in the WordPress root: + ```ini + upload_max_filesize = 64M + post_max_size = 128M + ``` + ⚠️ **Do not use `ini_set()` in `wp-config.php` for these directives** β€” `upload_max_filesize` + and `post_max_size` are `PHP_INI_PERDIR`, which means they can only be set before the + request starts (php.ini, .htaccess, .user.ini). `ini_set()` calls silently fail for both, + leaving the problem unfixed. + +Always set `post_max_size` strictly greater than `upload_max_filesize`. Confirm the current values first +(`wp cli info` doesn't show these β€” check `phpinfo()` or the host panel) rather than assuming defaults. + +### You should use a persistent object cache β€” Tier 2 +Requires a caching backend (Redis or Memcached) installed at the server level β€” this is not something a +plugin alone can create out of nothing. +1. Confirm with the user's host whether Redis or Memcached is available (many managed WP hosts include one). +2. If available, install a drop-in client plugin: Redis Object Cache or WP Redis (Redis), or Memcached + Object Cache (Memcached). `wp plugin install redis-cache --activate` then `wp redis enable`. This writes + an `object-cache.php` drop-in to `wp-content/` β€” confirm no existing `object-cache.php` is being + overwritten (check first with `ls wp-content/object-cache.php`); if one exists, back it up before enabling. +3. If not available, this is a hosting-tier limitation β€” report it as such rather than trying to fake a + fix; don't recommend switching hosts unprompted, just flag it as the blocker. + +### Page cache is not detected β€” Tier 2 +1. Check if the host provides server-level page caching (many managed WP hosts do, and it may already be + active but not reporting the headers Site Health looks for β€” worth confirming with the host before + installing a redundant plugin). +2. If not, install one page-cache plugin (not a full plugin stack) β€” WP Super Cache, W3 Total Cache, or + the host-recommended one. `wp plugin install wp-super-cache --activate` then enable caching from its + settings screen (no reliable WP-CLI toggle across cache plugins β€” flag manual step to user). +3. Avoid stacking two caching plugins; if one is already active but not detected, check the plugin's own + status page before adding another. Some cache plugins also write rules into `.htaccess` β€” back it up + first per the Safety section before activating. + +### Your site is not set to output debug information β€” usually already passing; if failing β€” Tier 1 +Back up `wp-config.php` first, lint after editing: +```php +// wp-config.php +define( 'WP_DEBUG', false ); // set to true only while actively debugging +define( 'WP_DEBUG_DISPLAY', false ); // never show errors to visitors +define( 'WP_DEBUG_LOG', true ); // logs to wp-content/debug.log instead +``` + +### REST API / loopback requests / background updates failing β€” Tier 2 +Usually a security plugin, firewall, or `.htaccess` rule blocking internal requests. Steps: +1. Temporarily deactivate security/firewall plugins one at a time, re-check Site Health after each. +2. Check hosting-level firewall (Cloudflare, Sucuri, host WAF) isn't blocking the site from calling itself. +3. Verify `wp-config.php` doesn't have `define('DISALLOW_FILE_MODS', true)` set incorrectly for background + updates specifically, if that's the failing item. Back up before removing/editing that line. + +### HTTPS not fully active β€” Tier 2 +``` +wp option get siteurl +wp option get home +``` +Both must be `https://`. Also check for mixed-content (http:// hardcoded in content/theme). Confirm a full +database backup exists, then dry-run before applying for real: +``` +wp search-replace 'http://olddomain.com' 'https://olddomain.com' --dry-run +``` +Only remove `--dry-run` after the user has reviewed the dry-run output and confirmed the replacement count +and matched rows look correct. + +## Phase 4 β€” What NOT to invent + +- There is no `wp site-health` WP-CLI command in WordPress core as of this writing β€” don't fabricate one. + Fixes are applied via the specific commands above, not a single audit-and-fix CLI call. +- Don't claim a fix is complete without the user (or a re-run of Site Health) confirming it β€” server-level + changes (Tier 2) especially can silently fail to apply depending on host restrictions. +- Don't guess PHP/server values (current `upload_max_filesize`, cache backend availability, etc.) β€” ask or + have the user check `phpinfo()` / host panel rather than assuming common defaults are in place. +- Don't skip or shortcut the Safety section for any reason, including "it's a small change" β€” file + corruption risk doesn't scale with edit size; a single dropped semicolon in `wp-config.php` is as fatal + as a large edit. + +## Phase 5 β€” Output format + +Give the user: +1. **Triage table**: item | category | tier | one-line fix summary +2. **Tier 1 fixes**: execute directly (with confirmation + backup for deletions), show before/after +3. **Tier 2 fixes**: exact snippet + exactly where it goes + backup command + lint/verify command + rollback + command + note that a host restart or support ticket may be required; don't mark these "done" until the + user confirms the site still loads +4. **Tier 3 / unrecognized items**: one line each, informational only +5. Recommend re-running Site Health after Tier 1/2 changes to confirm the yellow items clear. + +Keep the whole response scannable β€” this is a punch list, not an essay. Use the table + short recipe +blocks above, not prose paragraphs, unless the user asks for more explanation on a specific item. + +## Examples + +### Example: Site Health reports "You should use a persistent object cache" + +1. Triage β†’ Tier 2 (requires Redis/Memcached at server level) +2. Ask the user to check with their host whether Redis is available +3. If yes, run: + ``` + wp plugin install redis-cache --activate + wp redis enable + ``` +4. Verify: `ls wp-content/object-cache.php` exists +5. Re-run Site Health to confirm the item clears + +### Example: Site Health reports "Your site is not set to output debug information" + +1. Triage β†’ Tier 1 (safe, reversible via wp-config.php) +2. Back up `wp-config.php`: + ``` + cp wp-config.php wp-config.php.bak-$(date +%Y%m%d-%H%M%S) + ``` +3. Edit and lint: + ```php + define( 'WP_DEBUG', false ); + define( 'WP_DEBUG_DISPLAY', false ); + ``` +4. Verify `php -l wp-config.php` passes +5. Confirm the site homepage + wp-admin still load + +## Best Practices + +- βœ… Back up the specific file before every edit β€” `cp` takes seconds, restoring a dead site takes hours +- βœ… Change one thing at a time and verify the site loads between each change +- βœ… Always run `php -l` after editing `wp-config.php` before reloading the site +- βœ… Run `wp search-replace` with `--dry-run` first and show the output to the user +- ❌ Never batch multiple Tier-2 file edits into one pass β€” you won't know which change broke the site +- ❌ Never skip the backup step, even for a one-line comment change + +## Reference + +`references/catalog.md` β€” extended list of less-common Site Health items (SEO category items like llms.txt +generation, Privacy items, rarer Security items) with the same tier classification, for reports that +include items not covered above. + +## Common Pitfalls + +- **Treating every yellow item as actionable** β€” Some recommended improvements (e.g. persistent object cache) are host-level and may not be fixable. Always triage by tier before acting. +- **Changing permalinks without a redirect plan** β€” Flipping to "Post name" on an indexed site breaks every existing URL. Always plan 301 redirects first. +- **Using `ini_set()` for upload limits** β€” `upload_max_filesize` and `post_max_size` are `PHP_INI_PERDIR`; `ini_set()` silently fails. Use `php.ini`, `.htaccess`, or `.user.ini` instead. +- **Skipping the dry-run on `wp search-replace`** β€” A wrong pattern can corrupt serialized data. Never run it without `--dry-run` first. +- **Installing two caching plugins** β€” Stacking page cache plugins causes conflicts and obscure bugs. If one is already active but not detected, debug it rather than adding another. + +## Limitations + +- Cannot execute anything itself against a live site β€” every WP-CLI/PHP snippet is drafted for the user or + their host to run; this skill has no shell access to the user's actual server. +- Cannot verify current PHP/server values (upload limits, cache backend availability, HTTPS status) β€” + relies on what the user reports back after checking `phpinfo()` or their host panel. +- Does not cover multisite-specific Site Health variations or WooCommerce-specific health checks; both add + extra items this skill's recipe list doesn't include. +- The item catalog (main file + `references/catalog.md`) reflects WordPress core's Site Health checks as of + mid-2026 β€” item titles/wording can change across core versions, so an unmatched item should be reported + as unmatched, not force-fit to the closest recipe. +- Does not replace a full security audit or compromise scan β€” Site Health flags configuration hygiene + issues, not signs that a site has already been broken into. + +## Related Skills + +- `@security-hardening` β€” For deeper WordPress security audits beyond Site Health's surface checks +- `@wp-performance` β€” For targeted performance optimization after Site Health flags are resolved diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/references/catalog.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/references/catalog.md new file mode 100644 index 00000000..27501e30 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/wp-site-health-auditor/references/catalog.md @@ -0,0 +1,134 @@ +# WP Site Health item catalog + +Extended list of less-common WordPress Site Health items, organized by +category. Items in the main `SKILL.md` recipe list are NOT duplicated here. + +## Security + +### Passwords need updating β€” Tier 1 +Users with weak or reused passwords. Inform the admin, list affected users: +``` +wp user list --field=user_login | while read u; do echo "$u: $(wp user meta get "$u" session_tokens | wc -c)"; done +``` +No automated fix β€” the admin must ask each user to update via +`wp user reset-password ` or Users > Profile. + +### The site is not using a persistent connection (not an object cache) β€” Tier 3 +Persistent database connections (`mysqli.persist`). Purely informational; +most shared hosts disable this and there is no performance downside for +standard WP installs. No action needed. + +### File permissions should be reviewed β€” Tier 2 +`wp-config.php` and `/wp-content/` directory permissions. Draft the expected +permissions: +```bash +find . -type f -exec chmod 644 {} \; +find . -type d -exec chmod 755 {} \; +chmod 600 wp-config.php +chmod 400 .htaccess # if Apache; nginx ignores it +``` +The user must verify with their host that the filesystem supports these +permissions (some managed WP hosts lock permissions). + +## Performance + +### Indexed autoloaded options found β€” Tier 2 +Autoloaded options larger than 1 MB. List the worst offenders: +``` +SELECT option_name, LENGTH(option_value) AS size +FROM wp_options +WHERE autoload = 'yes' +ORDER BY size DESC +LIMIT 20; +``` +If a plugin is the source, report the plugin name. Cleaning involves: +- `wp option delete ` (only if the option is safe to delete β€” confirm + with the plugin author first). +- Disabling autoload: `wp option update --autoload=no`. + +### Can not process scheduled maintenance jobs (wp_cron) β€” Tier 2 +`DISABLE_WP_CRON` is set but no system cron is running. Fix by either: +1. Setting up a real system cron job (recommended): + ``` + * * * * * wget -q -O - https://example.com/wp-cron.php + ``` +2. Removing `define('DISABLE_WP_CRON', true);` from `wp-config.php` + +### Background updates failed β€” Tier 2 +Automatic background updates for core/plugins/themes. Check: +``` +wp core check-update +wp plugin list --update=available +``` +If `DISALLOW_FILE_MODS` is true, background updates are blocked. Only +override if the user explicitly wants auto-updates: +```php +define('DISALLOW_FILE_MODS', false); // wp-config.php +``` + +## SEO + +### llms.txt generation not configured β€” Tier 1 +The site is missing an `llms.txt` file at the domain root. Install and +activate an SEO plugin that supports it, or create a manual file via +wp-admin > SEO > Settings. Not a ranking factor, but recommended for +AI crawler discoverability. + +### No XML sitemap detected β€” Tier 1 +Install an SEO plugin with sitemap support (Yoast, Rank Math, etc.) or +a dedicated sitemap plugin. Enable sitemap generation from the plugin +settings screen (no WP-CLI toggle reliably available across plugins). + +### Social preview images missing β€” Tier 2 +Open Graph / Twitter Card meta tags not set. Requires theme integration +or an SEO plugin. Draft the OG meta tags if the theme uses `wp_head()`: +```php +add_action('wp_head', function () { + if (has_post_thumbnail()) { + echo ''; + } +}); +``` + +## Privacy + +### Privacy policy page not set β€” Tier 1 +The site has no privacy policy page. Create one: +``` +wp post create --post_type=page --post_title="Privacy Policy" --post_status=draft +``` +Then set it under Settings > Privacy or via: +``` +wp option update wp_page_for_privacy_policy +``` + +### Privacy policy page is outdated β€” Tier 2 +The privacy policy page was created before the site's current privacy +guidance generation date. Re-run the guidance generator in +Tools > Export Personal Data and update the page content. No WP-CLI +command for this β€” manual step. + +## Diagnostics / hard-to-classify + +### Requirement mis-match with Xdebug extension β€” Tier 3 +Xdebug is loaded but is not required for production. If the user didn't +intentionally install it, suggest removal via host panel or php.ini: +``` +; php.ini +; zend_extension=xdebug.so (comment out or remove) +``` + +### ZipArchive / gzinflate / BCMath / Imagick missing β€” Tier 2 +Missing PHP extensions that some plugins or WordPress itself need. +List missing extensions and suggest installation via host panel or: +``` +sudo apt install php-zip php-gd php-bcmath php-imagick +``` +(Command varies by OS β€” draft the correct one for the user's environment.) + +## Items deliberately excluded from this catalog + +- **SQL Server version** β€” WP core already reports this as Passed or + Informational; no user action exists. +- **Active theme up to date** β€” Already green in Site Health; no action. +- **Plugin updates available** β€” Handled by `wp plugin update --all`. diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/.codex-plugin/plugin.json index bb9b75cf..4a4e1a5e 100644 --- a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-awesome-skills", - "version": "13.9.0", + "version": "13.10.0", "description": "Plugin-safe Codex plugin for the Antigravity Awesome Skills library.", "author": { "name": "sickn33 and contributors", @@ -19,7 +19,7 @@ "skills": "./skills/", "interface": { "displayName": "Antigravity Awesome Skills", - "shortDescription": "1,829 plugin-safe skills for coding, security, product, and ops workflows.", + "shortDescription": "1,830 plugin-safe skills for coding, security, product, and ops workflows.", "longDescription": "Install a plugin-safe Codex distribution of Antigravity Awesome Skills. Skills that still need hardening or target-specific setup remain available in the repo but are excluded from this plugin.", "developerName": "sickn33 and contributors", "category": "Productivity", diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md index f41f3214..f8545fef 100644 --- a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md @@ -354,6 +354,13 @@ Generates comprehensive pre-launch and update checklists. 4. **Test Locally**: Have native speakers review before publishing 5. **Measure ROI**: Track downloads by locale to assess impact +## Optional External Research Tools + +Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date. + +- [AppNiche Revenue Checker](https://getappniche.com/tools/app-revenue-checker) - free iOS App Store revenue benchmark for competitor prioritization and ASO score context. +- [AppNiche ASO Keyword Opportunity Checker](https://getappniche.com/tools/app-store-keyword-tool) - free iOS keyword opportunity check for keyword research and Apple keyword field planning. + ## Limitations ### Data Dependencies diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md new file mode 100644 index 00000000..a9e0b9bb --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md @@ -0,0 +1,335 @@ +--- +name: wp-site-health-auditor +description: "Turns a WordPress Site Health report into a risk-tiered, backup-first fix plan with exact WP-CLI/PHP snippets. Use for site health, recommended improvements, or critical issue reports." +category: development +risk: critical +source: self +source_type: self +date_added: "2026-07-03" +author: whoisabhishekadhikari +tags: [wordpress, site-health, wp-cli, seo, performance, security, hardening] +tools: [claude, cursor, codex, gemini] +--- + +# WP Site Health Auditor + +## When to Use This Skill + +- The user pastes a WordPress Site Health report (`Tools > Site Health`), as text or screenshot +- The user pastes raw Site Health debug info (`Tools > Site Health > Info`) and asks what's wrong +- The user mentions "site health", "recommended improvements," or "critical issues" for a WordPress site +- The user asks to clean up, harden, or speed up a WP install based on that screen + +Turns a WordPress Site Health report (Critical issues / Recommended improvements / Passed tests) into a +prioritized, risk-tiered fix plan β€” then executes the safe fixes and hands off the rest with exact +commands or code. + +## ⚠️ Safety β€” read before touching any file + +This skill edits `wp-config.php`, `.htaccess`, and `php.ini`-equivalent settings, and deletes plugins and +themes. All three are one bad edit away from a white-screen-of-death or a broken upload path. **Never skip +this section, even for a one-line change, even if the user is in a hurry.** + +**Before any edit or deletion, in this order:** +1. **Back up the specific file(s) you're about to touch**, not just "have a backup somewhere": + ``` + cp wp-config.php wp-config.php.bak-$(date +%Y%m%d-%H%M%S) + cp .htaccess .htaccess.bak-$(date +%Y%m%d-%H%M%S) + ``` + If shell access isn't available, tell the user to download the current file via SFTP/host file + manager first, and don't proceed until they confirm they have it. +2. **Confirm a full site/database backup exists** before deleting any plugin or theme, or running + `wp search-replace`. If the user doesn't have one and has a backup plugin active (UpdraftPlus, etc.), + trigger a backup first: `wp updraftplus backup` or the plugin's own WP-CLI command, or tell them to + click "Backup Now" and wait for confirmation before continuing. +3. **Never run `wp search-replace` without `--dry-run` first**, and always show the dry-run output to the + user before running it for real. This command rewrites the database in place β€” a wrong pattern can + corrupt serialized data across every table it touches. +4. **After any PHP file edit, lint it before reloading the site**: + ``` + php -l wp-config.php + ``` + For `.htaccess` changes, run `apachectl configtest` if available, or check the site immediately. + A syntax error in `wp-config.php` takes the entire site down immediately. Do not skip the lint check to + save a step. +5. **Change one thing at a time, then verify the site still loads** (homepage + wp-admin) before making + the next change. Don't batch multiple Tier 2 file edits into one pass β€” if something breaks, you want to + know which change did it. +6. **Give the user the exact rollback command** alongside every edit: + ``` + cp wp-config.php.bak- wp-config.php + ``` + State this even if nothing goes wrong β€” it costs one line and saves a panicked user later. + +If the user says "just do it, skip the backup" β€” still create the backup silently as part of the edit +sequence and tell them you did. Refuse to skip step 1 or step 4 entirely; those two are non-negotiable +regardless of urgency, since the failure mode (corrupted `wp-config.php`, dead site) is worse than the ten +seconds a backup costs. + +## Overview + +The Site Health screen is diagnostic, not prescriptive. It tells the site owner *that* something is wrong +(e.g. "you should use a persistent object cache") but not *how* to fix it, and it mixes items that are +one-click-safe (deactivate a plugin) with items that require host-level changes (php.ini, object cache +backend) or are purely informational (SQL server version β€” no action needed). This skill sorts that out β€” +safely. + +## Phase 1 β€” Parse the report + +Input is usually one of: +- Pasted plain text copied from `Tools > Site Health` (Status tab) +- Pasted plain text from `Tools > Site Health > Info` (the debug data export) +- A screenshot of the Status tab +- WP-CLI output (`wp site-health check` is not a core command; note that up front, don't invent one β€” see Phase 4) + +Extract three buckets exactly as WordPress labels them: +1. **Critical issues** (red) β€” always fix first, always confirm before touching. +2. **Recommended improvements** (yellow) β€” the bulk of real work; triage by risk tier below. +3. **Passed tests** (green) β€” skip. Do not "fix" or re-verify passed tests unless the user asks. Do not + invent problems with green items β€” a common failure mode is treating "SQL server is up to date" as + something to act on. It isn't. + +If the report is a screenshot, transcribe item titles + category tags (Security/Performance/SEO/Privacy) +verbatim before triaging β€” don't paraphrase the WordPress-generated title, it's used for the fix lookup in +Phase 3. + +If no report was pasted and the user just says "audit my site health," ask them to paste the Status tab +text (fastest) rather than guessing β€” Site Health results are host- and config-specific and guessing wastes +a turn. + +## Phase 2 β€” Risk-tiered triage + +Classify every non-passed item into one of three tiers before touching anything. Present this triage table +to the user first for anything above Tier 1 count of 3+ items β€” don't silently start deactivating plugins. + +**Tier 1 β€” Safe, reversible, auto-fixable in wp-admin or via WP-CLI** +No data loss risk, no downtime, fully reversible. Still back up per the Safety section before deleting +anything. Fix directly once the user confirms the item list. +- Remove inactive plugins/themes (they aren't running, deactivation already happened β€” this is just + deletion of dead code) +- Turn off `WP_DEBUG` display in production (`WP_DEBUG_DISPLAY`, not `WP_DEBUG` itself if the user still + wants logging) +- Enable search engine indexing / fix robots visibility toggle +- Update the site tagline off "Just another WordPress site" + +**Tier 2 β€” Requires host/server-level access β€” Claude drafts the change, user or host applies it** +Cannot be fixed purely from wp-admin; needs php.ini, .htaccess, wp-config.php, or hosting panel access. +Draft the exact snippet, explain where it goes, remind the user of the backup + lint steps above, and flag +that a server restart or host support ticket may be needed. +- Permalink structure change (migration β€” existing URLs break without redirects; require a redirect plan and CDN/cache flush before applying) +- `post_max_size` < `upload_max_filesize` mismatch +- Persistent object cache not available (Redis/Memcached) +- Page cache not detected +- PHP version/module changes +- HTTPS/SSL configuration +- Loopback/REST API failures caused by firewall or security plugin blocking + +**Tier 3 β€” Informational / host-dependent, no fix exists or none needed** +Report as informational only. Do not attempt a fix, do not suggest one unless directly asked. +- SQL server version notices when already current +- "Autoloaded options are acceptable" type passed-adjacent info +- Anything already green in Passed tests + +## Phase 3 β€” Fix recipes by item + +Match the WordPress-generated item title (case-insensitive substring match is fine) to a recipe below. +Every recipe below assumes the Safety section has already been followed for that file. If an item doesn't +match anything here, say so explicitly rather than fabricating a fix β€” Site Health's item set changes +across WP core versions and this list isn't exhaustive (see `references/catalog.md` for the fuller list +including rarer items). + +### You should remove inactive plugins / themes β€” Tier 1 +``` +# confirm full site backup exists first (Safety step 2) +wp plugin list --status=inactive --field=name +wp plugin delete + +wp theme list --status=inactive --field=name +wp theme delete +``` +Never delete the currently active theme's parent if the active theme is a child theme. Never delete +Twenty Twenty-Five (or the current default core theme) if it's the only fallback theme β€” WordPress needs +at least one broken-theme fallback; recommend keeping one bundled default even if inactive. +Confirm the exact plugin/theme names with the user before deleting β€” inactive isn't the same as unused; +some plugins are intentionally kept inactive as a staged rollback. + +### post_max_size smaller than upload_max_filesize β€” Tier 2 +This breaks large file uploads (post data gets truncated before the file size limit is even reached). +Fix by raising `post_max_size` to be >= `upload_max_filesize`, typically with headroom for form overhead. + +Where to set it (pick whichever the host supports, in this order of preference): +1. Host control panel PHP settings (cPanel "Select PHP Version" > Options, Plesk, etc.) β€” no code needed, + safest option, skip the file-backup steps entirely. +2. `php.ini` (if the user has server access) β€” back up first (`cp php.ini php.ini.bak-`): + ```ini + upload_max_filesize = 64M + post_max_size = 128M + ``` +3. `.htaccess` (Apache + mod_php only, not on PHP-FPM/nginx) β€” back up first: + ```apache + php_value upload_max_filesize 64M + php_value post_max_size 128M + ``` + A malformed `.htaccess` directive can 500 the entire site. Run `apachectl configtest` if available + before reloading, or check the live site immediately after saving. +4. `.user.ini` (CGI/FastCGI hosts; not mod_php) β€” back up first, create or edit `.user.ini` + in the WordPress root: + ```ini + upload_max_filesize = 64M + post_max_size = 128M + ``` + ⚠️ **Do not use `ini_set()` in `wp-config.php` for these directives** β€” `upload_max_filesize` + and `post_max_size` are `PHP_INI_PERDIR`, which means they can only be set before the + request starts (php.ini, .htaccess, .user.ini). `ini_set()` calls silently fail for both, + leaving the problem unfixed. + +Always set `post_max_size` strictly greater than `upload_max_filesize`. Confirm the current values first +(`wp cli info` doesn't show these β€” check `phpinfo()` or the host panel) rather than assuming defaults. + +### You should use a persistent object cache β€” Tier 2 +Requires a caching backend (Redis or Memcached) installed at the server level β€” this is not something a +plugin alone can create out of nothing. +1. Confirm with the user's host whether Redis or Memcached is available (many managed WP hosts include one). +2. If available, install a drop-in client plugin: Redis Object Cache or WP Redis (Redis), or Memcached + Object Cache (Memcached). `wp plugin install redis-cache --activate` then `wp redis enable`. This writes + an `object-cache.php` drop-in to `wp-content/` β€” confirm no existing `object-cache.php` is being + overwritten (check first with `ls wp-content/object-cache.php`); if one exists, back it up before enabling. +3. If not available, this is a hosting-tier limitation β€” report it as such rather than trying to fake a + fix; don't recommend switching hosts unprompted, just flag it as the blocker. + +### Page cache is not detected β€” Tier 2 +1. Check if the host provides server-level page caching (many managed WP hosts do, and it may already be + active but not reporting the headers Site Health looks for β€” worth confirming with the host before + installing a redundant plugin). +2. If not, install one page-cache plugin (not a full plugin stack) β€” WP Super Cache, W3 Total Cache, or + the host-recommended one. `wp plugin install wp-super-cache --activate` then enable caching from its + settings screen (no reliable WP-CLI toggle across cache plugins β€” flag manual step to user). +3. Avoid stacking two caching plugins; if one is already active but not detected, check the plugin's own + status page before adding another. Some cache plugins also write rules into `.htaccess` β€” back it up + first per the Safety section before activating. + +### Your site is not set to output debug information β€” usually already passing; if failing β€” Tier 1 +Back up `wp-config.php` first, lint after editing: +```php +// wp-config.php +define( 'WP_DEBUG', false ); // set to true only while actively debugging +define( 'WP_DEBUG_DISPLAY', false ); // never show errors to visitors +define( 'WP_DEBUG_LOG', true ); // logs to wp-content/debug.log instead +``` + +### REST API / loopback requests / background updates failing β€” Tier 2 +Usually a security plugin, firewall, or `.htaccess` rule blocking internal requests. Steps: +1. Temporarily deactivate security/firewall plugins one at a time, re-check Site Health after each. +2. Check hosting-level firewall (Cloudflare, Sucuri, host WAF) isn't blocking the site from calling itself. +3. Verify `wp-config.php` doesn't have `define('DISALLOW_FILE_MODS', true)` set incorrectly for background + updates specifically, if that's the failing item. Back up before removing/editing that line. + +### HTTPS not fully active β€” Tier 2 +``` +wp option get siteurl +wp option get home +``` +Both must be `https://`. Also check for mixed-content (http:// hardcoded in content/theme). Confirm a full +database backup exists, then dry-run before applying for real: +``` +wp search-replace 'http://olddomain.com' 'https://olddomain.com' --dry-run +``` +Only remove `--dry-run` after the user has reviewed the dry-run output and confirmed the replacement count +and matched rows look correct. + +## Phase 4 β€” What NOT to invent + +- There is no `wp site-health` WP-CLI command in WordPress core as of this writing β€” don't fabricate one. + Fixes are applied via the specific commands above, not a single audit-and-fix CLI call. +- Don't claim a fix is complete without the user (or a re-run of Site Health) confirming it β€” server-level + changes (Tier 2) especially can silently fail to apply depending on host restrictions. +- Don't guess PHP/server values (current `upload_max_filesize`, cache backend availability, etc.) β€” ask or + have the user check `phpinfo()` / host panel rather than assuming common defaults are in place. +- Don't skip or shortcut the Safety section for any reason, including "it's a small change" β€” file + corruption risk doesn't scale with edit size; a single dropped semicolon in `wp-config.php` is as fatal + as a large edit. + +## Phase 5 β€” Output format + +Give the user: +1. **Triage table**: item | category | tier | one-line fix summary +2. **Tier 1 fixes**: execute directly (with confirmation + backup for deletions), show before/after +3. **Tier 2 fixes**: exact snippet + exactly where it goes + backup command + lint/verify command + rollback + command + note that a host restart or support ticket may be required; don't mark these "done" until the + user confirms the site still loads +4. **Tier 3 / unrecognized items**: one line each, informational only +5. Recommend re-running Site Health after Tier 1/2 changes to confirm the yellow items clear. + +Keep the whole response scannable β€” this is a punch list, not an essay. Use the table + short recipe +blocks above, not prose paragraphs, unless the user asks for more explanation on a specific item. + +## Examples + +### Example: Site Health reports "You should use a persistent object cache" + +1. Triage β†’ Tier 2 (requires Redis/Memcached at server level) +2. Ask the user to check with their host whether Redis is available +3. If yes, run: + ``` + wp plugin install redis-cache --activate + wp redis enable + ``` +4. Verify: `ls wp-content/object-cache.php` exists +5. Re-run Site Health to confirm the item clears + +### Example: Site Health reports "Your site is not set to output debug information" + +1. Triage β†’ Tier 1 (safe, reversible via wp-config.php) +2. Back up `wp-config.php`: + ``` + cp wp-config.php wp-config.php.bak-$(date +%Y%m%d-%H%M%S) + ``` +3. Edit and lint: + ```php + define( 'WP_DEBUG', false ); + define( 'WP_DEBUG_DISPLAY', false ); + ``` +4. Verify `php -l wp-config.php` passes +5. Confirm the site homepage + wp-admin still load + +## Best Practices + +- βœ… Back up the specific file before every edit β€” `cp` takes seconds, restoring a dead site takes hours +- βœ… Change one thing at a time and verify the site loads between each change +- βœ… Always run `php -l` after editing `wp-config.php` before reloading the site +- βœ… Run `wp search-replace` with `--dry-run` first and show the output to the user +- ❌ Never batch multiple Tier-2 file edits into one pass β€” you won't know which change broke the site +- ❌ Never skip the backup step, even for a one-line comment change + +## Reference + +`references/catalog.md` β€” extended list of less-common Site Health items (SEO category items like llms.txt +generation, Privacy items, rarer Security items) with the same tier classification, for reports that +include items not covered above. + +## Common Pitfalls + +- **Treating every yellow item as actionable** β€” Some recommended improvements (e.g. persistent object cache) are host-level and may not be fixable. Always triage by tier before acting. +- **Changing permalinks without a redirect plan** β€” Flipping to "Post name" on an indexed site breaks every existing URL. Always plan 301 redirects first. +- **Using `ini_set()` for upload limits** β€” `upload_max_filesize` and `post_max_size` are `PHP_INI_PERDIR`; `ini_set()` silently fails. Use `php.ini`, `.htaccess`, or `.user.ini` instead. +- **Skipping the dry-run on `wp search-replace`** β€” A wrong pattern can corrupt serialized data. Never run it without `--dry-run` first. +- **Installing two caching plugins** β€” Stacking page cache plugins causes conflicts and obscure bugs. If one is already active but not detected, debug it rather than adding another. + +## Limitations + +- Cannot execute anything itself against a live site β€” every WP-CLI/PHP snippet is drafted for the user or + their host to run; this skill has no shell access to the user's actual server. +- Cannot verify current PHP/server values (upload limits, cache backend availability, HTTPS status) β€” + relies on what the user reports back after checking `phpinfo()` or their host panel. +- Does not cover multisite-specific Site Health variations or WooCommerce-specific health checks; both add + extra items this skill's recipe list doesn't include. +- The item catalog (main file + `references/catalog.md`) reflects WordPress core's Site Health checks as of + mid-2026 β€” item titles/wording can change across core versions, so an unmatched item should be reported + as unmatched, not force-fit to the closest recipe. +- Does not replace a full security audit or compromise scan β€” Site Health flags configuration hygiene + issues, not signs that a site has already been broken into. + +## Related Skills + +- `@security-hardening` β€” For deeper WordPress security audits beyond Site Health's surface checks +- `@wp-performance` β€” For targeted performance optimization after Site Health flags are resolved diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md new file mode 100644 index 00000000..27501e30 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md @@ -0,0 +1,134 @@ +# WP Site Health item catalog + +Extended list of less-common WordPress Site Health items, organized by +category. Items in the main `SKILL.md` recipe list are NOT duplicated here. + +## Security + +### Passwords need updating β€” Tier 1 +Users with weak or reused passwords. Inform the admin, list affected users: +``` +wp user list --field=user_login | while read u; do echo "$u: $(wp user meta get "$u" session_tokens | wc -c)"; done +``` +No automated fix β€” the admin must ask each user to update via +`wp user reset-password ` or Users > Profile. + +### The site is not using a persistent connection (not an object cache) β€” Tier 3 +Persistent database connections (`mysqli.persist`). Purely informational; +most shared hosts disable this and there is no performance downside for +standard WP installs. No action needed. + +### File permissions should be reviewed β€” Tier 2 +`wp-config.php` and `/wp-content/` directory permissions. Draft the expected +permissions: +```bash +find . -type f -exec chmod 644 {} \; +find . -type d -exec chmod 755 {} \; +chmod 600 wp-config.php +chmod 400 .htaccess # if Apache; nginx ignores it +``` +The user must verify with their host that the filesystem supports these +permissions (some managed WP hosts lock permissions). + +## Performance + +### Indexed autoloaded options found β€” Tier 2 +Autoloaded options larger than 1 MB. List the worst offenders: +``` +SELECT option_name, LENGTH(option_value) AS size +FROM wp_options +WHERE autoload = 'yes' +ORDER BY size DESC +LIMIT 20; +``` +If a plugin is the source, report the plugin name. Cleaning involves: +- `wp option delete ` (only if the option is safe to delete β€” confirm + with the plugin author first). +- Disabling autoload: `wp option update --autoload=no`. + +### Can not process scheduled maintenance jobs (wp_cron) β€” Tier 2 +`DISABLE_WP_CRON` is set but no system cron is running. Fix by either: +1. Setting up a real system cron job (recommended): + ``` + * * * * * wget -q -O - https://example.com/wp-cron.php + ``` +2. Removing `define('DISABLE_WP_CRON', true);` from `wp-config.php` + +### Background updates failed β€” Tier 2 +Automatic background updates for core/plugins/themes. Check: +``` +wp core check-update +wp plugin list --update=available +``` +If `DISALLOW_FILE_MODS` is true, background updates are blocked. Only +override if the user explicitly wants auto-updates: +```php +define('DISALLOW_FILE_MODS', false); // wp-config.php +``` + +## SEO + +### llms.txt generation not configured β€” Tier 1 +The site is missing an `llms.txt` file at the domain root. Install and +activate an SEO plugin that supports it, or create a manual file via +wp-admin > SEO > Settings. Not a ranking factor, but recommended for +AI crawler discoverability. + +### No XML sitemap detected β€” Tier 1 +Install an SEO plugin with sitemap support (Yoast, Rank Math, etc.) or +a dedicated sitemap plugin. Enable sitemap generation from the plugin +settings screen (no WP-CLI toggle reliably available across plugins). + +### Social preview images missing β€” Tier 2 +Open Graph / Twitter Card meta tags not set. Requires theme integration +or an SEO plugin. Draft the OG meta tags if the theme uses `wp_head()`: +```php +add_action('wp_head', function () { + if (has_post_thumbnail()) { + echo ''; + } +}); +``` + +## Privacy + +### Privacy policy page not set β€” Tier 1 +The site has no privacy policy page. Create one: +``` +wp post create --post_type=page --post_title="Privacy Policy" --post_status=draft +``` +Then set it under Settings > Privacy or via: +``` +wp option update wp_page_for_privacy_policy +``` + +### Privacy policy page is outdated β€” Tier 2 +The privacy policy page was created before the site's current privacy +guidance generation date. Re-run the guidance generator in +Tools > Export Personal Data and update the page content. No WP-CLI +command for this β€” manual step. + +## Diagnostics / hard-to-classify + +### Requirement mis-match with Xdebug extension β€” Tier 3 +Xdebug is loaded but is not required for production. If the user didn't +intentionally install it, suggest removal via host panel or php.ini: +``` +; php.ini +; zend_extension=xdebug.so (comment out or remove) +``` + +### ZipArchive / gzinflate / BCMath / Imagick missing β€” Tier 2 +Missing PHP extensions that some plugins or WordPress itself need. +List missing extensions and suggest installation via host panel or: +``` +sudo apt install php-zip php-gd php-bcmath php-imagick +``` +(Command varies by OS β€” draft the correct one for the user's environment.) + +## Items deliberately excluded from this catalog + +- **SQL Server version** β€” WP core already reports this as Passed or + Informational; no user action exists. +- **Active theme up to date** β€” Already green in Site Health; no action. +- **Plugin updates available** β€” Handled by `wp plugin update --all`. diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.claude-plugin/plugin.json index f98d5a7b..f980d949 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-accessibility-inclusive-ux", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Accessibility & Inclusive UX\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.codex-plugin/plugin.json index 5f9931f2..93d1173e 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-accessibility-inclusive-ux/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-accessibility-inclusive-ux", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Accessibility & Inclusive UX\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.claude-plugin/plugin.json index 3183112f..df516d5a 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-agent-mcp-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Agent & MCP Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.codex-plugin/plugin.json index 3f82d311..93779a85 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-agent-mcp-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-agent-mcp-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Agent & MCP Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.claude-plugin/plugin.json index 4cf27c47..7ab533ae 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-ai-product-evaluation-ops", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS AI Product & Evaluation Ops\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.codex-plugin/plugin.json index 17e0fa7c..d1319055 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-ai-product-evaluation-ops/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-ai-product-evaluation-ops", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS AI Product & Evaluation Ops\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.claude-plugin/plugin.json index a61faf3e..6d1d233b 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-api-platform-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS API Platform Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.codex-plugin/plugin.json index d585fb52..3edb70b5 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-api-platform-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-api-platform-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS API Platform Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.claude-plugin/plugin.json index 748b72c6..5b56457a 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-automation-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Automation Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.codex-plugin/plugin.json index f831386f..d13deb67 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-automation-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-automation-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Automation Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.claude-plugin/plugin.json index 2188818a..285f6d07 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-data-analytics", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Data Analytics\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.codex-plugin/plugin.json index 63963134..c07c4bcf 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-analytics/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-data-analytics", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Data Analytics\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.claude-plugin/plugin.json index ec59135d..785469f6 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-data-engineering-platform", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Data Engineering Platform\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.codex-plugin/plugin.json index 8a7b61f6..3846a660 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-data-engineering-platform/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-data-engineering-platform", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Data Engineering Platform\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.claude-plugin/plugin.json index 8ff037bd..646242b4 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-devops-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS DevOps & Cloud\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.codex-plugin/plugin.json index 8791d4f9..863aae86 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-devops-cloud/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-devops-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS DevOps & Cloud\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.claude-plugin/plugin.json index a1a704a1..a2f56658 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-documents-presentations", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Documents & Presentations\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.codex-plugin/plugin.json index a9251d18..9713beef 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-documents-presentations/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-documents-presentations", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Documents & Presentations\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.claude-plugin/plugin.json index 5aadde33..1e6ed571 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-localization-international-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Localization & International Growth\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.codex-plugin/plugin.json index 13a23dfc..9b6e55eb 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-localization-international-growth/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-localization-international-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Localization & International Growth\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.claude-plugin/plugin.json index 26439b20..c2286a66 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-marketing-seo-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Marketing, SEO & Growth\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.codex-plugin/plugin.json index 46c75c53..a8d5179d 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-marketing-seo-growth/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-marketing-seo-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Marketing, SEO & Growth\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.claude-plugin/plugin.json index 15246fe3..5a6f4153 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-mobile-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Mobile App Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.codex-plugin/plugin.json index 362134a0..46e6fb6c 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-mobile-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Mobile App Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/skills/app-store-optimization/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/skills/app-store-optimization/SKILL.md index f41f3214..f8545fef 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/skills/app-store-optimization/SKILL.md +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-mobile-app-builder/skills/app-store-optimization/SKILL.md @@ -354,6 +354,13 @@ Generates comprehensive pre-launch and update checklists. 4. **Test Locally**: Have native speakers review before publishing 5. **Measure ROI**: Track downloads by locale to assess impact +## Optional External Research Tools + +Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date. + +- [AppNiche Revenue Checker](https://getappniche.com/tools/app-revenue-checker) - free iOS App Store revenue benchmark for competitor prioritization and ASO score context. +- [AppNiche ASO Keyword Opportunity Checker](https://getappniche.com/tools/app-store-keyword-tool) - free iOS keyword opportunity check for keyword research and Apple keyword field planning. + ## Limitations ### Data Dependencies diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.claude-plugin/plugin.json index cd214173..70b7c757 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-observability-ir", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Observability IR\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.codex-plugin/plugin.json index 567bd50b..7fd837ca 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-observability-ir", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Observability IR\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.claude-plugin/plugin.json index f6d8167e..c87ca4fa 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-oss-maintainer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS OSS Maintainer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.codex-plugin/plugin.json index 9eca77d9..e7965c86 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-oss-maintainer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-oss-maintainer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS OSS Maintainer\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.claude-plugin/plugin.json index 16a8dbe2..787ec50f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-privacy-compliance-engineering", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Privacy & Compliance Engineering\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.codex-plugin/plugin.json index 325e7cf3..3d6cfb79 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-privacy-compliance-engineering/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-privacy-compliance-engineering", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Privacy & Compliance Engineering\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.claude-plugin/plugin.json index 0e133d41..e2cdaed2 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-product-design-studio", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Product Design Studio\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.codex-plugin/plugin.json index 26a6be67..79dd7ab2 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-product-design-studio/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-product-design-studio", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Product Design Studio\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.claude-plugin/plugin.json index 5e6fd56b..c16694fe 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-python-api-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Python API Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.codex-plugin/plugin.json index 81adfaa3..cc6614e3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-python-api-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-python-api-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Python API Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.claude-plugin/plugin.json index f6bcc205..999c9e94 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-qa-test-automation", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS QA & Test Automation\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.codex-plugin/plugin.json index b578f00b..39e7f66e 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-qa-test-automation/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-qa-test-automation", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS QA & Test Automation\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.claude-plugin/plugin.json index 9972426d..18d872bf 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-saas-launch-revenue", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS SaaS Launch & Revenue\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.codex-plugin/plugin.json index f0365fdf..161e5e2f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-saas-launch-revenue/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-saas-launch-revenue", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS SaaS Launch & Revenue\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.claude-plugin/plugin.json index 6fcaaa4c..6e0a705e 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-secure-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Secure App Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.codex-plugin/plugin.json index ed8db14f..7894bbfd 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-secure-app-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-secure-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Secure App Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.claude-plugin/plugin.json index a9e488d3..c04c2217 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-security-engineer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Security Engineer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.codex-plugin/plugin.json index 8c858275..140700d3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-security-engineer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-security-engineer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Security Engineer\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.claude-plugin/plugin.json index e4b9798c..29022c55 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-aas-web-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"AAS Web App Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.codex-plugin/plugin.json index 3d7797e9..57e6974c 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-web-app-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-aas-web-app-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"AAS Web App Builder\" workflow plugin from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.claude-plugin/plugin.json index d268626c..5e81a702 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-agent-architect", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Agent Architect\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.codex-plugin/plugin.json index df187a5a..61596209 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-agent-architect/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-agent-architect", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Agent Architect\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.claude-plugin/plugin.json index cc05ea71..92a5162d 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-apple-platform-design", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Apple Platform Design\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.codex-plugin/plugin.json index b2f3240e..bf6c5c05 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-apple-platform-design/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-apple-platform-design", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Apple Platform Design\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.claude-plugin/plugin.json index c460b209..bd13cc0c 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-architecture-design", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Architecture & Design\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.codex-plugin/plugin.json index 0186b401..2b212db3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-architecture-design/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-architecture-design", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Architecture & Design\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.claude-plugin/plugin.json index c28e710a..6495f578 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-automation-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Automation Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.codex-plugin/plugin.json index a4b514bd..fa628a0c 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-automation-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-automation-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Automation Builder\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.claude-plugin/plugin.json index 62019b51..16de2713 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-azure-ai-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Azure AI & Cloud\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.codex-plugin/plugin.json index 74d4f93a..42cf99ca 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-azure-ai-cloud/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-azure-ai-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Azure AI & Cloud\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.claude-plugin/plugin.json index 8f919f3e..42461b41 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-business-analyst", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Business Analyst\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.codex-plugin/plugin.json index 6c1488b8..56ae07d1 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-business-analyst/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-business-analyst", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Business Analyst\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.claude-plugin/plugin.json index 210e392f..b4454523 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-commerce-payments", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Commerce & Payments\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.codex-plugin/plugin.json index 26b671f0..a97ced10 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-commerce-payments/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-commerce-payments", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Commerce & Payments\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.claude-plugin/plugin.json index 4be37e36..bfaa7aa8 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-creative-director", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Creative Director\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.codex-plugin/plugin.json index 92dfc385..fe02c39a 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-creative-director/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-creative-director", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Creative Director\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.claude-plugin/plugin.json index 21c575d7..a5e22a12 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-data-analytics", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Data & Analytics\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.codex-plugin/plugin.json index 961a3eea..c650ff15 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-data-analytics/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-data-analytics", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Data & Analytics\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.claude-plugin/plugin.json index da513a52..dec0a25c 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-data-engineering", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Data Engineering\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.codex-plugin/plugin.json index b192dae2..01d3e4cb 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-data-engineering/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-data-engineering", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Data Engineering\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.claude-plugin/plugin.json index 537f2143..44a569c4 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-ddd-evented-architecture", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"DDD & Evented Architecture\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.codex-plugin/plugin.json index 1f721ec6..81c607d3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-ddd-evented-architecture/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-ddd-evented-architecture", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"DDD & Evented Architecture\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.claude-plugin/plugin.json index 05671186..03344990 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-devops-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"DevOps & Cloud\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.codex-plugin/plugin.json index 937bc4d8..3a644e60 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-devops-cloud/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-devops-cloud", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"DevOps & Cloud\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.claude-plugin/plugin.json index a91d0abe..f7631e54 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-documents-presentations", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Documents & Presentations\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.codex-plugin/plugin.json index b885e93c..5bbc5f90 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-documents-presentations/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-documents-presentations", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Documents & Presentations\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.claude-plugin/plugin.json index 0b53df3c..2e9ccfeb 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-essentials", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Essentials\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.codex-plugin/plugin.json index 99cd7f71..9198f781 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-essentials/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-essentials", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Essentials\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.claude-plugin/plugin.json index 86b3fcdd..cc77c5bf 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-expo-react-native", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Expo & React Native\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.codex-plugin/plugin.json index 85d0e3c8..79c14420 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-expo-react-native", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Expo & React Native\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/skills/app-store-optimization/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/skills/app-store-optimization/SKILL.md index f41f3214..f8545fef 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/skills/app-store-optimization/SKILL.md +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-expo-react-native/skills/app-store-optimization/SKILL.md @@ -354,6 +354,13 @@ Generates comprehensive pre-launch and update checklists. 4. **Test Locally**: Have native speakers review before publishing 5. **Measure ROI**: Track downloads by locale to assess impact +## Optional External Research Tools + +Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date. + +- [AppNiche Revenue Checker](https://getappniche.com/tools/app-revenue-checker) - free iOS App Store revenue benchmark for competitor prioritization and ASO score context. +- [AppNiche ASO Keyword Opportunity Checker](https://getappniche.com/tools/app-store-keyword-tool) - free iOS keyword opportunity check for keyword research and Apple keyword field planning. + ## Limitations ### Data Dependencies diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.claude-plugin/plugin.json index 0afb06d0..6d05f4d2 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-full-stack-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Full-Stack Developer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.codex-plugin/plugin.json index 01d77778..80206851 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-full-stack-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Full-Stack Developer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.claude-plugin/plugin.json index 2c25f25f..af68245e 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-indie-game-dev", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Indie Game Dev\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.codex-plugin/plugin.json index 30f55f65..1c0e0755 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-indie-game-dev/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-indie-game-dev", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Indie Game Dev\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.claude-plugin/plugin.json index ff079079..a64afb90 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-integration-apis", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Integration & APIs\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.codex-plugin/plugin.json index 85048a17..eeffc161 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-integration-apis/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-integration-apis", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Integration & APIs\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.claude-plugin/plugin.json index 90390050..55c13ba8 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-llm-application-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"LLM Application Developer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.codex-plugin/plugin.json index 6cc68a11..1efc39a3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-llm-application-developer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-llm-application-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"LLM Application Developer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.claude-plugin/plugin.json index b6c15012..bae66abd 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-makepad-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Makepad Builder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.codex-plugin/plugin.json index 746d2fc7..cc52b0b7 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-makepad-builder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-makepad-builder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Makepad Builder\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.claude-plugin/plugin.json index 08402792..7e512a17 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-marketing-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Marketing & Growth\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.codex-plugin/plugin.json index 539092c4..e2d04cd2 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-marketing-growth/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-marketing-growth", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Marketing & Growth\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.claude-plugin/plugin.json index 38e89534..82302820 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-mobile-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Mobile Developer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.codex-plugin/plugin.json index 2c2a9e02..5eb68eeb 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-mobile-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Mobile Developer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/skills/app-store-optimization/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/skills/app-store-optimization/SKILL.md index f41f3214..f8545fef 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/skills/app-store-optimization/SKILL.md +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-mobile-developer/skills/app-store-optimization/SKILL.md @@ -354,6 +354,13 @@ Generates comprehensive pre-launch and update checklists. 4. **Test Locally**: Have native speakers review before publishing 5. **Measure ROI**: Track downloads by locale to assess impact +## Optional External Research Tools + +Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date. + +- [AppNiche Revenue Checker](https://getappniche.com/tools/app-revenue-checker) - free iOS App Store revenue benchmark for competitor prioritization and ASO score context. +- [AppNiche ASO Keyword Opportunity Checker](https://getappniche.com/tools/app-store-keyword-tool) - free iOS keyword opportunity check for keyword research and Apple keyword field planning. + ## Limitations ### Data Dependencies diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.claude-plugin/plugin.json index 739e7900..b5dab949 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-observability-monitoring", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Observability & Monitoring\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.codex-plugin/plugin.json index 6c98c273..1591a44f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-observability-monitoring", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Observability & Monitoring\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.claude-plugin/plugin.json index 27927cdb..19ab7b1e 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-odoo-erp", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Odoo ERP\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.codex-plugin/plugin.json index 6f4581ba..8af9c882 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-odoo-erp/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-odoo-erp", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Odoo ERP\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.claude-plugin/plugin.json index 28fede71..7ad4f7ae 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-oss-maintainer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"OSS Maintainer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.codex-plugin/plugin.json index c4071dc9..fe55ac12 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-oss-maintainer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-oss-maintainer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"OSS Maintainer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.claude-plugin/plugin.json index 8e709240..dd96b0c6 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-python-pro", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Python Pro\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.codex-plugin/plugin.json index 14b6508d..5dd5d8e1 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-python-pro/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-python-pro", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Python Pro\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.claude-plugin/plugin.json index 1850abaf..9fb1ce1d 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-qa-testing", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"QA & Testing\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.codex-plugin/plugin.json index 7939ef1b..f0144ee3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-qa-testing/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-qa-testing", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"QA & Testing\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.claude-plugin/plugin.json index 98e3a0af..3f30054f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-revops-crm-automation", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"RevOps & CRM Automation\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.codex-plugin/plugin.json index 88a56ef5..8946ab8d 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-revops-crm-automation/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-revops-crm-automation", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"RevOps & CRM Automation\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.claude-plugin/plugin.json index dba5308d..3864402f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-security-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Security Developer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.codex-plugin/plugin.json index 1bc67ddf..57a2cb57 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-security-developer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-security-developer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Security Developer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.claude-plugin/plugin.json index 5f8232ac..f8de1ad2 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-security-engineer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Security Engineer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.codex-plugin/plugin.json index 376a51f0..289bf6c3 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-security-engineer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-security-engineer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Security Engineer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.claude-plugin/plugin.json index 123434a1..f796d32f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-seo-specialist", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"SEO Specialist\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.codex-plugin/plugin.json index 60417ad5..e48199d0 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-seo-specialist/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-seo-specialist", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"SEO Specialist\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.claude-plugin/plugin.json index 62cca5fb..713a5e53 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-startup-founder", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Startup Founder\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.codex-plugin/plugin.json index d7e02c71..adee157b 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-startup-founder/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-startup-founder", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Startup Founder\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.claude-plugin/plugin.json index 92d0d53a..e7f181e7 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-systems-programming", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Systems Programming\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.codex-plugin/plugin.json index 28e999a0..f0734df6 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-systems-programming/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-systems-programming", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Systems Programming\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.claude-plugin/plugin.json index 4d2fffde..ca313ac0 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-typescript-javascript", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"TypeScript & JavaScript\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.codex-plugin/plugin.json index 6faf2b78..e4b0b268 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-typescript-javascript/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-typescript-javascript", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"TypeScript & JavaScript\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.claude-plugin/plugin.json index ca5ca9b5..30ae5261 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-web-designer", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Web Designer\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.codex-plugin/plugin.json index 34c24e59..343e4145 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-web-designer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-web-designer", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Web Designer\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.claude-plugin/plugin.json index 5bede9b7..6e467ca1 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.claude-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "antigravity-bundle-web-wizard", - "version": "13.9.0", + "version": "13.10.0", "description": "Editorial \"Web Wizard\" bundle for Claude Code from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.codex-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.codex-plugin/plugin.json index aeac71f3..21cb7f2f 100644 --- a/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.codex-plugin/plugin.json +++ b/antigravity-awesome-skills/plugins/antigravity-bundle-web-wizard/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agyb-web-wizard", - "version": "13.9.0", + "version": "13.10.0", "description": "Install the \"Web Wizard\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md b/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md index f41f3214..f8545fef 100644 --- a/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md +++ b/antigravity-awesome-skills/skills/app-store-optimization/SKILL.md @@ -354,6 +354,13 @@ Generates comprehensive pre-launch and update checklists. 4. **Test Locally**: Have native speakers review before publishing 5. **Measure ROI**: Track downloads by locale to assess impact +## Optional External Research Tools + +Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date. + +- [AppNiche Revenue Checker](https://getappniche.com/tools/app-revenue-checker) - free iOS App Store revenue benchmark for competitor prioritization and ASO score context. +- [AppNiche ASO Keyword Opportunity Checker](https://getappniche.com/tools/app-store-keyword-tool) - free iOS keyword opportunity check for keyword research and Apple keyword field planning. + ## Limitations ### Data Dependencies diff --git a/antigravity-awesome-skills/skills/context-kit/SKILL.md b/antigravity-awesome-skills/skills/context-kit/SKILL.md new file mode 100644 index 00000000..1ec67f50 --- /dev/null +++ b/antigravity-awesome-skills/skills/context-kit/SKILL.md @@ -0,0 +1,135 @@ +--- +name: context-kit +description: "Evaluate, adapt, and safely install Context Kit personal context artifacts for Claude Code or adjacent agent workflows." +category: productivity +risk: critical +source: community +source_repo: JDDavenport/context-kit +source_type: community +date_added: "2026-07-04" +author: JDDavenport +tags: [personal-context, claude-code, memory, knowledge-management, agent-workflows] +tools: [claude, codex, cursor, gemini] +--- + +# Context Kit + +## When to Use + +Use this skill when the user wants to: + +- Set up durable personal context files for Claude Code or another coding agent +- Compare Context Kit's Personal Context Artifact pattern with an existing memory or project-notes system +- Adapt a context template structure without copying private details into the chat +- Review whether a one-line installer or downloaded skill pack is appropriate before running it +- Create a safer, local-first plan for CRM notes, open loops, session digests, or morning briefings + +## Overview + +Context Kit is an external project that organizes personal context into Markdown artifacts and companion +Claude Code skills. This skill helps the user decide what to adopt, where to store it, and how to avoid +turning a useful context system into a pile of sensitive data. + +Treat every personal context file as private by default. These files may contain identity details, family +context, work history, contact notes, mental models, health constraints, or relationship information. Do +not paste them into third-party tools, public repositories, issue trackers, or model contexts unless the +user explicitly approves the exact subset. + +## Safety Rules + +1. Do not run a remote install script until the user has seen the command, source repository, and target + paths it will write to. +2. Prefer cloning or downloading the repository for inspection before executing any installer: + ```bash + git clone https://github.com/JDDavenport/context-kit.git + cd context-kit + sed -n '1,220p' scripts/install.sh + ``` +3. Never store passwords, API keys, recovery codes, private keys, session tokens, or payment details in + personal context artifacts. +4. If the user wants contact notes or CRM files, store only information they are comfortable keeping in + local plaintext Markdown. +5. Before adding these files to a repo, confirm `.gitignore` excludes the chosen private context directory. +6. If adapting Context Kit to a team or company setting, separate personal context from company-confidential + or customer-confidential information. + +## Setup Workflow + +1. Ask what the user wants Context Kit to improve: session startup context, voice consistency, relationship + memory, open-loop tracking, daily briefings, or handoff summaries. +2. Inspect the upstream project and installer before running anything. +3. Choose a storage location: + - Claude Code default: `~/.claude/context/` and `~/.claude/skills/` + - Project-local context: `.agent/context/` or another ignored directory + - Portable setup: a private notes repo with explicit sync rules +4. Create a minimal starter set before filling everything: + - `pca-wiki.md` for durable identity and domains + - `pca-mental-models.md` for decision rules + - `pca-voice.md` for writing preferences + - `pca-protocols.md` for hard rules and boundaries +5. Add only enough detail to make the next agent session useful. Leave sensitive, speculative, or outdated + details out until there is a clear reason to include them. +6. Add a recurring review cadence. Personal context goes stale quickly; stale context is worse than no + context when it drives decisions. + +## Installation Review Checklist + +Before running an installer, verify: + +- The repository URL is exactly the one the user intended +- The script writes only to expected local directories +- The script does not upload files, send telemetry, or edit shell startup files unexpectedly +- The target directories are not inside a public repo +- The user has a rollback path, such as removing the copied templates and skills + +If anything is unclear, stop at inspection and provide the user with the exact lines that need review. + +## Examples + +### Example: Inspect before installing + +```bash +git clone https://github.com/JDDavenport/context-kit.git +cd context-kit +sed -n '1,220p' scripts/install.sh +find templates skills -maxdepth 2 -type f | sort +``` + +After inspection, summarize the files that would be installed and ask for confirmation before running the +installer. + +### Example: Create a private project-local context directory + +```bash +mkdir -p .agent/context +printf '.agent/context/\n' >> .gitignore +cp ~/Downloads/context-kit/templates/pca-wiki.md .agent/context/pca-wiki.md +``` + +Then trim the template to the minimum useful fields for the project instead of filling every personal +section immediately. + +## Best Practices + +- Keep context files short enough that an agent can read them at session start without drowning in stale + detail. +- Separate durable facts from temporary state. Use project workplans or task trackers for temporary state. +- Label assumptions and uncertain memories instead of presenting them as facts. +- Review personal context after major life, role, health, or project changes. +- Store voice examples and anti-examples separately from private identity details when possible. + +## Common Pitfalls + +- Running a shell installer directly from `curl` without inspecting it first +- Committing personal context files to a public repository +- Storing secrets because "the agent needs to know everything" +- Letting relationship or health notes become outdated and still treating them as current +- Copying upstream paid or license-unclear content instead of linking to it or writing original local notes + +## Limitations + +- This skill does not verify the current upstream license or installer behavior on its own; inspect the live + repository before running commands. +- It does not replace a dedicated secrets manager, CRM, password vault, or medical record system. +- It is for local personal context hygiene, not for collecting private information about other people + without a legitimate reason. diff --git a/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md b/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md new file mode 100644 index 00000000..a9e0b9bb --- /dev/null +++ b/antigravity-awesome-skills/skills/wp-site-health-auditor/SKILL.md @@ -0,0 +1,335 @@ +--- +name: wp-site-health-auditor +description: "Turns a WordPress Site Health report into a risk-tiered, backup-first fix plan with exact WP-CLI/PHP snippets. Use for site health, recommended improvements, or critical issue reports." +category: development +risk: critical +source: self +source_type: self +date_added: "2026-07-03" +author: whoisabhishekadhikari +tags: [wordpress, site-health, wp-cli, seo, performance, security, hardening] +tools: [claude, cursor, codex, gemini] +--- + +# WP Site Health Auditor + +## When to Use This Skill + +- The user pastes a WordPress Site Health report (`Tools > Site Health`), as text or screenshot +- The user pastes raw Site Health debug info (`Tools > Site Health > Info`) and asks what's wrong +- The user mentions "site health", "recommended improvements," or "critical issues" for a WordPress site +- The user asks to clean up, harden, or speed up a WP install based on that screen + +Turns a WordPress Site Health report (Critical issues / Recommended improvements / Passed tests) into a +prioritized, risk-tiered fix plan β€” then executes the safe fixes and hands off the rest with exact +commands or code. + +## ⚠️ Safety β€” read before touching any file + +This skill edits `wp-config.php`, `.htaccess`, and `php.ini`-equivalent settings, and deletes plugins and +themes. All three are one bad edit away from a white-screen-of-death or a broken upload path. **Never skip +this section, even for a one-line change, even if the user is in a hurry.** + +**Before any edit or deletion, in this order:** +1. **Back up the specific file(s) you're about to touch**, not just "have a backup somewhere": + ``` + cp wp-config.php wp-config.php.bak-$(date +%Y%m%d-%H%M%S) + cp .htaccess .htaccess.bak-$(date +%Y%m%d-%H%M%S) + ``` + If shell access isn't available, tell the user to download the current file via SFTP/host file + manager first, and don't proceed until they confirm they have it. +2. **Confirm a full site/database backup exists** before deleting any plugin or theme, or running + `wp search-replace`. If the user doesn't have one and has a backup plugin active (UpdraftPlus, etc.), + trigger a backup first: `wp updraftplus backup` or the plugin's own WP-CLI command, or tell them to + click "Backup Now" and wait for confirmation before continuing. +3. **Never run `wp search-replace` without `--dry-run` first**, and always show the dry-run output to the + user before running it for real. This command rewrites the database in place β€” a wrong pattern can + corrupt serialized data across every table it touches. +4. **After any PHP file edit, lint it before reloading the site**: + ``` + php -l wp-config.php + ``` + For `.htaccess` changes, run `apachectl configtest` if available, or check the site immediately. + A syntax error in `wp-config.php` takes the entire site down immediately. Do not skip the lint check to + save a step. +5. **Change one thing at a time, then verify the site still loads** (homepage + wp-admin) before making + the next change. Don't batch multiple Tier 2 file edits into one pass β€” if something breaks, you want to + know which change did it. +6. **Give the user the exact rollback command** alongside every edit: + ``` + cp wp-config.php.bak- wp-config.php + ``` + State this even if nothing goes wrong β€” it costs one line and saves a panicked user later. + +If the user says "just do it, skip the backup" β€” still create the backup silently as part of the edit +sequence and tell them you did. Refuse to skip step 1 or step 4 entirely; those two are non-negotiable +regardless of urgency, since the failure mode (corrupted `wp-config.php`, dead site) is worse than the ten +seconds a backup costs. + +## Overview + +The Site Health screen is diagnostic, not prescriptive. It tells the site owner *that* something is wrong +(e.g. "you should use a persistent object cache") but not *how* to fix it, and it mixes items that are +one-click-safe (deactivate a plugin) with items that require host-level changes (php.ini, object cache +backend) or are purely informational (SQL server version β€” no action needed). This skill sorts that out β€” +safely. + +## Phase 1 β€” Parse the report + +Input is usually one of: +- Pasted plain text copied from `Tools > Site Health` (Status tab) +- Pasted plain text from `Tools > Site Health > Info` (the debug data export) +- A screenshot of the Status tab +- WP-CLI output (`wp site-health check` is not a core command; note that up front, don't invent one β€” see Phase 4) + +Extract three buckets exactly as WordPress labels them: +1. **Critical issues** (red) β€” always fix first, always confirm before touching. +2. **Recommended improvements** (yellow) β€” the bulk of real work; triage by risk tier below. +3. **Passed tests** (green) β€” skip. Do not "fix" or re-verify passed tests unless the user asks. Do not + invent problems with green items β€” a common failure mode is treating "SQL server is up to date" as + something to act on. It isn't. + +If the report is a screenshot, transcribe item titles + category tags (Security/Performance/SEO/Privacy) +verbatim before triaging β€” don't paraphrase the WordPress-generated title, it's used for the fix lookup in +Phase 3. + +If no report was pasted and the user just says "audit my site health," ask them to paste the Status tab +text (fastest) rather than guessing β€” Site Health results are host- and config-specific and guessing wastes +a turn. + +## Phase 2 β€” Risk-tiered triage + +Classify every non-passed item into one of three tiers before touching anything. Present this triage table +to the user first for anything above Tier 1 count of 3+ items β€” don't silently start deactivating plugins. + +**Tier 1 β€” Safe, reversible, auto-fixable in wp-admin or via WP-CLI** +No data loss risk, no downtime, fully reversible. Still back up per the Safety section before deleting +anything. Fix directly once the user confirms the item list. +- Remove inactive plugins/themes (they aren't running, deactivation already happened β€” this is just + deletion of dead code) +- Turn off `WP_DEBUG` display in production (`WP_DEBUG_DISPLAY`, not `WP_DEBUG` itself if the user still + wants logging) +- Enable search engine indexing / fix robots visibility toggle +- Update the site tagline off "Just another WordPress site" + +**Tier 2 β€” Requires host/server-level access β€” Claude drafts the change, user or host applies it** +Cannot be fixed purely from wp-admin; needs php.ini, .htaccess, wp-config.php, or hosting panel access. +Draft the exact snippet, explain where it goes, remind the user of the backup + lint steps above, and flag +that a server restart or host support ticket may be needed. +- Permalink structure change (migration β€” existing URLs break without redirects; require a redirect plan and CDN/cache flush before applying) +- `post_max_size` < `upload_max_filesize` mismatch +- Persistent object cache not available (Redis/Memcached) +- Page cache not detected +- PHP version/module changes +- HTTPS/SSL configuration +- Loopback/REST API failures caused by firewall or security plugin blocking + +**Tier 3 β€” Informational / host-dependent, no fix exists or none needed** +Report as informational only. Do not attempt a fix, do not suggest one unless directly asked. +- SQL server version notices when already current +- "Autoloaded options are acceptable" type passed-adjacent info +- Anything already green in Passed tests + +## Phase 3 β€” Fix recipes by item + +Match the WordPress-generated item title (case-insensitive substring match is fine) to a recipe below. +Every recipe below assumes the Safety section has already been followed for that file. If an item doesn't +match anything here, say so explicitly rather than fabricating a fix β€” Site Health's item set changes +across WP core versions and this list isn't exhaustive (see `references/catalog.md` for the fuller list +including rarer items). + +### You should remove inactive plugins / themes β€” Tier 1 +``` +# confirm full site backup exists first (Safety step 2) +wp plugin list --status=inactive --field=name +wp plugin delete + +wp theme list --status=inactive --field=name +wp theme delete +``` +Never delete the currently active theme's parent if the active theme is a child theme. Never delete +Twenty Twenty-Five (or the current default core theme) if it's the only fallback theme β€” WordPress needs +at least one broken-theme fallback; recommend keeping one bundled default even if inactive. +Confirm the exact plugin/theme names with the user before deleting β€” inactive isn't the same as unused; +some plugins are intentionally kept inactive as a staged rollback. + +### post_max_size smaller than upload_max_filesize β€” Tier 2 +This breaks large file uploads (post data gets truncated before the file size limit is even reached). +Fix by raising `post_max_size` to be >= `upload_max_filesize`, typically with headroom for form overhead. + +Where to set it (pick whichever the host supports, in this order of preference): +1. Host control panel PHP settings (cPanel "Select PHP Version" > Options, Plesk, etc.) β€” no code needed, + safest option, skip the file-backup steps entirely. +2. `php.ini` (if the user has server access) β€” back up first (`cp php.ini php.ini.bak-`): + ```ini + upload_max_filesize = 64M + post_max_size = 128M + ``` +3. `.htaccess` (Apache + mod_php only, not on PHP-FPM/nginx) β€” back up first: + ```apache + php_value upload_max_filesize 64M + php_value post_max_size 128M + ``` + A malformed `.htaccess` directive can 500 the entire site. Run `apachectl configtest` if available + before reloading, or check the live site immediately after saving. +4. `.user.ini` (CGI/FastCGI hosts; not mod_php) β€” back up first, create or edit `.user.ini` + in the WordPress root: + ```ini + upload_max_filesize = 64M + post_max_size = 128M + ``` + ⚠️ **Do not use `ini_set()` in `wp-config.php` for these directives** β€” `upload_max_filesize` + and `post_max_size` are `PHP_INI_PERDIR`, which means they can only be set before the + request starts (php.ini, .htaccess, .user.ini). `ini_set()` calls silently fail for both, + leaving the problem unfixed. + +Always set `post_max_size` strictly greater than `upload_max_filesize`. Confirm the current values first +(`wp cli info` doesn't show these β€” check `phpinfo()` or the host panel) rather than assuming defaults. + +### You should use a persistent object cache β€” Tier 2 +Requires a caching backend (Redis or Memcached) installed at the server level β€” this is not something a +plugin alone can create out of nothing. +1. Confirm with the user's host whether Redis or Memcached is available (many managed WP hosts include one). +2. If available, install a drop-in client plugin: Redis Object Cache or WP Redis (Redis), or Memcached + Object Cache (Memcached). `wp plugin install redis-cache --activate` then `wp redis enable`. This writes + an `object-cache.php` drop-in to `wp-content/` β€” confirm no existing `object-cache.php` is being + overwritten (check first with `ls wp-content/object-cache.php`); if one exists, back it up before enabling. +3. If not available, this is a hosting-tier limitation β€” report it as such rather than trying to fake a + fix; don't recommend switching hosts unprompted, just flag it as the blocker. + +### Page cache is not detected β€” Tier 2 +1. Check if the host provides server-level page caching (many managed WP hosts do, and it may already be + active but not reporting the headers Site Health looks for β€” worth confirming with the host before + installing a redundant plugin). +2. If not, install one page-cache plugin (not a full plugin stack) β€” WP Super Cache, W3 Total Cache, or + the host-recommended one. `wp plugin install wp-super-cache --activate` then enable caching from its + settings screen (no reliable WP-CLI toggle across cache plugins β€” flag manual step to user). +3. Avoid stacking two caching plugins; if one is already active but not detected, check the plugin's own + status page before adding another. Some cache plugins also write rules into `.htaccess` β€” back it up + first per the Safety section before activating. + +### Your site is not set to output debug information β€” usually already passing; if failing β€” Tier 1 +Back up `wp-config.php` first, lint after editing: +```php +// wp-config.php +define( 'WP_DEBUG', false ); // set to true only while actively debugging +define( 'WP_DEBUG_DISPLAY', false ); // never show errors to visitors +define( 'WP_DEBUG_LOG', true ); // logs to wp-content/debug.log instead +``` + +### REST API / loopback requests / background updates failing β€” Tier 2 +Usually a security plugin, firewall, or `.htaccess` rule blocking internal requests. Steps: +1. Temporarily deactivate security/firewall plugins one at a time, re-check Site Health after each. +2. Check hosting-level firewall (Cloudflare, Sucuri, host WAF) isn't blocking the site from calling itself. +3. Verify `wp-config.php` doesn't have `define('DISALLOW_FILE_MODS', true)` set incorrectly for background + updates specifically, if that's the failing item. Back up before removing/editing that line. + +### HTTPS not fully active β€” Tier 2 +``` +wp option get siteurl +wp option get home +``` +Both must be `https://`. Also check for mixed-content (http:// hardcoded in content/theme). Confirm a full +database backup exists, then dry-run before applying for real: +``` +wp search-replace 'http://olddomain.com' 'https://olddomain.com' --dry-run +``` +Only remove `--dry-run` after the user has reviewed the dry-run output and confirmed the replacement count +and matched rows look correct. + +## Phase 4 β€” What NOT to invent + +- There is no `wp site-health` WP-CLI command in WordPress core as of this writing β€” don't fabricate one. + Fixes are applied via the specific commands above, not a single audit-and-fix CLI call. +- Don't claim a fix is complete without the user (or a re-run of Site Health) confirming it β€” server-level + changes (Tier 2) especially can silently fail to apply depending on host restrictions. +- Don't guess PHP/server values (current `upload_max_filesize`, cache backend availability, etc.) β€” ask or + have the user check `phpinfo()` / host panel rather than assuming common defaults are in place. +- Don't skip or shortcut the Safety section for any reason, including "it's a small change" β€” file + corruption risk doesn't scale with edit size; a single dropped semicolon in `wp-config.php` is as fatal + as a large edit. + +## Phase 5 β€” Output format + +Give the user: +1. **Triage table**: item | category | tier | one-line fix summary +2. **Tier 1 fixes**: execute directly (with confirmation + backup for deletions), show before/after +3. **Tier 2 fixes**: exact snippet + exactly where it goes + backup command + lint/verify command + rollback + command + note that a host restart or support ticket may be required; don't mark these "done" until the + user confirms the site still loads +4. **Tier 3 / unrecognized items**: one line each, informational only +5. Recommend re-running Site Health after Tier 1/2 changes to confirm the yellow items clear. + +Keep the whole response scannable β€” this is a punch list, not an essay. Use the table + short recipe +blocks above, not prose paragraphs, unless the user asks for more explanation on a specific item. + +## Examples + +### Example: Site Health reports "You should use a persistent object cache" + +1. Triage β†’ Tier 2 (requires Redis/Memcached at server level) +2. Ask the user to check with their host whether Redis is available +3. If yes, run: + ``` + wp plugin install redis-cache --activate + wp redis enable + ``` +4. Verify: `ls wp-content/object-cache.php` exists +5. Re-run Site Health to confirm the item clears + +### Example: Site Health reports "Your site is not set to output debug information" + +1. Triage β†’ Tier 1 (safe, reversible via wp-config.php) +2. Back up `wp-config.php`: + ``` + cp wp-config.php wp-config.php.bak-$(date +%Y%m%d-%H%M%S) + ``` +3. Edit and lint: + ```php + define( 'WP_DEBUG', false ); + define( 'WP_DEBUG_DISPLAY', false ); + ``` +4. Verify `php -l wp-config.php` passes +5. Confirm the site homepage + wp-admin still load + +## Best Practices + +- βœ… Back up the specific file before every edit β€” `cp` takes seconds, restoring a dead site takes hours +- βœ… Change one thing at a time and verify the site loads between each change +- βœ… Always run `php -l` after editing `wp-config.php` before reloading the site +- βœ… Run `wp search-replace` with `--dry-run` first and show the output to the user +- ❌ Never batch multiple Tier-2 file edits into one pass β€” you won't know which change broke the site +- ❌ Never skip the backup step, even for a one-line comment change + +## Reference + +`references/catalog.md` β€” extended list of less-common Site Health items (SEO category items like llms.txt +generation, Privacy items, rarer Security items) with the same tier classification, for reports that +include items not covered above. + +## Common Pitfalls + +- **Treating every yellow item as actionable** β€” Some recommended improvements (e.g. persistent object cache) are host-level and may not be fixable. Always triage by tier before acting. +- **Changing permalinks without a redirect plan** β€” Flipping to "Post name" on an indexed site breaks every existing URL. Always plan 301 redirects first. +- **Using `ini_set()` for upload limits** β€” `upload_max_filesize` and `post_max_size` are `PHP_INI_PERDIR`; `ini_set()` silently fails. Use `php.ini`, `.htaccess`, or `.user.ini` instead. +- **Skipping the dry-run on `wp search-replace`** β€” A wrong pattern can corrupt serialized data. Never run it without `--dry-run` first. +- **Installing two caching plugins** β€” Stacking page cache plugins causes conflicts and obscure bugs. If one is already active but not detected, debug it rather than adding another. + +## Limitations + +- Cannot execute anything itself against a live site β€” every WP-CLI/PHP snippet is drafted for the user or + their host to run; this skill has no shell access to the user's actual server. +- Cannot verify current PHP/server values (upload limits, cache backend availability, HTTPS status) β€” + relies on what the user reports back after checking `phpinfo()` or their host panel. +- Does not cover multisite-specific Site Health variations or WooCommerce-specific health checks; both add + extra items this skill's recipe list doesn't include. +- The item catalog (main file + `references/catalog.md`) reflects WordPress core's Site Health checks as of + mid-2026 β€” item titles/wording can change across core versions, so an unmatched item should be reported + as unmatched, not force-fit to the closest recipe. +- Does not replace a full security audit or compromise scan β€” Site Health flags configuration hygiene + issues, not signs that a site has already been broken into. + +## Related Skills + +- `@security-hardening` β€” For deeper WordPress security audits beyond Site Health's surface checks +- `@wp-performance` β€” For targeted performance optimization after Site Health flags are resolved diff --git a/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md b/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md new file mode 100644 index 00000000..27501e30 --- /dev/null +++ b/antigravity-awesome-skills/skills/wp-site-health-auditor/references/catalog.md @@ -0,0 +1,134 @@ +# WP Site Health item catalog + +Extended list of less-common WordPress Site Health items, organized by +category. Items in the main `SKILL.md` recipe list are NOT duplicated here. + +## Security + +### Passwords need updating β€” Tier 1 +Users with weak or reused passwords. Inform the admin, list affected users: +``` +wp user list --field=user_login | while read u; do echo "$u: $(wp user meta get "$u" session_tokens | wc -c)"; done +``` +No automated fix β€” the admin must ask each user to update via +`wp user reset-password ` or Users > Profile. + +### The site is not using a persistent connection (not an object cache) β€” Tier 3 +Persistent database connections (`mysqli.persist`). Purely informational; +most shared hosts disable this and there is no performance downside for +standard WP installs. No action needed. + +### File permissions should be reviewed β€” Tier 2 +`wp-config.php` and `/wp-content/` directory permissions. Draft the expected +permissions: +```bash +find . -type f -exec chmod 644 {} \; +find . -type d -exec chmod 755 {} \; +chmod 600 wp-config.php +chmod 400 .htaccess # if Apache; nginx ignores it +``` +The user must verify with their host that the filesystem supports these +permissions (some managed WP hosts lock permissions). + +## Performance + +### Indexed autoloaded options found β€” Tier 2 +Autoloaded options larger than 1 MB. List the worst offenders: +``` +SELECT option_name, LENGTH(option_value) AS size +FROM wp_options +WHERE autoload = 'yes' +ORDER BY size DESC +LIMIT 20; +``` +If a plugin is the source, report the plugin name. Cleaning involves: +- `wp option delete ` (only if the option is safe to delete β€” confirm + with the plugin author first). +- Disabling autoload: `wp option update --autoload=no`. + +### Can not process scheduled maintenance jobs (wp_cron) β€” Tier 2 +`DISABLE_WP_CRON` is set but no system cron is running. Fix by either: +1. Setting up a real system cron job (recommended): + ``` + * * * * * wget -q -O - https://example.com/wp-cron.php + ``` +2. Removing `define('DISABLE_WP_CRON', true);` from `wp-config.php` + +### Background updates failed β€” Tier 2 +Automatic background updates for core/plugins/themes. Check: +``` +wp core check-update +wp plugin list --update=available +``` +If `DISALLOW_FILE_MODS` is true, background updates are blocked. Only +override if the user explicitly wants auto-updates: +```php +define('DISALLOW_FILE_MODS', false); // wp-config.php +``` + +## SEO + +### llms.txt generation not configured β€” Tier 1 +The site is missing an `llms.txt` file at the domain root. Install and +activate an SEO plugin that supports it, or create a manual file via +wp-admin > SEO > Settings. Not a ranking factor, but recommended for +AI crawler discoverability. + +### No XML sitemap detected β€” Tier 1 +Install an SEO plugin with sitemap support (Yoast, Rank Math, etc.) or +a dedicated sitemap plugin. Enable sitemap generation from the plugin +settings screen (no WP-CLI toggle reliably available across plugins). + +### Social preview images missing β€” Tier 2 +Open Graph / Twitter Card meta tags not set. Requires theme integration +or an SEO plugin. Draft the OG meta tags if the theme uses `wp_head()`: +```php +add_action('wp_head', function () { + if (has_post_thumbnail()) { + echo ''; + } +}); +``` + +## Privacy + +### Privacy policy page not set β€” Tier 1 +The site has no privacy policy page. Create one: +``` +wp post create --post_type=page --post_title="Privacy Policy" --post_status=draft +``` +Then set it under Settings > Privacy or via: +``` +wp option update wp_page_for_privacy_policy +``` + +### Privacy policy page is outdated β€” Tier 2 +The privacy policy page was created before the site's current privacy +guidance generation date. Re-run the guidance generator in +Tools > Export Personal Data and update the page content. No WP-CLI +command for this β€” manual step. + +## Diagnostics / hard-to-classify + +### Requirement mis-match with Xdebug extension β€” Tier 3 +Xdebug is loaded but is not required for production. If the user didn't +intentionally install it, suggest removal via host panel or php.ini: +``` +; php.ini +; zend_extension=xdebug.so (comment out or remove) +``` + +### ZipArchive / gzinflate / BCMath / Imagick missing β€” Tier 2 +Missing PHP extensions that some plugins or WordPress itself need. +List missing extensions and suggest installation via host panel or: +``` +sudo apt install php-zip php-gd php-bcmath php-imagick +``` +(Command varies by OS β€” draft the correct one for the user's environment.) + +## Items deliberately excluded from this catalog + +- **SQL Server version** β€” WP core already reports this as Passed or + Informational; no user action exists. +- **Active theme up to date** β€” Already green in Site Health; no action. +- **Plugin updates available** β€” Handled by `wp plugin update --all`. diff --git a/antigravity-awesome-skills/skills_index.json b/antigravity-awesome-skills/skills_index.json index 1823596d..c1eaf8f3 100644 --- a/antigravity-awesome-skills/skills_index.json +++ b/antigravity-awesome-skills/skills_index.json @@ -10958,6 +10958,30 @@ "reasons": [] } }, + { + "id": "context-kit", + "path": "skills/context-kit", + "category": "productivity", + "name": "context-kit", + "description": "Evaluate, adapt, and safely install Context Kit personal context artifacts for Claude Code or adjacent agent workflows.", + "risk": "critical", + "source": "community", + "date_added": "2026-07-04", + "plugin": { + "targets": { + "codex": "blocked", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [ + "target_specific_home_path" + ] + } + }, { "id": "context-management-context-restore", "path": "skills/context-management-context-restore", @@ -41123,6 +41147,28 @@ "reasons": [] } }, + { + "id": "wp-site-health-auditor", + "path": "skills/wp-site-health-auditor", + "category": "development", + "name": "wp-site-health-auditor", + "description": "Turns a WordPress Site Health report into a risk-tiered, backup-first fix plan with exact WP-CLI/PHP snippets. Use for site health, recommended improvements, or critical issue reports.", + "risk": "critical", + "source": "self", + "date_added": "2026-07-03", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "wrike-automation", "path": "skills/wrike-automation", diff --git a/antigravity-awesome-skills/tools/scripts/pr_preflight.cjs b/antigravity-awesome-skills/tools/scripts/pr_preflight.cjs index 4cb6d4b6..c23085b8 100644 --- a/antigravity-awesome-skills/tools/scripts/pr_preflight.cjs +++ b/antigravity-awesome-skills/tools/scripts/pr_preflight.cjs @@ -56,6 +56,10 @@ function parseArgs(argv) { } function safeUserPath(pathValue, baseDir = process.cwd()) { + if (path.isAbsolute(String(pathValue || ""))) { + return path.resolve(pathValue); + } + const root = path.resolve(baseDir); const segments = String(pathValue || "").split(/[\\/]+/).filter(Boolean).map((segment) => { const sanitized = sanitizeFilename(segment); diff --git a/antigravity-awesome-skills/tools/scripts/tests/pr_preflight.test.js b/antigravity-awesome-skills/tools/scripts/tests/pr_preflight.test.js new file mode 100644 index 00000000..41d1b80c --- /dev/null +++ b/antigravity-awesome-skills/tools/scripts/tests/pr_preflight.test.js @@ -0,0 +1,46 @@ +const assert = require("assert"); +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { spawnSync } = require("child_process"); + +const repoRoot = path.resolve(__dirname, "..", "..", ".."); +const scriptPath = path.join(repoRoot, "tools", "scripts", "pr_preflight.cjs"); + +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "aas-pr-preflight-")); +const eventPath = path.join(tempDir, "event.json"); + +fs.writeFileSync( + eventPath, + JSON.stringify({ + pull_request: { + body: "## Quality Bar Checklist βœ…\n\n- [x] Canonical skill location\n", + }, + }), + "utf8", +); + +const result = spawnSync( + process.execPath, + [ + scriptPath, + "--base", + "HEAD", + "--head", + "HEAD", + "--event-path", + eventPath, + "--no-run", + "--json", + ], + { + cwd: repoRoot, + encoding: "utf8", + }, +); + +assert.strictEqual(result.status, 0, result.stderr || result.stdout); + +const parsed = JSON.parse(result.stdout); +assert.strictEqual(parsed.prBody.available, true); +assert.strictEqual(parsed.prBody.hasQualityChecklist, true); diff --git a/ui-ux-pro-max/.github/workflows/release.yml b/ui-ux-pro-max/.github/workflows/release.yml index 2ce9f259..ec3670f7 100644 --- a/ui-ux-pro-max/.github/workflows/release.yml +++ b/ui-ux-pro-max/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: - name: Build CLI working-directory: cli - run: bun run build + run: npm run build - name: Run semantic-release env: diff --git a/ui-ux-pro-max/.github/workflows/smoke-stacks.yml b/ui-ux-pro-max/.github/workflows/smoke-stacks.yml index 0ac7c0f8..8ffdb914 100644 --- a/ui-ux-pro-max/.github/workflows/smoke-stacks.yml +++ b/ui-ux-pro-max/.github/workflows/smoke-stacks.yml @@ -1,13 +1,15 @@ -name: Smoke test stacks +name: Smoke test data on: pull_request: paths: - - 'src/ui-ux-pro-max/data/stacks/**' + - 'src/ui-ux-pro-max/data/**' - 'src/ui-ux-pro-max/scripts/**' - - 'cli/assets/data/stacks/**' + - 'cli/assets/data/**' - 'cli/assets/scripts/**' + - 'scripts/validate-csv.py' - 'scripts/smoke-stacks.sh' + - 'scripts/smoke-domains.sh' - '.github/workflows/smoke-stacks.yml' push: branches: [main] @@ -24,5 +26,11 @@ jobs: with: python-version: '3.x' + - name: Validate CSV structure + run: python3 scripts/validate-csv.py + + - name: Run domain smoke test + run: bash scripts/smoke-domains.sh + - name: Run stack smoke test run: bash scripts/smoke-stacks.sh diff --git a/ui-ux-pro-max/README.md b/ui-ux-pro-max/README.md index d1847ed1..fc24ba48 100755 --- a/ui-ux-pro-max/README.md +++ b/ui-ux-pro-max/README.md @@ -520,9 +520,14 @@ cli/ # CLI installer (generates files from templates) cd cli npm run sync:assets npm run check:assets +npm run validate:csv +npm run smoke:domains +npm run smoke:stacks +npm run typecheck # 5. Build and test CLI -bun run build +# `npm run build` uses Bun when available and falls back to TypeScript compiler output after `npm ci`. +npm run build node dist/index.js init --ai claude --offline # Test in a temp folder # 6. Create PR (never push directly to main) diff --git a/ui-ux-pro-max/SOURCE.md b/ui-ux-pro-max/SOURCE.md index e05d1839..0b6ea6af 100644 --- a/ui-ux-pro-max/SOURCE.md +++ b/ui-ux-pro-max/SOURCE.md @@ -1,8 +1,8 @@ # Source - Repo: https://github.com/nextlevelbuilder/ui-ux-pro-max-skill -- Ref: 9ceab49a1c6e9bf23fa9ebc49ca7d4f0c6303a99 +- Ref: 4baa399d00da806f83ed93652172f66943205153 - Remove-Paths: -- Snapshot: 2026-07-03 +- Snapshot: 2026-07-04 - Sync-Mode: render_skill - Notes: vendored into playbook branch thirdparty/skill diff --git a/ui-ux-pro-max/cli/assets/data/products.csv b/ui-ux-pro-max/cli/assets/data/products.csv index 10bba421..6ad79009 100644 --- a/ui-ux-pro-max/cli/assets/data/products.csv +++ b/ui-ux-pro-max/cli/assets/data/products.csv @@ -161,13 +161,13 @@ No,Product Type,Keywords,Primary Style Recommendation,Secondary Styles,Landing P 160,White Noise & Ambient Sound,"white noise, ambient, sound, sleep, focus, rain, nature, relax, concentration, background, noisli",Minimalism + Dark Mode (OLED),"Neumorphism, Organic Biophilic",Minimal & Direct + Social Proof,N/A - Player focused,Calming dark + ambient texture visual + subtle sound wave + sleep blue,Sound mixer with multiple simultaneous layers. Sleep timer with fade. Custom soundscapes. Offline. Background audio. 161,Home Decoration & Interior Design,"home, interior, decor, design, furniture, room, renovation, ar, plan, inspire, 3d, houzz",Minimalism + 3D Product Preview,"Organic Biophilic, Aurora UI",Storytelling-Driven + Feature-Rich,N/A - Project focused,Neutral interior palette + material texture accent + AR blue,AR room visualization. Style quiz. Product catalog with purchase links. 3D room planner. Mood board. Before/after. 162,Academic Journal / Scholarly Publishing,"academic, journal, paper, research, peer-review, open-access, scholarly, publication, citation, manuscript, issn, doi",Swiss Modernism 2.0 + Minimalism,"Trust & Authority, Accessible & Ethical",Content-Index + Search,N/A - Publication focused,Trust navy + White + Citation blue + Serif accents,"Prioritize readability (serif body text). Clear article hierarchy. Abstract/DOI prominence. WCAG AAA. Minimal visual noise. Trust signals: ISSN, indexing badges." -163,API Developer Portal,"api, developer, documentation, sdk, endpoint, integration, rest, graphql, webhook, reference, getting-started, auth",Trust & Authority + Minimalism,"Glassmorphism, Dark Mode (OLED)",Quick Start + Interactive Docs,N/A - Documentation focused,Dark code theme + Brand accent + Syntax colors,"Endpoint discoverability. Copy-paste code samples. Auth flow clarity. Version switching. Interactive playground. Rate limit visibility." +163,API Developer Portal,"api, developer, documentation, sdk, endpoint, integration, rest, graphql, webhook, reference, getting-started, auth",Trust & Authority + Minimalism,"Glassmorphism, Dark Mode (OLED)",Quick Start + Interactive Docs,N/A - Documentation focused,Dark code theme + Brand accent + Syntax colors,Endpoint discoverability. Copy-paste code samples. Auth flow clarity. Version switching. Interactive playground. Rate limit visibility. 164,Forum / Discussion Board,"forum, discussion, thread, post, reply, community, comment, moderation, subreddit, stackexchange, topic",Dark Mode (OLED) + Minimalism,"Flat Design, Vibrant & Block-based",Feed + Thread View,N/A - Discussion focused,Dark neutral + topic accent colors + unread indicator + reputation badge,Thread list with pagination. Rich text editor. Quote/mention system. Upvote/downvote. User badges. Moderation tools. 165,Directory / Listing Site,"directory, listing, classifieds, catalogue, business-directory, yellow-pages, venue, find, search, filter, map",Flat Design + Vibrant & Block-based,"Minimalism, Trust & Authority",Filter-Heavy Grid + Map,N/A - Listing focused,Neutral bg + category color chips + map accent + verified badge,Category tree. Multi-filter sidebar. Map/list toggle. Verified badges. Reviews. Claim listing flow. 166,Status Page / Incident Management,"status, incident, outage, uptime, downtime, statuspage, monitoring, sla, maintenance, sev1, postmortem",Data-Dense + Trust & Authority,"Minimalism, Dark Mode (OLED)",Timeline + Severity Indicators,Real-Time Monitoring + Timeline,Status green + incident red + maintenance amber + neutral dark,Service status matrix. Incident timeline. Severity badges. Maintenance schedule. SLA uptime history. Email/SMS subscribe. 167,Wiki / Encyclopedia,"wiki, encyclopedia, knowledge, article, reference, wikipedia, documentation, collaborative, edit, version, citation",Minimalism + Flat Design,"Swiss Modernism 2.0, Accessible & Ethical",Search-First + Hierarchical Navigation,N/A - Reference focused,Clean white + link blue + heading hierarchy + citation grey,Full-text search bar. Table of contents sidebar. Edit history. Inter-page linking. Mobile responsive. Print-friendly. 168,Auction Platform,"auction, bid, hammer, lot, live-auction, bidding-war, estate-sale, proxibid, gavel, lot-number, reserve-price",Dark Mode (OLED) + Motion-Driven,"Vibrant & Block-based, Real-Time Monitor",Live Auction Feed + Countdown,N/A - Auction focused,Dark bg + bid green + outbid red + countdown amber,Real-time bid updates. Countdown timer urgency. Auto-bid ceiling. Outbid notifications. Bid history. Reserve price indicator. -169,Changelog / Release Notes,"changelog, release-notes, version-history, whats-new, product-updates, semver, patch-notes, release-tracker",Minimalism + Flat Design,"Swiss Modernism 2.0, Trust & Authority",Timeline + Version List,N/A - Documentation focused,Neutral bg + version badge colors (feat=green, fix=blue, breaking=red) + date grey,Chronological release feed. Semver badges. Breaking change warnings. Copy-paste install commands. Subscribe to feed. Search by version. +169,Changelog / Release Notes,"changelog, release-notes, version-history, whats-new, product-updates, semver, patch-notes, release-tracker",Minimalism + Flat Design,"Swiss Modernism 2.0, Trust & Authority",Timeline + Version List,N/A - Documentation focused,"Neutral bg + version badge colors (feat=green, fix=blue, breaking=red) + date grey",Chronological release feed. Semver badges. Breaking change warnings. Copy-paste install commands. Subscribe to feed. Search by version. 170,Citizen Science Platform,"citizen-science, zooniverse, crowdsourced-research, volunteer-science, public-participation, distributed-research, citizen-researcher",Organic Biophilic + Vibrant & Block-based,"Claymorphism, Motion-Driven",Storytelling-Driven + Social Proof,Project Participation Dashboard,Earth green + discovery orange + volunteer badge blue + data neutral,Project cards with impact metrics. Contribution tracker. Beginner-friendly onboarding. Data quality feedback loop. Leaderboards. Community forums. 171,Classifieds / Buy-Sell,"classifieds, buy-sell, craigslist, secondhand, marketplace-listing, for-sale, trade, flea-market, thrift, resell",Flat Design + Vibrant & Block-based,"Minimalism, Trust & Authority",Filter-Heavy Grid + Map,N/A - Listing focused,Neutral bg + price green + category chips + verified seller badge,Category tree. Photo-first listing cards. Price negotiation. Location radius filter. Saved searches. Seller reputation. Flag/report. 172,Conference / Symposium Landing Page,"conference, symposium, summit, cfp, call-for-papers, speaker-lineup, registration, venue, proceedings, keynote, track",Swiss Modernism 2.0 + Minimalism,"Trust & Authority, Accessible & Ethical",Hero + Agenda + CFP,N/A - Event focused,Academic navy + track color chips + gold keynote + neutral white,Speaker grid. Multi-track agenda. CFP deadline countdown. Venue map. Sponsor tiers. Early-bird pricing. Proceedings download. diff --git a/ui-ux-pro-max/cli/assets/data/stacks/angular.csv b/ui-ux-pro-max/cli/assets/data/stacks/angular.csv index 75cb670f..f157b357 100644 --- a/ui-ux-pro-max/cli/assets/data/stacks/angular.csv +++ b/ui-ux-pro-max/cli/assets/data/stacks/angular.csv @@ -1,51 +1,51 @@ No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Components,Use standalone components,Angular 17+ default; no NgModule needed,Standalone components for all new code,NgModule-based components for new projects,"@Component({ standalone: true imports: [CommonModule] })","@NgModule({ declarations: [MyComp] })",High,https://angular.dev/guide/components/importing -2,Components,Use signals for state,Signals are Angular's reactive primitive for fine-grained reactivity,Signals for component state over class properties,Mutable class properties without signals,"count = signal(0); increment() { this.count.update(v => v + 1) }","count = 0; increment() { this.count++ }",High,https://angular.dev/guide/signals -3,Components,Use @if/@for/@switch control flow,Built-in control flow syntax replaces *ngIf/*ngFor directives,@if and @for in templates,*ngIf and *ngFor structural directives,"@if (isLoggedIn) { } @else { }","
",High,https://angular.dev/guide/templates/control-flow -4,Components,Use input() and output() signals,Signal-based inputs/outputs replace @Input()/@Output() decorators,input() and output() for component API,@Input() and @Output() decorators,"name = input(); clicked = output()","@Input() name: string; @Output() clicked = new EventEmitter()",High,https://angular.dev/guide/components/inputs +1,Components,Use standalone components,Angular 17+ default; no NgModule needed,Standalone components for all new code,NgModule-based components for new projects,@Component({ standalone: true imports: [CommonModule] }),@NgModule({ declarations: [MyComp] }),High,https://angular.dev/guide/components/importing +2,Components,Use signals for state,Signals are Angular's reactive primitive for fine-grained reactivity,Signals for component state over class properties,Mutable class properties without signals,count = signal(0); increment() { this.count.update(v => v + 1) },count = 0; increment() { this.count++ },High,https://angular.dev/guide/signals +3,Components,Use @if/@for/@switch control flow,Built-in control flow syntax replaces *ngIf/*ngFor directives,@if and @for in templates,*ngIf and *ngFor structural directives,@if (isLoggedIn) { } @else { },"
",High,https://angular.dev/guide/templates/control-flow +4,Components,Use input() and output() signals,Signal-based inputs/outputs replace @Input()/@Output() decorators,input() and output() for component API,@Input() and @Output() decorators,name = input(); clicked = output(),@Input() name: string; @Output() clicked = new EventEmitter(),High,https://angular.dev/guide/components/inputs 5,Components,Use content projection,ng-content for flexible component composition,ng-content with select for named slots,Rigid templates that can't be customized," ","
{{ title }}
",Medium,https://angular.dev/guide/components/content-projection -6,Components,Keep components small,Single responsibility; components should do one thing,Extract sub-components when template exceeds 50 lines,Monolithic components handling multiple concerns," ",One 300-line component template,Medium,https://angular.dev/guide/components -7,Components,Use OnPush change detection,Reduces re-renders by only checking on input changes or signal updates,OnPush for all components,Default change detection strategy,"changeDetection: ChangeDetectionStrategy.OnPush","changeDetection: ChangeDetectionStrategy.Default",High,https://angular.dev/guide/components/lifecycle -8,Components,Avoid direct DOM manipulation,Use renderer or ElementRef sparingly; prefer template bindings,Template bindings and Angular directives,Direct document.querySelector or innerHTML,"[class.active]=""isActive""","this.el.nativeElement.classList.add('active')",High,https://angular.dev/guide/components/host-elements -9,Routing,Lazy load feature routes,Load route chunks on demand to reduce initial bundle,loadComponent() for all feature routes,Eager-loaded routes in app config,"{ path: 'admin' loadComponent: () => import('./admin/admin.component') }","{ path: 'admin' component: AdminComponent }",High,https://angular.dev/guide/routing/lazy-loading -10,Routing,Use route guards with functional API,Protect routes with canActivate/canMatch functional guards,Functional guards returning boolean or UrlTree,Class-based guards with CanActivate interface,"canActivate: [() => inject(AuthService).isLoggedIn()]","canActivate: [AuthGuard]",High,https://angular.dev/guide/routing/common-router-tasks#preventing-unauthorized-access -11,Routing,Use route resolvers for data,Pre-fetch data before route activation using resolve,ResolveFn for route data,Fetching data in ngOnInit causing flash of empty state,"resolve: { user: () => inject(UserService).getUser() }",Fetch in ngOnInit with loading state flickering,Medium,https://angular.dev/guide/routing/common-router-tasks#resolve -12,Routing,Type route params with inject,Use inject(ActivatedRoute) with signals or toSignal,Typed route params via ActivatedRoute,Untyped route.snapshot.params string access,"const id = toSignal(route.paramMap.pipe(map(p => p.get('id'))))","const id = this.route.snapshot.params['id']",Medium,https://angular.dev/api/router/ActivatedRoute -13,Routing,Use nested routes for layouts,Compose shared layouts using router-outlet nesting,Nested routes with shared layout components,Duplicating layout code across routes,"{ path: 'app' component: ShellComponent children: [...] }",Duplicate header/sidebar in each route component,Medium,https://angular.dev/guide/routing/router-tutorial-toh#child-route-configuration -14,Routing,Configure preloading strategies,Preload lazy modules in background after initial load,PreloadAllModules or custom strategy,No preloading causing delayed navigation,"provideRouter(routes withPreloading(PreloadAllModules))","provideRouter(routes)",Low,https://angular.dev/api/router/PreloadAllModules -15,State,Use signals for local state,Signals provide synchronous reactive state without RxJS overhead,signal() for component-local reactive state,BehaviorSubject for simple local state,"const items = signal([]); addItem(i: Item) { this.items.update(arr => [...arr i]) }","items$ = new BehaviorSubject([])",High,https://angular.dev/guide/signals -16,State,Use computed() for derived state,Lazily evaluated derived values that update when dependencies change,computed() for values derived from other signals,Duplicated state or manual sync,"readonly total = computed(() => this.items().reduce((s i) => s + i.price 0))","this.total = this.items.reduce(...) // called manually",High,https://angular.dev/guide/signals#computed-signals -17,State,Use effect() carefully,Effects run side effects when signals change; avoid overuse,effect() for side effects like logging or localStorage sync,effect() for deriving state (use computed instead),"effect(() => localStorage.setItem('cart' JSON.stringify(this.cart())))","effect(() => { this.total.set(this.items().length) })",Medium,https://angular.dev/guide/signals#effects -18,State,Use NgRx Signal Store for complex state,NgRx Signal Store is the modern lightweight state management for Angular,@ngrx/signals SignalStore for feature state,Full NgRx reducer/action/effect boilerplate for simple state,"const Store = signalStore(withState({ count: 0 }) withMethods(s => ({ increment: () => patchState(s { count: s.count() + 1 }) })))","createReducer(on(increment state => ({ ...state count: state.count + 1 })))",Medium,https://ngrx.io/guide/signals -19,State,Inject services for shared state,Services with signals share state across components without a store,Injectable service with signals for cross-component state,Prop drilling or @Input chains for shared state,"@Injectable({ providedIn: 'root' }) class CartService { items = signal([]) }","@Input() cartItems passed through 4 component levels",Medium,https://angular.dev/guide/di/creating-injectable-service -20,State,Avoid mixing RxJS and signals unnecessarily,Use toSignal() to bridge RxJS into signal world at the boundary,toSignal() to convert observable to signal at component edge,Subscribing in components and storing in signal manually,"readonly user = toSignal(this.userService.user$)","this.userService.user$.subscribe(u => this.user.set(u))",Medium,https://angular.dev/guide/rxjs-interop -21,Forms,Use typed reactive forms,FormGroup/FormControl with explicit generics for compile-time safety,FormBuilder with typed controls,Untyped FormControl or any casts,"fb.group({ email: fb.control('') password: fb.control('') })","new FormGroup({ email: new FormControl(null) })",High,https://angular.dev/guide/forms/typed-forms +6,Components,Keep components small,Single responsibility; components should do one thing,Extract sub-components when template exceeds 50 lines,Monolithic components handling multiple concerns, ,One 300-line component template,Medium,https://angular.dev/guide/components +7,Components,Use OnPush change detection,Reduces re-renders by only checking on input changes or signal updates,OnPush for all components,Default change detection strategy,changeDetection: ChangeDetectionStrategy.OnPush,changeDetection: ChangeDetectionStrategy.Default,High,https://angular.dev/guide/components/lifecycle +8,Components,Avoid direct DOM manipulation,Use renderer or ElementRef sparingly; prefer template bindings,Template bindings and Angular directives,Direct document.querySelector or innerHTML,"[class.active]=""isActive""",this.el.nativeElement.classList.add('active'),High,https://angular.dev/guide/components/host-elements +9,Routing,Lazy load feature routes,Load route chunks on demand to reduce initial bundle,loadComponent() for all feature routes,Eager-loaded routes in app config,{ path: 'admin' loadComponent: () => import('./admin/admin.component') },{ path: 'admin' component: AdminComponent },High,https://angular.dev/guide/routing/lazy-loading +10,Routing,Use route guards with functional API,Protect routes with canActivate/canMatch functional guards,Functional guards returning boolean or UrlTree,Class-based guards with CanActivate interface,canActivate: [() => inject(AuthService).isLoggedIn()],canActivate: [AuthGuard],High,https://angular.dev/guide/routing/common-router-tasks#preventing-unauthorized-access +11,Routing,Use route resolvers for data,Pre-fetch data before route activation using resolve,ResolveFn for route data,Fetching data in ngOnInit causing flash of empty state,resolve: { user: () => inject(UserService).getUser() },Fetch in ngOnInit with loading state flickering,Medium,https://angular.dev/guide/routing/common-router-tasks#resolve +12,Routing,Type route params with inject,Use inject(ActivatedRoute) with signals or toSignal,Typed route params via ActivatedRoute,Untyped route.snapshot.params string access,const id = toSignal(route.paramMap.pipe(map(p => p.get('id')))),const id = this.route.snapshot.params['id'],Medium,https://angular.dev/api/router/ActivatedRoute +13,Routing,Use nested routes for layouts,Compose shared layouts using router-outlet nesting,Nested routes with shared layout components,Duplicating layout code across routes,{ path: 'app' component: ShellComponent children: [...] },Duplicate header/sidebar in each route component,Medium,https://angular.dev/guide/routing/router-tutorial-toh#child-route-configuration +14,Routing,Configure preloading strategies,Preload lazy modules in background after initial load,PreloadAllModules or custom strategy,No preloading causing delayed navigation,provideRouter(routes withPreloading(PreloadAllModules)),provideRouter(routes),Low,https://angular.dev/api/router/PreloadAllModules +15,State,Use signals for local state,Signals provide synchronous reactive state without RxJS overhead,signal() for component-local reactive state,BehaviorSubject for simple local state,const items = signal([]); addItem(i: Item) { this.items.update(arr => [...arr i]) },items$ = new BehaviorSubject([]),High,https://angular.dev/guide/signals +16,State,Use computed() for derived state,Lazily evaluated derived values that update when dependencies change,computed() for values derived from other signals,Duplicated state or manual sync,readonly total = computed(() => this.items().reduce((s i) => s + i.price 0)),this.total = this.items.reduce(...) // called manually,High,https://angular.dev/guide/signals#computed-signals +17,State,Use effect() carefully,Effects run side effects when signals change; avoid overuse,effect() for side effects like logging or localStorage sync,effect() for deriving state (use computed instead),effect(() => localStorage.setItem('cart' JSON.stringify(this.cart()))),effect(() => { this.total.set(this.items().length) }),Medium,https://angular.dev/guide/signals#effects +18,State,Use NgRx Signal Store for complex state,NgRx Signal Store is the modern lightweight state management for Angular,@ngrx/signals SignalStore for feature state,Full NgRx reducer/action/effect boilerplate for simple state,const Store = signalStore(withState({ count: 0 }) withMethods(s => ({ increment: () => patchState(s { count: s.count() + 1 }) }))),createReducer(on(increment state => ({ ...state count: state.count + 1 }))),Medium,https://ngrx.io/guide/signals +19,State,Inject services for shared state,Services with signals share state across components without a store,Injectable service with signals for cross-component state,Prop drilling or @Input chains for shared state,@Injectable({ providedIn: 'root' }) class CartService { items = signal([]) },@Input() cartItems passed through 4 component levels,Medium,https://angular.dev/guide/di/creating-injectable-service +20,State,Avoid mixing RxJS and signals unnecessarily,Use toSignal() to bridge RxJS into signal world at the boundary,toSignal() to convert observable to signal at component edge,Subscribing in components and storing in signal manually,readonly user = toSignal(this.userService.user$),this.userService.user$.subscribe(u => this.user.set(u)),Medium,https://angular.dev/guide/rxjs-interop +21,Forms,Use typed reactive forms,FormGroup/FormControl with explicit generics for compile-time safety,FormBuilder with typed controls,Untyped FormControl or any casts,fb.group({ email: fb.control('') password: fb.control('') }),new FormGroup({ email: new FormControl(null) }),High,https://angular.dev/guide/forms/typed-forms 22,Forms,Use reactive forms over template-driven,Reactive forms scale better and are fully testable,ReactiveFormsModule for all non-trivial forms,FormsModule with ngModel for complex forms,"","",Medium,https://angular.dev/guide/forms/reactive-forms -23,Forms,Write custom validators as functions,Functional validators are composable and tree-shakeable,ValidatorFn functions for custom validation,Class-based validators implementing Validator interface,"const noSpaces: ValidatorFn = ctrl => ctrl.value?.includes(' ') ? { noSpaces: true } : null","class NoSpacesValidator implements Validator { validate(c) {} }",Medium,https://angular.dev/guide/forms/form-validation#custom-validators -24,Forms,Use updateOn for performance,Control when validation runs to avoid per-keystroke validation overhead,updateOn: 'blur' or 'submit' for expensive validators,Default updateOn: 'change' for async validators,"fb.control('' { updateOn: 'blur' validators: [Validators.email] })","fb.control('' [Validators.email]) // validates on every key",Low,https://angular.dev/api/forms/AbstractControl#updateOn -25,Forms,Use FormArray for dynamic fields,FormArray manages variable-length lists of controls,FormArray for add/remove field scenarios,Manually tracking index-based controls,"get items(): FormArray { return this.form.get('items') as FormArray }","items: [FormControl] managed outside form",Medium,https://angular.dev/guide/forms/reactive-forms#using-the-formarray-class -26,Forms,Display validation errors clearly,Use form control touched and dirty states to show errors at the right time,Show errors after field is touched,Show all errors on page load,"@if (email.invalid && email.touched) { Invalid email }","@if (email.invalid) { Invalid email }",Medium,https://angular.dev/guide/forms/form-validation +23,Forms,Write custom validators as functions,Functional validators are composable and tree-shakeable,ValidatorFn functions for custom validation,Class-based validators implementing Validator interface,const noSpaces: ValidatorFn = ctrl => ctrl.value?.includes(' ') ? { noSpaces: true } : null,class NoSpacesValidator implements Validator { validate(c) {} },Medium,https://angular.dev/guide/forms/form-validation#custom-validators +24,Forms,Use updateOn for performance,Control when validation runs to avoid per-keystroke validation overhead,updateOn: 'blur' or 'submit' for expensive validators,Default updateOn: 'change' for async validators,fb.control('' { updateOn: 'blur' validators: [Validators.email] }),fb.control('' [Validators.email]) // validates on every key,Low,https://angular.dev/api/forms/AbstractControl#updateOn +25,Forms,Use FormArray for dynamic fields,FormArray manages variable-length lists of controls,FormArray for add/remove field scenarios,Manually tracking index-based controls,get items(): FormArray { return this.form.get('items') as FormArray },items: [FormControl] managed outside form,Medium,https://angular.dev/guide/forms/reactive-forms#using-the-formarray-class +26,Forms,Display validation errors clearly,Use form control touched and dirty states to show errors at the right time,Show errors after field is touched,Show all errors on page load,@if (email.invalid && email.touched) { Invalid email },@if (email.invalid) { Invalid email },Medium,https://angular.dev/guide/forms/form-validation 27,Performance,Apply OnPush to all components,OnPush + signals eliminates most unnecessary change detection cycles,OnPush change detection everywhere,Default strategy which checks entire tree on every event,changeDetection: ChangeDetectionStrategy.OnPush,changeDetection: ChangeDetectionStrategy.Default,High,https://angular.dev/best-practices/skipping-component-subtrees -28,Performance,Use trackBy in @for blocks,Stable identity for list items prevents full DOM re-creation on change,track item.id in @for,"@for (item of items; track item.id) {
  • {{ item.name }}
  • }","@for (item of items; track $index) {
  • {{ item.name }}
  • }",High,https://angular.dev/guide/templates/control-flow#track-and-identity -29,Performance,Use @defer for below-the-fold content,Defer blocks lazy-load components when they enter the viewport,@defer with on viewport for non-critical UI,Eagerly loading all components at startup,"@defer (on viewport) { } @placeholder { }"," loaded at startup",High,https://angular.dev/guide/defer +28,Performance,Use trackBy in @for blocks,Stable identity for list items prevents full DOM re-creation on change,track item.id in @for,track $index for dynamic data,@for (item of items; track item.id) {
  • {{ item.name }}
  • },@for (item of items; track $index) {
  • {{ item.name }}
  • },High,https://angular.dev/guide/templates/control-flow#track-and-identity +29,Performance,Use @defer for below-the-fold content,Defer blocks lazy-load components when they enter the viewport,@defer with on viewport for non-critical UI,Eagerly loading all components at startup,@defer (on viewport) { } @placeholder { }, loaded at startup,High,https://angular.dev/guide/defer 30,Performance,Use NgOptimizedImage,Enforces image best practices: lazy loading LCP hints and proper sizing,NgOptimizedImage for all img tags,Plain img tags for CMS or user content,"","",High,https://angular.dev/guide/image-optimization -31,Performance,Tree-shake unused Angular features,Import only what you use from Angular packages,Import specific Angular modules needed,Import BrowserAnimationsModule when not using animations,"import { NgOptimizedImage } from '@angular/common'","import { CommonModule } from '@angular/common' // entire module",Medium,https://angular.dev/tools/cli/build -32,Performance,Avoid subscribe in components,Subscriptions leak and cause bugs; prefer async pipe or toSignal,toSignal() or async pipe instead of manual subscribe,Manual subscribe without unsubscribe in ngOnDestroy,"readonly data = toSignal(this.service.data$)","this.service.data$.subscribe(d => this.data = d)",High,https://angular.dev/guide/rxjs-interop -33,Performance,Use SSR with Angular Universal,Pre-render pages for faster LCP and better SEO,SSR or SSG for public-facing routes,Pure CSR for SEO-critical pages,"ng add @angular/ssr","// no SSR, client renders empty shell",Medium,https://angular.dev/guide/ssr -34,Performance,Minimize bundle with standalone APIs,Standalone components + provideRouter() eliminate dead NgModule code,provideRouter() and provideHttpClient() in app.config,Root AppModule with all imports,provideRouter(routes) in app.config.ts,"@NgModule({ imports: [RouterModule.forRoot(routes)] })",Medium,https://angular.dev/guide/routing/standalone -35,Testing,Use TestBed for component tests,TestBed sets up Angular DI for realistic component testing,TestBed.configureTestingModule for component tests,Instantiate components with new keyword,"TestBed.configureTestingModule({ imports: [MyComponent] })","const comp = new MyComponent()",High,https://angular.dev/guide/testing/components-basics -36,Testing,Use Angular CDK component harnesses,Harnesses provide a stable testing API that survives template refactors,MatButtonHarness and custom HarnessLoader,Direct native element queries that break on template changes,"const btn = await loader.getHarness(MatButtonHarness)","fixture.debugElement.query(By.css('button'))",Medium,https://material.angular.io/cdk/test-harnesses/overview -37,Testing,Use Spectator for less boilerplate,Spectator wraps TestBed with a cleaner API reducing test setup noise,Spectator for unit tests,Raw TestBed for every test,"const spectator = createComponentFactory(MyComponent)","TestBed.configureTestingModule({ declarations: [MyComponent] providers: [...] })",Low,https://github.com/ngneat/spectator -38,Testing,Mock services with jasmine.createSpyObj,Isolate unit tests by providing mock implementations of dependencies,SpyObj or jest.fn() mocks for services,Real HTTP calls in unit tests,"const spy = jasmine.createSpyObj('UserService' ['getUser']); spy.getUser.and.returnValue(of(user))","providers: [UserService] // real service in unit test",High,https://angular.dev/guide/testing/services -39,Testing,Write integration tests for routes,Test full route navigation including guards and resolvers,RouterTestingHarness for route integration tests,Mock all routing behavior in unit tests,"const harness = await RouterTestingHarness.create(); await harness.navigateByUrl('/home')","// manually calling route guard methods",Medium,https://angular.dev/api/router/testing/RouterTestingHarness -40,Testing,Test signal-based components,Signals update synchronously; no async flush needed in most cases,Read signal value directly in test assertions,TestBed.tick() or fakeAsync for signal reads,"component.count.set(5); expect(component.double()).toBe(10)","fakeAsync(() => { component.count.set(5); tick(); expect(component.double()).toBe(10) })",Medium,https://angular.dev/guide/testing +31,Performance,Tree-shake unused Angular features,Import only what you use from Angular packages,Import specific Angular modules needed,Import BrowserAnimationsModule when not using animations,import { NgOptimizedImage } from '@angular/common',import { CommonModule } from '@angular/common' // entire module,Medium,https://angular.dev/tools/cli/build +32,Performance,Avoid subscribe in components,Subscriptions leak and cause bugs; prefer async pipe or toSignal,toSignal() or async pipe instead of manual subscribe,Manual subscribe without unsubscribe in ngOnDestroy,readonly data = toSignal(this.service.data$),this.service.data$.subscribe(d => this.data = d),High,https://angular.dev/guide/rxjs-interop +33,Performance,Use SSR with Angular Universal,Pre-render pages for faster LCP and better SEO,SSR or SSG for public-facing routes,Pure CSR for SEO-critical pages,ng add @angular/ssr,"// no SSR, client renders empty shell",Medium,https://angular.dev/guide/ssr +34,Performance,Minimize bundle with standalone APIs,Standalone components + provideRouter() eliminate dead NgModule code,provideRouter() and provideHttpClient() in app.config,Root AppModule with all imports,provideRouter(routes) in app.config.ts,@NgModule({ imports: [RouterModule.forRoot(routes)] }),Medium,https://angular.dev/guide/routing/standalone +35,Testing,Use TestBed for component tests,TestBed sets up Angular DI for realistic component testing,TestBed.configureTestingModule for component tests,Instantiate components with new keyword,TestBed.configureTestingModule({ imports: [MyComponent] }),const comp = new MyComponent(),High,https://angular.dev/guide/testing/components-basics +36,Testing,Use Angular CDK component harnesses,Harnesses provide a stable testing API that survives template refactors,MatButtonHarness and custom HarnessLoader,Direct native element queries that break on template changes,const btn = await loader.getHarness(MatButtonHarness),fixture.debugElement.query(By.css('button')),Medium,https://material.angular.io/cdk/test-harnesses/overview +37,Testing,Use Spectator for less boilerplate,Spectator wraps TestBed with a cleaner API reducing test setup noise,Spectator for unit tests,Raw TestBed for every test,const spectator = createComponentFactory(MyComponent),TestBed.configureTestingModule({ declarations: [MyComponent] providers: [...] }),Low,https://github.com/ngneat/spectator +38,Testing,Mock services with jasmine.createSpyObj,Isolate unit tests by providing mock implementations of dependencies,SpyObj or jest.fn() mocks for services,Real HTTP calls in unit tests,const spy = jasmine.createSpyObj('UserService' ['getUser']); spy.getUser.and.returnValue(of(user)),providers: [UserService] // real service in unit test,High,https://angular.dev/guide/testing/services +39,Testing,Write integration tests for routes,Test full route navigation including guards and resolvers,RouterTestingHarness for route integration tests,Mock all routing behavior in unit tests,const harness = await RouterTestingHarness.create(); await harness.navigateByUrl('/home'),// manually calling route guard methods,Medium,https://angular.dev/api/router/testing/RouterTestingHarness +40,Testing,Test signal-based components,Signals update synchronously; no async flush needed in most cases,Read signal value directly in test assertions,TestBed.tick() or fakeAsync for signal reads,component.count.set(5); expect(component.double()).toBe(10),fakeAsync(() => { component.count.set(5); tick(); expect(component.double()).toBe(10) }),Medium,https://angular.dev/guide/testing 41,Styling,Use ViewEncapsulation.Emulated,Default emulation scopes styles to component preventing global leaks,Emulated or None for intentional global styles,ViewEncapsulation.None for component-specific styles,ViewEncapsulation.Emulated (default),ViewEncapsulation.None on feature components,Medium,https://angular.dev/guide/components/styling#style-scoping -42,Styling,Use :host selector,Style the component's host element using :host pseudo-class,":host for host element styles",Adding wrapper div just for styling,":host { display: block; padding: 1rem }","
    ...
    + .wrapper { padding: 1rem }",Medium,https://angular.dev/guide/components/styling#host-element -43,Styling,Use CSS custom properties for theming,CSS variables work across component boundaries and enable dynamic theming,CSS custom properties for colors and spacing,Hardcoded hex values in component styles,":root { --primary: #6200ee } button { background: var(--primary) }","button { background: #6200ee }",Medium,https://angular.dev/guide/components/styling +42,Styling,Use :host selector,Style the component's host element using :host pseudo-class,:host for host element styles,Adding wrapper div just for styling,:host { display: block; padding: 1rem },"
    ...
    + .wrapper { padding: 1rem }",Medium,https://angular.dev/guide/components/styling#host-element +43,Styling,Use CSS custom properties for theming,CSS variables work across component boundaries and enable dynamic theming,CSS custom properties for colors and spacing,Hardcoded hex values in component styles,:root { --primary: #6200ee } button { background: var(--primary) },button { background: #6200ee },Medium,https://angular.dev/guide/components/styling 44,Styling,Integrate Tailwind with Angular,Tailwind utilities work alongside Angular's ViewEncapsulation via global stylesheet,Add Tailwind in styles.css and use utility classes in templates,Custom CSS for layout that Tailwind already handles,"
    ","
    /* .my-custom-flex { display: flex } */",Low,https://tailwindcss.com/docs/guides/angular -45,Styling,Use Angular Material theming tokens,Material 3 uses design tokens for systematic theming,M3 token-based theming for Angular Material,Overriding Angular Material CSS with deep selectors,"@include mat.button-theme($my-theme)","::ng-deep .mat-button { background: red }",Medium,https://material.angular.io/guide/theming -46,Architecture,Use injection tokens for config,Provide configuration via InjectionToken for testability and flexibility,InjectionToken for environment-specific values,Importing environment.ts directly in services,"const API_URL = new InjectionToken('apiUrl'); provide: [{ provide: API_URL useValue: env.apiUrl }]","constructor(private env: Environment) { this.url = env.apiUrl }",Medium,https://angular.dev/guide/di/dependency-injection-providers#using-an-injectiontoken-object -47,Architecture,Use HTTP interceptors,Intercept requests for auth headers error handling and logging,Functional interceptors with withInterceptors(),Service-level header management in every request,"withInterceptors([authInterceptor errorInterceptor])","httpClient.get(url { headers: { Authorization: token } }) in every call",High,https://angular.dev/guide/http/interceptors -48,Architecture,Organize by feature not type,Feature-based folder structure scales better than type-based,Feature folders with collocated component service and routes,Flat folders: all-components/ all-services/,"src/features/checkout/checkout.component.ts checkout.service.ts checkout.routes.ts","src/components/checkout.component.ts src/services/checkout.service.ts",Medium,https://angular.dev/style-guide#folders-by-feature-structure -49,Architecture,Use environment configurations,Separate environment values for dev staging and prod via Angular build configs,angular.json fileReplacements for env configs,Hardcoded API URLs or feature flags in source,"fileReplacements: [{ replace: environment.ts with: environment.prod.ts }]","const API = 'https://api.example.com' // hardcoded in service",High,https://angular.dev/tools/cli/environments -50,Architecture,Prefer inject() over constructor DI,inject() function is composable and works in more contexts than constructor injection,inject() for dependency injection,Constructor parameters for new code,"readonly http = inject(HttpClient); readonly router = inject(Router)","constructor(private http: HttpClient private router: Router) {}",Medium,https://angular.dev/api/core/inject +45,Styling,Use Angular Material theming tokens,Material 3 uses design tokens for systematic theming,M3 token-based theming for Angular Material,Overriding Angular Material CSS with deep selectors,@include mat.button-theme($my-theme),::ng-deep .mat-button { background: red },Medium,https://material.angular.io/guide/theming +46,Architecture,Use injection tokens for config,Provide configuration via InjectionToken for testability and flexibility,InjectionToken for environment-specific values,Importing environment.ts directly in services,const API_URL = new InjectionToken('apiUrl'); provide: [{ provide: API_URL useValue: env.apiUrl }],constructor(private env: Environment) { this.url = env.apiUrl },Medium,https://angular.dev/guide/di/dependency-injection-providers#using-an-injectiontoken-object +47,Architecture,Use HTTP interceptors,Intercept requests for auth headers error handling and logging,Functional interceptors with withInterceptors(),Service-level header management in every request,withInterceptors([authInterceptor errorInterceptor]),httpClient.get(url { headers: { Authorization: token } }) in every call,High,https://angular.dev/guide/http/interceptors +48,Architecture,Organize by feature not type,Feature-based folder structure scales better than type-based,Feature folders with collocated component service and routes,Flat folders: all-components/ all-services/,src/features/checkout/checkout.component.ts checkout.service.ts checkout.routes.ts,src/components/checkout.component.ts src/services/checkout.service.ts,Medium,https://angular.dev/style-guide#folders-by-feature-structure +49,Architecture,Use environment configurations,Separate environment values for dev staging and prod via Angular build configs,angular.json fileReplacements for env configs,Hardcoded API URLs or feature flags in source,fileReplacements: [{ replace: environment.ts with: environment.prod.ts }],const API = 'https://api.example.com' // hardcoded in service,High,https://angular.dev/tools/cli/environments +50,Architecture,Prefer inject() over constructor DI,inject() function is composable and works in more contexts than constructor injection,inject() for dependency injection,Constructor parameters for new code,readonly http = inject(HttpClient); readonly router = inject(Router),constructor(private http: HttpClient private router: Router) {},Medium,https://angular.dev/api/core/inject diff --git a/ui-ux-pro-max/cli/assets/data/stacks/astro.csv b/ui-ux-pro-max/cli/assets/data/stacks/astro.csv index cacba81c..0b920deb 100644 --- a/ui-ux-pro-max/cli/assets/data/stacks/astro.csv +++ b/ui-ux-pro-max/cli/assets/data/stacks/astro.csv @@ -3,42 +3,42 @@ No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL 2,Architecture,Default to zero JS,Astro ships zero JS by default - add only when needed,Static components without client directive,Add client:load to everything,
    (static),
    (unnecessary),High,https://docs.astro.build/en/basics/astro-components/ 3,Architecture,Choose right client directive,Different directives for different hydration timing,client:visible for below-fold client:idle for non-critical,client:load for everything,,,Medium,https://docs.astro.build/en/reference/directives-reference/#client-directives 4,Architecture,Use content collections,Type-safe content management for blogs docs,Content collections for structured content,Loose markdown files without schema,const posts = await getCollection('blog'),import.meta.glob('./posts/*.md'),High,https://docs.astro.build/en/guides/content-collections/ -5,Architecture,Define collection schemas,Zod schemas for content validation,Schema with required fields and types,No schema validation,"defineCollection({ schema: z.object({...}) })",defineCollection({}),High,https://docs.astro.build/en/guides/content-collections/#defining-a-collection-schema +5,Architecture,Define collection schemas,Zod schemas for content validation,Schema with required fields and types,No schema validation,defineCollection({ schema: z.object({...}) }),defineCollection({}),High,https://docs.astro.build/en/guides/content-collections/#defining-a-collection-schema 6,Routing,Use file-based routing,Create routes by adding .astro files in pages/,pages/ directory for routes,Manual route configuration,src/pages/about.astro,Custom router setup,Medium,https://docs.astro.build/en/basics/astro-pages/ 7,Routing,Dynamic routes with brackets,Use [param] for dynamic routes,Bracket notation for params,Query strings for dynamic content,pages/blog/[slug].astro,pages/blog.astro?slug=x,Medium,https://docs.astro.build/en/guides/routing/#dynamic-routes -8,Routing,Use getStaticPaths for SSG,Generate static pages at build time,getStaticPaths for known dynamic routes,Fetch at runtime for static content,"export async function getStaticPaths() { return [...] }",No getStaticPaths with dynamic route,High,https://docs.astro.build/en/reference/api-reference/#getstaticpaths -9,Routing,Enable SSR when needed,Server-side rendering for dynamic content,output: 'server' or 'hybrid' for dynamic,SSR for purely static sites,"export const prerender = false;",SSR for static blog,Medium,https://docs.astro.build/en/guides/server-side-rendering/ +8,Routing,Use getStaticPaths for SSG,Generate static pages at build time,getStaticPaths for known dynamic routes,Fetch at runtime for static content,export async function getStaticPaths() { return [...] },No getStaticPaths with dynamic route,High,https://docs.astro.build/en/reference/api-reference/#getstaticpaths +9,Routing,Enable SSR when needed,Server-side rendering for dynamic content,output: 'server' or 'hybrid' for dynamic,SSR for purely static sites,export const prerender = false;,SSR for static blog,Medium,https://docs.astro.build/en/guides/server-side-rendering/ 10,Components,Keep .astro for static,Use .astro components for static content,Astro components for layout structure,React/Vue for static markup,,{children},High, 11,Components,Use framework components for interactivity,React Vue Svelte for complex interactivity,Framework component with client directive,Astro component with inline scripts,,