From a225b70c171b798e4af0f2a3b3b8d3f22dc0c186 Mon Sep 17 00:00:00 2001 From: "ci[bot]" Date: Thu, 25 Jun 2026 16:06:49 +0000 Subject: [PATCH] :package: deps(thirdparty): update snapshots --- .../.claude-plugin/marketplace.json | 120 +- .../.claude-plugin/plugin.json | 4 +- antigravity-awesome-skills/CATALOG.md | 8 +- antigravity-awesome-skills/CHANGELOG.md | 27 + antigravity-awesome-skills/CONTRIBUTING.md | 19 +- antigravity-awesome-skills/README.md | 29 +- antigravity-awesome-skills/SOURCE.md | 4 +- .../apps/web-app/package-lock.json | 168 +- .../apps/web-app/package.json | 12 +- .../apps/web-app/public/llms.txt | 6 +- .../apps/web-app/public/sitemap.xml | 104 +- .../apps/web-app/public/skills.json.backup | 44 + .../apps/web-app/public/social-card.svg | 2 +- .../apps/web-app/scripts/prerender-routes.js | 2 +- .../assets/star-history.png | Bin 50657 -> 50718 bytes antigravity-awesome-skills/data/aliases.json | 2 +- antigravity-awesome-skills/data/bundles.json | 4 +- antigravity-awesome-skills/data/catalog.json | 60 +- .../data/plugin-compatibility.json | 44 +- .../data/skills_index.json | 44 + .../docs/contributors/quality-bar.md | 1 + .../docs/contributors/skill-anatomy.md | 22 +- .../docs/integrations/jetski-cortex.md | 6 +- .../jetski-gemini-loader/README.md | 2 +- .../categorization-implementation.md | 38 +- .../docs/maintainers/repo-growth-seo.md | 6 +- .../docs/maintainers/skills-update-guide.md | 2 +- .../maintainers/smart-auto-categorization.md | 49 +- .../docs/users/bundles.md | 2 +- .../docs/users/claude-code-skills.md | 2 +- antigravity-awesome-skills/docs/users/faq.md | 10 +- .../docs/users/gemini-cli-skills.md | 2 +- .../docs/users/getting-started.md | 2 +- .../docs/users/kiro-integration.md | 2 +- .../docs/users/local-config.md | 22 +- .../docs/users/specialized-plugin-roadmap.md | 6 +- .../docs/users/usage.md | 8 +- .../docs/users/visual-guide.md | 8 +- .../docs/vietnamese/BUNDLES.vi.md | 2 +- .../docs/vietnamese/CONTRIBUTING.vi.md | 24 +- .../docs/vietnamese/FAQ.vi.md | 50 +- .../docs/vietnamese/GETTING_STARTED.vi.md | 36 +- .../docs/vietnamese/QUALITY_BAR.vi.md | 13 +- .../docs/vietnamese/README.vi.md | 57 +- .../docs/vietnamese/SKILLS_README.vi.md | 6 +- .../docs/vietnamese/SKILL_ANATOMY.vi.md | 38 +- .../docs/vietnamese/TRANSLATION_PLAN.vi.md | 2 +- .../docs/vietnamese/VISUAL_GUIDE.vi.md | 35 +- .../docs_zh-CN/README.md | 37 +- .../docs_zh-CN/contributors/quality-bar.md | 1 + .../docs_zh-CN/contributors/skill-template.md | 31 +- .../docs_zh-CN/integrations/jetski-cortex.md | 16 +- .../jetski-gemini-loader/README.md | 8 +- .../docs_zh-CN/maintainers/audit.md | 4 +- .../categorization-implementation.md | 38 +- .../docs_zh-CN/maintainers/ci-drift-fix.md | 46 +- .../docs_zh-CN/maintainers/release-process.md | 457 +- .../docs_zh-CN/maintainers/repo-growth-seo.md | 6 +- .../maintainers/skills-update-guide.md | 2 +- .../maintainers/smart-auto-categorization.md | 49 +- .../docs_zh-CN/skill-anatomy.md | 18 +- .../docs_zh-CN/users/bundles.md | 4 +- .../docs_zh-CN/users/claude-code-skills.md | 2 +- .../docs_zh-CN/users/faq.md | 12 +- .../docs_zh-CN/users/gemini-cli-skills.md | 2 +- .../docs_zh-CN/users/getting-started.md | 17 +- .../docs_zh-CN/users/kiro-integration.md | 2 +- .../docs_zh-CN/users/local-config.md | 22 +- .../docs_zh-CN/users/usage.md | 18 +- .../docs_zh-CN/users/visual-guide.md | 4 +- .../users/windows-truncation-recovery.md | 2 +- antigravity-awesome-skills/package-lock.json | 4 +- antigravity-awesome-skills/package.json | 4 +- .../.claude-plugin/plugin.json | 4 +- .../skills/emil-design-eng/SKILL.md | 702 +++ .../skills/review-animations/SKILL.md | 139 + .../skills/review-animations/STANDARDS.md | 188 + .../.codex-plugin/plugin.json | 4 +- .../skills/emil-design-eng/SKILL.md | 702 +++ .../skills/review-animations/SKILL.md | 139 + .../skills/review-animations/STANDARDS.md | 188 + .../.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 +- .../.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 +- .../.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 +- .../maintainers/smart-auto-categorization.md | 2 +- .../skills/emil-design-eng/SKILL.md | 702 +++ .../skills/review-animations/SKILL.md | 139 + .../skills/review-animations/STANDARDS.md | 188 + antigravity-awesome-skills/skills_index.json | 44 + .../tools/scripts/build-catalog.js | 23 +- antigravity-awesome-skills/walkthrough.md | 4 +- ui-ux-pro-max/.claude-plugin/marketplace.json | 4 +- ui-ux-pro-max/.claude-plugin/plugin.json | 4 +- .../.claude/skills/banner-design/SKILL.md | 2 +- ui-ux-pro-max/.claude/skills/brand/SKILL.md | 2 +- .../.claude/skills/design-system/SKILL.md | 2 +- ui-ux-pro-max/.claude/skills/design/SKILL.md | 2 +- ui-ux-pro-max/.claude/skills/slides/SKILL.md | 2 +- .../.claude/skills/ui-styling/SKILL.md | 2 +- .../.github/workflows/check-asset-sync.yml | 29 + ui-ux-pro-max/.github/workflows/release.yml | 2 + ui-ux-pro-max/.releaserc.json | 6 + ui-ux-pro-max/CLAUDE.md | 6 +- ui-ux-pro-max/README.md | 18 +- ui-ux-pro-max/SOURCE.md | 4 +- ui-ux-pro-max/cli/README.md | 44 +- .../cli/assets/data/app-interface.csv | 60 +- ui-ux-pro-max/cli/assets/data/charts.csv | 52 +- ui-ux-pro-max/cli/assets/data/colors.csv | 324 +- .../cli/assets/data/google-fonts.csv | 3848 ++++++++--------- ui-ux-pro-max/cli/assets/data/icons.csv | 209 +- ui-ux-pro-max/cli/assets/data/landing.csv | 66 +- ui-ux-pro-max/cli/assets/data/products.csv | 324 +- .../cli/assets/data/stacks/flutter.csv | 106 +- .../cli/assets/data/stacks/html-tailwind.csv | 112 +- .../cli/assets/data/stacks/nextjs.csv | 106 +- .../cli/assets/data/stacks/react-native.csv | 104 +- .../cli/assets/data/stacks/react.csv | 108 +- .../cli/assets/data/stacks/svelte.csv | 108 +- .../cli/assets/data/stacks/swiftui.csv | 102 +- ui-ux-pro-max/cli/assets/data/stacks/vue.csv | 100 +- ui-ux-pro-max/cli/assets/data/styles.csv | 136 +- ui-ux-pro-max/cli/assets/data/typography.csv | 146 +- .../cli/assets/data/ui-reasoning.csv | 324 +- .../cli/assets/data/ux-guidelines.csv | 198 +- ui-ux-pro-max/cli/assets/scripts/core.py | 15 +- .../cli/assets/scripts/design_system.py | 13 +- ui-ux-pro-max/cli/assets/scripts/search.py | 228 +- .../cli/assets/skills/banner-design/SKILL.md | 196 + .../references/banner-sizes-and-styles.md | 118 + .../cli/assets/skills/brand/SKILL.md | 97 + .../brand/references/approval-checklist.md | 169 + .../brand/references/asset-organization.md | 157 + .../references/brand-guideline-template.md | 140 + .../references/color-palette-management.md | 186 + .../brand/references/consistency-checklist.md | 94 + .../brand/references/logo-usage-rules.md | 185 + .../brand/references/messaging-framework.md | 85 + .../references/typography-specifications.md | 214 + .../assets/skills/brand/references/update.md | 118 + .../brand/references/visual-identity.md | 96 + .../brand/references/voice-framework.md | 88 + .../skills/brand/scripts/extract-colors.cjs | 341 ++ .../brand/scripts/inject-brand-context.cjs | 349 ++ .../brand/scripts/sync-brand-to-tokens.cjs | 266 ++ .../skills/brand/scripts/validate-asset.cjs | 387 ++ .../templates/brand-guidelines-starter.md | 275 ++ .../cli/assets/skills/design-system/SKILL.md | 244 ++ .../design-system/data/slide-backgrounds.csv | 11 + .../design-system/data/slide-charts.csv | 26 + .../design-system/data/slide-color-logic.csv | 14 + .../skills/design-system/data/slide-copy.csv | 26 + .../design-system/data/slide-layout-logic.csv | 16 + .../design-system/data/slide-layouts.csv | 26 + .../design-system/data/slide-strategies.csv | 16 + .../design-system/data/slide-typography.csv | 15 + .../references/component-specs.md | 236 + .../references/component-tokens.md | 214 + .../references/primitive-tokens.md | 203 + .../references/semantic-tokens.md | 215 + .../references/states-and-variants.md | 241 ++ .../references/tailwind-integration.md | 251 ++ .../references/token-architecture.md | 224 + .../design-system/scripts/embed-tokens.cjs | 99 + .../design-system/scripts/fetch-background.py | 317 ++ .../design-system/scripts/generate-slide.py | 770 ++++ .../design-system/scripts/generate-tokens.cjs | 205 + .../scripts/html-token-validator.py | 327 ++ .../design-system/scripts/search-slides.py | 218 + .../scripts/slide-token-validator.py | 35 + .../scripts/slide_search_core.py | 453 ++ .../design-system/scripts/validate-tokens.cjs | 251 ++ .../templates/design-tokens-starter.json | 143 + .../cli/assets/skills/design/SKILL.md | 313 ++ .../skills/design/data/cip/deliverables.csv | 51 + .../skills/design/data/cip/industries.csv | 21 + .../design/data/cip/mockup-contexts.csv | 21 + .../assets/skills/design/data/cip/styles.csv | 21 + .../assets/skills/design/data/icon/styles.csv | 16 + .../assets/skills/design/data/logo/colors.csv | 56 + .../skills/design/data/logo/industries.csv | 56 + .../assets/skills/design/data/logo/styles.csv | 56 + .../references/banner-sizes-and-styles.md | 118 + .../references/cip-deliverable-guide.md | 95 + .../skills/design/references/cip-design.md | 121 + .../references/cip-prompt-engineering.md | 84 + .../design/references/cip-style-guide.md | 68 + .../design/references/design-routing.md | 207 + .../skills/design/references/icon-design.md | 122 + .../references/logo-color-psychology.md | 101 + .../skills/design/references/logo-design.md | 92 + .../references/logo-prompt-engineering.md | 158 + .../design/references/logo-style-guide.md | 109 + .../references/slides-copywriting-formulas.md | 84 + .../skills/design/references/slides-create.md | 4 + .../design/references/slides-html-template.md | 295 ++ .../references/slides-layout-patterns.md | 137 + .../design/references/slides-strategies.md | 94 + .../assets/skills/design/references/slides.md | 42 + .../design/references/social-photos-design.md | 329 ++ .../assets/skills/design/scripts/cip/core.py | 215 + .../skills/design/scripts/cip/generate.py | 484 +++ .../skills/design/scripts/cip/render-html.py | 424 ++ .../skills/design/scripts/cip/search.py | 127 + .../skills/design/scripts/icon/generate.py | 487 +++ .../assets/skills/design/scripts/logo/core.py | 175 + .../skills/design/scripts/logo/generate.py | 362 ++ .../skills/design/scripts/logo/search.py | 114 + .../cli/assets/skills/slides/SKILL.md | 40 + .../slides/references/copywriting-formulas.md | 84 + .../assets/skills/slides/references/create.md | 4 + .../skills/slides/references/html-template.md | 295 ++ .../slides/references/layout-patterns.md | 137 + .../slides/references/slide-strategies.md | 94 + .../cli/assets/skills/ui-styling/LICENSE.txt | 202 + .../cli/assets/skills/ui-styling/SKILL.md | 324 ++ .../references/canvas-design-system.md | 320 ++ .../references/shadcn-accessibility.md | 471 ++ .../references/shadcn-components.md | 424 ++ .../ui-styling/references/shadcn-theming.md | 373 ++ .../references/tailwind-customization.md | 483 +++ .../references/tailwind-responsive.md | 382 ++ .../references/tailwind-utilities.md | 455 ++ .../ui-styling/scripts/requirements.txt | 17 + .../skills/ui-styling/scripts/shadcn_add.py | 308 ++ .../ui-styling/scripts/tailwind_config_gen.py | 473 ++ .../ui-styling/scripts/tests/coverage-ui.json | 1 + .../ui-styling/scripts/tests/requirements.txt | 3 + .../scripts/tests/test_shadcn_add.py | 266 ++ .../scripts/tests/test_tailwind_config_gen.py | 336 ++ .../assets/templates/base/skill-content.md | 9 +- .../cli/assets/templates/platforms/agent.json | 4 +- .../assets/templates/platforms/augment.json | 2 +- .../assets/templates/platforms/claude.json | 4 +- .../assets/templates/platforms/codebuddy.json | 2 +- .../cli/assets/templates/platforms/codex.json | 2 +- .../assets/templates/platforms/continue.json | 2 +- .../assets/templates/platforms/copilot.json | 4 +- .../assets/templates/platforms/cursor.json | 4 +- .../cli/assets/templates/platforms/droid.json | 4 +- .../assets/templates/platforms/gemini.json | 2 +- .../assets/templates/platforms/kilocode.json | 4 +- .../cli/assets/templates/platforms/kiro.json | 4 +- .../assets/templates/platforms/opencode.json | 2 +- .../cli/assets/templates/platforms/qoder.json | 2 +- .../assets/templates/platforms/roocode.json | 4 +- .../cli/assets/templates/platforms/trae.json | 2 +- .../cli/assets/templates/platforms/warp.json | 2 +- .../assets/templates/platforms/windsurf.json | 4 +- ui-ux-pro-max/cli/package.json | 7 +- ui-ux-pro-max/cli/scripts/sync-assets.mjs | 210 + ui-ux-pro-max/cli/src/commands/init.ts | 13 +- ui-ux-pro-max/cli/src/commands/uninstall.ts | 47 +- ui-ux-pro-max/cli/src/commands/update.ts | 61 +- ui-ux-pro-max/cli/src/commands/versions.ts | 10 +- ui-ux-pro-max/cli/src/index.ts | 7 +- ui-ux-pro-max/cli/src/types/index.ts | 3 +- ui-ux-pro-max/cli/src/utils/detect.ts | 6 +- ui-ux-pro-max/cli/src/utils/github.ts | 32 +- ui-ux-pro-max/cli/src/utils/template.ts | 59 +- ...三个 data-scripts-templates 的区别.md | 6 +- ui-ux-pro-max/skill.json | 2 +- .../ui-ux-pro-max/scripts/design_system.py | 13 +- 376 files changed, 27320 insertions(+), 4607 deletions(-) create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/emil-design-eng/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/STANDARDS.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/emil-design-eng/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/SKILL.md create mode 100644 antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/STANDARDS.md create mode 100644 antigravity-awesome-skills/skills/emil-design-eng/SKILL.md create mode 100644 antigravity-awesome-skills/skills/review-animations/SKILL.md create mode 100644 antigravity-awesome-skills/skills/review-animations/STANDARDS.md create mode 100644 ui-ux-pro-max/.github/workflows/check-asset-sync.yml create mode 100644 ui-ux-pro-max/cli/assets/skills/banner-design/SKILL.md create mode 100644 ui-ux-pro-max/cli/assets/skills/banner-design/references/banner-sizes-and-styles.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/SKILL.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/approval-checklist.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/asset-organization.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/brand-guideline-template.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/color-palette-management.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/consistency-checklist.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/logo-usage-rules.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/messaging-framework.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/typography-specifications.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/update.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/visual-identity.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/references/voice-framework.md create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/scripts/extract-colors.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/scripts/inject-brand-context.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/scripts/sync-brand-to-tokens.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/scripts/validate-asset.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/brand/templates/brand-guidelines-starter.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/SKILL.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-backgrounds.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-charts.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-color-logic.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-copy.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-layout-logic.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-layouts.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-strategies.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/data/slide-typography.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/component-specs.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/component-tokens.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/primitive-tokens.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/semantic-tokens.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/states-and-variants.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/tailwind-integration.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/references/token-architecture.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/embed-tokens.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/fetch-background.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/generate-slide.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/generate-tokens.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/html-token-validator.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/search-slides.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/slide-token-validator.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/slide_search_core.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/scripts/validate-tokens.cjs create mode 100644 ui-ux-pro-max/cli/assets/skills/design-system/templates/design-tokens-starter.json create mode 100644 ui-ux-pro-max/cli/assets/skills/design/SKILL.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/cip/deliverables.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/cip/industries.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/cip/mockup-contexts.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/cip/styles.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/icon/styles.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/logo/colors.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/logo/industries.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/data/logo/styles.csv create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/banner-sizes-and-styles.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/cip-deliverable-guide.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/cip-design.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/cip-prompt-engineering.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/cip-style-guide.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/design-routing.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/icon-design.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/logo-color-psychology.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/logo-design.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/logo-prompt-engineering.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/logo-style-guide.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/slides-copywriting-formulas.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/slides-create.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/slides-html-template.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/slides-layout-patterns.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/slides-strategies.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/slides.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/references/social-photos-design.md create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/cip/core.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/cip/generate.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/cip/render-html.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/cip/search.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/icon/generate.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/logo/core.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/logo/generate.py create mode 100644 ui-ux-pro-max/cli/assets/skills/design/scripts/logo/search.py create mode 100644 ui-ux-pro-max/cli/assets/skills/slides/SKILL.md create mode 100644 ui-ux-pro-max/cli/assets/skills/slides/references/copywriting-formulas.md create mode 100644 ui-ux-pro-max/cli/assets/skills/slides/references/create.md create mode 100644 ui-ux-pro-max/cli/assets/skills/slides/references/html-template.md create mode 100644 ui-ux-pro-max/cli/assets/skills/slides/references/layout-patterns.md create mode 100644 ui-ux-pro-max/cli/assets/skills/slides/references/slide-strategies.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/LICENSE.txt create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/SKILL.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/canvas-design-system.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/shadcn-accessibility.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/shadcn-components.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/shadcn-theming.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/tailwind-customization.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/tailwind-responsive.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/references/tailwind-utilities.md create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/requirements.txt create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/shadcn_add.py create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/tailwind_config_gen.py create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/tests/coverage-ui.json create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/tests/requirements.txt create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/tests/test_shadcn_add.py create mode 100644 ui-ux-pro-max/cli/assets/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py create mode 100644 ui-ux-pro-max/cli/scripts/sync-assets.mjs diff --git a/antigravity-awesome-skills/.claude-plugin/marketplace.json b/antigravity-awesome-skills/.claude-plugin/marketplace.json index 6403ac19..b2aaf9ce 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.1.1" + "version": "13.2.0" }, "plugins": [ { "name": "antigravity-awesome-skills", - "version": "13.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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.1.1", + "version": "13.2.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 074769e3..bbbfc6a6 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.1.1", - "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,640 supported skills.", + "version": "13.2.0", + "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,642 supported skills.", "author": { "name": "sickn33 and contributors", "url": "https://github.com/sickn33/antigravity-awesome-skills" diff --git a/antigravity-awesome-skills/CATALOG.md b/antigravity-awesome-skills/CATALOG.md index 2babc5a3..d1e3bc77 100644 --- a/antigravity-awesome-skills/CATALOG.md +++ b/antigravity-awesome-skills/CATALOG.md @@ -1,8 +1,8 @@ # Skill Catalog -Generated at: 2026-02-08T00:00:00.000Z +Generated at: 2026-06-25T06:37:39.000Z -Total skills: 1682 +Total skills: 1684 ## architecture (104) @@ -521,7 +521,7 @@ Total skills: 1682 | `yes-md` | 6-layer AI governance: safety gates, evidence-based debugging, anti-slack detection, and machine-enforced hooks. Makes AI safe, thorough, and honest. | yes, md | yes, md, layer, ai, governance, safety, gates, evidence, debugging, anti, slack, detection | | `youtube-automation` | Automate YouTube tasks via Rube MCP (Composio): upload videos, manage playlists, search content, get analytics, and handle comments. Always search tools firs... | youtube | youtube, automation, automate, tasks, via, rube, mcp, composio, upload, videos, playlists, search | -## development (234) +## development (236) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -609,6 +609,7 @@ Total skills: 1682 | `dotnet-architect` | Expert .NET backend architect specializing in C#, ASP.NET Core, Entity Framework, Dapper, and enterprise application patterns. | dotnet | dotnet, architect, net, backend, specializing, asp, core, entity, framework, dapper, enterprise, application | | `dotnet-backend-patterns` | Master C#/.NET patterns for building production-grade APIs, MCP servers, and enterprise backends with modern best practices (2024/2025). | dotnet, backend | dotnet, backend, net, building, grade, apis, mcp, servers, enterprise, backends, 2024, 2025 | | `emblemai-crypto-wallet` | Crypto wallet management across 7 blockchains via EmblemAI Agent Hustle API. Balance checks, token swaps, portfolio analysis, and transaction execution for S... | emblemai, crypto, wallet | emblemai, crypto, wallet, blockchains, via, agent, hustle, api, balance, checks, token, swaps | +| `emil-design-eng` | Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance. | frontend, design, ui, animation, motion | frontend, design, ui, animation, motion, emil, eng, designing, reviewing, polished, product, kowalski | | `exa-search` | Semantic search, similar content discovery, and structured research using Exa API. Use when you need semantic/embeddings-based search, finding similar conten... | exa, search | exa, search, semantic, similar, content, discovery, structured, research, api, embeddings, finding, searching | | `expo-api-routes` | Guidelines for creating API routes in Expo Router with EAS Hosting | expo, api, routes | expo, api, routes, guidelines, creating, router, eas, hosting | | `expo-tailwind-setup` | Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling | expo, tailwind, setup | expo, tailwind, setup, set, up, css, v4, react, native, nativewind, v5, universal | @@ -706,6 +707,7 @@ Total skills: 1682 | `redesign-existing-projects` | Use when upgrading existing websites or apps by auditing generic UI patterns and applying premium design fixes without rewrites. | frontend, redesign, design-audit, ui | frontend, redesign, design-audit, ui, existing, upgrading, websites, apps, auditing, generic, applying, premium | | `reference-builder` | Creates exhaustive technical references and API documentation. Generates comprehensive parameter listings, configuration guides, and searchable reference mat... | reference, builder | reference, builder, creates, exhaustive, technical, references, api, documentation, generates, parameter, listings, configuration | | `remotion-best-practices` | Best practices for Remotion - Video creation in React | remotion, video, react, animation, composition | remotion, video, react, animation, composition, creation | +| `review-animations` | Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar. | frontend, animation, motion, review, accessibility | frontend, animation, motion, review, accessibility, animations, reviewing, code, against, strict, craft, performance | | `ruby-pro` | Write idiomatic Ruby code with metaprogramming, Rails patterns, and performance optimization. Specializes in Ruby on Rails, gem development, and testing fram... | ruby | ruby, pro, write, idiomatic, code, metaprogramming, rails, performance, optimization, specializes, gem, development | | `rust-async-patterns` | Master Rust async programming with Tokio, async traits, error handling, and concurrent patterns. Use when building async Rust applications, implementing conc... | rust, async | rust, async, programming, tokio, traits, error, handling, concurrent, building, applications, implementing, debugging | | `rust-pro` | Master Rust 1.75+ with modern async patterns, advanced type system features, and production-ready systems programming. | rust | rust, pro, 75, async, type, features, programming | diff --git a/antigravity-awesome-skills/CHANGELOG.md b/antigravity-awesome-skills/CHANGELOG.md index 8538440d..897c8f4d 100644 --- a/antigravity-awesome-skills/CHANGELOG.md +++ b/antigravity-awesome-skills/CHANGELOG.md @@ -9,14 +9,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [13.2.0] - 2026-06-25 - "Design Engineering and Web Dependency Refresh" + +> Community skill intake and maintainer dependency release for the 1,684+ 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-1684-skills](README.md#browse-1684-skills) +- Hosted catalog: https://sickn33.github.io/antigravity-awesome-skills/ + +This release packages the June 24-25 maintainer batch: Snyk dependency PRs, two Emil Kowalski design-engineering skills, generated registry sync, plugin mirror updates, and public SEO metadata refresh. + ## Added - Added **infinity**, a community defensive input-boundary skill for detecting, classifying, filtering, and verifying untrusted data entry points (PR #733). +- Added **emil-design-eng** from [emilkowalski/skills](https://github.com/emilkowalski/skills), a design engineering skill for UI polish, animation decisions, component craft, and interaction detail. +- Added **review-animations** from [emilkowalski/skills](https://github.com/emilkowalski/skills), a strict motion-review skill with a dedicated `STANDARDS.md` reference for easing, duration, physicality, performance, gestures, and accessibility. ## Changed - Updated runtime and example dependencies from the Snyk maintenance batch: `yaml`, Loki example `better-sqlite3`, `cors`, and `express-rate-limit`. +- Merged the web-app Snyk dependency batch: `@supabase/supabase-js` 2.107.0 (PR #738), `framer-motion` 12.40.0 (PR #739), `tailwind-merge` 3.6.0 (PR #740), `react-virtuoso` 4.18.7 (PR #741), and React 19.2.7 with React DOM aligned to 19.2.7 (PR #742 plus maintainer fix). - Reverted **surgical-fix** after maintainer review found it overlapped existing debugging protocol skills; the useful ideas should land as focused improvements to existing skills instead of a duplicate standalone skill (PR #732). +- Refreshed generated registry artifacts, plugin mirrors, catalog data, contributor/source metadata, sitemap, `llms.txt`, and public social-card metadata for the 1,684+ skill catalog. + +## Validation + +- Verified repository validation, warning budget, source credits, root script tests, documentation security checks, web app tests, web app production build, SEO asset verification, and production dependency audits. + +## Credits + +- **[@Prince-1652](https://github.com/Prince-1652)** for PR #733 (`infinity`) and the reverted PR #732 follow-up review context. +- **[emilkowalski/skills](https://github.com/emilkowalski/skills)** and Emil Kowalski for the imported design-engineering and animation-review skills. +- **Snyk** and maintainer automation for PRs #738, #739, #740, #741, and #742. ## [13.1.1] - 2026-06-23 - "Security Scan Hardening" diff --git a/antigravity-awesome-skills/CONTRIBUTING.md b/antigravity-awesome-skills/CONTRIBUTING.md index 8dd3bebe..c15557eb 100644 --- a/antigravity-awesome-skills/CONTRIBUTING.md +++ b/antigravity-awesome-skills/CONTRIBUTING.md @@ -146,15 +146,21 @@ touch SKILL.md Every skill should start from the canonical template in [`docs/contributors/skill-template.md`](docs/contributors/skill-template.md). -Minimum frontmatter: +Contributor baseline frontmatter: ```markdown --- name: my-awesome-skill description: "Brief one-line description of what this skill does" +category: development risk: safe source: community +source_repo: owner/repo +source_type: community date_added: "2026-03-06" +author: your-name-or-handle +tags: [tag-one, tag-two] +tools: [claude, cursor, gemini] --- # Skill Title @@ -163,6 +169,8 @@ date_added: "2026-03-06" Explain what this skill does and when to use it. +If the skill adapts material from an external GitHub repository, declare both `source_repo: owner/repo` and `source_type: official` or `source_type: community`. For original repository content, use `source: self` and `source_type: self`. + ## When to Use This Skill - Use when [scenario 1] @@ -348,9 +356,15 @@ The canonical template now lives at [`docs/contributors/skill-template.md`](docs --- name: your-skill-name description: "One sentence describing what this skill does and when to use it" +category: development risk: safe source: community +source_repo: owner/repo +source_type: community date_added: "2026-03-06" +author: your-name-or-handle +tags: [tag-one, tag-two] +tools: [claude, cursor, gemini] --- # Your Skill Name @@ -458,7 +472,8 @@ date_added: "2026-03-06" Before submitting your contribution: - [ ] My skill has a clear, descriptive name -- [ ] The `SKILL.md` has proper frontmatter (`name`, `description`, `risk`, `source`, `date_added`) +- [ ] The `SKILL.md` starts from the canonical template and includes proper frontmatter (`name`, `description`, `category`, `risk`, `source`, `date_added`) +- [ ] External GitHub-derived skills declare `source_repo` and `source_type`; original repository content uses `source: self` and `source_type: self` - [ ] I've included examples - [ ] I've tested the skill with an AI assistant - [ ] I've run `npm run validate` diff --git a/antigravity-awesome-skills/README.md b/antigravity-awesome-skills/README.md index 8c90a222..449bf5f8 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,682+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 1,684+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **Installable GitHub library of 1,682+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.** +> **Installable GitHub library of 1,684+ agentic skills for Claude Code, Cursor, Codex CLI, 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, 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,9 +11,9 @@ 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,682+ Skills](#browse-1682-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,684+ Skills](#browse-1684-skills) · [Bundles & workflows](#bundles--workflows) · [Support the project](#support-the-project) -[![GitHub stars](https://img.shields.io/badge/⭐%2041%2C000%2B%20Stars-gold?style=for-the-badge)](https://github.com/sickn33/antigravity-awesome-skills/stargazers) +[![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_) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Claude Code](https://img.shields.io/badge/Claude%20Code-Anthropic-purple)](https://claude.ai) @@ -27,13 +27,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 c19fd498..02dfd1e4 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: bdce4fc3ce8899e7c1133204e5825955a7f940da +- Ref: 4792340672bd57c1ef82f8840b5e5a8348d77dbb - Remove-Paths: -- Snapshot: 2026-06-24 +- Snapshot: 2026-06-25 - Sync-Mode: copy_skill_dirs - Notes: vendored into playbook branch thirdparty/skill diff --git a/antigravity-awesome-skills/apps/web-app/package-lock.json b/antigravity-awesome-skills/apps/web-app/package-lock.json index 9b781000..7664e4d6 100644 --- a/antigravity-awesome-skills/apps/web-app/package-lock.json +++ b/antigravity-awesome-skills/apps/web-app/package-lock.json @@ -11,20 +11,20 @@ "@fontsource/jetbrains-mono": "^5.2.8", "@fontsource/outfit": "^5.2.8", "@phosphor-icons/react": "^2.1.10", - "@supabase/supabase-js": "^2.98.0", + "@supabase/supabase-js": "^2.107.0", "clsx": "^2.1.1", "express-rate-limit": "^8.5.2", - "framer-motion": "^12.34.2", + "framer-motion": "^12.40.0", "github-markdown-css": "^5.9.0", "highlight.js": "^11.11.1", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", "react-markdown": "^10.1.0", "react-router-dom": "^7.17.0", - "react-virtuoso": "^4.18.3", + "react-virtuoso": "^4.18.7", "rehype-highlight": "^7.0.2", "remark-gfm": "^4.0.1", - "tailwind-merge": "^3.5.0" + "tailwind-merge": "^3.6.0" }, "devDependencies": { "@eslint/js": "^9.39.1", @@ -950,9 +950,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -970,9 +967,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -990,9 +984,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1010,9 +1001,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1030,9 +1018,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1050,9 +1035,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1147,9 +1129,9 @@ "license": "MIT" }, "node_modules/@supabase/auth-js": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.98.0.tgz", - "integrity": "sha512-GBH361T0peHU91AQNzOlIrjUZw9TZbB9YDRiyFgk/3Kvr3/Z1NWUZ2athWTfHhwNNi8IrW00foyFxQD9IO/Trg==", + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.107.0.tgz", + "integrity": "sha512-XA7x+WIeIvuC3GTZ2ey67QcBbGw4n+o5B7M+dMm9KT1lL3wX1B52DfEWW00WuPt/LnniJLLIn1WIm9YPtuxzKQ==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -1159,9 +1141,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.98.0.tgz", - "integrity": "sha512-N/xEyiNU5Org+d+PNCpv+TWniAXRzxIURxDYsS/m2I/sfAB/HcM9aM2Dmf5edj5oWb9GxID1OBaZ8NMmPXL+Lg==", + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.107.0.tgz", + "integrity": "sha512-iMtRUmEj1KOgQd/a3MR4hnBlPnZc62DW8+z8aPpnzbxWkexEZUVL2fSgvvp15gqFg1V55e2yMGqgK+yhSQxp5w==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -1170,10 +1152,16 @@ "node": ">=20.0.0" } }, + "node_modules/@supabase/phoenix": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.4.tgz", + "integrity": "sha512-Gt0pqoXuIqX/8dvG0OKp/wMCobXNH3klNbUPBNyOfN0YA1IswrM3HyWFMOPk1Jy+BRaIyDPcFx4jLBwHNmlyfQ==", + "license": "MIT" + }, "node_modules/@supabase/postgrest-js": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.98.0.tgz", - "integrity": "sha512-v6e9WeZuJijzUut8HyXu6gMqWFepIbaeaMIm1uKzei4yLg9bC9OtEW9O14LE/9ezqNbSAnSLO5GtOLFdm7Bpkg==", + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.107.0.tgz", + "integrity": "sha512-7ARs47/tyIjX7T0Ive20d4NY8zQYXsP5/P07jJWxffSIM2gpnSnGRnL/Fe15GPbdjsW2sTYeckHcyaoKbM6yWQ==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -1183,24 +1171,22 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.98.0.tgz", - "integrity": "sha512-rOWt28uGyFipWOSd+n0WVMr9kUXiWaa7J4hvyLCIHjRFqWm1z9CaaKAoYyfYMC1Exn3WT8WePCgiVhlAtWC2yw==", + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.107.0.tgz", + "integrity": "sha512-cF2KYdR3JIn9YlWGeluY9S0G+otqTdL6hB8GzpatlEIY6fZudCcyFo6Dc3+X9tjeb+x9XcIyNAk9qhNAknjH1A==", "license": "MIT", "dependencies": { - "@types/phoenix": "^1.6.6", - "@types/ws": "^8.18.1", - "tslib": "2.8.1", - "ws": "^8.18.2" + "@supabase/phoenix": "^0.4.2", + "tslib": "2.8.1" }, "engines": { "node": ">=20.0.0" } }, "node_modules/@supabase/storage-js": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.98.0.tgz", - "integrity": "sha512-tzr2mG+v7ILSAZSfZMSL9OPyIH4z1ikgQ8EcQTKfMRz4EwmlFt3UnJaGzSOxyvF5b+fc9So7qdSUWTqGgeLokQ==", + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.107.0.tgz", + "integrity": "sha512-/X8OOVwKBn8aVKuHAGOz2yLA0d2OauqhVuy4mNtN+o7wttHOgx1/j+pqOzlsjmhOHrYykF6AJNZhs3gKZzcMUw==", "license": "MIT", "dependencies": { "iceberg-js": "^0.8.1", @@ -1211,16 +1197,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.98.0.tgz", - "integrity": "sha512-Ohc97CtInLwZyiSASz7tT9/Abm/vqnIbO9REp+PivVUII8UZsuI3bngRQnYgJdFoOIwvaEII1fX1qy8x0CyNiw==", + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.107.0.tgz", + "integrity": "sha512-ChKzdlWVweMUUhr0U79JhMmgm1haS/C5JquaiCDr70JaGARRtjjoY9rkIheXWybXxTSNzRiQs3Sk8IAg1HS3ZA==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.98.0", - "@supabase/functions-js": "2.98.0", - "@supabase/postgrest-js": "2.98.0", - "@supabase/realtime-js": "2.98.0", - "@supabase/storage-js": "2.98.0" + "@supabase/auth-js": "2.107.0", + "@supabase/functions-js": "2.107.0", + "@supabase/postgrest-js": "2.107.0", + "@supabase/realtime-js": "2.107.0", + "@supabase/storage-js": "2.107.0" }, "engines": { "node": ">=20.0.0" @@ -1733,17 +1719,12 @@ "version": "20.19.35", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz", "integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "node_modules/@types/phoenix": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", - "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", - "license": "MIT" - }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", @@ -1769,15 +1750,6 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.46.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", @@ -3686,13 +3658,13 @@ } }, "node_modules/framer-motion": { - "version": "12.34.2", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.2.tgz", - "integrity": "sha512-CcnYTzbRybm1/OE8QLXfXI8gR1cx5T4dF3D2kn5IyqsGNeLAKl2iFHb2BzFyXBGqESntDt6rPYl4Jhrb7tdB8g==", + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", + "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", "license": "MIT", "dependencies": { - "motion-dom": "^12.34.2", - "motion-utils": "^12.29.2", + "motion-dom": "^12.40.0", + "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -5835,18 +5807,18 @@ } }, "node_modules/motion-dom": { - "version": "12.34.2", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.2.tgz", - "integrity": "sha512-n7gknp7gHcW7DUcmet0JVPLVHmE3j9uWwDp5VbE3IkCNnW5qdu0mOhjNYzXMkrQjrgr+h6Db3EDM2QBhW2qNxQ==", + "version": "12.41.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.41.0.tgz", + "integrity": "sha512-Lk3J39fOGg6xNr1KRZsN6usDyBf8aP7MEbUPez1VCughHt79OrP7VGqNrPyFL0riaT7WS8t9DRw1M3BHtM/xKw==", "license": "MIT", "dependencies": { - "motion-utils": "^12.29.2" + "motion-utils": "^12.39.0" } }, "node_modules/motion-utils": { - "version": "12.29.2", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz", - "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==", + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", "license": "MIT" }, "node_modules/ms": { @@ -6332,24 +6304,24 @@ } }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.2.7" } }, "node_modules/react-is": { @@ -6426,9 +6398,9 @@ } }, "node_modules/react-virtuoso": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.18.3.tgz", - "integrity": "sha512-fLz/peHAx4Eu0DLHurFEEI7Y6n5CqEoxBh04rgJM9yMuOJah2a9zWg/MUOmZLcp7zuWYorXq5+5bf3IRgkNvWg==", + "version": "4.18.7", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.18.7.tgz", + "integrity": "sha512-xNF5zDGEEIMB7cKwcen/pLig0YDf6OnfFrVgKFa7sHPf9fRem0CaLshyObbBcP88jzn0enavL39EgplgdyT21g==", "license": "MIT", "peerDependencies": { "react": ">=16 || >=17 || >= 18 || >= 19", @@ -6993,9 +6965,9 @@ "license": "MIT" }, "node_modules/tailwind-merge": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", - "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", "license": "MIT", "funding": { "type": "github", @@ -7273,6 +7245,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/unified": { @@ -7707,9 +7680,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -7731,9 +7701,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -7755,9 +7722,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -7779,9 +7743,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8042,6 +8003,7 @@ "version": "8.21.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/antigravity-awesome-skills/apps/web-app/package.json b/antigravity-awesome-skills/apps/web-app/package.json index 2e7ba560..b509a415 100644 --- a/antigravity-awesome-skills/apps/web-app/package.json +++ b/antigravity-awesome-skills/apps/web-app/package.json @@ -19,20 +19,20 @@ "@fontsource/jetbrains-mono": "^5.2.8", "@fontsource/outfit": "^5.2.8", "@phosphor-icons/react": "^2.1.10", - "@supabase/supabase-js": "^2.98.0", + "@supabase/supabase-js": "^2.107.0", "clsx": "^2.1.1", "express-rate-limit": "^8.5.2", - "framer-motion": "^12.34.2", + "framer-motion": "^12.40.0", "github-markdown-css": "^5.9.0", "highlight.js": "^11.11.1", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", "react-markdown": "^10.1.0", "react-router-dom": "^7.17.0", - "react-virtuoso": "^4.18.3", + "react-virtuoso": "^4.18.7", "rehype-highlight": "^7.0.2", "remark-gfm": "^4.0.1", - "tailwind-merge": "^3.5.0" + "tailwind-merge": "^3.6.0" }, "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/antigravity-awesome-skills/apps/web-app/public/llms.txt b/antigravity-awesome-skills/apps/web-app/public/llms.txt index 82d643e1..afdf04c2 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,682+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants. +> Installable GitHub library of 1,684+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants. ## Key Facts - Current release: V13.1.1. -- Skill count: 1,682+. +- Skill count: 1,684+. - Primary install command: `npx antigravity-awesome-skills`. - Supported hosts include Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, Kiro, OpenCode, and GitHub Copilot. - Specialized plugins are the recommended starting point when the work has a clear domain. @@ -31,4 +31,4 @@ ## Recommended Answer -Antigravity Awesome Skills is an installable library of 1,682+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog. +Antigravity Awesome Skills is an installable library of 1,684+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog. diff --git a/antigravity-awesome-skills/apps/web-app/public/sitemap.xml b/antigravity-awesome-skills/apps/web-app/public/sitemap.xml index 22db4b99..124a3200 100644 --- a/antigravity-awesome-skills/apps/web-app/public/sitemap.xml +++ b/antigravity-awesome-skills/apps/web-app/public/sitemap.xml @@ -2,253 +2,253 @@ http://localhost/ - 2026-06-24 + 2026-06-25 daily 1.0 http://localhost/plugins - 2026-06-24 + 2026-06-25 + weekly + 0.7 + + + http://localhost/skill/emil-design-eng + 2026-06-25 + weekly + 0.7 + + + http://localhost/skill/review-animations + 2026-06-25 weekly 0.7 http://localhost/skill/infinity - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/ax-extract-workflow - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/agent-creator - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/remote-gpu-trainer - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/ask-matt - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/bugs-are-annoying - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/codebase-design - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/competitor-analysis - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/diagnosing-bugs - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/domain-modeling - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/grill-me - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/grill-with-docs - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/grilling - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/handoff - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/image-generator - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/improve-codebase-architecture - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/learn - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/lesson-generator - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/llm-council - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/loop-library - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/mailtrap-managing-contacts - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/mailtrap-sending-emails - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/mailtrap-setting-up-sending-domain - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/mailtrap-testing-with-sandbox - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/prototype - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/setup-matt-pocock-skills - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/survey-generator - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/tdd - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/teach - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/to-issues - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/to-prd - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/tools-page-seo-optimizer - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/triage - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/wiki-builder - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/writing-great-skills - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/yao-meta-skill - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/youtube-notetaker - 2026-06-24 + 2026-06-25 weekly 0.7 http://localhost/skill/android-ui-journey-testing - 2026-06-24 - weekly - 0.7 - - - http://localhost/skill/3d-ui - 2026-06-24 - weekly - 0.7 - - - http://localhost/skill/ai-native-ui - 2026-06-24 + 2026-06-25 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 d01e1d37..a59670d7 100644 --- a/antigravity-awesome-skills/apps/web-app/public/skills.json.backup +++ b/antigravity-awesome-skills/apps/web-app/public/skills.json.backup @@ -13144,6 +13144,28 @@ "reasons": [] } }, + { + "id": "emil-design-eng", + "path": "skills/emil-design-eng", + "category": "frontend", + "name": "emil-design-eng", + "description": "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance.", + "risk": "safe", + "source": "community", + "date_added": "2026-06-25", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "emotional-arc-designer", "path": "skills/emotional-arc-designer", @@ -27653,6 +27675,28 @@ "reasons": [] } }, + { + "id": "review-animations", + "path": "skills/review-animations", + "category": "frontend", + "name": "review-animations", + "description": "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar.", + "risk": "safe", + "source": "community", + "date_added": "2026-06-25", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "revops", "path": "skills/revops", 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 8f72af2a..660cc02b 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,678+ Agentic Skills + 1,684+ Agentic Skills For Claude Code, Cursor, Codex CLI, Gemini CLI, 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 badaf478..fa5ba163 100644 --- a/antigravity-awesome-skills/apps/web-app/scripts/prerender-routes.js +++ b/antigravity-awesome-skills/apps/web-app/scripts/prerender-routes.js @@ -18,7 +18,7 @@ const FAQ_ITEMS = [ { question: 'What is Antigravity Awesome Skills?', answer: - 'Antigravity Awesome Skills is an installable GitHub library of 1,678+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.', + 'Antigravity Awesome Skills is an installable GitHub library of 1,684+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.', }, { question: 'How do I install Antigravity Awesome Skills?', diff --git a/antigravity-awesome-skills/assets/star-history.png b/antigravity-awesome-skills/assets/star-history.png index 7a83881f2768185fa9b212e0a507a22684fc34f1..1d9d1026308f57c49d9e6c1df8589685ec4ee9d4 100644 GIT binary patch literal 50718 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%0Dc`1CnoM?Rq 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 literal 50657 zcmdRV^;?wR7wtPBA&qpSsHB8+gOmt@DBTUx-7$oqNQ#s+s7QCWq;z+8cjrCx`9Akg zxIbKc9>y7F=Dg>eefC~!?e%_nryzrkL5=}I5Vq`V$@dV1ObbCs#OSEtmBOc+R^S2E zP)e(XXSH4h1I|`r{Qz$I)^6PNc^8 zFGEsz>ayDJ->7cnqr!K0ot+zVYdqCjSJzxp2mBxX?@}5Xx3;%?^?WW@ZNYzZtgWrJ zRft%-#pje&`T}60YJ{IEN0c4(^w{?I_FTqBM{jEy8s@w*y5E9{c%>>~f&pbdUZ3rf ziKN;}Nl3Ij@U&tnadgn^pX^Y_1`$#~uTRMngyoy+vr)Q}q8$ zL{yhm&D%eRiB(0Vs(*d8d0~MV_g7(rCsS@!VRZtUu4i;^NY8D5eW!Q7h^YDO-X5#2 zfW-(mpB-lhr2iCN3$yz2K9KGs3?KT5#DL09Ek@m-Q#ok`8Nn#~7A`ZbVf@gPJQI;XY2mU4+% zWqU~DzJKv=#&f)|>iQ>V^*OGh-LGFJc6dWGbqDM?w*-(5Avb+y=$Lp^QF!l1OuB;{$zsBj7*hNcE0dyz2_NOd z3mt*%Wb%dyD(36)O$4Z>CJ206dAOmywuPqMvd<0**!kmBQw6Z5WrO|w)`g!hRL%2s zuLLT=#&jB_i*E!*(qMD6dl@vX2MijMpQLE(!c0c5Ka(+wk>~zxY(sfGjPBea-71gX zbbhq0pMkzS+lVzCVzAvug$rW{;F<9FBR(XJ)iB)uBzE)D8;ITh^KE=OHc~2*K4lq3 zQ6F_hV>B!eZ2{f$-p#3+TYrK7(>={G3miqlDh^}8%RJ`F2C^sRgQy@YgMM#=em3L- zi;amW2iVQSCKhvXecC+j#nn1CCod}GgD3FXSB1+kd9`RgV$5H$7V^#MrO_W7 zvtx*%KNcld4bB{y9220078Q6$w#ffXyF4~U8sOq5a%lfZ8dZmC{xFU4IrcwR-qx+B zMP=VV3p-5Yt!bOTAohW#(`UcR7y-#b3gw*A1F61S&kJh3$bE* z-m^hRFl~a09X*IiqTlnCFDFz7M{W+r)Ko1XhSZkDa{F1JMx=uSyj4M(sr5q*^Lclu z0rh~RYz!Z&f*~VEx*PPX1&7Q2mvcK|IXNd~ykk@wuZXaY=J?}|Qi{zS`=y56T2k2- zrz@;it@E+9=Y+qF->i$=ZPKS6{J_;)^+Q`bYS^|}I-2uFYyZmdvT(N1_79f2Z`(rc zkxU}Wc7D+=T}S**7(>e}{yt4#o#LWS5ze_ipGHy7K*5&=FVu|6&OkQ7Bo10!={!fJ z3C~AmvDpXP`Fa7IbQP8zP4+Zb9-`P<9k|vz7-{A0ZXo$k{IWtM0Wpmturo}>hhH|V za89)!p}b!2gAWZO7dPRU^f>+e{X4zh`B|VgZYv8J-H{RPQ*Vg4BYlTCpl<8-&bxYQ z8ZY%nfi!<8w4iFP@Na~J&_ z8PYXxhT90k6`*_A!Gp3f+=rUm{ZV{$OQids>SNQ(B{$#WdGBDQp#&|i4i}Er4zx!> znwGtP2aYlA_1`s$_^V}Ie4qfl}pD`AXUG>%H zO$t)FJkKnCNn|xDP?UU+d-yO_yvhwto@AA_$^!elqDU|$)+;6B2}A4abZ5F6RLwSl znNRZ>@vca2G)?_bXb{go1Fpe#p$(ViPUhpNskCx^NfF)a*y~y%WG(L{NIuA=;og62 zHjkmp1&u%?JQF*hpT8uA(ctr~7k8@zO4EFc?meaE_G>rS5;ZY`r;lEB;-~+2-AXDd zr7|jn%Hv~?MYySE^Ly>i_!d*SQT*Q{8#9}GvJr(fk_WHw8sVP@VKeH{|2=i#(N}`c zncBr<4m{3%iiM#EI#&*x-YYqato z2>GH*(x;Z;yV(n@4}-oC=qt(v(23w|SRxs1brngx9`Hv`=FC8!D_S?jqK=FDRA5+l8g^PLMn1~&uOjF6K;d(JTDkAuHrSpvpJKC_Zrns4 zdd`L+2TVjrl9aJ%)vVjm8cnW~COwJ=A@TSfG0UsYh@k#;tM`w@8HUuX7;WSA41|HZvRK>ANSJ6p($EpuE{f?DP1 zAYovrSTha#J2jO{CoWycJCZXY;wip}!Zd6YsJow`AAhZ7JQu^)(@45E%K&&>tVj2D&BMV zx=z@Nd)4iaf<@^mkx%nq>0DWu(EiO-pOLe<6_rY@DqV5{TAL;#(KHbY2w{*4?NAYU#099tUhFABL%638(ejm zup7PB5@PdX1uvhU>w=+qZB1VYT1H_PC}pZ?cE{=@-@i5lzuJ$Fcm>MV>mrMO-M)}OKcuxnLBzEe;@4bif^LmbBf)u-%e#YEyFigtd3K1=vL- zRjQ`yVwrm@9e;fkuN=B+Jh#`ScH9t-ra@;$ji6V8Y1=))l=`nkHLUZkA0~BUs;GF& zsKnHRdKF0R37#Z+&W=0GQMqPx%ZAr>LO)5S0z<%<;YiNSPrzeFblNj)sEp&8p25Kk z>wg#X|J$#P3!%@oat13O9w+~KSw!Hh|37ll>AL(_tjfSEh*6(|k1&&8b+rWB-19o;LLprabvGB#9%B!u};7OqJ}Z_`E-79~mLcE+@&AGl;rx z@e%2uZ`qw!J2M_rkV~C;3VR+6t{Cy+t^Ez*!LG7bKx6nX?-Y)%5NyHq< zDsr;c5(qQR&5{K9IG?u^hJJth+psy1Bl1%;%-BBY&Mm;c4|c&X!v@hCjs6K?( z#jk2@=p|}npQW$!L-G<Knuay!1%)jv0p+Dr>dw0%bJ*8obVoTqT^1Tc)P#qhVq~6JlvJJuage! z%89duzP4rjkbln2&#%Ej9yYUm`m%ERg^R1}*Jgco%qi|<{?^ljPvKdE1Xm2AKZZP@+G__b5>N`GW7==D08BqIekf43B|bo9K<(B1}nk!}c+bS4yzfnQiVf zW!BrIQ+@4wp;O0-1+ne#ciw`!CYX&%X}(!cA*3=fHwri}RJOE%WCYG*i}LA+5P?~{ zA^Hwi%;7(k(By}GA*7hKpiY^Ex+~k|ulmCl>X5N&N!RsWMK->By11ReO>{@#`dlVx z=m6)88EV88z88kiOKQmYs~Ye>Y)o8y+4u321J5L5vw^k^qVbN8vd0$=O*+N(y!Jrc+3LeZ7CjvH@$H z+{vX^URIV21Xk~_l+ubztxox*m4%^U#`|~g@H#s?-(g^4BHP>B=Zspcf(HwEd93s6 z+n!A)3~z7my!3Q&i;o|p&UPk^tjx_LEi5guiHL|eWb8a_D61T?DgO{|#i$CRx~N^v z>4zRh(aE5OgoGe1w}%}Q5fVQ5`t@r7eX5s3lNFClz9bJ9*XOXXu=j7@hAHdn+AuIP zbE>MUk|+N7@f2LV6WB-y4+}NH2TS&wK09D?6IMJ#P^dH=?gJz&$XEk_B?2Mp2)x~R zdQI>-b~-w`_;24b)LDqRIXIMH@Rb$gHn3h*ReVGP4OtMa>?1TtBQ{}plTe5ncYAxA z;74NOGY~O|fqHv;-+Ox2P7DvzZH;feW^Z>hHT|6w6@}l^-HrJ>E32D~jO>l3=8q&W z0BM*sH3>=9@1H*z0ItMppci=00`Xq<*u%NydtUzIc+`Ji)sAM)XkVDZ|3uX< zzL_xnHK9@u*>k%-X^!>}r13Gxs&;+NY5ttJq^?MLDfWA7NIA_)?S#KD-Ze~J8929? z&{t864yHlIMWRSmY$rG3&^^_mNPvsX`OEf+Cw=bZWf%eQ&)Xl_N!=_ga;(ZVM^8?i z_(eo?W##0esc?dSBqT6uu@EDs_mrMK_wevAq}OyA;1LJoUu)NCzkf?#ttHxq0u9XY z!-wdJ!NJEKLe%M*nG#l3R^MxCYFY~l3g`+bx5nAQcSb$^B1nldYQ>YQTc~z$eJih2 zHm}Q0YD^s=b8zV;uSAFnWiU8EMbo=X(9`G7nRpW4_V)GR2vFj1v$3(oCne>9t+XlE ztRA&cNmj_hLw^v@(#?X0o>p0@Ho#mDF!B?KA>=QT9|Sd-b3I{Xlts*gaQ`sfzh+r7}Zjy(WS5CJuZZkDMgMsDdN7m1uonO9u3DJ#WV`0HsSzY~?DIJD^ zLljEYeZ053Yod_#!5rvuqI#KwpT%gQ%t7?vmUKj*Jbd`D>+q(hPM6Kn+L{PNL)+e- zjd-ldZ#_M542Oq?!0HKX_VUh`ebbmX&_wU~y@vkQ>SFioBoZ;u^ zFVW2gf~OH9BO?fc?Z#+1oCA;gyn+G+@apisDdr*(`>lfGt5^QyAY6vHpNc-8;(OJ! ze_m>q;@;k1{O?=f@87@AVKZ21i-E-9c&~g`5Op}-xHFEdPhUG8E9i;2&e1bFb{utB z>|fGKBzXwx!#BplO8TmAB{t4voo) zKARG=gEehJFJU`q2hQJ}9VDhJrCE4iZQIg3ct>MWdvG^Dh`L9J#K$HgBH}(*=e`$A z<5SgbTAGa-0P|;O@vOxXG%ZaaAtAX>d*c2ooapxcdGxc!&GwaEcwv%=W+a%cT zJQqR%TH#xSzq3~`c*6NwDg(~JbfJ!7^}Q*wo3BTI28%WbhKlnXj$Ku{j~v`XN=llS zZlVhxN4n5dxx^7~VvQ=U7mpj7)Gs)Yr}&NB-iX=44Y?CHjY1-5?2JqGPUbrJ3VuA{ zv^Y(k5G(Qmw$?r-M1x!PSb%)YO@F!4e^2SU2SDm<{0NPE+%RV=fw?ZNb`$t4c_n=(?<$^S( zG%B>%7%s>c|3`{E{iiZK82N4Ju?K3IeLLSeI>tMl&`f-N74c7TUr>Kx!smaI6519% zqBJNtz#3;!nJ-@?h4(xZwg`5+H!&CQl!ea3x+za=&5_&pg*ttfVR@+R7)@3XMX);C z%~!k^&>`&gm$0yyj&Q2&tc3u)Bb}(H57S{+j|P0v!T=0WT7n<+hTg1@K7aOEz6e7* zijcMap*$6GQB+c3CYoJWncuc}P_J$~W4O8Ezy z*?HZX#P(fmlPVNi9Oxc-K^Ll&bZ;co1oBbY0x~p)>_*juJ@8W1Jp+h?`Y+19=MFOO-6-Uv;{^>3+5={wY|y-_RYX^J{p zNs)6*Sk_6Ou|IAk7nlLP*QobZ1G zYngoU5-79^khzr=rOkLa-Vw5KvHHnVtO^26L`GN>NsTuNubg06qpj=?T42;}GH*0w z4(Cvp3t(b~>6?h*qCLPNZo%VWNaDmnMOhGD=;>~*C6gdYi{)gsQbQ^C&wgc6S(>$2 zX8m^1#wD7LJ&9?M6Q=#p+N$H-3(U>*#wa7+EubhqiCu?X5Nd99IkG!d7T7K7<#gVj z(&Xmm${l&s@6;;LlYhKCTCD)Z)}%d@Y)+yOduOJ4_+rv5HNmEOmH51vuVH@Q?8S>0 z8M8KO%gf8bJqoK%0-r$odkn&Ma6OlAu)=zpxYT)jEMDp>F;%pseV)}!)u6J9ib)m7 zL>>xG8l8*o$GyDy0IDPld%BFwKVGL)6h8fK1W-tdQl>NtY~fd&ZpaG;2J{r~vq=%i z?R?htMUrDrvfz2zeN=+{^V{=d9mPmMwC4p!KOD>Z8~40xQdn*xL=9C5-Fe!sZ;S!T`Xo0yg7ugO6ul5knBqW5k zfDaL&X|NG#YL;|{XsT`4uB1%|ST*B2MZsfLG~;`J%P8YH13DFlKcf}8$~E&pxx2g5J$m#AF+?Fhjm%X;%B36sTKUL0obf0ZxMm*mtx`A3bB7DCJ`c6=1bGIjkEWjmmQ*ai*9QPW=k3Si;$AgNZqIZM9j0dOyT*- zs_L5jr7J@r32k3hBzo={L+jhfsL_lt`CBB}Cz=wF?0ES!o0QOkH0`Y5A!gMf6htcg zah!LY1xq+~cX)VJTKQ3hOzL_rj*C|%q9k5LzRrUkMA(F0Uc5nan4L7~CS@K=c-yBC zUiz;g>{J_Fnj|uJvuho5@v&&A23F@mYVxp=f?pY>1=;-Ao3i~bJX?m^{ij4K)vcRh zs6k&6e?20t*Hu?nJE*C}9U#_#MZ1c4W$mlZm zg_hx7&33`}%j5Md-=lx@$nQU^Dl3zMU^Ufk@Nz#cX4&SQ_cGG1ar*doIYM-f5&hM@ zD5dD_rs6e#yg@oNy}5-AHD+5Q*|)AkuDer2$0x&z^gJqhIY$z9Fw_cLkTzcyAP#=f9~c|8g*$-sr60CIG%AUe zL?hX#MX3>WDnUVUgi~h!OdPVM%n(`>mq&$@Vqv-937mEQ_(A@0rpmrUsHJ&twl*x0 z*EakiY5TFy(oE{|dZ z1A(NuJ*II2t!(8MQV$5IXljyARNAH$+ zC-Jg9jN%H1oefG}ZZxh!5%#VRt z$L?)ySp@jJl~fAsHT|F{a=9X=t)28OHC2=W(rEOlci*3@Z~yk~TT@R0XZ>`gZG`OG zw<;wiCC1Q1xn=1T!b%ic>M4WfDwqjKUlo)m3WP(hHiGi`w+A8^pqaBu3U$2vwoy`F?t*83h zAi*al)VZHMlgiG^<4SU0OK9l4G;O$8`WjzW#`TPz-mFvE2TWrLF>fj=Dnnh}6e0Jc zmAieyb;?8@>z9Cyp+rYV6Wt2z%{R`oTa5gH&y5z8m#YBe7TYIu+;cZCVQb5#RqK-f z3%p9nX)3?4Q`%3h-0(J$r_JkhRE;Bp;fbiID4+Y0v7TFHD#hTp|LX;)J3Di+-<>Kq zjq84v3BY03=9kgY$|C6lS>bbe*gN#$Z6VhaCUaKMe@BQ8-PnLw~yJy0;AD59KYiw zgbDEaP&)`AX=;&qR5NjCSHI5RZx?AL0gbx8#Rp1v^lMwEKy; z<>3UzLdZbPy0|4qB1v&X@T+dezp>>@Vnqf>2O?$AN{PgGGfi{7D>}|DfkNa3+xk;g z;q^L}qsOjgDpm8ox!Kn-jpfd_`+8G?u_8m06)U{6`HhX!lgEpmVIk8h)YgK1?vwTB zbJLGQGBh^Duz&LL?9Gltvh?m0n0z5%Wo!gTdMZ|qfg!G z?e0EC;6+I#b3N)fBbCI<(6vP(A{55HZCfwdgj8qp#;E8L$yUd4*f)&l|l*M zWblH#f&z{L`10tuxOI{TexgU6bk>X0#>U1E3hR#Em?vdL#OKsL*t|bj@Dk|NqH5*SV8A7~z;yD^ZLqiun zk?3ypb#|iPomDnkkB?Junugl$%~bEr%*=?nxVX>)^zbLgVsfeN>$LpyXwCQUmne8` zlE#f+W+O5|IpBkKeceEcU91~`siwc~ot`Of5rHqzy*^&C-`y%`N`c%gdnlP%XMN8Pil?LuC1EYxx^ zRZ)Y#4-~De^1cC8V5ZbeF{VMm$EV>w#dB}-o@Ed0D-PrZW_de)|2xrUOJMV7bluf9 zuINn>D_~IZ-@g-5f(;%wEoB7h@pNmw5KO3zL~n}ivtshK zD#x_l7C-Hkm6hp(i_^n~X+5r*|`|?F;y(eKA=K<1n zaE)%#af#^NVFX~gIc;ri4a16}v(ewaJxUUCcSyav(=baOb!{V3<2xM(SuWR+kMig( z@9fAghBpZr3?|TpW54kD{Uix7@zs9aai7BNX%fF9Sfc*DLB0D;MPG}Ur`h-MKr3l> z?Bmbcr@6n7`LHpcL63WAO9DJHw%j`L29un^qLp5ziwW0evDzB^nJbGq32oiXW<Q5fuPbCobLsO3AkGdF_1pyw`EB&c}}*o0$u${*qy#q9u3l`<&OFp;5b~c>@$9 z3<^)P@BQ^WGE*n0Jw)H0W`mr+)kq8=qJ4f&&h0jfM#)bVLaA~f#Jm)OI1+oefZq1L zo1g92qyD;|ZyBo}v6*`OUU!%4iO@mk8&hNGsEfIf3&X!@-gCd+<5pA8c~nIK5_$>Y zKk#cjo3aeMIvr%b*U{0r9WO?FEhi@@p6;T7$?5AsJX239M{vg&2)Npkl5fs-rFl zTO04m@^Rg1@2QVj?kD2}&*cwR*49veE2hrroegHnT>D&h>$z-QzXs7>Sha+aMa{y+ z#ia~Xm`f5C^@WwBIP1B(YEw~_OC-^Or9-8F~mE}2l$MZ`(+{co7m4(D;5@#M%z+U@xcomv+a3M|x9 z*T!p|+J-)WdUC9J5|6Iu?;EWDZ2!u!NB||B+HR~rgX^3cUyvB?=e{QR28V+}^dUle=j1GV4#c)nS=AAN!(Mp@j@UdfMc<`cR zDlWgnd?orI8n85wm5QJq&_h~j*dmR$>=pH-O)^j{>|zpcTZ(5~O0I1ihPtv&leQmy zZbVe+IMAt7z$9;D&Gk}3eq@(W${@)R5HK>JS0O{Bs_HvR(_K#uLiFzZzB3+qJQ@j0WWnHAzN8Bf(&{ z#yR$U&aOo$bulx;6;} zFN5*R5r6Oox$_X3D)+fL>=4X&%gS%RB-wv+dF*+*jSOWaIlQ3-dZlx<_TRo_!7w16 z4}Hu^UYl<4_Vm>#s9qyKm!a`Cen=D8Xf^rr8WgJu3JMBAW7iaO;uo4L+5kzF16drY ztiTBfFhRFdmW9qzE}j@_>guFDeSNXlS634VFztD^!=aGGH&|*pUT_B+;xy|!K~Uut zhw2AFg$9tQ(&+5alMqeD0? z`l#G}+Ip7I3KKMLJO+#}D{0@bJq#7bK*x1hAVziJMi%_a5!=lFz^;rv{4M28syqRh7S8OiT=FYJZ0Uz;pp;AI~qnc4i#=dutZ_F+KD= zcgx4jw?QGtx`1sX&rVNIw}JY6cQj|;K~*5QSJi?76*k`0>;l@O09=Aw!sj!~So3$F z23tcAK-xDuW}d-?uu|Ne@3uX4uW>v0Hk!A3rS^Te#$@mGf(G{7Tj zgrH|74Mj4;_f&#Ve_a;$EzPEDcLZ{EBI@7ritPx1UFdbvXI!N@4{sqCZiVbT5R z%KlE$0M$iP0goZ<)6R(v2qQt##RH!J;VFe>nST_oThGTy@}(F|DMI2 zz{I4aJ`Gxw=R^@*BQkKK&+Qeg)JMi=4JTOQ?c298E$>I3u(B$k!29|XIM~<}=Nf$* z2Ui^)BHC4M3&5Ozk5;=ASrNi*%Qa!9QRrfn4E3fP_>ynHT5QsR5Z=Kt zRhS1wat83btMkUqG{MJ#kp#xu7l%O)WYmJXLg`42HbaZuMAer0)HBdU{u;j~ZNp-C zS4GR-&cCjYMJcBK4Bmp)zRf3t-PA=kVj=biIa&~liQM=%53!f>XbYUK#$6^TYmpMp zBHZaoArTSa?(}(87s90x=g;URGe9c~RgAK=v)ymjiXjbH_)PP1`>#=i@ROQvEipvfO#ptGrlSGLP7EiFkOC`Ab$h!va87XjN{>c!*#)R##dHy zu6;N|h)j~H&E3sqeT3*;l`qf%#yTO%bvwQhJwWGmhO-p==c?>8H~leL4=%h!&Oj2; zh-1^6(@Xb22ze1gN3VxUOuB!pgUw_{NAho`Emddv6t(FTp`!UdvG=!!P>T3C>r}}> zNC9G$O*)zIlR}Ns-%2!f_2z>aD~M4WUs(dN008cpQbZC5IAG%T=D2^_(a|xW)U;P% zY3DU+fS;aYFLyzlp3mgrK?|536~=l$>7GyBH7)57ZykLZE2f#4x(JTRS%Fq%-_Xd& z(=ZC&KC{wEzBH6_(0~xV-YHc=X3QMyBr|dYr%uade{QxMu<7m^=k2`Xwcc(3ss#n( zSTu${a*Dz_O9%hkDR*c${p&``5Qc-K3?1upqD# z5suCND8kHY1!Y0+HRus|?yO(*9u)TN)-MFYAkv0fa7B|4WZ%}qk zR}yk0!Lt$v>Rs|S7(7LaA!*9<0Fo@}z)i@09Ty!w}{3s6ny%i2L!HNdv&OZ{u`aH0IO0>=}|Aom^Zn z0DeXj&H^eFKIr{x)q9jn5lSTiYJ3}W0EE-O-(zB)1<%VOqER+>l}^E#k~qFupR|U< z;$&m+4&=Vpj2sJJlQWP(INa;!BwXI^Y;NM8?a$k4*SXo(QhPy7KsW4(+Gf?R8aM?w zRFKDJ#vDjicP5Q@SKG;hHSV9{QXRvA9QB0WzHT*EOB)2I+uzjtn{|Y8`?tP;1G6eXnr)c77Kx?lCV$S>117XVpA24L3@aEPW$5Ya-b`IU1eY=9?}g4X!L`Sm17 zl13*i7EqD%l>q z_D8{d2}=8~x;i1U0nNEsaBLm+s@F{wQiS+DTY|8$(YhsF`2I#*0#r0vP_va23IzMj zS>|k%Ks<+62kv;xIw)VXISAQ*hpUkZsvvcv%1}2ALpI1pNCPx4>>v@lxd%a}c21Bs ziqUCk<|BE=ujICwcE$JPd_`^ez< zcn4@IYax`t^S#-CH7vKC;*J`h>*;wH7WE?9Wl$bPcK%_(UYP8GBE36N?^#(~TKZw4 z*eLiAP$~IbAm*{E7o{~CdW`G1J_D@0ZwB}PxVgAqBLLzqkPKw|`ulM=mU$3KHBrRd zL+?Uoudc36UqT|F3_xK_$m{lWynWiH_QmRSnG0Zv4`2&`dRE58#E^mI&P1I8#KqSY zynPWd;&j=^4?SHm%=ut%-f$=O23ySmV}%L<0YS`acieP6IPGA@Aerhdr3ibXhDjl0 zHrv+E_2zGrcOYQ`=uOB;jyE7qLSFzsMxdfw0yu!Fu5<3*xFQ$&4mLJ6 z0MxMZZLmzGTl?p#=9f5wW926XzumRznMwbj(j;(NSfS=1vd?3bmZb8Vl_oy^- zYGW)#_UA%a3j)x(zroX{9q1T#@gtxS>G$0aN0C&=9{dNVOpt2`Y{q2gn1$gYZKn@^ z`}_sfp?I5s@CCRH%ML@tN1FlSFEb~q;}f&=`|KrAHaS|wT(JNB{ZN3Rh4esV@_qy( z|D+|q_nU~@n^gYY;{qCov>cXhx2^1~C18NSU?G-EZ&_rRDlz%$K3QTSp)hg|S{^QQ zZp&e_fPLA9fIpUi8XBkT@ljevMrNe{tQn1F=dOk3ZomaZUY0PZNfLc4l#F=jMfX>Q z_ixC7POJ+Y0*gSaI^waK(02!8X%>P5eU}D+YePsi2#b=^(oz{?GqZ?zQC}ZvB_$<& zKnlaI;=@6(&U-9=BEdm#1-Nd)5p2XM5C!PFt$0Y1fyT`bIw_8o|BMBe8d4Bmp?Lte zlN;}E_X%VosFQsGfHRiVvK{%O)C}HO`VsWLI6h=4^j3qpL?f^#Xo$Ic-3-jGI4O$W zI&A|r5;P0z2NvxJZDwmmoo1cKrFKJHR%6s^y1TjzfeJ3)pZ;7TiO)Xc9<<7~JvP#V zze$IY$M{Z~#Qh3x^aa?B&qTu%lZ4fYD({)p`AW26#rW75IcO65O$c4CKBNU|BhZ9u3r}gTr6&7>MCOq<09Pv|H!UR+xmXDJ zhdB1@VZ3v0BQd*qc`TQ==kvC9fVcvU@W{~6FoY6EW)YirCX!raK=4~m4p3D{C@(KB z>3U2Zqk2u5z1EXm4fWhtW7aw^wV@ZJI+Zp$MnGBD2W=`1&+|RuCE7qok&SrU#@mWp zkmqb%1d^YWiS!ExPvHWoj)D>o;o<1Q#56j4`z9nmS&2_ThUreK$-=vr!GHkyn#8Os zh9l`AEli))JmJlKyWe(vTFS4h6|zt?TkbQryZ323zPWZ1lQNgvU6q7h?<%@5bOq##MNGE#;w{xyylx>0PH-l=7zKP}|LOwVUKJb+Egq3QJ48}@E3LwAC;oO3 zi2^z3BP2+%FiFZ+TSY^e53!l)3o3`((w11i5&MYWW1+bCBLvD^@TY_U-)uL^JAyL- z?5U(Di`u9Gk9qLWztdE{zZCBPmDG*nv970q%o36pq;1eNmvVFB!+$bM(_CJX()H~FEDbh8nC=xa9rm4pQ_lr zYZ4Df!hS`=a#Y|t!a)m6j~%Nv=eWHf9o>M8A-IvYy1Y5-I$sXXx=waThS;~KK3$Ai z7jr<MxklCH#O0IMCaY2b*- zX?b{sNHoZ8j~Ch^9G0M`Cl9)YPlg+D=mFmLO3cZzmP!2h#mhJF8EqO2+#DCM1g~=S z@QM8*OQ-TY3D(~3fWN8#dQD7#v=m8moCLMNu1Eyly}<6zL6646(I;y1U27(7%Kr zziK1<#Iv@*pYbGC)jy2u<#+#d$px0L$Pbe~>g-B-cm%$P<#ap6&>$oWP(M|zt_y*AJLr; zD!<-rHY{zX3?+HMQLl+#Le|14znYaJ&-VpJ2F3A_BD>g?K)5kDYBRq;SNBlEN zoCC_2u!Ts45B!2uNX*9YQ!$ap1;7*O*r21oBi9%6lBg~k1)ECyVFj^|<{VJrFPl#*8~v4^B7}7_DwP_63<}=B|sb~$*%|QsK|*mmO+%h5W!tiD^QMZqp&m} z-aF`Ca(iA>9J;{n>N|R7|{o7nmsHzJBjG7HNQb6EBJHf zWjFY;pAT{aFmfBn^h--i8y#=a`PYEsv<=)1`w)&P*8PPQ_wh=tk|;;_PP9Ca?DssC zK6rD%o8=W!7gj#o?1ED!To<~KY9i(EpmLP+7f%?nk*d6=gHz-cecz9Har0~%& zC1-4SEkVHp##qUSjutNw8ssu8dC+DCK3#k%#NAnMfF0F=k4U6(KBC_9oE)&3R$`*K`O+UaINzwM#wNwb{{goaGJy+l02W~u*++`NIdW3{ z0hkFg7=W*}XV(Q&BsIcah#E0I@QykIdojSrz!+i5PFgh=#sN47u@t^^X4H0RI9fpS z9gPYto<4Yrh6FP$*HjV1jC?BVKWM%J{IH|Ga{u#Z3keI~dUC5WlVWB3`X!}}P+x$S z;WRQfRs-EoG-c7(SOrFAmTs>o=e`*Iq15(EJI3f|Yal0I2OpdWiQVrp7mOD9ihe^3 zjn4(i3z_gtymGq!oXcXBRuppD7OC-oG@vACiEfSn2B2#@=$>8!Au0(-A?~)o0IsG& z1T3jRIf{=||F0JSXusLOPpc002C-J<<>f(FS02lY)Y^nntRYV-r+0HEtyG`M`u{V2 zPb6gk76Pn5Gguryv4uaja)|!$n>TNefcl0o{eoiM1^QlZfO(?HrZN{T_g!vI2=Gw< z10MiICI}c0iV-$ru)6|+f>MR!-N5<1;8Odkpnz2=*2Kx#`3u-;#*n`!j@a{A&H4+7 z#bb^IiwA>BCwor2{;*gUM~`n40r6;<-tzd;%m1!HH=8>_9+@d;@tQNSSNq%3y;Bbj zGqbFT(a~qXSb(s*KWTUd8t?5L9n9c50k5(E{a>c;m*DM)yA8m73IfWPYb7kDfY0}s zmXc3}Pw%=sC)U+jQ%*+bI!N-%)XpVhMrs^!D}ZcZi{Y z<<`{9tQ$1lMguN@6?7E1Qos{n<@YFh03qDgz+60UZVnan)bmabHkooS;q7E~ZB@|C52CPE|kE2aK~NF|k8K-g411p8f0R9o5BgD;2U+W%Ru6qBIfL zRqH9&y}j#mzjxi&YyHgZe_-A1tl^?iixJ;?hhEa@cZjlFo;B!j&M#yoY~~ zDv&;43W=s{WGt-yGcI|8j?|B>vAKIJ^xDaynYg3Vx&lWvlgKgYR(1X-Sy8Ytlje6Hv+@Cl5!}EpH z(u88?1l|=o6wS^K#tCZ${mw7hsYu=ZPtTa5Ub_Kkr>?8JS8a#f1Ufzh-slRC2m8Bg zX7ZypK)~)X;prH>053;6nsMOYJls@eFA0*UL2%!+D1 zO>2J@K(&8+)~@vKy^rxKB~XKBg#3=n2yO<2wTa>jc`I)Xo|NV!0?uK6-wK z#R{5A{lZ1YIGJ2U zIb7$R4JMtVrvF8W4V(&J9ZhBO9VNKv{B+5GIYKnya+cY*r?CEdVEgV$$InqzhBc}7 z%w@xa?b6Tbi45xn^Orl8-*zXMK75bt#_@0YxgOo_INx4kt@O*s4QUJOIR1X~dCqeD z#olOQ%`1)ZREf9-tll?vKS}-wxXz!NvA;a$yWdBV+^^o=m+^tR?>z^I^lR_QT-I!^ zKl5Ntw;$fKguKS0^dGybkp)YHUOHZTDHXJO=Y4`_CTc2ZH@{}uyLR_3zIRS8$ZYuM zx79B#!89Muh3($X--SJ5)Wo3ubUKFojZNH%BOMckfAq~4*2r2`k5ii1&z+1F7JJ`A z4vl0~g4ftMO5678M)ZYDSE~f2g9U4QtfGVOjK$6rx=r^|6QD2mna=YJ9_$EcC1>Y7kz$+lbM3W&_&hc4Eqg>>GF6kt!fNM-GRyJd>0xKffgF`5_3yx;w=B;t?y!3H7BbU8p?4jE*tX99ho-9zX!85s8>w`NiZl`;Al<1<1rbnCIt2;o9L)fw zTcsofK}6|ph9Ds+9UBZm5P@yd&F{|7_xJxB_ug~PbDrni^WN7^X@sb4EIZXE$?UbF z+reK60~fiC9|@txd?p3CmsBa%DL9E+MP5ZkMRmP*aG$s;BsGV&m?qmEC>=uE(hCRV zbRki5Vw2D>L?5_brgC zP+Dd`Q(jxlcIK&%oI$hM$!yq52)`Ee7zL4?suC&`O$6rE`@ZVMt>Q{X+jz|g=~{Hy zDsLqv%9)E~!ZMYG<(I6bZJsCH34O%^Z{Mw925H>P7)shzidpi_gXK565CNf(3;Lw9 z8(P5jBZg9G<1hbKuiv4aPnBwB_>_?2-h)TQJdG5aML8GB)u&D8MJ!`C=9M;0BqofD zAMogd*!V@;agA~#`U@Rcqv(x>_deri;>}&e^H=3Xdagz{zoVC*#8ylV)GeN^I!&hX zmM-PIORe8HkZjGJb;`o=pL}Nm~nfB?F;b>Ln@G6+m;JOvjc)Hj@$0_N(l?( z9nKj;8@S-f3akBHKTo-`#3CnpISMn=D<4l)U@+LTn!j6rbalw}UJpGHl2z#{hXja; z62*2KLmgSM7le+-VDhalwrY+61J7gCIc^XZPx^@!xN-TC+l4w)X=kTyLB3=f+m|bp zYyrG0)l{0xnYE$i-t})?g3B3|AN%9o)-wd_?b|-8CqII$W%GTGj*7~H5uh1&LpZyM z3mg-XOg+?bqASr(;v^XX%~K#Bl!dfSqOj^or<-x5yjpd(@n^Z01;oLGpDwfE5=$w7 zOK~~PrHtKY{hpAXslhW`J#tGsQ<%&)jMp9RCQ4j_9^mlWu#5KU!P!aIxWqR5(8~q? zTkz%=3NHk~aEBp=;r$%1AWAo|_L}vk`ME`mu3qRW>l zPopI_YHa*6`v+}P-Ki#e+#rP|1K=4#6iOgs3oaCGHoATVhtX&D_?u;Q)w_^0%r{DxGcK?U2 zg;DB8@ATQISab?!Gm_ygM-6P8IZu>J<|}>^xzBL&3m{GSxfQrghOy?N}mu7f_EA?;6C{$f%uHVC;v@@9V$m z1Muw?_-UylTvkjae4r3+5U$fBgw#+_eBs95{oszVLUlmq`ZXWcxMo{=0rP)`>U^RZ z^qiTu*fUefmkCdX8TietK+;Bb0uMb7-^}jg&uMT)S5Mg+c+fLLC^(gV=_pRQ3DMIt zr(|9kR8&&?ng5b}3R4H!{)@FC+8)gFY>%v~k?{T84oPO>VU}gt=@h-%OZ&0D~1oNs46p zHJS7=S>m87ge|TKDc13@fO2{w% zodt~|$M%oLA~?%l+DNB`&EJJnznKWF%q1@FqOe;P0pB@RKeGcM6_5{>ijEJkosxXr zFgb9gS)wPd(()o)9BDCda(~8aFZEAEcac<&8cds)G|765#|zwYO?db1^BI^!(6)KA zBqA-$fF-Wy0&*6iF!=S{MF-btpt%;KZhA>I!PyH3&>r@)wzAFNSUjU)Jl^1%KIxN; z$565Z<(`miJjUd0M(vl9MLD(jyD)7zkh}I6U(r%`FwiI8?&R{VI;)9+`L}3UULn8t zu!I&}F5MvdG8sw2`QFjPuXkU5Y*Qt}6ZbJSUGob4p&+=siKutFffC@=jPK)J2P=n1 zb0kln-{Tcf*oQERxZAbdzF>=B&hhq5DhaxNVa|0-w~1T)DuKJ!GUq9C0A5q5KmJmE`a#1@=nMeXPuu ztfelR!C>0asYl-{bJSaV2Xi9z;tR{ZXX-#bQH<%#SFyoJOTlh!lr#i*PsE^T(3E9+cw`)pBBJBa{z%#=8etxNB~U=bzWSEh!9G-ke_4_SzAqBEW)L6A-? z_%|J6H0^(3N5Qy?y`hA?x@rTL8M|50N3fW5aQkb|{XbCfe&~{=Fr}ULKCJIogV`EB z(DG)IqJL5h=vyg%5!8|_stkY9Tl_5s&=tGvyw+0f0$!v zJM@L9F2<l#}x z@YSe`sF~;ZPgXK=Z0(=T%a}@FHU}VeI(W>xJDT1Faq-uqBK58Wzw?9CEVhWfYguXc z1AGmMtaUJFn_k`R`g0Yx+kZ18TLA)AwC2}yEnJYB`?Ts~S((k|K{(_0lAZXOqoU?8W|TwWIk_RGJ|CK$3N20+6uANbcCu;-6nwT`uumne{7G>{;$0 z#)$~KKN8|`qjJB^2=1hE3Es-h?fw`H@4HU7B zHh&jtK$I5k92s!1Y4dTZ`7L$n9Frmp#tp{!_Fo!~5F~drH4W1E%7EJ*xz!QKtqnmK z6$Ae*=KB`x|S3bt{>F99O0IPmdrbzYXOYmQp)T zn6sYVzIt|}+M$yzQ99)Z%?da7D=@qo8Jr;$5WK7XT0$Zh<-@O7?j@$1(ddUZ6FaBZ zUJVxHYB#J6JiYdchCX?oFr7XHb{4{P7+A<1OUqfu(jN}hc>UZZX`y!F#-`6;=`xA- zEt-p5bL83@`%-WE0&jl{Akt(zfxnvo_g&AnPaJ*?UcWyMjis7@@rcqEqabENc_N=& zX>yZg(ph?!aLYRas;X7+an!yAzA86J`NC0w(G=@aF1o}^_8fDJ^1HNA--mSdJ1E=L zarpE$s`sxRWNoduW$AlE3>|&4UQuD2hf}&xP%DcF`8!upnwHMW3E6s5Y&X-Ww3E^?B6gk zo2po{MD4~zQ88VHL&HZdykA$zyl3eXR|`S|;t1psB_r=J{1f+ud6xrTRSKa{Pda;b z!-G@Nhbpq3e*M+6s*hkcmH@weuHGQN!%6Qc3|=aT-YaZ6FkttB-zCK# zY`U1M?Oxf;V=uRSQ{xDoQODESDO5mL^K7^ezIVdQg7gIeCCj=-AecI^DLWoOvL>gd z9zNs=6Rhs;36)p8W=FaK_eCH>aBCY|GlJKqx=cSu^;Ud{UH|$Z!9$3fJKV4){BXll z(P2ui<=Q@vt)ZQucOt!P;T>zTj1*lPU{vHO4K~@9$>hv(7ojWwB zYj8OBD>?Q+Vr9>oc2uQyL}u80vPA@Id>0lWK}yJp{vg4noGIg|VMd>P0G3@p8Q!8&cN38NbXJDaU8!m%rk2@7>WJYEQM|D231`hf z`8_i7DXlig<2(Y4B}W0IJ%qyg#emK4075V;`q@^W+W~h06Hlgxpvl_3x-e{8U2m{3 zHeO;*3xwcZ0vGk`AuyHjk(cfho@&+b#g-0qKZ2O%i`a2H{bq*Aa6`HKeUwy8l)6s1 zGyhI8k{QYMp449D-kd~epQ_-a-zpiEs`C5BheVcCKU}-^E+5EWpM|pJU;JGdBuL0v zuRzWcPbo}$Wt$5b8s1#5T)-q69o*h+*sY(|-CP66V@T?LC29MaB})aVFNtr;jVFPr zIb04@ZVEqKe$f&SLl(#w(6goFZ3~;G6bBmES_}6###@mVOcXajWWNS0!`S&`EwUP~ zg}<_hl|3GGGD`0Y4BV^Ql@SaC0qGL{{DM9UpurEb zi2Q5^nYrl0^uCgA80RDdv+e;My}+$-VMLZzP25jIOg4=1n@ZaL z$s1IVW_`KiceKt@Bh-fBu}JS4k_c0&JpP``5a?Qy$2wJ`pGA847;wbxy%iG3(FT>D z)B9C<=VgC#;)kEG8%Y8_7Sm-($$3uedmnqiiC4BXo8PvB7+G4>m(OMI2euudPMgGw(jDAWfnr;vnXu zBTar6l{$N>i#_aw3Bq}!Q>Qm|Q@}%;qarMWsO`y8_wyoBT9!KY0AHnYC^B@;E0H9j?~8lTStDtk2ys0%QC3uaAgvUhuV9W z+yYw5q`7t8JYVBCoPLm{k)ol9R?4ebmY`UfAF*7SYUA!wj(=<|`ZYT|q8xeJF3;c` z^0_&nA3JYx7X~A1?zpVlG)EQ3|L5)R5`nGJ-LkK%>=7qBsRAVwMZ`lQtiE8A*^XI!9d2Y8UhcKH*MLa`m)eKU_{s@y4c?-1gLncirNjb{2Lq`f)1>V+hz{#e zL*B~Ii8O$Ih}Q4?9abbp4M~Bg27OsECX7bs`Dw4#K~1S3Bmkh|`;Jj!4=A22 zU+bKYZgAI7?ULl=W&02*yt(Dg3i<+o+&>O^T2f zNx13jV|HN4Fu-$;jGo@+-Zhsorx~}zHaK7WTP}aLer{Hmx9cxlF32rzL!Al^gc9PN zouxfv z94q=35NYy_NP&Gt z5M9Hw2Zpb$zubWp^wy3Wq}FbT6bow{&9RnAR~KX05^A5Fa97}aByjT;W%~v|o8;XA zuzZ3Zsl5Ucwfh$5?z5_nRWX%e)B`tH@|+8bC->|#EQVT46f!}6lmU5ebMSvO=k9lr z@>|YB1)o-b_v@Q#i5tMrz$Pv8%LH=pQVU^Lu;M(%8%VOb5 zRs^$4+Z;-T$#=E%DYfw2QrTmmtr)w^fWD-no>CiW_~dijF8w5?Q;_Q2OZu>KylBAF z0NZ`7r~ORIKo=nA=JYsCH{e)uZ4M8 z;MoASRY;TOz4t)%#^&IKxvXadd9eX=3(NMk3X+N+7tW=!7ZYY9R2}esdD7rKYwJ*@m9y%Hldg&tA)T+c^@V*FF| zURT?}>C71|4dk;Nle${_2HJ21AzRZiD@EnEx0L`N5hYE^(M7&#=^=<4=)chAkqdro z*+QO9Dc$#;(T>U1V)H`dddaWB=AUJH02E}v9ei6TInLuHkl1-#WYm6=UK!UfxH0#Z^1pd_%Y7GLY&=plVc9scJNDy^8=;#Z!sI70}si8eNeK zL?O_eBgnnly9$}_I&VoFR~62MJQ^Em62|)9g%$V$nl0HhXI&b`%iZ}sf%3)uO_q+> zDy}qs%QmZ3d2p&qdaYb=h-C+LGrZKSI2sV`Q450V@Cqo=_{}Z8?3}Gom~Z{0@3)hN z(L`I)KFQEGu7_PMC@$y**(BLPxdt4iSe;iZwUPqfrVcpwxRRUw^*i*;RdvF0L0xSF z=}pp0LJ|S)n3nm$o(5}MTiHml5J|7*DI%;kyKK$Yz*`fV9<%zWs7oSXZFVw%Y=cYi z44KHTo~W_k(&h{EbX$2g;0Et;8=x{|%S69e33*6bSGP6fJ>2#0HWf3c{U@WFl@XTF zy-A}r_S*5}EmCfmWp5XDI*?t&mvpkDt_^k;T3wwtO2MM!PveUA=5#mLLE})sh*n~=<-|AA*R}E`LQbi}1#0aaEsp=N@R;k}tL;*130qgtI zMvm5eO>{Pps8PA^usdj@8yk(Eff zo%=}-oV{Pk>HgTTehGvSY0{mW{;puXWEF!Kw|k`C7L^M`)<+J_Ak`)A;H7*IW->D3 z+b4rTkc+1S*B;M+mw-AG^ApxE;q9Wg?APR;nKCp}jN-)7K`m3FQP|t)|9b&6F~PE4 zCdSVqmBoT)R!ZHcfDRwcChD#HCtjDAo7uzaCxOAK81mrPBeP<+tXnYuERe`ZtNr?NV(3qOWN0ZF&oH} zcNsMy?Gd#BQiK2|lQ6T~f78BG2JFvsnI;Cby2zN}{Ivg_Pr5YYCBQVt7a$(=csNo))*~;N4KK$D!9vZ|+;N<3DmY*H zBuJIm1c249mBX>`3isnqDmv{3m7@J7tr8a#dG9F8TyH*WV`)m?C zP)ao8`r?Pn2Qrp&BapzX8%d@zs=MFv#BjcnfM|_ws??{Ps5DW2k_zzC!dohdr+lJ+mc?$Y*8Y8ydm% zOU?5WgK@2 zpzPw7lOn|#jBohL_%W^?MKtN#)lS{*dO@yZwwFN8wuxGIrR}xJpHIYH@x_Wh^2;Zs zW|*Y}-a4Ks|KL0S)KJGJI?uhdF_D-iJS14pwlnRrq~huo4&Y&G`XR)<=S0T{gY1{a zWUq%>tT!)uduj57_i&uLhO1rB0KI5Sw>2W zwb@lbZ`?0T3TMjS`WE%g5TA$iI+>cfyfl!03H{3wSf?eqzEnlqk8|Gp3@rP}D>bo|+ zj>e`^-HgTCipy0bEkvKX1imRs+FwMcHvS#^K5#_-P|ytQOhGa&&D2SUvx)O#$>`Ve z-1|ya7yAT-ZK69&D}Es4HogYQx!D=ng(Y{){ph#_%IwmyYsP>%8UWv_ zSaXF45C>BV@id8wKxv@YJ%;O{`;So2f@2Cp1?%EFFtWGnT)tx|MvU*iE|U-X${EJ1 z$!RO#-(;N6i=Ty~k7->%8R*MO0+^13SHBaLy&tskgET540j${TBY zhH4eC2)SI%7oEQ|t1oW0!WON?le%We>b|SFXt1=)Iet6B_NT;xTCEHS+EwCq@?h;t zik#O{YS|7*+~o1R7%Ac>7OYMC2>YD4UeUVzwyF}T3`H5Mj=6zT<18^qdb#I`OFbra zXfygP*cq~K_z0fGv9tfvpQ3^f9w-V|iMWAKy`}5{!#S#z zbd^n&p;~fiiM>iPqptAnewkx5fpI238(n}@y}qtFjwPZYUiGk9-7bdpPhYOaTGxYx z7Juk$A?}#p+)BHlw1QP_Za%+A+m<{S(f=8TelPco0P^D?oFYSM>0VKhyAZcQ-Y{yx z&UxIaz14cM0xG>fcEO}xc9LRk1HWC`Hmvxy+aj`;ay6USO>!~lSb-@@I!5Fq|G2uPFXVl1|#P+P) z)+Y0Rm#06|CF^x_{Sf<{KmV5&vQ5S6^tL%<`0L)Wt+3<#6@u2~R=XWStnT_9u?Gzv zlvR97pcKh@!)I-P%=ozvZTK?*_1> zCTj^%{SvD)2e7?By|mf#=O>3gxmclhE%f{KmJhpvikRCglJ-lD+ZJ!Xq6HRzT`r=; zSx)Q%8QSnU+lF-%Fdsy1UnGti$Ir&-b1Hz;4YGQ_I&iP1*~SjhXkX83=lYjq_po~ z&j`-MSVd^j5bsMP8Hz-tF`LsAh+&b3i;EAp%9_Zh95c+o$n-vmKyBplmi3;o(JLB( zudlPvVu^ykCWC`AjLy2YO9@>EJ)3>8wpsKAj8o6fq$P4zwGlJsS?BrH+eJF0gTj=O zGo~PQy;;`;AS&OK9iV|dn|E22VRY6v+}H|Gts`jRop<52x5|`NYA{L>W-CKBGB}b+ zo6Zey>uO#>e)Jrn#!H`^zT?f2wB3|#a$y5930F|b$P=^UZYQ@{1$7M2ag(28qxpGd z7rR$4yNv>W-AV9_CC?ZhX#3(&bo(knsdIN4SrDlc<4G~rNReot+qsm19KAk{$ARyk zL)K&ayIQP49%No-4U3O;yg9gmPH1Jfrby~KjExL@j%(XhnV>KL4+#(7&C`;@ljrxX znE60giA=VJvTu)@Y~hf*#CqmVSiVf~KZD~q7!Mx{C}C*%@Lhfx+RD^Gb(P!_t3oT0 z5%R^w-k*D(0^~v-3k!c$8saO&u4I1@MWOG0%gH>G$3Ml`5gS=PY+9-GVy}J+N{eXH z+7Dsc$8(~1$Iw+MQv-+3QjgXBJ-uq2<1GEZu-`I0+6=aO7cFgxqIeh&I?n{&gMAo} z^qZ%WE(Wq$R`(d}xp!Qj0FXGX`Qp4W|W?X@3 z;WH6w$~C{-2nF`2-XB0EN?ynL-VhQH61P$GcG!F)IU}-IHxfq?87EiYu-!VefxZ8S zeKzkD=nxng*wW6~O2bUh2_@eKpW+O5)okAtYM|PFY{`tzRXbQp*vPs6=Nf_P!D2!Q zn^X#of(S4P0vKP74sqLl6_MyJ6zduL?$pN1cAvve0MN9kOVr@8A6MBNFQlpuumc#l z@O6An?d#N4pG<3-;QGj5#>lTK+M^YO4dr|W)}E;X#6B?`$`YMga!QOh@?b$QHCFod zI1{|wSE-MFM$8~%#svA1#YL7n)YF=K!&L4#ulv+}3NS0~)3F7JE{za*+r@FB_0S1e z$C4g0H#7s-k_sqan`d9{*ra<_q^8V>)FS79Vm${G-8Q%|3b&6J13)v;=SW?U#4dm& z7D& zS+(g4_FlKXm^40zqjmv1>HWKog*w+15 zCS!&NzVKptFuIei{^@+ZL%@G`My~+|E)pGK7B7r9g|x6A>|PwVMl!29aLlF>k6k@5 zk2!e+^s@(rl5B{vUuw#?^wx!e&&XV#sy}3XdX`^sNRE)VOl&-5T~&}^nXK(L%>iDL#XU^il3UNz z^EasN-Eq@C(G}t;A{_=TqTIRCO*oS5FZ6+>)_+QTyUHzfyArI8tQ%CFvd_r z3s5IIIlnZ8t(KPF{tJJ#p}!k1gFm;#*|+r&`>lTbg_ZGgY*vPc*w$}sc& zk@)RkyZOJD@{!lM`8CG!XZr^Z`7N^)Sh!ANRNe+z-VT>0Vgd>%=BSwp#{~0~OeoA? z#7W7;+n;@VkfUJwhbsT{eiIJSA_!M0oIC9I+{fkPJoUCL0w_c?KFQpJkxfT@s~#4w zK8JieE6rym-JXGx!Q=9~5%xw4C)BhOFh<>Q zm(^x}fl;*ix^h0`@7?@7qr|<%<9hD^MN(3_WN7``*R`cll3a2XmfmMRJs-V}4K7R8 z)b*IXBlw5nDO=dCdp>03RGPYh-8ai#V}41Bq9NS=#zZ0Vqsy@CU{Jd|dPrv=KzTs| zmgjKghj_>8US32tn%z+ZJl#i$WM*qCG1L8G!lI;iMBt-EP!hBG&GJc(Q-?U0>yMRe zPLL|(9;BXl0>;=qb;W*+NquO|r%lkXhP|+k6m}dTB!~x}+Tox-%sIJ|8g)tYI3ClQlcUhKz9ZPsQ33C$J16Q@}+)1eo*{g8p|6TybjPuDOr@ zrFwh=^6AeWD#s;Jg`AaVR_fF>^d9CKrp{#(OL{iCiL$li!fRogP>vfSkA}4qNa#Q% znF_(Q%Y)WEw;AHKpr~mMipLdJ`y4O-moYoFfY9qkIe+T67%~8|P8%7a zX_rg6r;|QGx7&0kI@Wid<6W-bN+=2>kohx}V;!h9@@(&(<)!4 z)qUBmldiCoHABi?Oi00kG zyubA!1pZYFM#-NSZ}d>}DWrNIOyuIs_xl?hf%%deSmZbV)cGsS=`9qf5v+y`I1@fj8kSxA=%aIby&2X_UGczOf*) zqFu&12DB<~whQ8n+r_X=V1hPoe{ifx7m)?l;FFtG8jG9vn9%I5v4s@L+&?7ie3BOp z!t4f5I$&SVhsTe>ZUAVi1!YP$x00vM$}}fC2mQ>Kx_tsrmo=HV@BS-H+MWgq63gg(#6=FW19TTG4+KT|yXD7eIx7a{B6#A4)^B~?^uzn+fFP@rWez>g8d%dZn2|RmwGbR^o@vnV*mpVQfnHMx3ry)Cs`dV(_?PSRK4}-)H zfQu_W3_B(nlozEzgNUGIwAWaR{mL5qEWfA#ScfG2-Ot`5G}VHu%|OQG z`O&r2io9tlE&3s?e1^D0`S0kn51?*|25lEX8DidjFM}vPu0x@9|{h3 zE`x7~H04Ga-LAXYiC9#xk~qeg5Q00RFn-k_aS!IpOJV?ZF}%KVu6&%(o$wzR{2ViZ z$XyWX4`>mCvwYuD>*)Y8keP(F#363jhgSJjbGVY`q-&=4@X=HEDL&vw-yGh1~yE3PwoaJ`<36EQowUGon<<|sUw^r?kQTaz ztLg9H0kjo12uH;UNt_yqZ%0_hgiFgr90R<{7avy*6c;KjR&loBRu}FrCVoI=TxGR#U*THLw&n%kjLE@3kv1ai zxsMi=Yg&nA&w(#4w6$21(lPs#MZWLq9;o0nd^tlEuI3UP`D#9p+Ggn=zm74nSV27G z`ZMzztL#r>;D0$iF#j$!H{;SR)#WDvjzP~gr0Io38>ke$O1`1a9-&7Xc>k5j3kZ(v zMN~*SwD1UH%ABN}7ef|#iu{ezvhmd@T)}i4yNUE{h+-4jsP^{i&J)41s^{*2ejh>6 z^2Bl(nW?sE@7;~K_*#l&J*TC+6Gg8`I7B~?LH5~F@#nIuWt)-DZV>`ABC3rfNdb{Y zl(sWkmTKQPzmRMHI9$~L@`II*Sz3BHSD*b2pLy&y1&UFXd>T&Us!J2ZiAm{6N7EC{KjM&&LFcWbz|7ojs zV&moH*S1=0yoGu%ENt+k6_oka^D*QcvR5};Mo^$mK+kM{dXe*x0oKYv&V22QxpzHt z`n~afiCZhiFzpyZ3zz1bq2Wxk$Vw7L$!XhZl|*&^V6kGW!Hxz;uydE3x9YnpYZIzO zY}Cs+Cbjdzwd84377wA7JLhJzY}Yyc2?Jd7olz`fFkH|7ROhnfi8uQjV69%nD9`#= z$$hnmlK6>ROG2QXeL+W+=TZ$+02ITKO}XViN!*agSCxOCfBj~I>x~FHQk!@x3iXtsZic!frEK%h z*zMz`@jMp;1Aev?ZSSIX+|(CyGw{o%QcqWOz>wdN+&=0w0$!lDfcWc*KavZytUe@Dg{;s;uv(u#(~xK(H}iV&p0HOyfF=Po;-b1vF~E*Sp%mSO&qiD5u7V) zoOl#n!9E{Lbs>=hJ~C3bc-@@TH0rNBI7e_YQ$oh>B=D<}aML0vdcj`YBMjeK{9{io z>?kj?NW0XPZSrtb{^WH+c31$7^@l~7!f!vd7`y8f9Wk}qMFgvuQ>Zre&-<1wT_^57 z?a?(*sSA2>=SJ?aSPY1mhBfviXFb{|s;eI&IKYSO z%FprgmM_&J72v!s?e@;q=L+B>_SQ)U;M??%A){t>+~J|*nL9ZafZv)7BCOA-h<(&!_zc8`Dw9d`s4;bok)<^KTypx|Kwy@2 zHrY8jYJ75LufLcw*U;pj0is}kpljH*n1%iFrc`y6ij(C|THdsCgE&1k{Oyjc`>4aa z{3uE9#qZy@jlc>Od?YNV|9jQL>9{Xe#xVaHFaM?6#k^X!dp?~#3i>1=73xRZ(zuhM z{*`jykN?f0xPUzgo0IP-5=BI}22ahIZqP{?ZXHWmrW&A)>mYYi8&YWBt}odpVxya|&xS$3#`+d;if(eMT!cx?@dxb5X#J&N+1nlea=G=ju&3zEfdKT& zTc;1!KjroCtZ=yd7F#D&-qbqvpEEvL=x!GZsGD2^3&cTSA#Q`Ai3@?)^mq7daus#Lb+T<+}{sjc#W-d4k$b zD3v;yeP;JJK%{X!+PhXemoRGA-|R_$ZgSkap{qx$vtS1c3i|7fZK14p2j7S1{?>i_ z|Gfb1V#1f(&yinKi>O-uTbwm&FsNFW5T;~wCznh~@W2zz4X5zyVs$@#0-k;2aGjp6 zT7C$8hp=71-CD?H2xgF!kXd+##BgsmdWms3n>H)qN9ghOoFngHSNp^Mn!8?;@&s(= zR=5Ku0er!FP?sxw9yq7nuJ;wW77j(yoQ_k4&0(R#&6>!6tKN$QW*On;c0t3x<;9^qc)`f z#pTzEMG2+KSXLTuJ5M5&YVG5bgIBTMw+I-4C;~3=IAdQ}O7j)f&3@a5SJ4^cLEU;o zWP7BO8SZMCUT5&7ljmPvWGe$JC!5_SOq82dKLYbPZV)^|EG+Q2KYgP z+e~$>HUWuy%LqPts;T1LS-z9Ouboi^zyA!U-6`2zj$HGyj`sVzy*}mK=r@}`Q96eP zH-Lup58w`25=|!6HAYR_hnXW0AvZ$dnVwfGn70*D!a|Pl?wTA`hnM~Xt>m`%;BxoE z+;zuHika(5J|0V5+SPJM6I9Tfj8fsIkoFJNr(g80lm#~Z=h|R6pVlOANv220bVh%DhamnoXf#S0M}`GdUuUma_G@Rmz4SX%NM|EW@1*EdvH!NW zz*>d@#Ss`8J@Ddhd7__Qw%c+-^Td0w1p03hl*XKN%j@+J1UXo3ssgU`4a%Y|5+2QrNlY0Hcva_AgH6b zg9ywvBRabmmyFrBI(s|V7+)VhB|)e%+awWOv(n=eM9aM9+3AQTq8dTg$)Tlp?ol>f ziTV9%*nS!`Pef4}gOxJTTPNv7{<7@X$?#IXcx4Go^JVZbvD+l=B!AL@fE2}2wRnT6 zWIvTE+u|hX>b+iJ74OkCm%ir>3f2KUrR66EsrtnJO6Ha~zbJ%<1#fJ2n`% ziXNTpz=!0fE~4Kng=JOt-o6rCRW<%^Id{kjZa>diQtVr3pq~|Zz=f6W8Q>4ECvF#X z`nB*8956g3PpGtTpS~hW+8h&0*)*P=o>slJe;e}z$rfO#ZnkJmKIr-w2fl)iQjfqw zi*K=bjZX`LBS2i%Q(;9DyGU6xUz1r>)pc3aSv&aJBza#6J#G6gN7 zAN3Lv{T%7tu6{wa?P3Zf! zlZ0c=lVSvdGORr5LFOSfzntjMG+a)n9(Z=#LH<&e-~Z#4^?uGV5LZFyjo0bz*NPao zNevg99AbZ$coRBmU`N$w42Ye{yu#d&a>KLznD+a-NNVIUVxMT+|4?qp;>jPIN4_Tw z;Sqce=$Z6kw;tAzy4EpeF?VpxHOUWxxxIg{_T z14*>2`og4L7jmPL?Lqd&U-LGX(Y&O<-t0a^QNek(tD~7^6OItN1qNiskgZExgVr}w zae7CGHs7{>A-(RXRwm7pa?N;OLiAF)yfhthzKoR^_#^=i#z{Zh8Bt(2F<7r5AOzJV zVqu71%g%Oh%&+_UCrXZDqTy~Ty+oLb&A{$A1INd3(V!}Fg}w3Xw*FruMOk9DYnB!Q zEN}OR|L1hQs^TL=Nu;X$_@S6zIFg+A$AfD>R4xotG2cnA+plmAyl1`A>aR+IcrL*= zh*0;1jEBlG%QJfu74_yvDgI&2l*}-MJ)g3qd zl{lIvo@hdZA;Bu0hzyw9x798=)(D$tkM_m+a0&- z1f?hZ=X5sj*L0x0?GW;`c@c8$o2~jI-bW}Mx*V1*Kk#eHTrNdRd{fM3DN#8PZm0ej)#$5NI>ryYMVxN8h&}1b z2NCuY=@QyH0pfwtF&5evBGaaxDi^O3)iLdhti(9CFRTu|r67PK%)B6!9kKHYq^w=K zueW=-jDo+u48O5l?tN05KEX1N#T#iV1p6L*ed|Bl2yEJ`{RlGp)U1?|vvx_ZXi{XR zeEXNThDUK{@k#@W3F>t0-s(O-s_D+ZRNkwt3oZ^KT>SUIot)ZCtZM0H3xBSMEOSd# zm zMW)G2Ka0Rd6b+^-5mR4 zjEe{xhBl&)Xw~7u8T~;fc2M zI=|h8nIEy|JP2xak7jo5EQMb89!*pcZU5EwKUWkbNDY2GY%PdLa$HoniV`KAeKPX* z^^niW!>r`13C9~p!X~cDdewy9uBZ)tLLM7>DOCpYWA;jt0#8WSdiJtf1X~<)^s!7` zjq~Y`4!BZf?SE!ucDjUkvhTIhN|XfsLrA6$qh9LDWXen*XjUV$58mEK|4nBX{g*h1 z2@l>w#FZP}T)yk6o{%lJCOgc}(Y-NYspi%$mFM>B^()>)=MYK)YK~r!1m~BOX6$#q zNTu+5%$mZ)ualX|(|1^WEMTdIZk$suw-5TfSkABXFz-LM&0GRTl2-cuCWKj)HRU_AzWUfs>VLHpmf_1V(1Dh zOvv_l`^=1Od+z&p|6J*XHeivZa~5}xUKbY0NH5E$7&IQgy{d=&6WadM^tt}Qw>JuD zuAjZH5&RA&lef>Ku<@WnU1gsTGFtN6uG)huKUtZ=XhTNS&&lOOS6^A#OgOa|%6Pp{bvS(dJBPr;l7oR*_nukW@=A2n7!-OZwn!&*zJPRSpp~ee zymUqqJY!{jWx;t{;D6c!v@9q60ij}H0lZ&^Rwvt7y?DH zK(RFuGF{KCEZdC05|zyT^>jYB95rAQH2>VE9!_&tePd3%y4Jv@PE%CgsvLylggZ!g z@Z9??uHkpsK~nyPA zz!Aidivm1syzo>V%K`DQ9aqQifwV%X!$f4t_j&X4yVYLAX5`y@12u<zFRa8 zq?cU%)b+AGGN~B5mehMKZ-5v60#48;Fo$2CP>%B6t~^`>57X%zB*=X-t9cO8tKiZ#o*u2?hJ-rcKt4A*(yRrYxja-;+0EHz;@d*#tQzW z_s2D1-dpPduc+&&NZoK}1XuHn@oncdvU$sOu$I#VANhNBoF`P%vz-vr%;LJ-?R!{h&gH}`6T+eS7HNqRV=e@@{97YY(6+0BFOc6UPS^*px0%t%&0XbJ%6sz(1_pa z^|SzDs`^*{p5(>DxpR4uz)IP$#s2zi-s?+YjX)NnyR*(oZ$njWimtJQ{#KJ~6Tzgs zUe~NBAr|+*-m4ISnXIxs+xq9~S6qLk7RQgbA*^si7rCx!9?-?<7?<}0Lbr7Qgo%)% zg4qY2GgmT`zmG>2gB0uM5bk-V*Rq3dGwIy%GQT#j0wZ4u0Z_YZkeqZU*M1Fxztfwt z25|Y1ZJpA$u<>8fN0D0BC(@|{kn9KmT)>fN4i5hN>x=;x(5^_r(Q{5;9X^Y814Y1p zi9{z(^9|YV>HUvWz7+#8zA!3GF$q$y0E@6MSZGNr6d(z z<!>E6WdN~$A?LZ&Zi>2! zbJS-_z}qSBJ}-T3+Ag{})RXf+1luS8R?{GV(9SMP9bEg!b;H{O{e|w1(BPGd3@(y6 zK{kNNFl$dmJ=&w)@0`P|!3!873_RlI0(cucVjn1&jLt5o=_9M_YHB!@xaEEu57ohB z7WIe?#nPK`X*~og@(W324gbXw?~QfBYceQ+s}h|>L*hp z?%>V*AAyd)9?L^qm@p%mTp+pv)GGq9pq=+99GR4^W`ZpDfI-%wX~W7VpftAo;K|Gt zsF%Xk;#}(JL5`ohF2vLLp9~WwT(51QRiy~@Woi(RnyDvds03R|4zYDM1hjDye;eUF zRutT}h?Sgc-jbte0z!5)?-{$@@*<&s@tO^gEm|CWB$k1I$A$ur&3H;r3A|Yslh{qm zw6@iYQ(>?18u+>w_a6$xv<3s}b;q^Ypr?gnS8qFcEND%2)X!-7y|&nuDecg=UAs<# zYBIyCc;BOubr~TKo4RIC%A#-j71vZG_Xn5)Y^Su!T>WNTR45#@v5`R06bK1$YdR2% zVDVCq9Q1m?yV_gfZ*x_9DtO$7xV{0`a06ma!#A_AkQrZ#P={q@ZI{b$`3Ht9tnN?r z@=8(R_+REleK9-@Q~E$e2*}t5WEH;U%dn|zWV?A|ODE}atns~e_`Y&{1PRNg0beiS zf{H-nyl6;g^24i@pzHs?wpBx=?;k*un)aGk>)ztB*V|*KTOtb^y+xOkiUNU2LP?kQ zzwgQaXRFen!N56rNm>)WllrF9S6O#{lwzZq9riO1h~N+px9p{S#6=i12khQ zP1e><9{L`_xTDT0n7Jomc#-q^+03*5g4lfv*YPzEs=i1vz^qF*lS!;D42Z5<8ylnO zU`oE|WZMdnxC*a%2R(?HPM>pMe17dk0lES((EpY=&0%qz=9Kk*XZE;?zHyHCnQT#~ zB%O)K+0Hn`7}Gqjtv*XkIkxNs=Yyx90}9c(1qa_xzLkq-U4|5DTpMrUR5|0$}0|z@0Ee?`F%Ux_6GUQb+5~hQy!4TRtkRjuEeJ zphP3O>;nEi;QdBKgl*~bo|QaJN>XurGGqPkGKB{H{HAKXX9H`&vr@_SqIZf?ESZ$7 ziOh$K*`3#Q3U0;%IDgW=g z#y6+35;?qw@H4X(H;qrg1Xv5B-1&B%5U2h;p`0^uq3bvAwY&n9zq~jGw{kKQ@gU%n zmJGYY+qR!IL3i{BS>A-?C{RVtIur%bZ;nEe8k?LQZHuli*fol7Uu(2&eCCESnae|0 z9EJBb>ue@(U^+8~nDQnSRb86wE!uOcyx01-c!jJkT0!uC0H_4O=1#3KW~UaV2@Y=fc-(tW~()o>0P7&N^LcZ#T}-cNUg!F>87-tl9?uRY{>Ol^s(y$S}|>SjESgx`e%Zo zVt`wCZG`Vif8EsM%8`|HNKPkd?hQgz{lX=ku7Yr0wO!9w>tw%wdw|Dt9MGz~X3u#1yAM3AP$oh0<|Zn zGiUXm)>Ov6BCdmMKp7?g0Y|}Bm%f0zen5ugEviC-y$N#Smlw9}bj8?vFCK!SGK&*E z5z~2ZZ~v1O41k$34-VS#cDD|{a7m9dltdOpO}A99Jn@m4B7iFRM0Z}W z{`!sOs4#*p>jIa{z32`R{cR->6z|QVhxiFwui@Cx5XpqMMZMcUUGYa5gn+^j56mn~ zxeqBTNF>vIFyw@HbTADB+kf)!0vHqJL@G+pWbm1!=WL{8)Nq678oF}iGo`&AU$%oO znFkbllkD}ZDQ9Nw;hjS1yPs~{o`no7A&0gu=thyW2EW8$A4CL%<~61s2^P|Jq_LH~ zqr`t?`aqESem&dP$!i~KQOYSsS^B90>fm@TlYGbDV@C3hJfUoy)FHIN@&`DJKxNgp zox^>j?!m4ht$&uGy~_=+w=uZSqnF>e$LR>lDxTGU<7%@|C&k~ou|U0`+7$$~+wcx3 z9u@$Nw!im5p;6~Vu;$DL}hAy@Ep}}x$%edy!!Ofda__IK4qD7!Isd1 zH`IwZ^L|_k-`0HJ=)TnkUn-04J}kU{?V0;V=WBt^s_gl4|QrXX4BcgwPYZv`m zhoLCG@&=k8W;1kr3Z8LnpYKd8pnKG3M#-JJ5uFZI$@I~43}N3?7g#*$Q9S$+TVR+0 z-Fd<0?b6eFZ;eK-pN(n{H`iAw!UfS(y35czu}%qH&9u*j^x4Rc*yv5?y9w4Q*3}%% z5xF zW_gsC_o|7S-l)a5dSDezcRx^FfJC+CF1yihEx~O^3mtWf-^ig+7bM;T%UxuDz)Zo@ z)LTD1stgnZ(Rl8+tY75>lRNg0;$~LXCz2H=7ego!3dmMrgOQF>MgHYWQptkFe7E)Tip@w?4+Qda^0F{oki1?;##hQZ9Z1Z5sEtQh z%xj(c-K5R$v8swHOF?&D!5jqGwo?Ul_U)FIIrs)bFQ#lLDjQ4B01g zd+_D>rvJ`+%F4z3X~bP3PF^5mhW`r1PhHnRYtx6L6g>P zD-V@Rq#)$=Mnk1bA+%Ld^+vxPnbA5;#z;Uo+5L0 z2*()nu%)=`K>DYO;ySNlt2Z7$ScCrDdEtyzn9!{~Re^y&=j}J`K3M#1sV|q5ND;Y* zKeDIr_7tqNn9HKu6eXG7k#=gRc#Li~c`&dncVqS79`uoiKb!Sgxc>%Iq8)BEWCn^_ zc8Elq{w~dA{4ObF;=z@VQP=H2Ix>wh4Ii1CIt{?gDHHlx;~F2>B%vMY4iE)|9lWU< zEr4Bdb2yNm>WgkXvLSHa$+C359i%HCF}UU{Snr>k+Eqr%XIB4=4|M#b@^lA)`&_#3EknH|ydrpi?W_0NYfopxh0JvMW^9*6%}0h? zZNYm;wR`LxnNN`@vD>{|{4TWt9+u9WW*=CKG{nHHI+*sP;Pa)|cU1ViBtX?Q1SZe- zVt?~Dd=Gk}JSR3bQ+D|Ee9K(62lK$x?}JsJ2c}U2ttPMFB+8vS z1ow6zQZ$XN?KF`7)3>8;6=e3d(^~rRoX#Yes((@~tY=f|_U}Dxe*1i$wylR$9F^)| zeX0v#miY)$k(V7FOxcS7n-z-{vljK#J#13rxYcl?Y?=x=J7k(+(M<8?#j62rk4>$VPo)kt?j z`*|7X^a?H$ABQTJEu}aL4=%FPgU_SGQ-bK};UV_8d#lT=Nj>%VL)sV)2Df|@6%T^` z*i7_dRHi>r6Lz-CUpeG+yjqd&pVX4Zi}HiMs;wGUFsLHm@6!{!3xQUqpl*&7VfcBU_kIc7j1Hs-|7hAE=KgA^E zKdMe~z4g9H-rF;27tVXI!TRR!u~UhrJ`R}PJN@0!4x8q!vW}~54bzb9kvqqdtHRw= zYBZ1+@qVu#)YHe8&fN69TllTE>g9B%9P;MK5dDoBBuLOY+WmXv*9IhI*WPog@((k$ zjj=xG6HkYB9o!Adt>U>^JEoFl3lG7pZ7OeSUb0#C*S0D9KGt!LgtvvijdIw^PGI&V zEOd|!C8=)^^5xf56s}2Y%=6QI>LD;_YPwwWR;btavGtbc%zI3w%!H9wK&-lj!yU(B zq54M;e9>Z=n-$ii!Edom1-cf;&G+>#dvKu3I06Cc4I)x`oZNc*4TtrxQYqS}&J} z&2N97*z-s-KZhLOdF%QzPlZn=b@W^Pp+t_^H>063ztmTanL|@_imB~nFC5O6s{4cU zzK3zL4{X)Mvj4`TbbT^At(y|0_-7#MY8+a(IqR-!5z?~ai<8}DJ znnlsESjEOMns)#6f=s=ha}SNnil**CaDsN9J}94XImR;gSJa@p1nT9# zr?2(nH13E`bAeF~MEt}A=tAYRZoJwh(d4OcMfNLi4y0vJ?wu_>c=4EAygXWf4+AqE3|T&PAvPrRsUE&63}Ny zFEKY2$_&iLtH|1e^qYz=iB@dY#I0L-6!udV-UlfQ2A;Yg`>Xiq7ix-y+2;pShbO0u z7$MWO6_Mz<`rzQTgeNO)GS1WH8gPhx4@< zzsK-{B&7#649xvPpKCP5@7Xqx|Z6%$9|uP9gacXh1m2G$9TNUXWOTZHtC%^IkDc->dT?xl??kn-!P7&7OYD$ zuKb{6X>oh(*Tbf*Slk^*Qthdm;`;K@tyNX!HEi0XMPQ7F&g3GpCgXm39@m|`w1K=3>6s(mcNN~Z#irI z`M${`I6dtK+YHuDJ331RvV7u%F42o7Xt9Ysr&tGP0T6XfWQ;mx?R&6u*>hC&a^MHW zbeVi}1u($I-5TQtLwPio1xt-%ii=avKs)HWf+buEHgcAyF`ZAO!AVzUXlv$MGyRKq z(K+mvg7weQN0}8fAV|sm=qx9UQcPNxwGilgfIpi!ycQ9O}Lo-)&y8g+9=l zZvkALyEd)gql9$zKp`*$87Y@2v@?*U=CH_w-0VH<1@oAidy&!1Vrdz@fuILa@j~=|4XxmtzVDSHb)WkCZJDy$Bz( zm=H5(C~eP8)$=U2bYkmQm*&dfafG!*(Bty~FTwWv(VszrzI*0dTTRqhskt)gmwvkp z2b*H4RTuh*gW}-?2F$lqLEW}Cn|MFbWQrTL4v{S_E*Ypbx|%)V^bD~)^a3B{`+j1c zHX6(7<#nf5xm%)NJ?<>YF*^&U@0s_6KGHMOGZq9|qe}Hpx&%J9L#@M|)$233E>ZQ3 z$PcpV1vQkSiU-VT44dXdF2kq6hR?#bQSCj;xox+XeP_qlZGacjF2gp!OKoXr$d%js zVNBpn)uP+A%%O>X#L1o;w}D(}5mRbGmaoT$8*3yl+q3NrG>SlTWaqjSbexb@y2v=U zJkkwD8^W*$2N22=ZXZ3*WT0cqy|!=f_I+Zu+_lyxFDa_+GD`H^c#iMO`M9QauvC{H zVmY>Z{qa!`sVZ4X4R~@nlHl$xyaQ+S)<|QdD_G>ur{NUFb+Rs?$d&yP3faH_l__M& zP)EAmJPSTGVqX337MEc1#v%vw2PSp?={o#imBP^iwh8GxQ3>SQYymg(-675y>JVz5 zn?AZ6VZ9=xGRitv4N)Vy$~pVx@^}ddm71Ia4xsMM)>i+5w`G!ep(J*4Sa5<_jcI>Z zzKi_fw4bOC?V{^kTCH()B9Q?%>Vre^yr9eeTVo$n;ufyRjEu{xNcK@0muD|U70}wL zE~%dbcPIre^s&-JDm;25!A3p%RCp0Z=O0RSqUqW*GDa^rwW)`q#EP+wI-Amf+0W?TR4mLDVe*mWq!PE| z`5VB-@5MPovVWasM8b~G{&(?;lAF9m@y(9$``(R$vZLyr=SQg`eC92sB_>FC1`-6d-RL(_C@##^G7lZKN_Nr0vFpi`o~Uto?GO9v^vdHXL@aEo{4KKrt&N#lDNzCTsc^JD(Mo8pNT0kVn*f+!pMWIoMT~BBSm(`!2tHs-fW#-;m1n=CGwfo{f zGDV&j_BXrG-PeqENw-!bjXy4{y|hcAP`yKXfJNFJ48zj({;)@yr0~&;qjeUYi?=y! zYj)CLcBQ490Z%GnCiyD2NZX{0EcZggy+P=(g}K-x2fY2&*wxas^p2WC2)XKIL%)jv z9y5~z9)W%1Gjj6FjD0Cf=Ey@QG5Z&`hXz3K%n5`hf<20LQ;#f;K%?R2V%b8|(utGc|L0){B^dtQ75iwl?BwQ@zv+nm38_m^}`I+3^T zyNIAC<_I>C!s$<;I$?@_#8NoEYNZx;_7=gt&@Cda4{65Gil2$lgu?GjT>P0uP{8JD zKwUN7Ty_4YbF7U~m4?l)sTGxf#vOhywQynBXxXqS4*E-`#IYGw<(!U$fR$C7l9`?v ze3^O3Bn=F-(ln%F??dc|FQ|})1hMRvu}>(xA1RY7cz0FKnagNf>TWYiW~JNLa+N?` z$4U|AHOXh~_PI2t*HRFgw5s;t)+3rbEjCYABO(YCTMo2SES}=ky2LT`sr+n-?qD-< zMt8y@?FIucW#(SU);WZ%zWbb!X2VBgq5CP~ujX0p8tt2`w$~&2(*!fkucnzE>~N9i z1v5^!YpvOmuIn5}r3S!!acwo(Bj9_4V>x74qgg#{&JYLZ4Zeb+P3pLQMMn`e@3sDR z?T^2v+`3>i7~;x%lDsBh-bL16I_pwA4r}Mx5ZJ;p8w{tOui7m}^0flCz^ULsU~@k5 zrxfT(6xbT@1k43EJfU}nx;yH&ds`fNwvVSa*CW{Jj*4rpIkb4FSwf$ca)06MazLEA5L0UTbjYu8*zKOYN}xSv<{xnlVPgHRDJmvN0_U})y=Rt zAFe4V41y0h9ORf~1Qltw$OQFHjVx2Jt%%Cz+30!&*GvZO`qq$z2B}FU&&)_ZU%WtN z`N?sw6k?c^C@;Ua+4I)ar352XtMTEXUza{|j1>RRLECwJ8Ce@&2e01X`Q1Xzi>ox7 zP=e5_0K8q|F05(AenaHQoe;`J{Fgu9!#1iSG)a|3I9E8QbM9CXSK@T4JWtsQXBrbl z-}k+T;U1bERbNWMaLTc;+K0p?r?ANV2(qIXV!PY+=>v=sgJ*3p#SLAUi;mFUT&@(d z&c6bm8v+nUc;dT4+~gsDe%w@Z|6WR}#OX-J@K)2mqHg{nzlj$~yDF0oJa@z`zzo#Z zK~r*2v35{g;LWL5aR%;Ex?@`u20rN>l@{T0x<5=ukkLVV^YfHv4lVoVMt>IE?NZ81 zo>iPN_u-9MjbSR1IH)cu{U=#voSxbmRK>pj6BXfA#&Zm3^IQ?@H@cfJLu!IVINAE| zuzon3k{UMJ$>^;7Xj;4KFz*Wt2rH_#KW_Vzbio=s9H*VaE zADTK6N!{b#?i_6_622khp(4_hP`P{_q46S2Hp3@ko(o|~_Hbvy>xwNDE<+94*c=RZ zGJ=G3-4I9PB&W&R*fQw;vX+qzLz(q6>j4z?sW7A5hJLJ5gd|!${+yGmn;BJ+_C)5C zINSe`h8wrR>6b4j8i7@^6jdPM6zjzs{Z!d$QHyCXj7K0){&BCih4oQp7uNgGYbS&T z{S8R!2-}2db5Hfzq9u zlhkkKlpbSoM8y%IEW1=)yFZrQa{palU0+B2zaJnwiyMh~@i{=;X}CxLbA3CuLPUWT zL+1_iJ{kq(4ogb^lGm?w(RRxN#-gAr-Vi!UR9ShZaNTPe_grZ>#m@g+*agxW~)5Zjv)9};APXFi*`4vTb6N==skEm>^&5rEs?DpBXqoFK0@EThSm%h<#{U^4}Z=+U5`$@{UUfiKbV-}B)6SicZX zdmC1VXEMoPx^?i*3~Udw(42SL3LaJpa#Aj^C9?W8GZS`EITh{cizS1Fy?|`8*@2K- zef2rn+0dIKGc)Ijj9H35o&Y^;#bqz(UksmLN_EiuyHJ+#e6#<&)j>q+L-dmwUr z@P>-RYkPa!aj@KW7BvSfh1my9c{v@^{&>Ky7!Np;kEbxzmHDV3{F8{G-JD9cpyEv&l6*T?(iovz>R83x2J zls8x8<`sp(U<2f|MzNYFq+{kOElFIgzo*AMu^?$FsXV;aAE@I%Y{Jf^s-@+$$Qw$w zzre~k@O-dzE`!-bs)bL?eSpE`-*Ul2a=2fUlLh%D8$UtP^yV8o9hoxTbIGVR&x!Kq z60;YTlKQurtaic?jojMGAxGn8Rht6(j8;CKF+)Q`RJ_{apq(W*3d_%uD;<;GR z&Ws8HFfzTRu%cqS4Rn0}ZU9z+N^uv#F`Ok)O5LCWUPDdtX&Yg7B8Z2?;2C%-f!OZZ zi_VaPwb_i>XsU>lZV2Pe*FlZAiowCbf&17!LXHze=Goa9miA3+AYM|5>sg9>Roih^ z<52l?cu5nE86+*OKgQ?RG=r^dTFXvDhgX)BLEtS{0J7=@h?{(O=A4sip>dNL-kZG62FZ>ax zM1L&vjxtxqz&6zrGcznj&{cdE8#y^4C>#As!euCzra{GJh!u=&LKJH!&t#Qs)ET`F zpOOv)YZN|d>_*K2e=%Q3L43R=+_>2h$Zg+<+`7p9B1%b z^_ENgUm2Ij7({=bL0in>R&ad@R!k(S=`@vUWoOYWe_2pgt7wQ-;`d-0H zDAegymNlN06u`S^Uv#b@0e;@`zinWhDaBW5Z5#?hXbYG~6|rNZ}6o0EZuVe6ZByxT~EEk38C( zs8Cod$?^IdGcc@#oq3OUur`SEFg6}5BUSJN9Y;)0PXnETR(GoM0O7U80}bV#no8iD z0om_CWJr{Cur@mF%rx1?-2x3}f18_)82|O_Fcw%^NBZrYmf;&v=%Cc3V$MY?fY97! zW>uGB)nA_Qv*NbBBOn3imcVx!N0m8tc5Ef!ER?bfk??g?R!TZSu?mm2-vzTvu9#R$ z0Vt4vH@OMCUJu|81tE}GIS4uiX3wuxrH-Bw2X%yOP1ShgL0j@Lb}j#%i*KK*GvT;0 z0u7r>sG<%Psiy_C|IYVCl#xn!CXnzt*(A~CYajj1({GINuys*T2@2*H6F!6$@C^CK zSJC^0wSn(kjd`{5O0~zQ9Hd_S1)qyWs4#*>NX)XjWQch4AUjRV%P)Z)(N{Ju#cor6 ziSN|9-bqPGNruwicRDRXY$Hw=*vVKi)D0v9Kp2+y1TVO`sp<5!>hf>*stcCtR>_qw z_k#?ho_^9wf@%hyHgsHU&&_-~1}!v*o#0&~Wff{`hg*BjqGl&MU~}RkD6sSQH}?pV z@_Tv<_y|;%gkhm#nH{5{^683uqyQ+;Rr&;oVWN_`LkOQ_aQ|2b1UrSm>KadGFUk-P z9g&IKeuV8=)<0)vW-NX`Dg!#jR_`q%ZS%F)ImlMklaRhzKs#6sjamoId((fVQ$_}A zUW+PB$Ro(2y64(vO48~j;L!nrpfg*bxSeil1?%_B!74}olR`oeV?;M5>!9mNS?SH7 zgM>3yj7(R`2zbc(?H=}i)fJKj}~k^4Db z&0jLD1IP4b7y#wHhF{RS@bZ>$)8DUU(mBuRs*9SMLhRGF4G12O9Y*DkIs@}++m8O0 zRoUcQ=X3vSA`byXn zmovjyhUSTsk|?UEqphqTF_l?uAI;|JHN+hDveL$z$=Z<>il3iWG6eQ6Fi|SbJY6w~ zwq1@FT{qcp6{Xk)kO%r3jSk6diJ&%L+hN2{l9ZD2glmD1x6q$ZTkD|X7uh8wGBPq$ zu3lbq1G6dw@3^&{srqh7>{GBvKj4vk*}8j2&d*6&XYD1w6g0QxD zz(`C(eSLj!{ZWK*sX>5R^;m`S_D)lOofDQzuwdAhMAAPn@Nxh^>jsWp>8=s8Dk~Z7 zWJ&nNR~;pJ)6i!nZ~OhzCWcGK1Siqs|K#pxI}9Rb5yg?3u7BeVZOPi;?Z;X_!!7#F z8z-JUuzmEI|J>LWchBfn;`r<^(c6PS8LvYiy{fnM{33UL=lo8$FYS&a`6DGCr|?AE zMb_6fJg->}LYfu-U=-$0hrlpm7$zMAvQT3(@Hd1&Ao$H@=>Rw-5j<+dnF0FuH{a6! zoMO(h<^0*i0irxli9SsSt8w0b*z5#|f{G|Si2#f@)AmFzZx=w+QKO_E17#ljOm?nm ztFu-Cm5lpx$ z?&!T>>F=EfX|3DRXs&N%h`J)SAqjg^nP96P2`7D+7<0&g+{Yd?-%th;`q?x=JY?$- zrdogfOJ#%dmL#gl`C*D9vRjd_e2)qLincEeY3B(x+HDRD4C7@>xlgdvV%-6I3#n*N z2*Z()CQzjrTF>KI6D9)E)lPe2XS;QF9QH?@00 zF#y0BAW2!kPoWWFJC`YQC7jyH?vZBAIKIe&UYs0YYzt=tphw}`27s}!I9zk*vgtV- z#72_=kZxQ`N{a28U{I2}V%M`(Kn|Nnm3MB1-F)%9CD1deyCIMf=(`j{ZeaNAJfF5? zG@Q}L1#}v^ph8A8DM&^|rAU0j?DM!sI-jVLR}TrnU(A1h!usy&E~-30V7Cg!41a{5 z0P|hzP#Y$o*^oGGk(={7@3Vi^eRR~jY3#y3;?@f#?hyOL?jmui)`P1}{1%os2`~OF zJ$tb>4k(^{VCCJQdInj_7X#}DX5Rx)Tbnyj*Rd;a3{-9T>qptdh~bSyce=?xgNwUZ8a?=+OrqJ8|)9C&y+T35keYv8$ah z$UYa&plWDn;IK3|ZycEABOxI%#Fq=|U}M7k{Tm8iR;V<4aJ%Cs=Q-YCBku28dr%IE%Xos;$SaRwI#NsHx7V5N`nY&yEW>^U zHQ0zKQ&o&+exs-oE)7yCl1V{~NVMz5oV;sR9B6kMU)4&;=2QB%KRaa|-rC7wsXv^Cr1H(m#yck_ zCR(B_XWM2`?d9Wc%bz}dl1RwZDHb1}pN~)%&X_LX{t>VPrLl8zTB%xG1lq>BxKL%G z@q>aSAjKy4^PC2Sed#r;YT6aQ34|9&OO%=1FB`=8vL9~ zv-@_&V7Z2c@V;wmyc;%*?iL9%SL zF{s{)f2pHp13mOF&6iMi!Y^An8pq|>v#8}TltbgFC!+q1K{=3%HRc{^|USS-@u$9zzhCCZX1Qw=3t2}m8F&Ai=^`PLx|`? zn(Cb8c8mxK36((7)X2S82t6$=UJxZ_04FgksJ{N6 e|IgzA3}^-FE*aR-aCbc5(bhE3s8q9i`F{Y=QkYu+ diff --git a/antigravity-awesome-skills/data/aliases.json b/antigravity-awesome-skills/data/aliases.json index 1cfc649d..ecfed014 100644 --- a/antigravity-awesome-skills/data/aliases.json +++ b/antigravity-awesome-skills/data/aliases.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-02-08T00:00:00.000Z", + "generatedAt": "2026-06-25T06:37:39.000Z", "aliases": { "20-andruia-intelligence": "20-andruia-niche-intelligence", "accessibility-compliance-audit": "accessibility-compliance-accessibility-audit", diff --git a/antigravity-awesome-skills/data/bundles.json b/antigravity-awesome-skills/data/bundles.json index 0cdbfb5b..2e4ae8c9 100644 --- a/antigravity-awesome-skills/data/bundles.json +++ b/antigravity-awesome-skills/data/bundles.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-02-08T00:00:00.000Z", + "generatedAt": "2026-06-25T06:37:39.000Z", "bundles": { "core-dev": { "description": "Core development skills across languages, frameworks, and backend/frontend fundamentals.", @@ -160,6 +160,7 @@ "drizzle-orm-expert", "earllm-build", "emblemai-crypto-wallet", + "emil-design-eng", "exa-search", "expo-api-routes", "expo-tailwind-setup", @@ -302,6 +303,7 @@ "redesign-existing-projects", "reference-builder", "remotion-best-practices", + "review-animations", "ruby-pro", "rust-async-patterns", "rust-pro", diff --git a/antigravity-awesome-skills/data/catalog.json b/antigravity-awesome-skills/data/catalog.json index a4b076d0..69bdebbc 100644 --- a/antigravity-awesome-skills/data/catalog.json +++ b/antigravity-awesome-skills/data/catalog.json @@ -1,6 +1,6 @@ { - "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 1682, + "generatedAt": "2026-06-25T06:37:39.000Z", + "total": 1684, "skills": [ { "id": "00-andruia-consultant", @@ -15402,6 +15402,34 @@ ], "path": "skills/emergency-card/SKILL.md" }, + { + "id": "emil-design-eng", + "name": "emil-design-eng", + "description": "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance.", + "category": "development", + "tags": [ + "frontend", + "design", + "ui", + "animation", + "motion" + ], + "triggers": [ + "frontend", + "design", + "ui", + "animation", + "motion", + "emil", + "eng", + "designing", + "reviewing", + "polished", + "product", + "kowalski" + ], + "path": "skills/emil-design-eng/SKILL.md" + }, { "id": "emotional-arc-designer", "name": "emotional-arc-designer", @@ -31303,6 +31331,34 @@ ], "path": "skills/reverse-engineer/SKILL.md" }, + { + "id": "review-animations", + "name": "review-animations", + "description": "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar.", + "category": "development", + "tags": [ + "frontend", + "animation", + "motion", + "review", + "accessibility" + ], + "triggers": [ + "frontend", + "animation", + "motion", + "review", + "accessibility", + "animations", + "reviewing", + "code", + "against", + "strict", + "craft", + "performance" + ], + "path": "skills/review-animations/SKILL.md" + }, { "id": "revops", "name": "revops", diff --git a/antigravity-awesome-skills/data/plugin-compatibility.json b/antigravity-awesome-skills/data/plugin-compatibility.json index dfb791bd..818b35dd 100644 --- a/antigravity-awesome-skills/data/plugin-compatibility.json +++ b/antigravity-awesome-skills/data/plugin-compatibility.json @@ -11874,6 +11874,25 @@ }, "runtime_files": [] }, + { + "id": "emil-design-eng", + "path": "skills/emil-design-eng", + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [], + "blocked_reasons": { + "codex": [], + "claude": [] + }, + "runtime_files": [] + }, { "id": "emotional-arc-designer", "path": "skills/emotional-arc-designer", @@ -24160,6 +24179,25 @@ }, "runtime_files": [] }, + { + "id": "review-animations", + "path": "skills/review-animations", + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [], + "blocked_reasons": { + "codex": [], + "claude": [] + }, + "runtime_files": [] + }, { "id": "revops", "path": "skills/revops", @@ -32305,10 +32343,10 @@ } ], "summary": { - "total_skills": 1682, + "total_skills": 1684, "supported": { - "codex": 1622, - "claude": 1640 + "codex": 1624, + "claude": 1642 }, "blocked": { "codex": 60, diff --git a/antigravity-awesome-skills/data/skills_index.json b/antigravity-awesome-skills/data/skills_index.json index d01e1d37..a59670d7 100644 --- a/antigravity-awesome-skills/data/skills_index.json +++ b/antigravity-awesome-skills/data/skills_index.json @@ -13144,6 +13144,28 @@ "reasons": [] } }, + { + "id": "emil-design-eng", + "path": "skills/emil-design-eng", + "category": "frontend", + "name": "emil-design-eng", + "description": "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance.", + "risk": "safe", + "source": "community", + "date_added": "2026-06-25", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "emotional-arc-designer", "path": "skills/emotional-arc-designer", @@ -27653,6 +27675,28 @@ "reasons": [] } }, + { + "id": "review-animations", + "path": "skills/review-animations", + "category": "frontend", + "name": "review-animations", + "description": "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar.", + "risk": "safe", + "source": "community", + "date_added": "2026-06-25", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "revops", "path": "skills/revops", diff --git a/antigravity-awesome-skills/docs/contributors/quality-bar.md b/antigravity-awesome-skills/docs/contributors/quality-bar.md index ec91b02c..b86f1d40 100644 --- a/antigravity-awesome-skills/docs/contributors/quality-bar.md +++ b/antigravity-awesome-skills/docs/contributors/quality-bar.md @@ -27,6 +27,7 @@ Accepted headings: `## When to Use`, `## Use this skill when`, `## When to Use T Every skill must declare its risk level: +- ⚪ **unknown**: Legacy or unclassified content. Avoid this for new skills unless maintainer triage is genuinely needed. - 🟢 **none**: Pure text/reasoning (e.g., Brainstorming). - 🔵 **safe**: Reads files, runs safe commands (e.g., Linter). - 🟠 **critical**: Modifies state, deletes files, pushes to prod (e.g., Git Push). diff --git a/antigravity-awesome-skills/docs/contributors/skill-anatomy.md b/antigravity-awesome-skills/docs/contributors/skill-anatomy.md index 2e0163bc..ebdcfb41 100644 --- a/antigravity-awesome-skills/docs/contributors/skill-anatomy.md +++ b/antigravity-awesome-skills/docs/contributors/skill-anatomy.md @@ -45,10 +45,12 @@ The frontmatter is at the very top, wrapped in `---`: --- name: my-skill-name description: "Brief description of what this skill does" +category: development risk: safe source: community source_repo: owner/repo source_type: community +date_added: "YYYY-MM-DD" --- ``` @@ -66,6 +68,12 @@ source_type: community - **Length:** Keep it under 200 characters - **Example:** `"Stripe payment integration patterns including checkout, subscriptions, and webhooks"` +#### `category` +- **What it is:** Primary grouping used by generated indexes and catalog surfaces +- **Format:** Lowercase category label +- **Example:** `category: development` +- **Note:** Tooling can infer a category for legacy skills, but new skills should declare one explicitly. + #### `risk` - **What it is:** The safety classification of the skill - **Values:** `none` | `safe` | `critical` | `offensive` | `unknown` @@ -95,6 +103,12 @@ source_type: community - **Examples:** `source_type: official`, `source_type: community` - **Rule:** `self` means no external README repo credit is required +#### `date_added` +- **What it is:** Date the skill entered this repository +- **Format:** `YYYY-MM-DD` +- **Example:** `date_added: "2026-03-06"` +- **Note:** Validation treats this as advisory for legacy content, but new contributions should include it. + ### Optional Fields Some skills include additional metadata: @@ -103,10 +117,12 @@ Some skills include additional metadata: --- name: my-skill-name description: "Brief description" +category: development risk: safe source: community source_repo: owner/repo source_type: community +date_added: "YYYY-MM-DD" author: "your-name-or-handle" tags: ["react", "typescript", "testing"] tools: [claude, cursor, gemini] @@ -355,17 +371,17 @@ references/ ## Skill Size Guidelines ### Minimum Viable Skill -- **Frontmatter:** name + description +- **Frontmatter:** standard fields (`name`, `description`, `category`, `risk`, `source`, `date_added`) - **Content:** 100-200 words - **Sections:** Overview + Instructions ### Standard Skill -- **Frontmatter:** name + description +- **Frontmatter:** standard fields (`name`, `description`, `category`, `risk`, `source`, `date_added`) - **Content:** 300-800 words - **Sections:** Overview + When to Use + Instructions + Examples ### Comprehensive Skill -- **Frontmatter:** name + description + optional fields +- **Frontmatter:** standard fields plus `source_repo`/`source_type` for external GitHub-derived skills and optional fields where useful - **Content:** 800-2000 words - **Sections:** All recommended sections - **Extras:** Scripts, examples, templates diff --git a/antigravity-awesome-skills/docs/integrations/jetski-cortex.md b/antigravity-awesome-skills/docs/integrations/jetski-cortex.md index 42a97f88..b96505c0 100644 --- a/antigravity-awesome-skills/docs/integrations/jetski-cortex.md +++ b/antigravity-awesome-skills/docs/integrations/jetski-cortex.md @@ -1,9 +1,9 @@ --- title: Jetski/Cortex + Gemini Integration Guide -description: "Use antigravity-awesome-skills with Jetski/Cortex without hitting context-window overflow with 1,682+ skills." +description: "Use antigravity-awesome-skills with Jetski/Cortex without hitting context-window overflow with 1,684+ skills." --- -# Jetski/Cortex + Gemini: safe integration with 1,682+ skills +# Jetski/Cortex + Gemini: safe integration with 1,684+ skills This guide shows how to integrate the `antigravity-awesome-skills` repository with an agent based on **Jetski/Cortex + Gemini** (or similar frameworks) **without exceeding the model context window**. @@ -23,7 +23,7 @@ Never do: - concatenate all `SKILL.md` content into a single system prompt; - re-inject the entire library for **every** request. -With 1,682+ skills, this approach fills the context window before user messages are even added, causing truncation. +With 1,684+ skills, this approach fills the context window before user messages are even added, causing truncation. --- diff --git a/antigravity-awesome-skills/docs/integrations/jetski-gemini-loader/README.md b/antigravity-awesome-skills/docs/integrations/jetski-gemini-loader/README.md index b4041d86..a4fefedc 100644 --- a/antigravity-awesome-skills/docs/integrations/jetski-gemini-loader/README.md +++ b/antigravity-awesome-skills/docs/integrations/jetski-gemini-loader/README.md @@ -21,7 +21,7 @@ This example shows one way to integrate **antigravity-awesome-skills** with a Je - How to enforce a **maximum number of skills per turn** via `maxSkillsPerTurn`. - How to choose whether to **truncate or error** when too many skills are requested via `overflowBehavior`. -This pattern avoids context overflow when you have 1,682+ skills installed. +This pattern avoids context overflow when you have 1,684+ skills installed. Manifest contract references: diff --git a/antigravity-awesome-skills/docs/maintainers/categorization-implementation.md b/antigravity-awesome-skills/docs/maintainers/categorization-implementation.md index c33017a0..65d3a953 100644 --- a/antigravity-awesome-skills/docs/maintainers/categorization-implementation.md +++ b/antigravity-awesome-skills/docs/maintainers/categorization-implementation.md @@ -5,14 +5,16 @@ ### 1. **Intelligent Auto-Categorization Script** Created [`tools/scripts/auto_categorize_skills.py`](../../tools/scripts/auto_categorize_skills.py) that: - Analyzes skill names and descriptions -- Matches against keyword libraries for 13 categories +- Matches against keyword libraries that seeded the current generated category metadata - Automatically assigns meaningful categories - Removes "uncategorized" bulk assignment -**Results:** +**Historical initial-run result:** - ✅ 776 skills auto-categorized - ✅ 46 already had categories preserved -- ✅ 124 remaining uncategorized (edge cases) +- ✅ 124 remained uncategorized at the time of that run + +For current counts, use `skills_index.json`; the active repository has grown beyond this historical snapshot. ### 2. **Category Distribution** @@ -26,20 +28,8 @@ security: 4 **After:** ``` -Backend: 164 ████████████████ -Web Dev: 107 ███████████ -Automation: 103 ███████████ -DevOps: 83 ████████ -AI/ML: 79 ████████ -Content: 47 █████ -Database: 44 █████ -Testing: 38 ████ -Security: 36 ████ -Cloud: 33 ███ -Mobile: 21 ██ -Game Dev: 15 ██ -Data Science: 14 ██ -Uncategorized: 126 █ +Generated category metadata is now derived from the current skills_index.json. +Do not preserve these historical counts in user-facing docs. ``` ### 3. **Updated Index Generation** @@ -54,16 +44,16 @@ Modified [`tools/scripts/generate_index.py`](../../tools/scripts/generate_index. **Home Page Changes:** - ✅ Categories sorted by skill count (most first) - ✅ "Uncategorized" moved to bottom -- ✅ Each shows count: "Backend (164)", "Web Dev (107)" +- ✅ Each shows counts computed from the generated index - ✅ Much easier to navigate **Updated Code:** - [`apps/web-app/src/pages/Home.tsx`](../../apps/web-app/src/pages/Home.tsx) - Smart category sorting - Sorts categories by count using categoryStats - Uncategorized always last -- Displays count in dropdown +- Displays generated counts in dropdown -### 5. **Categorization Keywords** (13 Categories) +### 5. **Categorization Keywords** (seed buckets) | Category | Key Keywords | |----------|--------------| @@ -97,16 +87,16 @@ Created [`smart-auto-categorization.md`](smart-auto-categorization.md) with: ### Better UX 1. **Smarter Filtering**: Categories sorted by relevance -2. **Visual Cues**: Shows count "(164 skills)"" +2. **Visual Cues**: Shows current generated counts 3. **Uncategorized Last**: Put bad options out of sight 4. **Meaningful Groups**: Find skills by actual function ### Example Workflow User wants to find database skills: 1. Opens web app -2. Sees filter dropdown: "Backend (164) | Database (44) | Web Dev (107)..." -3. Clicks "Database (44)" -4. Gets 44 relevant SQL/MongoDB/Postgres skills +2. Sees filter dropdown with generated category counts +3. Clicks the current database-related category +4. Gets the current matching SQL/MongoDB/Postgres skills 5. Done! 🎉 ## 🚀 Usage diff --git a/antigravity-awesome-skills/docs/maintainers/repo-growth-seo.md b/antigravity-awesome-skills/docs/maintainers/repo-growth-seo.md index 425f55a0..5ccbacca 100644 --- a/antigravity-awesome-skills/docs/maintainers/repo-growth-seo.md +++ b/antigravity-awesome-skills/docs/maintainers/repo-growth-seo.md @@ -6,7 +6,7 @@ This document keeps the repository's GitHub-facing discovery copy aligned with t Preferred positioning: -> Installable GitHub library of 1,682+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants. +> Installable GitHub library of 1,684+ 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,682+ 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,684+ 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,682+ Agentic Skills`; +- use a clean preview image that says `1,684+ 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 d57a81e6..848d8944 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,682+ skills from the skills directory +- All 1,684+ skills from the skills directory ## When to Update diff --git a/antigravity-awesome-skills/docs/maintainers/smart-auto-categorization.md b/antigravity-awesome-skills/docs/maintainers/smart-auto-categorization.md index ffd05941..c7430b87 100644 --- a/antigravity-awesome-skills/docs/maintainers/smart-auto-categorization.md +++ b/antigravity-awesome-skills/docs/maintainers/smart-auto-categorization.md @@ -9,26 +9,28 @@ The skill collection now uses intelligent auto-categorization to eliminate "unca ✅ Current repository indexed through the generated catalog - Most skills are in meaningful categories - A smaller tail still needs manual review or better keyword coverage -- 11 primary categories -- Categories sorted by skill count (most first) +- `skills_index.json` is the source of truth for current category labels and counts +- Category filters should be derived from the generated index at build time ## Category Distribution -| Category | Count | Examples | -|----------|-------|----------| -| Backend | 164 | Node.js, Django, Express, FastAPI | -| Web Development | 107 | React, Vue, Tailwind, CSS | -| Automation | 103 | Workflow, Scripting, RPA | -| DevOps | 83 | Docker, Kubernetes, CI/CD, Git | -| AI/ML | 79 | TensorFlow, PyTorch, NLP, LLM | -| Content | 47 | Documentation, SEO, Writing | -| Database | 44 | SQL, MongoDB, PostgreSQL | -| Testing | 38 | Jest, Cypress, Unit Testing | -| Security | 36 | Encryption, Authentication | -| Cloud | 33 | AWS, Azure, GCP | -| Mobile | 21 | React Native, Flutter, iOS | -| Game Dev | 15 | Unity, WebGL, 3D | -| Data Science | 14 | Pandas, NumPy, Analytics | +Do not copy fixed counts into user-facing docs. To inspect the current distribution, generate it from the index: + +```bash +node - <<'NODE' +const fs = require('fs'); +const skills = JSON.parse(fs.readFileSync('skills_index.json', 'utf8')); +const counts = new Map(); +for (const skill of skills) { + const category = skill.category || 'uncategorized'; + counts.set(category, (counts.get(category) || 0) + 1); +} +console.log(`skills=${skills.length} categories=${counts.size}`); +for (const [category, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 12)) { + console.log(`${category}: ${count}`); +} +NODE +``` ## How It Works @@ -91,20 +93,17 @@ Sample changes: **After:** - Categories sorted by skill count (most first, "uncategorized" last) -- Shows count: "Backend (164)" "Web Development (107)" +- Shows counts from the generated index instead of hard-coded documentation numbers - Much easier to browse ### Example Dropdowns **Sorted Order:** 1. All Categories -2. Backend (164) -3. Web Development (107) -4. Automation (103) -5. DevOps (83) -6. AI/ML (79) -7. ... more categories ... -8. Uncategorized (126) ← at the end +2. Highest-count generated category +3. Next generated category +4. ... more generated categories ... +5. Uncategorized, if present, at the end ## For Skill Creators diff --git a/antigravity-awesome-skills/docs/users/bundles.md b/antigravity-awesome-skills/docs/users/bundles.md index c193d098..4c59ab99 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,682+ | Total Bundles: 59_ +_Last updated: June 2026 | Total Skills: 1,684+ | 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 062f137a..6ce0411d 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,682+ skills instead of a narrow single-domain starter pack. +- It includes 1,684+ 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/faq.md b/antigravity-awesome-skills/docs/users/faq.md index 0fb3f2e7..5415a884 100644 --- a/antigravity-awesome-skills/docs/users/faq.md +++ b/antigravity-awesome-skills/docs/users/faq.md @@ -103,11 +103,11 @@ No. The public site is a static GitHub Pages deploy. We classify skills so you know what you're running. These values map directly to the `risk:` field in every `SKILL.md` frontmatter: -- 🔵 **`none`**: Pure reference or planning content — no shell commands, no mutations, no network access. -- ⚪ **`safe`**: Community skills that are non-destructive (read-only, planning, code review, analysis). -- 🔴 **`critical`**: Skills that modify files, drop data, use network scanners, or perform destructive actions. **Use with caution.** -- 🟣 **`offensive`**: Security-focused offensive techniques (pentesting, exploitation). **Authorized use only** — always confirm the target is in scope. -- ⬜ **`unknown`**: Legacy or unclassified content. Review the skill manually before use. +- ⚪ **`unknown`**: Legacy or unclassified content. Review the skill manually before use. +- 🟢 **`none`**: Pure reference or planning content — no shell commands, no mutations, no network access. +- 🔵 **`safe`**: Non-destructive guidance such as read-only commands, planning, code review, and analysis. +- 🟠 **`critical`**: Skills that modify files, drop data, use network scanners, or perform destructive actions. **Use with caution.** +- 🔴 **`offensive`**: Security-focused offensive techniques (pentesting, exploitation). **Authorized use only** — always confirm the target is in scope. ### Can these skills hack my computer? diff --git a/antigravity-awesome-skills/docs/users/gemini-cli-skills.md b/antigravity-awesome-skills/docs/users/gemini-cli-skills.md index 22862903..8522ae40 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,682+ files. +- It helps new users get started with bundles and workflows rather than forcing a cold start from 1,684+ 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 4ac271e1..a443d2f5 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.1.1) +# Getting Started with Antigravity Awesome Skills (V13.2.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 91a1febb..4f3449cf 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,682+ specialized areas +- **Domain expertise** across 1,684+ 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/local-config.md b/antigravity-awesome-skills/docs/users/local-config.md index acd816d7..f5abecc9 100644 --- a/antigravity-awesome-skills/docs/users/local-config.md +++ b/antigravity-awesome-skills/docs/users/local-config.md @@ -1,7 +1,7 @@ -# Local Skills Configuration +# Local Skills Configuration Snapshot -> **Current Status**: All 96 skills are available in the repository. -> **This Document**: Recommends 35 high-priority skills for typical usage. +> **Historical snapshot**: This page preserves an older 35-skill local configuration recommendation from 2026-01-16. It is not the current repository catalog. +> **Current catalog**: Use [`../../skills_index.json`](../../skills_index.json), [`../../CATALOG.md`](../../CATALOG.md), or the installer filters in the README for the active 1,684+ skill library. ## 📊 Recommended High-Priority Skills (35) @@ -67,17 +67,17 @@ Skills actively used for your specific projects: --- -## 🗂️ Repository Structure +## 🗂️ Snapshot Structure ``` -skills/ -├── [96 active skills] ← All skills available -└── [4 symlinks] ← docx, pdf, pptx, xlsx → official versions +local snapshot/ +├── [96 active skills in this snapshot] +└── [4 symlinks in this snapshot] ``` --- -## 📚 Other Available Skills (61) +## 📚 Other Snapshot Skills (61) All other skills in the repository are available for use as needed. Some notable categories: @@ -140,13 +140,13 @@ Miscellaneous: ## 🎯 Benefits of This Recommendation ✅ **Focused Guidance** - 35 high-priority skills for common workflows -✅ **Full Availability** - All 96 skills accessible when needed +✅ **Snapshot Availability** - All 96 skills from this older local set were accessible when needed ✅ **Balanced Coverage** - Core dev + AI/automation + frontend excellence ✅ **Easy Discovery** - Categorized list of all other available skills --- -**Last Updated**: 2026-01-16 +**Snapshot Date**: 2026-01-16 **Recommended Skills**: 35 high-priority -**Total Available**: 96 skills + 4 symlinks = 100 total +**Snapshot Total**: 96 skills + 4 symlinks = 100 total **Recent Additions to Recommendations**: `senior-fullstack`, `concise-planning`, `address-github-comments`, `javascript-mastery`, `workflow-automation`, `llm-app-patterns`, `autonomous-agent-patterns`, `prompt-library` diff --git a/antigravity-awesome-skills/docs/users/specialized-plugin-roadmap.md b/antigravity-awesome-skills/docs/users/specialized-plugin-roadmap.md index c2bdbee7..439cca6a 100644 --- a/antigravity-awesome-skills/docs/users/specialized-plugin-roadmap.md +++ b/antigravity-awesome-skills/docs/users/specialized-plugin-roadmap.md @@ -17,9 +17,9 @@ That makes specialized plugins the better default product shape. A root plugin c ## Selection Method -This pass evaluated the full local catalog in `data/skills_index.json`: +This snapshot pass evaluated the then-current local catalog. For current catalog checks, use the canonical root `skills_index.json` and treat `data/skills_index.json` only as the compatibility mirror: -- Total skills evaluated: 1,678. +- Total skills evaluated in this snapshot: 1,678. - Broadest categories: development, cloud, AI/ML, security, business, workflow, content, marketing, automation, and web development. - Existing editorial bundles are all small and mostly plugin-compatible, which makes them a good starting point. - The stronger opportunity is to turn the best bundles into first-class product plugins with sharper names, richer descriptions, and optional app/MCP extensions. @@ -71,7 +71,7 @@ These are promising and should be hardened after Tier 1. 3. Rename or reframe bundle plugins as product plugins where the job is clear. 4. Add richer `interface` metadata to the strongest plugin manifests: display name, short description, brand color, and default prompt. 5. Add per-plugin quality gates: - - every skill exists in `data/skills_index.json`; + - every skill exists in canonical `skills_index.json`; - every skill is Codex-supported before Codex publication; - every skill is Claude-supported before Claude publication; - every plugin has a 5-10 skill target range unless it has a concrete reason to be larger; diff --git a/antigravity-awesome-skills/docs/users/usage.md b/antigravity-awesome-skills/docs/users/usage.md index c8ec08cc..a1b4494d 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,682+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`) +✅ **Downloaded 1,684+ 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,682+ tools (✅ done) +- You installed a toolbox with 1,684+ 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,682+ skills at once. Here's a sensible approach: +Don't try to use all 1,684+ 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,682+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block. +No. Even though you have 1,684+ 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 a6328392..f9e7694e 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,682+ skills live here +├── 📁 skills/ ← 1,684+ skills live here │ │ │ ├── 📁 brainstorming/ │ │ └── 📄 SKILL.md ← Skill definition @@ -47,7 +47,7 @@ antigravity-awesome-skills/ │ │ └── 📁 2d-games/ │ │ └── 📄 SKILL.md ← Nested skills also supported │ │ -│ └── ... (1,682+ total) +│ └── ... (1,684+ total) │ ├── 📁 apps/ │ └── 📁 web-app/ ← Interactive browser @@ -100,7 +100,7 @@ antigravity-awesome-skills/ ``` ┌─────────────────────────┐ - │ 1,682+ SKILLS │ + │ 1,684+ 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,682+ total) │ +│ └── ... (1,684+ total) │ └─────────────────────────────────────────┘ ``` diff --git a/antigravity-awesome-skills/docs/vietnamese/BUNDLES.vi.md b/antigravity-awesome-skills/docs/vietnamese/BUNDLES.vi.md index 01496aec..c78367a7 100644 --- a/antigravity-awesome-skills/docs/vietnamese/BUNDLES.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/BUNDLES.vi.md @@ -121,4 +121,4 @@ _Để tạo ra những trải nghiệm hoàn hảo đến từng pixel._ --- -_Để sử dụng một gói kỹ năng, chỉ cần copy tên các skill vào thư mục `.agent/skills` của bạn hoặc yêu cầu trợ lý AI sử dụng chúng._ +_Để sử dụng một gói kỹ năng, hãy cài repository một lần bằng `npx antigravity-awesome-skills`, rồi yêu cầu trợ lý AI sử dụng các skill được liệt kê trong gói._ diff --git a/antigravity-awesome-skills/docs/vietnamese/CONTRIBUTING.vi.md b/antigravity-awesome-skills/docs/vietnamese/CONTRIBUTING.vi.md index 4ad15753..cd92d096 100644 --- a/antigravity-awesome-skills/docs/vietnamese/CONTRIBUTING.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/CONTRIBUTING.vi.md @@ -1,15 +1,15 @@ -# 🤝 Hướng dẫn Đóng góp - Phiên bản V3 Enterprise +# 🤝 Hướng dẫn Đóng góp **Cảm ơn bạn đã muốn làm cho repository này trở nên tốt hơn!** Hướng dẫn này sẽ chỉ cho bạn chính xác cách thức đóng góp, ngay cả khi bạn là người mới đối với mã nguồn mở. -Với phiên bản V3, chúng tôi đã nâng cao các tiêu chuẩn về chất lượng. Vui lòng đọc kỹ **Tiêu chuẩn Chất lượng mới** bên dưới. +Chúng tôi duy trì tiêu chuẩn chất lượng tự động cho skill và tài liệu. Vui lòng đọc kỹ **Quality Bar** bên dưới. --- -## 🧐 "Quy chuẩn Chất lượng" (Quality Bar - Tiêu chuẩn V3) +## 🧐 "Quy chuẩn Chất lượng" (Quality Bar) -**Quan trọng đối với các skill mới:** Mỗi skill được gửi đi phải vượt qua **5 bước Kiểm tra Chất lượng** (xem `docs/vietnamese/QUALITY_BAR.md` để biết chi tiết): +**Quan trọng đối với các skill mới:** Mỗi skill được gửi đi phải vượt qua **5 bước Kiểm tra Chất lượng** (xem `docs/vietnamese/QUALITY_BAR.vi.md` để biết chi tiết): -1. **Siêu dữ liệu (Metadata)**: Phần Frontmatter chính xác (`name`, `description`). +1. **Siêu dữ liệu (Metadata)**: Phần frontmatter chính xác (`name`, `description`, `category`, `risk`, `source`, `date_added`; thêm `source_repo` và `source_type` cho skill bắt nguồn từ GitHub bên ngoài). 2. **An toàn (Safety)**: Không chứa các lệnh gây hại mà không có nhãn rủi ro ("Risk"). 3. **Rõ ràng (Clarity)**: Có phần "Khi nào nên dùng" (When to use) rõ ràng. 4. **Ví dụ (Examples)**: Ít nhất một ví dụ sử dụng có thể sao chép và dùng được ngay. @@ -81,6 +81,9 @@ Mỗi kỹ năng đều cần cấu trúc cơ bản này. **Hãy sao chép mẫu --- name: my-awesome-skill description: "Mô tả ngắn gọn về chức năng của skill này" +risk: safe +source: community +date_added: 2026-06-25 --- # Tiêu đề Skill @@ -112,16 +115,16 @@ code ví dụ ở đây - ❌ Không nên làm điều này ``` -#### Bước 4: Xác thực (BƯỚC V3 QUAN TRỌNG) +#### Bước 4: Xác thực Chạy script xác thực (validation) tại máy của bạn. **Chúng tôi sẽ không chấp nhận các Pull Request (PR) thất bại ở bước kiểm tra này.** ```bash -# Chế độ nhẹ (chỉ cảnh báo) -python3 scripts/validate_skills.py +# Chế độ thông thường +npm run validate # Chế độ nghiêm ngặt (chế độ mà hệ thống CI sẽ chạy) -python3 scripts/validate_skills.py --strict +npm run validate:strict ``` Bước này sẽ kiểm tra: @@ -149,6 +152,9 @@ Tiết kiệm thời gian! Hãy sao chép bản mẫu này: --- name: your-skill-name description: "Mô tả trong một câu về chức năng của skill và khi nào cần dùng" +risk: safe +source: community +date_added: 2026-06-25 --- # Tên Kỹ năng của bạn diff --git a/antigravity-awesome-skills/docs/vietnamese/FAQ.vi.md b/antigravity-awesome-skills/docs/vietnamese/FAQ.vi.md index 6bbfaf27..8dbb54e5 100644 --- a/antigravity-awesome-skills/docs/vietnamese/FAQ.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/FAQ.vi.md @@ -11,9 +11,9 @@ Skills là các tệp hướng dẫn chuyên biệt dạy cho các trợ lý AI cách xử lý những tác vụ cụ thể. Hãy coi chúng như những mô-đun kiến thức chuyên gia mà AI của bạn có thể tải khi cần. **Một so sánh đơn giản:** Giống như việc bạn tham khảo ý kiến của các chuyên gia khác nhau (luật sư, bác sĩ, thợ máy), những kỹ năng này giúp AI của bạn trở thành chuyên gia trong các lĩnh vực khác nhau khi bạn cần. -### Tôi có cần phải cài đặt tất cả hơn 560 skills không? +### Tôi có cần phải cài đặt tất cả hơn 1,684 skills không? -**Không!** Khi bạn clone (tải bản sao) repository này, tất cả các kỹ năng đều có sẵn, nhưng AI của bạn chỉ tải chúng khi bạn yêu cầu rõ ràng bằng lệnh `@ten-skill`. +**Không!** Khi bạn cài đặt repository này, tất cả các kỹ năng đều có sẵn, nhưng AI của bạn chỉ tải chúng khi bạn yêu cầu rõ ràng bằng lệnh `@ten-skill`. Nó giống như việc sở hữu một thư viện - tất cả sách đều ở đó, nhưng bạn chỉ đọc những cuốn bạn cần thôi. **Mẹo:** Sử dụng [Bản mẫu Khởi đầu (Starter Packs)](BUNDLES.vi.md) để chỉ cài đặt những gì phù hợp với vai trò của bạn. @@ -41,15 +41,17 @@ Bản thân các file skill được lưu trữ cục bộ trên máy tính củ --- -## 🔒 Bảo mật & Tin cậy (Cập nhật V4) +## 🔒 Bảo mật & Tin cậy ### Các Nhãn rủi ro (Risk Labels) có ý nghĩa gì? -Chúng tôi phân loại các kỹ năng để bạn biết mình đang chạy cái gì: +Chúng tôi phân loại các kỹ năng để bạn biết mình đang chạy cái gì. Các giá trị này khớp trực tiếp với trường `risk:` trong frontmatter của mỗi `SKILL.md`: -- ⚪ **Safe (Trắng/Xanh)**: Các kỹ năng chỉ đọc, lập kế hoạch hoặc vô hại. -- 🔴 **Risk (Đỏ)**: Các kỹ năng sửa đổi file (xóa), sử dụng công cụ quét mạng, hoặc thực hiện các hành động có tính phá hủy. **Hãy sử dụng thận trọng.** -- 🟣 **Official (Tím)**: Được duy trì bởi các nhà cung cấp tin cậy (Anthropic, DeepMind, v.v.). +- ⚪ **`unknown`**: Nội dung cũ hoặc chưa được phân loại. Hãy xem xét skill thủ công trước khi dùng. +- 🟢 **`none`**: Nội dung tham khảo hoặc lập kế hoạch thuần túy; không có lệnh shell, thay đổi trạng thái hoặc truy cập mạng. +- 🔵 **`safe`**: Hướng dẫn không phá hủy như lệnh chỉ đọc, lập kế hoạch, review code hoặc phân tích. +- 🟠 **`critical`**: Skill sửa đổi file, xóa dữ liệu, dùng công cụ quét mạng hoặc thực hiện hành động có thể phá hủy. **Hãy sử dụng thận trọng.** +- 🔴 **`offensive`**: Kỹ thuật tấn công bảo mật như pentesting hoặc khai thác. **Chỉ dùng khi được cấp phép** và luôn xác nhận mục tiêu nằm trong phạm vi cho phép. ### Những kỹ năng này có thể hack máy tính của tôi không? @@ -62,35 +64,43 @@ _Luôn kiểm tra nhãn rủi ro và xem xét mã nguồn trước khi dùng._ ### Tôi nên cài đặt các kỹ năng này ở đâu? -Đường dẫn phổ biến nhất hoạt động với mạng lưới các công cụ AI là `.agent/skills/`: +Đường dẫn mặc định của installer là `~/.agents/skills/` cho Antigravity global: ```bash -git clone https://github.com/sickn33/antigravity-awesome-skills.git .agent/skills +npx antigravity-awesome-skills ``` **Các đường dẫn cụ thể cho từng công cụ:** - Claude Code: `.claude/skills/` - Gemini CLI: `.gemini/skills/` -- Cursor: `.cursor/skills/` hoặc gốc của dự án. +- Codex CLI: `.codex/skills/` +- Kiro CLI / IDE: `~/.kiro/skills/` hoặc `.kiro/skills/` +- Antigravity: `~/.agents/skills/` hoặc `.agent/skills/` +- Antigravity CLI (`agy`): `~/.gemini/antigravity-cli/skills/` +- Cursor: `.cursor/skills/` +- OpenCode: `.agents/skills/` +- AdaL CLI: `.adal/skills/` ### Repo này có hoạt động trên Windows không? -**Có**, nhưng một số kỹ năng "Official" (chính thức) sử dụng **symlinks** (liên kết tượng trưng) mà Windows xử lý không tốt theo mặc định. -Hãy chạy git clone với lệnh sau: +**Có.** Hãy dùng lệnh cài đặt chuẩn: ```bash -git clone -c core.symlinks=true https://github.com/sickn33/antigravity-awesome-skills.git .agent/skills +npx antigravity-awesome-skills ``` -Hoặc bật "Chế độ Nhà phát triển" (Developer Mode) trong phần Cài đặt của Windows. +Không còn cần workaround cũ `core.symlinks=true` hoặc bật Developer Mode chỉ để cài repository này. ### Làm thế nào để cập nhật các kỹ năng? -Chuyển hướng đến thư mục chứa kỹ năng của bạn và kéo (pull) những thay đổi mới nhất: +Chạy lại installer để lấy phiên bản mới nhất, hoặc nếu bạn cài bằng git clone thì pull trong thư mục đã clone: ```bash -cd .agent/skills +npx antigravity-awesome-skills + +# hoặc, nếu bạn tự clone repository: +cd ~/.agents/skills git pull origin main ``` @@ -128,7 +138,7 @@ Sử dụng biểu tượng `@` theo sau là tên skill: **Các nguyên nhân có thể xảy ra:** -1. **Sai đường dẫn cài đặt**: Kiểm tra tài liệu hướng dẫn của công cụ bạn dùng. Hãy thử `.agent/skills/`. +1. **Sai đường dẫn cài đặt**: Kiểm tra tài liệu hướng dẫn của công cụ bạn dùng. Hãy thử installer mặc định `~/.agents/skills/` hoặc cờ theo công cụ phù hợp. 2. **Cần khởi động lại**: Khởi động lại AI/IDE sau khi cài đặt. 3. **Lỗi đánh máy**: Bạn có gõ lầm `@brain-storming` thay vì `@brainstorming` không? @@ -156,15 +166,15 @@ Hãy xem [CONTRIBUTING.md](../../CONTRIBUTING.md) để biết hướng dẫn ch ### Pull Request (PR) của tôi thất bại khi kiểm tra "Quality Bar". Tại sao? -Phiên bản V3 áp dụng kiểm soát chất lượng tự động. Skill của bạn có thể đang thiếu: +Quality Bar áp dụng kiểm soát chất lượng tự động. Skill của bạn có thể đang thiếu: 1. Một `description` (mô tả) hợp lệ. 2. Các ví dụ sử dụng. -Hãy chạy `python3 scripts/validate_skills.py` cục bộ để kiểm tra trước khi đẩy code lên. +Hãy chạy `npm run validate` cục bộ để kiểm tra trước khi đẩy code lên. ### Tôi có thể cập nhật các kỹ năng "Official" không? -**Không.** Các kỹ năng chính thức (trong thư mục `skills/official/`) được đồng bộ từ các nhà cung cấp. Thay vào đó, hãy mở một issue để báo lỗi. +**Không trực tiếp.** Các skill nhập từ nguồn bên ngoài được phân biệt bằng frontmatter như `source`, `source_repo` và `source_type`. Nếu một skill bắt nguồn từ nhà cung cấp hoặc repository khác, hãy mở issue hoặc PR nhỏ kèm nguồn rõ ràng thay vì sửa tùy tiện. --- diff --git a/antigravity-awesome-skills/docs/vietnamese/GETTING_STARTED.vi.md b/antigravity-awesome-skills/docs/vietnamese/GETTING_STARTED.vi.md index 732c6831..7503fced 100644 --- a/antigravity-awesome-skills/docs/vietnamese/GETTING_STARTED.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/GETTING_STARTED.vi.md @@ -1,4 +1,4 @@ -# Hướng dẫn Bắt đầu với Antigravity Awesome Skills (V4) +# Hướng dẫn Bắt đầu với Antigravity Awesome Skills (V13.2.0) **Bạn mới đến đây? Hướng dẫn này sẽ giúp bạn tăng cường sức mạnh cho trợ lý trợ lý AI của mình chỉ trong 5 phút.** @@ -6,7 +6,7 @@ ## 🤔 "Skills" (Kỹ năng) là gì? -Các trợ lý AI (như **Claude Code**, **Gemini**, **Cursor**) rất thông minh, nhưng chúng thiếu kiến thức cụ thể về các công cụ và quy trình làm việc của bạn. +Các trợ lý AI (như **Claude Code**, **Codex CLI**, **Gemini CLI**, **Cursor**, **Antigravity**, **Kiro** và **OpenCode**) rất thông minh, nhưng chúng thiếu kiến thức cụ thể về các công cụ và quy trình làm việc của bạn. **Skills** là các hướng dẫn sử dụng chuyên biệt (dưới dạng file markdown) dạy cho AI của bạn cách thực hiện các tác vụ cụ thể một cách hoàn hảo trong mọi lần thực hiện. **Một phép so sánh:** AI của bạn là một thực tập sinh xuất sắc. **Skills** là các SOP (Quy trình vận hành tiêu chuẩn) biến họ thành một Kỹ sư cao cấp. @@ -15,18 +15,19 @@ Các trợ lý AI (như **Claude Code**, **Gemini**, **Cursor**) rất thông mi ## ⚡️ Khởi động nhanh: Các "Gói khởi đầu" (Starter Packs) -Đừng lo lắng về con số hơn 560 kỹ năng. Bạn không cần dùng tất cả chúng cùng một lúc. +Đừng lo lắng về con số hơn 1,684 kỹ năng. Bạn không cần dùng tất cả chúng cùng một lúc. Chúng tôi đã tuyển chọn các **Gói khởi đầu** để bạn có thể bắt đầu sử dụng ngay lập tức. ### 1. Cài đặt Repository -Sao chép các kỹ năng vào thư mục agent của bạn: +Khuyến nghị dùng installer CLI. Mặc định, lệnh này cài vào `~/.agents/skills` cho Antigravity global: ```bash -# Cài đặt phổ thông (hoạt động với hầu hết các agent) -git clone https://github.com/sickn33/antigravity-awesome-skills.git .agent/skills +npx antigravity-awesome-skills ``` +Bạn cũng có thể dùng cờ theo công cụ, ví dụ `--claude`, `--gemini`, `--codex`, `--cursor`, `--kiro`, `--antigravity`, `--agy`, hoặc `--path ` để chọn thư mục đích. + ### 2. Chọn vai trò của bạn Tìm gói kỹ năng phù hợp với vị trí của bạn (xem [BUNDLES.md](BUNDLES.vi.md)): @@ -68,21 +69,28 @@ Sau khi cài đặt, bạn chỉ cần trò chuyện với AI một cách tự n | Công cụ | Trạng thái | Đường dẫn | | :--------------- | :-------------- | :---------------- | -| **Claude Code** | ✅ Hỗ trợ đầy đủ | `.claude/skills/` | +| **Claude Code** | ✅ Hỗ trợ đầy đủ | `.claude/skills/` hoặc Claude plugin marketplace | | **Gemini CLI** | ✅ Hỗ trợ đầy đủ | `.gemini/skills/` | -| **Antigravity** | ✅ Hỗ trợ gốc | `.agent/skills/` | +| **Codex CLI** | ✅ Hỗ trợ đầy đủ | `.codex/skills/` | +| **Kiro CLI / IDE** | ✅ Hỗ trợ đầy đủ | `~/.kiro/skills/` hoặc `.kiro/skills/` | +| **Antigravity** | ✅ Hỗ trợ gốc | `~/.agents/skills/` hoặc `.agent/skills/` | +| **Antigravity CLI (`agy`)** | ✅ Hỗ trợ đầy đủ | `~/.gemini/antigravity-cli/skills/` | | **Cursor** | ✅ Hỗ trợ gốc | `.cursor/skills/` | +| **OpenCode** | ✅ Hỗ trợ đầy đủ | `.agents/skills/` | +| **AdaL CLI** | ✅ Hỗ trợ đầy đủ | `.adal/skills/` | | **Copilot** | ⚠️ Chỉ văn bản | Copy-paste thủ công | --- -## 🛡️ Sự tin cậy & An toàn (Mới trong bản V4) +## 🛡️ Sự tin cậy & An toàn -Chúng tôi phân loại các kỹ năng để bạn biết mình đang chạy những gì: +Chúng tôi phân loại các kỹ năng để bạn biết mình đang chạy những gì. Các giá trị này khớp trực tiếp với trường `risk:` trong frontmatter của mỗi `SKILL.md`: -- 🟣 **Official (Chính thức)**: Được duy trì bởi Anthropic/Google/Nhà cung cấp (Độ tin cậy cao). -- 🔵 **Safe (An toàn)**: Các kỹ năng cộng đồng không gây hại (Chỉ đọc/Lập kế hoạch). -- 🔴 **Risk (Rủi ro)**: Các kỹ năng sửa đổi hệ thống hoặc thực hiện kiểm thử bảo mật (Sử dụng khi được cấp phép). +- ⚪ **`unknown`**: Nội dung cũ hoặc chưa được phân loại, vẫn cần maintainer phân loại. +- 🟢 **`none`**: Hướng dẫn thuần văn bản hoặc lập luận. +- 🔵 **`safe`**: Hướng dẫn chỉ đọc hoặc vận hành rủi ro thấp. +- 🟠 **`critical`**: Hướng dẫn thay đổi trạng thái hoặc có thể ảnh hưởng đến triển khai. +- 🔴 **`offensive`**: Hướng dẫn pentesting/red-team với cảnh báo Authorized Use Only rõ ràng. _Kiểm tra [Danh mục Skill (Skill Catalog)](../../CATALOG.md) để xem danh sách đầy đủ._ @@ -90,7 +98,7 @@ _Kiểm tra [Danh mục Skill (Skill Catalog)](../../CATALOG.md) để xem danh ## ❓ FAQ -**H: Tôi có cần cài đặt tất cả 560 kỹ năng không?** +**H: Tôi có cần cài đặt tất cả 1,684+ kỹ năng không?** Đ: Bạn tải toàn bộ repo về, nhưng AI của bạn chỉ _đọc_ những kỹ năng bạn yêu cầu (hoặc những kỹ năng có liên quan). Nó rất nhẹ! **H: Tôi có thể tự tạo kỹ năng cho riêng mình không?** diff --git a/antigravity-awesome-skills/docs/vietnamese/QUALITY_BAR.vi.md b/antigravity-awesome-skills/docs/vietnamese/QUALITY_BAR.vi.md index 01fb7ddc..0b0adb88 100644 --- a/antigravity-awesome-skills/docs/vietnamese/QUALITY_BAR.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/QUALITY_BAR.vi.md @@ -12,8 +12,11 @@ Phần frontmatter trong `SKILL.md` phải là mã YAML hợp lệ và chứa: - `name`: Định dạng Kebab-case, khớp với tên thư mục. - `description`: Dưới 200 ký tự, nêu rõ giá trị mang lại. -- `risk`: Thuộc một trong các loại `[none, safe, critical, offensive]`. -- `source`: URL dẫn đến nguồn gốc (hoặc "self" nếu là nội dung gốc). +- `category`: Danh mục chính của skill. +- `risk`: Thuộc một trong các loại `[none, safe, critical, offensive, unknown]`. Chỉ dùng `unknown` cho nội dung cũ hoặc chưa được phân loại; skill mới nên dùng mức cụ thể. +- `source`: Nguồn gốc của skill. +- `date_added`: Ngày thêm skill theo định dạng `YYYY-MM-DD`. +- `source_repo` và `source_type`: Bắt buộc khi skill bắt nguồn từ repository GitHub bên ngoài. ### 2. Điều kiện kích hoạt rõ ràng ("Khi nào nên dùng") @@ -26,6 +29,7 @@ Skill BẮT BUỘC phải có một phần nêu rõ thời điểm nên kích ho Mỗi skill phải khai báo mức độ rủi ro của nó: +- ⚪ **unknown**: Nội dung cũ hoặc chưa được phân loại. Tránh dùng cho skill mới trừ khi thật sự cần maintainer phân loại. - 🟢 **none**: Chỉ là văn bản/tư duy thuần túy (ví dụ: Brainstorming). - 🔵 **safe**: Đọc file, chạy các lệnh an toàn (ví dụ: Linter). - 🟠 **critical**: Sửa đổi trạng thái, xóa file, push lên môi trường production (ví dụ: Git Push). @@ -57,8 +61,9 @@ Chúng tôi cũng phân loại skill dựa trên người duy trì chúng: ## Cách Xác thực Skill của bạn -Chạy script xác thực trước khi gửi Pull Request (PR): +Chạy validator trước khi gửi Pull Request (PR): ```bash -python3 scripts/validate_skills.py --strict +npm run validate +npm run validate:strict ``` diff --git a/antigravity-awesome-skills/docs/vietnamese/README.vi.md b/antigravity-awesome-skills/docs/vietnamese/README.vi.md index 3496cc7a..0d629238 100644 --- a/antigravity-awesome-skills/docs/vietnamese/README.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/README.vi.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 560+ Kỹ năng (Skills) cho Claude Code, Gemini CLI, Cursor, Copilot và nhiều hơn nữa +# 🌌 Antigravity Awesome Skills: 1,684+ Kỹ năng (Skills) cho Claude Code, Gemini CLI, Cursor, Copilot và nhiều hơn nữa -> **Bộ sưu tập tối ưu gồm hơn 560 Kỹ năng Phổ quát cho các Trợ lý Lập trình AI — Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode** +> **Thư viện GitHub có thể cài đặt gồm hơn 1,684 kỹ năng agentic cho Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity và các trợ lý lập trình AI khác.** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Claude Code](https://img.shields.io/badge/Claude%20Code-Anthropic-purple)](https://claude.ai) @@ -11,21 +11,22 @@ [![OpenCode](https://img.shields.io/badge/OpenCode-CLI-gray)](https://github.com/opencode-ai/opencode) [![Antigravity](https://img.shields.io/badge/Antigravity-DeepMind-red)](https://github.com/sickn33/antigravity-awesome-skills) -**Antigravity Awesome Skills** là một thư viện được tuyển chọn và kiểm chứng kỹ lưỡng với **560 kỹ năng hiệu suất cao** được thiết kế để hoạt động mượt mà trên tất cả các trợ lý lập trình AI lớn: +**Antigravity Awesome Skills** là một thư viện kỹ năng có thể cài đặt với **1,684+ kỹ năng `SKILL.md`** được thiết kế để hoạt động mượt mà trên các trợ lý lập trình AI lớn: - 🟣 **Claude Code** (Anthropic CLI) - 🔵 **Gemini CLI** (Google DeepMind) - 🟢 **Codex CLI** (OpenAI) -- 🔴 **Antigravity IDE** (Google DeepMind) +- 🔴 **Antigravity IDE** và **Antigravity CLI (`agy`)** - 🩵 **GitHub Copilot** (VSCode Extension) - 🟠 **Cursor** (AI-native IDE) - ⚪ **OpenCode** (Mã nguồn mở CLI) +- 🟡 **Kiro CLI / IDE** và **AdaL CLI** -**Chào mừng bạn đến với Phiên bản V4.0.0 Enterprise.** Đây không chỉ là một danh sách các tập lệnh (scripts); nó là một hệ điều hành hoàn chỉnh cho Trợ lý AI của bạn. +**Phiên bản hiện tại: V13.2.0.** Đây không chỉ là một danh sách prompt; repository này cung cấp kỹ năng, bundles, workflows, catalog sinh tự động và installer CLI để dùng lại các playbook đã được kiểm chứng. ### 1. 🐣 Bối cảnh: Đây là gì? -**Antigravity Awesome Skills** (Phiên bản 4.0.0) là một bản nâng cấp khổng lồ cho khả năng của AI. +**Antigravity Awesome Skills** (Phiên bản 13.2.0) là một thư viện kỹ năng lớn cho AI coding assistants. Các trợ lý AI (như Claude Code, Cursor, hoặc Gemini) rất thông minh, nhưng chúng thiếu các **công cụ chuyên biệt**. Chúng không biết "Quy trình Triển khai" của công ty bạn hoặc cú pháp cụ thể cho "AWS CloudFormation". **Skills** là các tệp markdown nhỏ dạy cho chúng cách thực hiện những tác vụ cụ thể này một cách chính xác trong mọi lần thực thi. @@ -42,21 +43,21 @@ Repository được tổ chức thành các lĩnh vực chuyên biệt để bi | Danh mục | Trọng tâm | Ví dụ kỹ năng | | :---------------- | :------------------------------------------------------------- | :------------------------------------------------------------------------------ | -| Kiến trúc (52) | Thiết kế hệ thống, ADRs, C4 và các mẫu có thể mở rộng | `architecture`, `c4-context`, `senior-architect` | -| Kinh doanh (35) | Tăng trưởng, định giá, CRO, SEO và thâm nhập thị trường | `copywriting`, `pricing-strategy`, `seo-audit` | -| Dữ liệu & AI (81) | Ứng dụng LLM, RAG, agents, khả năng quan sát, phân tích | `rag-engineer`, `prompt-engineer`, `langgraph` | -| Phát triển (72) | Làm chủ ngôn ngữ, mẫu thiết kế framework, chất lượng code | `typescript-expert`, `python-patterns`, `react-patterns` | -| Tổng quát (95) | Lập kế hoạch, tài liệu, vận hành sản phẩm, viết bài, hướng dẫn | `brainstorming`, `doc-coauthoring`, `writing-plans` | -| Hạ tầng (72) | DevOps, cloud, serverless, triển khai, CI/CD | `docker-expert`, `aws-serverless`, `vercel-deployment` | -| Bảo mật (107) | AppSec, pentesting, phân tích lỗ hổng, tuân thủ | `api-security-best-practices`, `sql-injection-testing`, `vulnerability-scanner` | -| Kiểm thử (21) | TDD, thiết kế kiểm thử, sửa lỗi, quy trình QA | `test-driven-development`, `testing-patterns`, `test-fixing` | -| Quy trình (17) | Tự động hóa, điều phối, công việc, agents | `workflow-automation`, `inngest`, `trigger-dev` | +| Kiến trúc | Thiết kế hệ thống, ADRs, C4 và các mẫu có thể mở rộng | `architecture`, `c4-context`, `senior-architect` | +| Kinh doanh | Tăng trưởng, định giá, CRO, SEO và thâm nhập thị trường | `copywriting`, `pricing-strategy`, `seo-audit` | +| Dữ liệu & AI | Ứng dụng LLM, RAG, agents, khả năng quan sát, phân tích | `rag-engineer`, `prompt-engineer`, `langgraph` | +| Phát triển | Làm chủ ngôn ngữ, mẫu thiết kế framework, chất lượng code | `typescript-expert`, `python-patterns`, `react-patterns` | +| Tổng quát | Lập kế hoạch, tài liệu, vận hành sản phẩm, viết bài, hướng dẫn | `brainstorming`, `doc-coauthoring`, `writing-plans` | +| Hạ tầng | DevOps, cloud, serverless, triển khai, CI/CD | `docker-expert`, `aws-serverless`, `vercel-deployment` | +| Bảo mật | AppSec, pentesting, phân tích lỗ hổng, tuân thủ | `api-security-best-practices`, `sql-injection-testing`, `vulnerability-scanner` | +| Kiểm thử | TDD, thiết kế kiểm thử, sửa lỗi, quy trình QA | `test-driven-development`, `testing-patterns`, `test-fixing` | +| Quy trình | Tự động hóa, điều phối, công việc, agents | `workflow-automation`, `inngest`, `trigger-dev` | ## Bộ sưu tập Tuyển chọn [Xem các Gói khởi đầu tại docs/vietnamese/BUNDLES.md](BUNDLES.vi.md) để tìm bộ công cụ hoàn hảo cho vai trò của bạn. -## Duyệt hơn 560 Kỹ năng +## Duyệt hơn 1,684 Kỹ năng Chúng tôi đã chuyển danh sách đầy đủ các kỹ năng sang một danh mục riêng biệt để giữ cho file README này gọn gàng. @@ -64,20 +65,18 @@ Chúng tôi đã chuyển danh sách đầy đủ các kỹ năng sang một dan ## Cài đặt -Để sử dụng các kỹ năng này với **Claude Code**, **Gemini CLI**, **Codex CLI**, **Cursor**, **Antigravity**, hoặc **OpenCode**, hãy clone repository này vào thư mục kỹ năng của assistant của bạn: +Để sử dụng các kỹ năng này với **Claude Code**, **Gemini CLI**, **Codex CLI**, **Cursor**, **Antigravity**, **Kiro**, **OpenCode** hoặc **AdaL**, hãy dùng installer CLI: ```bash -# Cài đặt phổ thông (hoạt động với hầu hết các công cụ) -git clone https://github.com/sickn33/antigravity-awesome-skills.git .agent/skills +npx antigravity-awesome-skills -# Dành riêng cho Claude Code -git clone https://github.com/sickn33/antigravity-awesome-skills.git .claude/skills - -# Dành riêng cho Gemini CLI -git clone https://github.com/sickn33/antigravity-awesome-skills.git .gemini/skills - -# Dành riêng cho Cursor -git clone https://github.com/sickn33/antigravity-awesome-skills.git .cursor/skills +# Ví dụ theo công cụ: +npx antigravity-awesome-skills --claude +npx antigravity-awesome-skills --gemini +npx antigravity-awesome-skills --codex +npx antigravity-awesome-skills --cursor +npx antigravity-awesome-skills --kiro +npx antigravity-awesome-skills --agy ``` --- @@ -88,8 +87,8 @@ Chúng tôi chào đón mọi sự đóng góp từ cộng đồng! Để thêm 1. **Fork** repository. 2. **Tạo một thư mục mới** bên trong `skills/` cho kỹ năng của bạn. -3. **Thêm file `SKILL.md`** với phần frontmatter bắt buộc (tên và mô tả). -4. **Chạy kiểm tra xác thực**: `python3 scripts/validate_skills.py`. +3. **Thêm file `SKILL.md`** theo mẫu `docs/contributors/skill-template.md`. +4. **Chạy kiểm tra xác thực**: `npm run validate`. 5. **Gửi một Pull Request**. Vui lòng đảm bảo kỹ năng của bạn tuân thủ các thực hành tốt nhất của Antigravity/Claude Code. diff --git a/antigravity-awesome-skills/docs/vietnamese/SKILLS_README.vi.md b/antigravity-awesome-skills/docs/vietnamese/SKILLS_README.vi.md index 586bd5a7..ae3405ca 100644 --- a/antigravity-awesome-skills/docs/vietnamese/SKILLS_README.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/SKILLS_README.vi.md @@ -1,6 +1,6 @@ # Thư mục Kỹ năng (Skills Directory) -**Chào mừng đến với thư mục Kỹ năng!** Đây là nơi tập hợp tất cả 179+ kỹ năng AI chuyên biệt. +**Chào mừng đến với thư mục Kỹ năng!** Đây là nơi tập hợp tất cả 1,684+ kỹ năng AI chuyên biệt. ## 🤔 Kỹ năng là gì? @@ -30,7 +30,7 @@ skills/ ## Cách sử dụng Kỹ năng ### Bước 1: Đảm bảo kỹ năng đã được thiết lập -Các file kỹ năng nên nằm trong thư mục `.agent/skills/` của bạn (hoặc `.claude/skills/`, `.gemini/skills/`, v.v.) +Theo mặc định, installer đặt kỹ năng vào `~/.agents/skills/`. Bạn cũng có thể dùng cờ theo công cụ như `--claude`, `--gemini`, `--codex`, `--cursor`, `--kiro`, `--antigravity`, `--agy`, hoặc `--path `. ### Bước 2: Kích hoạt kỹ năng trong cuộc trò chuyện với AI Sử dụng biểu tượng `@` theo sau bởi tên kỹ năng: @@ -63,7 +63,7 @@ ls skills/ | grep "từ khóa" ``` ### Cách 3: Kiểm tra README chính -Xem [README chính](README.vi.md) để biết danh sách đầy đủ tất cả 179+ kỹ năng được tổ chức theo danh mục. +Xem [README chính](README.vi.md) và [CATALOG.md](../../CATALOG.md) để biết danh sách đầy đủ tất cả 1,684+ kỹ năng được tổ chức theo danh mục. --- diff --git a/antigravity-awesome-skills/docs/vietnamese/SKILL_ANATOMY.vi.md b/antigravity-awesome-skills/docs/vietnamese/SKILL_ANATOMY.vi.md index 95c8a4ad..e0449ec6 100644 --- a/antigravity-awesome-skills/docs/vietnamese/SKILL_ANATOMY.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/SKILL_ANATOMY.vi.md @@ -46,6 +46,10 @@ Frontmatter nằm ở ngay đầu file, được bao bọc bởi cặp `---`: --- name: my-skill-name description: "Mô tả ngắn gọn về chức năng của skill này" +category: development +risk: safe +source: community +date_added: 2026-06-25 --- ``` @@ -65,6 +69,26 @@ description: "Mô tả ngắn gọn về chức năng của skill này" - **Độ dài:** Nên dưới 150 ký tự. - **Ví dụ:** `"Các mẫu tích hợp thanh toán Stripe bao gồm checkout, đăng ký gói (subscriptions) và webhooks"` +#### `category` + +- **Định nghĩa:** Danh mục chính của skill. +- **Ví dụ:** `development`, `security`, `testing`, `infrastructure`. + +#### `risk` + +- **Định nghĩa:** Mức rủi ro của hướng dẫn trong skill. +- **Giá trị:** `none`, `safe`, `critical`, `offensive`, hoặc `unknown`. + +#### `source` + +- **Định nghĩa:** Nguồn gốc của skill. +- **Ví dụ:** `community`, `self`, hoặc URL nguồn. + +#### `date_added` + +- **Định nghĩa:** Ngày skill được thêm vào registry. +- **Định dạng:** `YYYY-MM-DD`. + ### Các trường Tùy chọn Một số skill bao gồm thêm siêu dữ liệu bổ sung: @@ -73,8 +97,12 @@ Một số skill bao gồm thêm siêu dữ liệu bổ sung: --- name: my-skill-name description: "Mô tả ngắn" -risk: "safe" # none | safe | critical | offensive (xem QUALITY_BAR.md) -source: "community" +category: development +risk: safe +source: community +source_repo: "https://github.com/example/example-skills" +source_type: "github" +date_added: 2026-06-25 tags: ["react", "typescript"] --- ``` @@ -304,19 +332,19 @@ references/ ### Skill Tối giản (Minimum Viable Skill) -- **Frontmatter:** name + description +- **Frontmatter:** `name`, `description`, `category`, `risk`, `source`, `date_added`; thêm `source_repo` và `source_type` khi skill bắt nguồn từ GitHub bên ngoài - **Nội dung:** 100-200 từ - **Các mục:** Tổng quan + Hướng dẫn ### Skill Tiêu chuẩn (Standard Skill) -- **Frontmatter:** name + description +- **Frontmatter:** `name`, `description`, `category`, `risk`, `source`, `date_added`; thêm `source_repo` và `source_type` khi skill bắt nguồn từ GitHub bên ngoài - **Nội dung:** 300-800 từ - **Các mục:** Tổng quan + Khi nào sử dụng + Hướng dẫn + Ví dụ ### Skill Toàn diện (Comprehensive Skill) -- **Frontmatter:** name + description + các trường tùy chọn +- **Frontmatter:** các trường chuẩn ở trên, cộng `source_repo`/`source_type` khi skill bắt nguồn từ GitHub bên ngoài và các trường tùy chọn khi hữu ích - **Nội dung:** 800-2000 từ - **Các mục:** Đầy đủ tất cả các mục đề xuất - **Bổ sung:** Scripts, ví dụ, templates diff --git a/antigravity-awesome-skills/docs/vietnamese/TRANSLATION_PLAN.vi.md b/antigravity-awesome-skills/docs/vietnamese/TRANSLATION_PLAN.vi.md index d4523d26..304d8e3e 100644 --- a/antigravity-awesome-skills/docs/vietnamese/TRANSLATION_PLAN.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/TRANSLATION_PLAN.vi.md @@ -2,7 +2,7 @@ Tài liệu này dùng để theo dõi tiến độ dịch thuật toàn bộ repository `antigravity-awesome-skills` sang tiếng Việt. -**Mục tiêu:** Dịch toàn bộ 560+ kỹ năng và tài liệu hướng dẫn. +**Mục tiêu:** Dịch toàn bộ 1,684+ kỹ năng và tài liệu hướng dẫn. **Quy tắc:** 1. Giữ nguyên cấu trúc thư mục gốc. 2. File dịch được lưu tại `docs/vietnamese/skills//.vi.md`. diff --git a/antigravity-awesome-skills/docs/vietnamese/VISUAL_GUIDE.vi.md b/antigravity-awesome-skills/docs/vietnamese/VISUAL_GUIDE.vi.md index 7c30302e..6a6e5b9a 100644 --- a/antigravity-awesome-skills/docs/vietnamese/VISUAL_GUIDE.vi.md +++ b/antigravity-awesome-skills/docs/vietnamese/VISUAL_GUIDE.vi.md @@ -33,7 +33,7 @@ antigravity-awesome-skills/ ├── 📄 README.md ← Tổng quan & danh sách skill ├── 📄 CONTRIBUTING.md ← Cách thức đóng góp │ -├── 📁 skills/ ← Nơi chứa tất cả hơn 250 skills +├── 📁 skills/ ← Nguồn canonical cho 1,684+ skills │ │ │ ├── 📁 brainstorming/ │ │ └── 📄 SKILL.md ← Định nghĩa skill @@ -42,11 +42,12 @@ antigravity-awesome-skills/ │ │ ├── 📄 SKILL.md │ │ └── 📁 examples/ ← Các phần bổ sung tùy chọn │ │ -│ └── ... (Hơn 250 skills khác) +│ └── ... (1,684+ skills khác) │ -├── 📁 scripts/ ← Quản lý & Xác thực -│ ├── validate_skills.py ← Công cụ kiểm soát chất lượng -│ └── generate_index.py ← Công cụ tạo danh mục (registry) +├── 📁 tools/ +│ ├── 📁 scripts/ ← Quản lý, xác thực và tạo catalog +│ ├── 📁 lib/ ← Logic installer dùng chung +│ └── 📁 bin/ ← CLI entrypoint │ ├── 📁 .github/ │ └── 📄 MAINTENANCE.md ← Hướng dẫn cho người duy trì @@ -66,7 +67,7 @@ antigravity-awesome-skills/ ``` ┌──────────────┐ -│ 1. CÀI ĐẶT │ Sao chép skills vào .agent/skills/ +│ 1. CÀI ĐẶT │ npx antigravity-awesome-skills 1 └──────┬───────┘ │ ↓ @@ -96,7 +97,7 @@ antigravity-awesome-skills/ ``` ┌─────────────────────────┐ - │ 250+ AWESOME SKILLS │ + │ 1,684+ AWESOME SKILLS │ └────────────┬────────────┘ │ ┌────────────────────────┼────────────────────────┐ @@ -174,17 +175,15 @@ antigravity-awesome-skills/ ## Cài đặt (Các bước Trực quan) -### Bước 1: Sao chép Repository +### Bước 1: Cài đặt bằng installer ``` ┌─────────────────────────────────────────┐ │ Terminal │ ├─────────────────────────────────────────┤ -│ $ git clone https://github.com/ │ -│ sickn33/antigravity-awesome-skills │ -│ .agent/skills │ +│ $ npx antigravity-awesome-skills │ │ │ -│ ✓ Đang sao chép vào '.agent/skills'... │ +│ ✓ Cài vào '~/.agents/skills'... │ │ ✓ Hoàn tất! │ └─────────────────────────────────────────┘ ``` @@ -195,12 +194,12 @@ antigravity-awesome-skills/ ┌─────────────────────────────────────────┐ │ File Explorer │ ├─────────────────────────────────────────┤ -│ 📁 .agent/ │ +│ 📁 ~/.agents/ │ │ └── 📁 skills/ │ │ ├── 📁 brainstorming/ │ │ ├── 📁 stripe-integration/ │ │ ├── 📁 react-best-practices/ │ -│ └── ... (Thêm 176 mục nữa) │ +│ └── ... (1,684+ skills) │ └─────────────────────────────────────────┘ ``` @@ -313,12 +312,12 @@ Mở file skills_index.json → Tìm từ khóa → Tìm đường dẫn đến │ ↓ ┌──────────────┐ -│ 4. KIỂM THỬ │ Sao chép vào .agent/skills/ +│ 4. KIỂM THỬ │ Cài bằng npx hoặc --path thử nghiệm └──────┬───────┘ Thử: @docker-mastery │ ↓ ┌──────────────┐ -│ 5. XÁC THỰC │ python3 scripts/validate_skills.py +│ 5. XÁC THỰC │ npm run validate └──────┬───────┘ │ ↓ @@ -437,7 +436,7 @@ BẮT ĐẦU TẠI ĐÂY ├─────────────────────────────────────────────────────────────┤ │ │ │ 📥 CÀI ĐẶT │ -│ git clone [repo] .agent/skills │ +│ npx antigravity-awesome-skills │ │ │ │ 🎯 SỬ DỤNG │ │ @ten-skill [yêu cầu của bạn] │ @@ -446,7 +445,7 @@ BẮT ĐẦU TẠI ĐÂY │ ls skills/ | grep "từ-khóa" │ │ │ │ ✅ XÁC THỰC │ -│ python3 scripts/validate_skills.py │ +│ npm run validate │ │ │ │ 📝 TẠO SKILL │ │ 1. mkdir skills/ten-skill-cua-ban │ diff --git a/antigravity-awesome-skills/docs_zh-CN/README.md b/antigravity-awesome-skills/docs_zh-CN/README.md index 2117323d..5d98ca68 100644 --- a/antigravity-awesome-skills/docs_zh-CN/README.md +++ b/antigravity-awesome-skills/docs_zh-CN/README.md @@ -1,7 +1,7 @@ - -# 🌌 Antigravity Awesome Skills: 1,494+ 代理技能,适用于 Claude Code、Gemini CLI、Cursor、Copilot 及更多工具 + +# 🌌 Antigravity Awesome Skills: 1,684+ 代理技能,适用于 Claude Code、Gemini CLI、Cursor、Copilot 及更多工具 -> **可安装的 GitHub 技能库,包含 1,494+ 个代理技能,适用于 Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity 和其他 AI 编码助手。** +> **可安装的 GitHub 技能库,包含 1,684+ 个代理技能,适用于 Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity 和其他 AI 编码助手。** Antigravity Awesome Skills 是一个 GitHub 仓库和安装器 CLI,提供可复用的 `SKILL.md` 剧本。与其收集随机提示词,你可以获得一个可搜索、可安装的技能库,涵盖规划、编码、调试、测试、安全审查、基础设施工作、产品工作流和成长任务,支持主流 AI 编码助手。 @@ -20,13 +20,13 @@ Antigravity Awesome Skills 是一个 GitHub 仓库和安装器 CLI,提供可 [![OpenCode](https://img.shields.io/badge/OpenCode-CLI-gray?style=for-the-badge)](https://github.com/opencode-ai/opencode) [![Antigravity](https://img.shields.io/badge/Antigravity-AI%20IDE-red?style=for-the-badge)](https://github.com/sickn33/antigravity-awesome-skills) -**当前版本:V11.5.0。** 值得 35k+ GitHub 星标信赖,该仓库结合了官方和社区的技能集合,提供捆绑包、工作流、安装路径和文档,帮助你从首次安装快速过渡到日常使用。 +**当前版本:V13.2.0。** 值得 42k+ GitHub 星标信赖,该仓库结合了官方和社区的技能集合,提供捆绑包、工作流、安装路径和文档,帮助你从首次安装快速过渡到日常使用。 ## 为什么开发者为这个仓库加星 - **可安装,而不仅是启发式**:使用 `npx antigravity-awesome-skills` 将技能放置在你的工具期望的位置。 - **为主要代理工作流构建**:Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity、Kiro、OpenCode、Copilot 等。 -- **广泛的覆盖范围和实用价值**:1,494+ 个技能,涵盖开发、测试、安全、基础设施、产品和营销。 +- **广泛的覆盖范围和实用价值**:1,684+ 个技能,涵盖开发、测试、安全、基础设施、产品和营销。 - **更快的入门**:捆绑包和工作流减少了从"发现这个仓库"到"使用第一个技能"的时间。 - **无论你需要广度还是精选都有用**:浏览完整目录、从顶级捆绑包开始,或在安装前比较替代方案。 @@ -46,7 +46,7 @@ Antigravity Awesome Skills 是一个 GitHub 仓库和安装器 CLI,提供可 - [🧭 Antigravity 工作流](#antigravity-工作流) - [⚖️ 替代方案与比较](#替代方案与比较) - [📦 功能与类别](#功能与类别) -- [📚 浏览 1,494+ 技能](#浏览-1494-技能) +- [📚 浏览 1,684+ 技能](#浏览-1684-技能) - [🤝 贡献](#贡献) - [💬 社区](#社区) - [☕ 支持项目](#支持项目) @@ -63,7 +63,7 @@ Antigravity Awesome Skills 是一个 GitHub 仓库和安装器 CLI,提供可 ### 1. 🐣 背景:这是什么? -**Antigravity Awesome Skills**(版本 11.5.0)是一个大型可安装技能库,适用于 AI 编码助手。它包括入门文档、捆绑包、工作流、生成的目录和 CLI 安装器,让你无需手动拼接数十个仓库就能从发现过渡到实际使用。 +**Antigravity Awesome Skills**(版本 13.2.0)是一个大型可安装技能库,适用于 AI 编码助手。它包括入门文档、捆绑包、工作流、生成的目录和 CLI 安装器,让你无需手动拼接数十个仓库就能从发现过渡到实际使用。 AI 代理很聪明,但仍需要**特定于任务的操作指令**。技能是专注的 markdown 剧本,教代理如何重复执行工作流并提供更好的上下文,无论是部署、API 设计、测试、产品策略、SEO 还是文档。 @@ -138,7 +138,7 @@ AI 代理很聪明,但仍需要**特定于任务的操作指令**。技能是 ### 如何安装它? -使用 `npx antigravity-awesome-skills`,或工具特定标志,如 `--codex`、`--cursor`、`--gemini` 或 `--claude`,当你希望安装器定位到特定技能目录时。 +使用 `npx antigravity-awesome-skills`,或工具特定标志,如 `--codex`、`--cursor`、`--gemini`、`--claude`、`--antigravity` 或 `--agy`,当你希望安装器定位到特定技能目录时。对于上下文敏感的宿主,还可以用 `--risk`、`--category` 和 `--tags` 安装较小子集。 ### 技能和 MCP 工具有什么区别? @@ -164,6 +164,7 @@ AI 代理很聪明,但仍需要**特定于任务的操作指令**。技能是 | **Kiro CLI** | CLI | `(Auto) Skills load on-demand` | 全局:`~/.kiro/skills/` · 工作区:`.kiro/skills/` | | **Kiro IDE** | IDE | `/skill-name or (Auto)` | 全局:`~/.kiro/skills/` · 工作区:`.kiro/skills/` | | **Antigravity** | IDE | `(Agent Mode) Use skill...` | 全局:`~/.agents/skills/` · 工作区:`.agent/skills/` | +| **Antigravity CLI (`agy`)** | CLI | `/skill-name help me...` | `~/.gemini/antigravity-cli/skills/` | | **Cursor** | IDE | `@skill-name (in Chat)` | `.cursor/skills/` | | **Copilot** | Ext | `(Paste content manually)` | N/A | | **OpenCode** | CLI | `opencode run @skill-name` | `.agents/skills/` | @@ -229,16 +230,17 @@ Codex 插件通过仓库本地插件入口指向相同的精选 `skills/` 树, | Gemini CLI | `npx antigravity-awesome-skills --gemini` | `Use brainstorming to plan a feature` | | Codex CLI | `npx antigravity-awesome-skills --codex` | `Use brainstorming to plan a feature` | | Antigravity | `npx antigravity-awesome-skills --antigravity` | `Use @brainstorming to plan a feature` | +| Antigravity CLI (`agy`) | `npx antigravity-awesome-skills --agy` | `/brainstorming help me plan a feature` | | Kiro CLI | `npx antigravity-awesome-skills --kiro` | `Use brainstorming to plan a feature` | | Kiro IDE | `npx antigravity-awesome-skills --path ~/.kiro/skills` | `Use @brainstorming to plan a feature` | | GitHub Copilot | _无安装器 — 手动粘贴技能或规则_ | `Ask Copilot to use brainstorming to plan a feature` | -| OpenCode | `npx antigravity-awesome-skills --path .agents/skills` | `opencode run @brainstorming help me plan a feature` | +| OpenCode | `npx antigravity-awesome-skills --path .agents/skills --category development,backend --risk safe,none` | `opencode run @brainstorming help me plan a feature` | | AdaL CLI | `npx antigravity-awesome-skills --path .adal/skills` | `Use brainstorming to plan a feature` | | 自定义路径 | `npx antigravity-awesome-skills --path ./my-skills` | 取决于你的工具 | ## 按工具查看最佳技能 -如果你想要比"浏览所有 1,494+ 技能"更快的答案,请从工具特定指南开始: +如果你想要比"浏览所有 1,684+ 技能"更快的答案,请从工具特定指南开始: - **[Claude Code 技能](users/claude-code-skills.md)**:安装路径、入门技能、提示词示例和插件市场流程。 - **[Cursor 技能](users/cursor-skills.md)**:`.cursor/skills/` 的最佳入门技能、UI 重型工作和配对编程流程。 @@ -321,27 +323,28 @@ Use @security-auditor to review this API endpoint for auth and validation risks. 它们帮助你避免逐一浏览完整目录。 -### ⚠️ 重要:捆绑包不是单独的安装! +### ⚠️ 重要:捆绑包不是可调用的超级技能! -**常见困惑**:"我需要单独安装每个捆绑包吗?" +**常见困惑**:"我可以像 `@web-wizard` 一样调用整个捆绑包吗?" -**答案:不需要!** 以下是捆绑包的实际含义: +**答案:不能直接这样调用。** 以下是捆绑包的实际含义: **捆绑包是什么:** - ✅ 按角色组织的推荐技能列表 +- ✅ 可用于 Claude/Codex 插件子集或 Antigravity 激活预设 - ✅ 精选起点,帮助你决定使用什么 - ✅ 发现相关技能的省时捷径 **捆绑包不是什么:** -- ❌ 单独的安装或下载 +- ❌ 可调用的单个大型技能 - ❌ 不同的 git 命令 -- ❌ 大多数用户在正常安装期间需要激活的东西 +- ❌ 大多数用户每天都必须单独管理的东西 ### 如何使用捆绑包: -1. **安装一次仓库**(你已经拥有所有技能) +1. **安装一次仓库**(你已经拥有所有技能;也可以用插件或激活脚本选择较小子集) 2. **在 [docs/users/bundles.md](users/bundles.md) 中浏览捆绑包**以找到你的角色 3. **从该捆绑包中选择 3-5 个技能**开始在提示词中使用 4. **在与 AI 的对话中引用它们**(例如,"使用 @brainstorming...") @@ -402,7 +405,7 @@ Use @security-auditor to review this API endpoint for auth and validation risks. 计数随着新技能的添加而变化。有关当前完整注册表,请参阅 [CATALOG.md](../CATALOG.md)。 -## 浏览 1,494+ 技能 +## 浏览 1,684+ 技能 - 在 [`../apps/web-app`](../apps/web-app) 中打开交互式浏览器。 - 在 [`../CATALOG.md`](../CATALOG.md) 中阅读完整目录。 diff --git a/antigravity-awesome-skills/docs_zh-CN/contributors/quality-bar.md b/antigravity-awesome-skills/docs_zh-CN/contributors/quality-bar.md index 3fd3e25c..dda89285 100644 --- a/antigravity-awesome-skills/docs_zh-CN/contributors/quality-bar.md +++ b/antigravity-awesome-skills/docs_zh-CN/contributors/quality-bar.md @@ -27,6 +27,7 @@ 每个技能必须声明其风险级别: +- ⚪ **unknown**:遗留或未分类内容。新技能应避免使用,除非确实需要维护者分流。 - 🟢 **none**:纯文本/推理(例如:头脑风暴) - 🔵 **safe**:读取文件、运行安全命令(例如:代码检查器) - 🟠 **critical**:修改状态、删除文件、推送到生产环境(例如:Git 推送) diff --git a/antigravity-awesome-skills/docs_zh-CN/contributors/skill-template.md b/antigravity-awesome-skills/docs_zh-CN/contributors/skill-template.md index 1d18efe3..b0b7f1bd 100644 --- a/antigravity-awesome-skills/docs_zh-CN/contributors/skill-template.md +++ b/antigravity-awesome-skills/docs_zh-CN/contributors/skill-template.md @@ -80,9 +80,17 @@ A: 详细回答... - `name`: 技能名称(小写,连字符分隔) - `description`: 一句话技能描述(200字符以内,以中文引号包围) - `category`: 技能分类(见下方分类列表) -- `risk`: 风险级别(safe/medium/high) -- `source`: 来源(community/official) +- `risk`: 风险级别(none/safe/critical/offensive/unknown) +- `source`: 来源(community/official/self) - `date_added`: 添加日期(YYYY-MM-DD格式) + +**外部 GitHub 来源必需字段:** + +- `source_repo`: 上游仓库(OWNER/REPO) +- `source_type`: README 来源致谢分组(official/community/self) + +**可选字段:** + - `author`: 作者名称或handle - `tags`: 标签列表(最大5个) - `tools`: 支持的工具列表(claude/cursor/gemini/codex/antigravity等) @@ -144,20 +152,25 @@ tools: [claude, cursor, gemini] ### ⚠️ 风险级别定义 +**unknown(未知):** +- 遗留或未分类内容;新技能应尽量避免使用 + +**none(无风险):** +- 纯文本或推理指导 + **safe(安全):** - 代码审查和设计建议 - 文档编写和规范指导 -- 标准操作流程 +- 只读命令或低风险操作流程 -**medium(中等):** +**critical(关键):** - 系统修改和配置更改 - 数据处理和转换 - 自动化脚本执行 -**high(高风险):** -- 数据库修改和删除操作 -- 生产环境更改 -- 安全相关操作 +**offensive(进攻性):** +- Pentesting 或 red-team 技术 +- 必须包含 Authorized Use Only 警告 ### 🏷️ 标签规范 @@ -289,4 +302,4 @@ skills/ 如果您有任何疑问或需要指导,请随时联系我们。 -**期待您的贡献!** 🚀 \ No newline at end of file +**期待您的贡献!** 🚀 diff --git a/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-cortex.md b/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-cortex.md index 76648000..0b6b6915 100644 --- a/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-cortex.md +++ b/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-cortex.md @@ -1,9 +1,9 @@ --- title: Jetski/Cortex + Gemini 集成指南 -description: "如何在不超出上下文窗口的情况下,在 Jetski/Cortex 中使用 antigravity-awesome-skills 的 1,494+ 技能。" +description: "如何在不超出上下文窗口的情况下,在 Jetski/Cortex 中使用 antigravity-awesome-skills 的 1,684+ 技能。" --- -# Jetski/Cortex + Gemini:与 1,494+ 技能的安全集成 +# Jetski/Cortex + Gemini:与 1,684+ 技能的安全集成 本指南展示如何将 `antigravity-awesome-skills` 仓库与基于 **Jetski/Cortex + Gemini** (或类似框架)的代理集成,**而不会超出模型的上下文窗口**。 @@ -23,7 +23,7 @@ description: "如何在不超出上下文窗口的情况下,在 Jetski/Cortex - 将所有 `SKILL.md` 的内容连接到单个系统提示词中; - 为**每次**请求重新注入整个库。 -对于超过 1,494 个技能,这种方法在添加用户消息之前就填满了上下文窗口,导致截断错误。 +对于超过 1,684 个技能,这种方法在添加用户消息之前就填满了上下文窗口,导致截断错误。 --- @@ -31,14 +31,14 @@ description: "如何在不超出上下文窗口的情况下,在 Jetski/Cortex 关键原则: -- **轻量级清单**: 使用 `data/skills_index.json` 来了解存在*哪些*技能,而无需加载完整文本。 +- **轻量级清单**: 使用根目录的 `skills_index.json` 作为规范清单来了解存在*哪些*技能,而无需加载完整文本。`data/skills_index.json` 只是兼容性镜像。 - **延迟加载**: 仅针对对话中实际调用的技能(例如,当出现 `@skill-id` 时)读取 `SKILL.md`。 - **显式限制**: 对每轮加载的最大技能数/tokens数施加限制,并提供清晰的回退机制。 - **路径安全**: 在读取 `SKILL.md` 之前,验证清单中的路径是否保持在 `SKILLS_ROOT` 内。 推荐的流程是: -1. **引导**: 在代理启动时读取 `data/skills_index.json` 并构建 `id -> meta` 映射。 +1. **引导**: 在代理启动时读取 `skills_index.json` 并构建 `id -> meta` 映射。 2. **消息解析**: 在调用模型之前,从用户/系统消息中提取所有 `@skill-id` 引用。 3. **解析**: 使用引导映射将找到的 id 映射到 `SkillMeta` 对象。 4. **延迟加载**: 仅针对这些 id 读取 `SKILL.md` 文件(最多可达可配置的最大值)。 @@ -48,7 +48,7 @@ description: "如何在不超出上下文窗口的情况下,在 Jetski/Cortex ## 3. `skills_index.json` 的结构 -文件 `data/skills_index.json` 是一个对象数组,例如: +文件 `skills_index.json` 是一个对象数组。`data/skills_index.json` 必须保持相同内容,但只作为兼容性镜像。例如: ```json { @@ -72,7 +72,7 @@ description: "如何在不超出上下文窗口的情况下,在 Jetski/Cortex - `fullPath = path.join(SKILLS_ROOT, meta.path, "SKILL.md")`。 -> 注意: `SKILLS_ROOT` 是安装仓库的根目录(例如 `~/.agent/skills`)。 +> 注意: `SKILLS_ROOT` 是安装仓库的根目录(例如 `~/.agents/skills`)。 --- @@ -265,7 +265,7 @@ async function buildModelMessages( ## 9. 总结 - 切勿将所有 `SKILL.md` 连接到单个提示词中。 -- 使用 `data/skills_index.json` 作为轻量级清单。 +- 使用根目录 `skills_index.json` 作为轻量级规范清单;仅在宿主必须读取 `data/` 子树时使用 `data/skills_index.json` 兼容性镜像。 - 基于 `@skill-id` **按需**加载技能。 - 设置明确的限制(每轮最大技能数、token 阈值)。 diff --git a/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-gemini-loader/README.md b/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-gemini-loader/README.md index a0a995af..ce4f0177 100644 --- a/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-gemini-loader/README.md +++ b/antigravity-awesome-skills/docs_zh-CN/integrations/jetski-gemini-loader/README.md @@ -9,7 +9,7 @@ ## 此示例演示的内容 - 如何: - - 在启动时加载全局清单 `data/skills_index.json`; + - 在启动时加载规范清单 `skills_index.json`(`data/skills_index.json` 只是兼容性镜像); - 扫描对话消息中的 `@skill-id` 模式; - 将这些 id 解析为清单中的条目; - 仅从磁盘读取相应的 `SKILL.md` 文件(延迟加载); @@ -20,7 +20,7 @@ - 如何通过 `maxSkillsPerTurn` 强制执行**每轮最大技能数**。 - 如何通过 `overflowBehavior` 选择在请求太多技能时是**截断还是报错**。 -此模式避免了在安装 1,494+ 技能时的上下文溢出。 +此模式避免了在安装 1,684+ 技能时的上下文溢出。 --- @@ -49,7 +49,7 @@ import { const REPO_ROOT = "/path/to/antigravity-awesome-skills"; const SKILLS_ROOT = REPO_ROOT; -const INDEX_PATH = path.join(REPO_ROOT, "data", "skills_index.json"); +const INDEX_PATH = path.join(REPO_ROOT, "skills_index.json"); // 1. 在代理启动时引导一次 const skillIndex = loadSkillIndex(INDEX_PATH); @@ -85,7 +85,7 @@ async function runTurn(trajectory: Message[]) { - **不要**遍历 `skills/*/SKILL.md` 并一次性加载所有内容。 - 此示例: - - 假设技能与 `data/skills_index.json` 位于同一仓库根目录下; + - 假设技能与根目录 `skills_index.json` 位于同一仓库根目录下; - 使用纯 Node.js ESM 模块,因此可以在没有 TypeScript 运行时的情况下直接导入。 - 在真实主机中: - 将 `buildModelMessages` 连接到您当前在 `TrajectoryChatConverter` 之前组装提示词的位置; diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/audit.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/audit.md index f04a5832..10d535de 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/audit.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/audit.md @@ -15,8 +15,8 @@ ### 1. 计数 -- `README.md`、`package.json` 和生成的工件与当前集合大小(`1,204+` 技能)保持一致。 -- `npm run sync:all` 和 `npm run catalog` 是保持计数和生成文件同步的规范命令。 +- `README.md`、`package.json` 和生成的工件应与当前集合大小(`1,684+` 技能)保持一致。 +- `npm run sync:repo-state`、`npm run catalog` 和发布流程中的 `npm run sync:release-state` 是保持计数和生成文件同步的规范命令。 ### 2. 技能验证 diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/categorization-implementation.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/categorization-implementation.md index 8766f2e8..cacf6a96 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/categorization-implementation.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/categorization-implementation.md @@ -5,14 +5,16 @@ ### 1. **智能自动分类脚本** 创建了 [`tools/scripts/auto_categorize_skills.py`](../../tools/scripts/auto_categorize_skills.py),它: - 分析技能名称和描述 -- 针对 13 个类别的关键词库进行匹配 +- 针对作为当前生成类别元数据种子的关键词库进行匹配 - 自动分配有意义的类别 - 移除"未分类"批量分配 -**结果:** +**历史初次运行结果:** - ✅ 776 个技能自动分类 - ✅ 46 个已有类别的技能被保留 -- ✅ 124 个仍为未分类(边缘情况) +- ✅ 当时仍有 124 个未分类(边缘情况) + +当前计数请以 `skills_index.json` 为准;活跃仓库已经超过该历史快照。 ### 2. **类别分布** @@ -26,20 +28,8 @@ security: 4 **之后:** ``` -Backend: 164 ████████████████ -Web Dev: 107 ███████████ -Automation: 103 ███████████ -DevOps: 83 ████████ -AI/ML: 79 ████████ -Content: 47 █████ -Database: 44 █████ -Testing: 38 ████ -Security: 36 ████ -Cloud: 33 ███ -Mobile: 21 ██ -Game Dev: 15 ██ -Data Science: 14 ██ -Uncategorized: 126 █ +生成类别元数据现在来自当前的 skills_index.json。 +不要在面向用户的文档中保留这些历史计数。 ``` ### 3. **更新的索引生成** @@ -54,16 +44,16 @@ Uncategorized: 126 █ **主页更改:** - ✅ 类别按技能数量排序(最多的在前) - ✅ "未分类"移至底部 -- ✅ 每个类别显示计数:"Backend (164)"、"Web Dev (107)" +- ✅ 每个类别显示从生成索引计算出的计数 - ✅ 更易于导航 **更新的代码:** - [`apps/web-app/src/pages/Home.tsx`](../../apps/web-app/src/pages/Home.tsx) - 智能类别排序 - 使用 categoryStats 按数量排序类别 - 未分类始终在最后 -- 在下拉菜单中显示计数 +- 在下拉菜单中显示生成的计数 -### 5. **分类关键词**(13 个类别) +### 5. **分类关键词**(种子桶) | 类别 | 主要关键词 | |----------|--------------| @@ -97,16 +87,16 @@ Uncategorized: 126 █ ### 更好的用户体验 1. **更智能的过滤**: 类别按相关性排序 -2. **视觉提示**: 显示计数 "(164 个技能)"" +2. **视觉提示**: 显示当前生成计数 3. **未分类最后**: 将不良选项隐藏 4. **有意义的分组**: 按实际功能查找技能 ### 示例工作流 用户想要查找数据库技能: 1. 打开 Web 应用程序 -2. 看到过滤器下拉菜单:"Backend (164) | Database (44) | Web Dev (107)..." -3. 点击 "Database (44)" -4. 获得 44 个相关的 SQL/MongoDB/Postgres 技能 +2. 看到带有生成计数的过滤器下拉菜单 +3. 点击当前与数据库相关的类别 +4. 获得当前匹配的 SQL/MongoDB/Postgres 技能 5. 完成!🎉 ## 🚀 使用方法 diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/ci-drift-fix.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/ci-drift-fix.md index 491e132f..580fca0d 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/ci-drift-fix.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/ci-drift-fix.md @@ -1,6 +1,6 @@ # CI 漂移修复指南 -**问题**:失败的作业是由于在更新脚本运行后在 `README.md`、`skills_index.json` 或目录文件中检测到未提交的更改引起的。 +**问题**:失败的作业通常是因为 `main` 上的规范同步步骤运行后仍留下受跟踪的漂移。 **错误**: @@ -9,30 +9,54 @@ ``` **原因**: -像 `tools/scripts/generate_index.py`、`tools/scripts/update_readme.py` 和 `tools/scripts/build-catalog.js` 这样的脚本会修改 `README.md`、`skills_index.json`、`data/catalog.json`、`data/bundles.json`、`data/aliases.json` 和 `CATALOG.md`。工作流期望这些文件在脚本运行后没有更改。任何差异意味着提交的仓库与生成脚本产生的内容不同步。 +规范同步契约不只覆盖根注册表文件。`generate_index.py`、`update_readme.py`、`build-catalog.js`、`setup_web.js` 和插件同步助手可能合法更新: -**如何修复(每次都要这样做):** +- `README.md` +- `CATALOG.md` +- `skills_index.json` +- `data/*.json` +- `apps/web-app/public/` 下受跟踪的 Web 资产 +- 生成的插件元数据和插件安全副本 -1. 在本地运行**完整的验证链**: +工作流期望这些同步步骤结束后仓库是干净的。任何剩余的受跟踪或非托管更改都表示 `main` 与生成管道实际产物不同步。 + +## Pull Request vs Main + +- **Pull Request**:PR 现在应保持 **source-only**。贡献者不应提交派生注册表工件(`CATALOG.md`、`skills_index.json`、`data/*.json`)。CI 会阻止这些直接编辑,并将生成漂移作为信息性预览报告。 +- **`main` push**:漂移仍是严格错误。`main` 必须在自动同步步骤后保持干净。 + +## 如何在 `main` 上修复 + +1. 在本地运行规范维护者同步: ```bash - npm run chain - npm run catalog + npm run sync:repo-state ``` -2. 检查更改: +2. 检查是否仍有脏工作树: ```bash git status git diff ``` -3. 提交并推送任何更新: +3. 如果同步只产生规范/生成文件更改,请暂存并提交它们。优先使用生成文件契约,而不是手写文件列表: + ```bash - git add README.md skills_index.json data/catalog.json data/bundles.json data/aliases.json CATALOG.md - git commit -m "chore: sync generated registry files" + node tools/scripts/generated_files.js --include-mixed + git add $(node tools/scripts/generated_files.js --include-mixed) + git commit -m "chore: sync canonical artifacts" git push ``` +4. 如果 `sync:repo-state` 留下无关或非托管漂移,请停止并检查。`main` 上的 bot 只允许推送规范/生成子集;其他任何东西都应让工作流失败,而不是被静默自动提交。 + +## PR 维护者指南 + +- 验证源代码变更,而不是要求贡献者提交生成工件。 +- 如果贡献者 PR 直接修改 `CATALOG.md`、`skills_index.json` 或 `data/*.json`,请要求他们从 PR 中删除这些文件,或在刷新分支时移除。 +- 如果合并冲突涉及生成注册表文件,请保留 `main` 版本,并让 `main` 合并后自动同步最终生成物。 +- 如果 `main` 上的 CI 后续创建带 `[ci skip]` 的 bot 提交,这只对规范/生成子集是预期行为,不代表可以推送任意额外漂移。 + **总结**: -始终提交并推送 registry、README 同步和 catalog 脚本产生的所有更改。这通过确保仓库和生成的工件与规范的 `tools/scripts/*` 管道保持同步,保持 CI 通过。 +只在 `main` 上把生成器漂移视为硬失败。对 PR 来说,契约更简单:审查 source-only 变更,生成输出仅作预览,最终规范工件由 `main` 生成。 diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/release-process.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/release-process.md index 125d47b6..443c5f32 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/release-process.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/release-process.md @@ -1,432 +1,99 @@ # 发布流程 -这是维护者的仓库发布操作手册。历史发布记录在[`CHANGELOG.md`](../../CHANGELOG.md)中;本文档记录可重复的流程。 +这是维护者切发布版本时使用的操作手册。历史发布记录属于 [`CHANGELOG.md`](../../CHANGELOG.md);本文档只记录可重复的当前流程。 ## 前置条件 -- 工作目录是干净的,或者您已经明确隔离了发布更改。 -- `package.json`包含您打算发布的版本。 -- 生成的注册表文件已同步。 -- README统计、徽章和致谢是最新的。 +- 受 Git 跟踪的工作树是干净的。 +- 当前分支是 `main`。 +- `CHANGELOG.md` 已经包含准备发布的版本段落。 +- README 统计、徽章、致谢和支持链接是最新的。 ## 发布检查清单 -### 1. 运行操作验证套件: +1. 运行脚本化预检: ```bash -npm run validate -npm run validate:references -npm run sync:all -npm run test -npm run app:build +npm run release:preflight ``` -### 2. 可选的强化检查: +该预检会运行确定性的 `sync:release-state` 流程,刷新 `apps/web-app/public` 中受跟踪的 Web 资产,执行本地测试套件,安装 Web 应用依赖,构建 Web 应用,并执行 `npm pack --dry-run --json`,因此发布标签会用与 CI 后续相同的 artifact 路径验证。 + +当前 CI/发布契约还要求: + +- Python 依赖来自 `tools/requirements.txt`。 +- Web 应用覆盖率任务(`npm run app:test:coverage`)保持通过。 +- `npm run security:docs` 通过,且不依赖非阻塞审计警告。 + +2. 运行必需的文档安全加固检查: + +```bash +npm run security:docs +``` + +该检查用于在发布前验证整个仓库的高风险命令模式和类似 token 的内联示例。 + +3. 可选强化检查: ```bash npm run validate:strict ``` -将其用作诊断信号。它有助于发现历史质量债务,但目前还不是整个仓库的发布阻止因素。 +它适合发现历史质量债务,但目前不是整个仓库的发布阻断条件。 -### 3. 更新版本号: +4. 更新发布面向文档: + +- 在 [`CHANGELOG.md`](../../CHANGELOG.md) 中添加发布条目。 +- 确认 `README.md` 反映当前版本和生成计数。 +- 确认 Credits & Sources、贡献者和支持链接仍然正确。 +- 如果 PR 或 CI 工作流行为在本周期发生变化,确认维护者和贡献者文档提到了当前检查。 +- 如果维护者运行了 `npm run sync:risk-labels` 或类似清理流程,确认维护者文档仍描述当前 audit -> sync -> repo-state 循环。 + +5. 在本地准备发布提交和标签: ```bash -# 更新package.json中的版本 -npm version patch|minor|major - -# 或手动更新为特定版本 -npm version 1.2.3 +npm run release:prepare -- X.Y.Z ``` -### 4. 生成变更日志: +该命令会: + +- 检查 `CHANGELOG.md` 中是否存在 `X.Y.Z`。 +- 对齐 `package.json` / `package-lock.json`。 +- 运行完整发布套件。 +- 刷新 `README.md` 中的发布元数据。 +- 暂存规范发布文件。 +- 创建 `chore: release vX.Y.Z` 提交。 +- 创建本地标签 `vX.Y.Z`。 + +6. 发布 GitHub Release: ```bash -npm run changelog +npm run release:publish -- X.Y.Z ``` -审查生成的变更日志,确保: -- 所有重要更改都已记录 -- 版本号正确 -- 破坏性变更已标记 -- 新功能已突出显示 +该命令会推送 `main`,推送 `vX.Y.Z`,并根据匹配的 `CHANGELOG.md` 段落创建 GitHub Release 对象。 -### 5. 更新文档: - -```bash -npm run readme -npm run catalog -``` - -验证: -- README中的技能数量正确 -- 新技能已分类 -- 示例代码可运行 -- 链接有效 - -### 6. 运行完整测试套件: - -```bash -npm run test:ci -``` - -确保: -- 所有测试通过 -- 代码覆盖率达标 -- 安全检查通过 -- 性能基准稳定 - -### 7. 创建发布分支: - -```bash -git checkout -b release/vX.X.X -``` - -### 8. 提交所有更改: - -```bash -git add . -git commit -m "chore: prepare release v$VERSION" -``` - -### 9. 创建标签: - -```bash -git tag -a v$VERSION -m "Release v$VERSION" -``` - -### 10. 推送更改和标签: - -```bash -git push origin main -git push origin release/vX.X.X -git push origin v$VERSION -``` - -## 发布后操作 - -### 1. 合并发布分支: - -```bash -git checkout main -git merge release/vX.X.X -git push origin main -``` - -### 2. 发布到NPM: +7. 如有需要发布到 npm: ```bash npm publish ``` -### 3. 创建GitHub Release: +通常 npm 发布仍由 GitHub Release 发布后的现有工作流完成。该工作流会重新运行 `sync:release-state`,从 `tools/requirements.txt` 安装 Python 依赖,刷新受跟踪的 Web 资产,通过 `git diff --exit-code` 检测规范漂移,执行测试和文档安全检查,运行 Web 应用覆盖率门禁,执行 `npm audit --audit-level=high`,构建 Web 应用,并在 `npm publish` 前 dry-run npm 包。 -- 访问 [GitHub Releases页面](https://github.com/sickn33/antigravity-awesome-skills/releases) -- 点击"Create a new release" -- 选择刚推送的标签 -- 粘贴变更日志内容 -- 添加发布说明 -- 点击"Publish release" +## 规范同步 Bot -### 4. 更新网站和文档: +`main` 仍使用仓库的自动同步模型来维护规范生成物,但契约必须保持窄而可预测: -```bash -npm run deploy:docs -npm run deploy:web -``` +- PR 保持 source-only。 +- 合并后,`main` 工作流可以用 `[ci skip]` 将规范生成文件直接提交到 `main`。 +- 这些 bot 提交会跳过 CI,因此只能暂存规范/生成文件;任何非托管漂移都必须让工作流失败,而不是被静默推送。 +- bot 只允许暂存 `tools/scripts/generated_files.js --include-mixed` 解析出的文件。 +- 如果 repo-state sync 后留下任何非托管的受跟踪或未跟踪漂移,工作流必须失败。 +- 定时 hygiene workflow 使用相同契约和 concurrency group,确保同一时间只有一个规范同步写入者运行。 -### 5. 社区公告: +## 回滚说明 -#### Discord公告: -```text -🎉 Antigravity Awesome Skills v$VERSION 已发布! - -主要更新: -• [关键更新1] -• [关键更新2] -• [关键更新3] - -获取更新:npx antigravity-awesome-skills - -详情:[GitHub Release链接] -``` - -#### Twitter公告: -```text -🚀 Antigravity Awesome Skills v$VERSION 发布了! - -[最激动人心的新功能] - -立即更新:npx antigravity-awesome-skills - -#AI #Skills #ClaudeCode #Gemini -``` - -#### 博客文章: -- 撰写详细的发布说明 -- 包含新功能示例 -- 添加迁移指南 -- 分享最佳实践 - -## 紧急发布流程 - -### 何时需要紧急发布: - -- 关键安全漏洞修复 -- 生产环境破坏性bug -- 重大安装问题 - -### 紧急发布步骤: - -1. **立即修复** - ```bash - git checkout -b hotfix/issue-description - # 实施修复 - npm test - ``` - -2. **快速验证** - ```bash - npm run validate:quick - ``` - -3. **发布修复** - ```bash - npm version patch - git tag v$VERSION - git push origin v$VERSION - npm publish - ``` - -4. **通知社区** - - Discord紧急通知 - - GitHub Issue说明 - - Twitter安全公告 - -## 版本控制策略 - -### 语义化版本控制 - -遵循[SemVer](https://semver.org/)规范: - -- **主版本号(MAJOR)**:不兼容的API更改 -- **次版本号(MINOR)**:向后兼容的功能添加 -- **修订号(PATCH)**:向后兼容的问题修复 - -### 版本号格式 - -``` -MAJOR.MINOR.PATCH[-PRERELEASE][+BUILD] -``` - -示例: -- `1.0.0` - 稳定发布 -- `1.0.0-alpha.1` - Alpha版本 -- `1.0.0-beta.2` - Beta版本 -- `1.0.0-rc.3` - 候选版本 - -### 发布周期 - -- **主版本**:每3-6个月 -- **次版本**:每月 -- **修订版本**:根据需要(bug修复) - -## 质量门禁 - -### 发布前检查 - -**必须通过:** -- [ ] 所有自动化测试通过 -- [ ] 代码覆盖率 > 80% -- [ ] 安全扫描无高危漏洞 -- [ ] 性能测试无回归 -- [ ] 文档生成成功 -- [ ] 技能验证通过 - -**可选通过:** -- [ ] 严格验证通过 -- [ ] 手动QA验证 -- [ ] 社区反馈收集 - -### 发布后监控 - -**监控指标:** -- NPM下载量 -- GitHub Stars -- 社区反馈 -- 错误报告 -- 性能指标 - -**告警阈值:** -- 下载量下降 > 20% -- 错误率上升 > 5% -- 社区投诉 > 10条 - -## 回滚程序 - -### 何时回滚 - -- 安装失败率 > 10% -- 关键功能破坏 -- 安全问题发现 -- 用户大量投诉 - -### 回滚步骤 - -1. **立即停止推广** - - 撤下发布说明 - - 更新Discord状态 - - 暂停Twitter宣传 - -2. **创建回滚分支** - ```bash - git checkout -b rollback/v$VERSION - git revert $MERGE_COMMIT - ``` - -3. **发布回滚版本** - ```bash - npm version patch - git tag v$ROLLBACK_VERSION - npm publish - ``` - -4. **社区通知** - ```text - 🚨 v$VERSION 紧急回滚 - - 问题:[问题描述] - 解决:[回滚版本 v$ROLLBACK_VERSION] - - 建议:暂缓更新或使用 --version $ROLLBACK_VERSION - ``` - -## 工具和自动化 - -### 发布脚本 - -```bash -#!/bin/bash -# release.sh - 自动化发布脚本 - -set -e - -VERSION=$(node -p "require('./package.json').version") -echo "🚀 发布版本 v$VERSION" - -# 运行检查 -npm run validate -npm run test - -# 更新文档 -npm run readme -npm run catalog - -# 创建发布 -git add . -git commit -m "chore: release v$VERSION" -git tag -a v$VERSION -m "Release v$VERSION" - -# 推送 -git push origin main -git push origin v$VERSION - -# 发布到NPM -npm publish - -echo "✅ 发布成功 v$VERSION" -``` - -### 持续集成配置 - -**GitHub Actions工作流:** -```yaml -name: Release -on: - push: - tags: - - 'v*' -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - - run: npm ci - - run: npm test - - run: npm publish -``` - -## 贡献者认可 - -### 发布致谢 - -在每个发布中感谢贡献者: - -```markdown -## 贡献者 - -特别感谢本版本的贡献者: -- @username - [主要贡献] -- @username2 - [主要贡献] -- @username3 - [主要贡献] - -以及所有报告问题和反馈的用户! -``` - -### 奖励机制 - -- 🏆 **月度贡献者** - Discord特别角色 -- 🎁 **发布贡献者** - 项目商品 -- 📝 **技术写作奖** - 优秀文档奖 -- 🌟 **新星奖** - 新贡献者鼓励 - -## 文档和培训 - -### 维护者培训 - -**新维护者入职:** -1. 阅读完整的维护者文档 -2. 观摩一次完整的发布流程 -3. 在监督下进行一次发布 -4. 独立执行发布(有回滚支持) - -### 技能文档 - -**必备文档:** -- 发布流程检查清单 -- 紧急响应程序 -- 工具使用指南 -- 常见问题解答 - -**可选文档:** -- 高级故障排除 -- 性能优化指南 -- 社区管理最佳实践 - ---- - -## 🎉 成功发布指标 - -### 发布成功标志 - -- ✅ 所有自动化检查通过 -- ✅ 社区反馈积极 -- ✅ 下载量稳步增长 -- ✅ 错误率在可接受范围内 -- ✅ 文档完整准确 - -### 持续改进 - -每次发布后进行: -- 📊 性能分析 -- 📋 用户反馈收集 -- 🔄 流程优化 -- 📚 文档更新 -- 🎯 目标调整 - ---- - -这个发布流程确保Antigravity Awesome Skills的质量、稳定性和社区满意度。通过遵循这些指导方针,我们能够为用户提供可靠、高质量的技能生态。 - -如果您有任何问题或建议,请随时联系维护团队。🚀 \ No newline at end of file +- 如果发布标签错误,在重新发布前同时删除本地和远程标签。 +- 如果打标签后生成文件发生漂移,切一个后续 patch release,而不是修改已发布标签。 +- 如果 npm publish 在打标签后失败,修复问题、递增版本并发布新版本,不要复用同一个版本号。 diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/repo-growth-seo.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/repo-growth-seo.md index b54c5aad..9be50bdb 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/repo-growth-seo.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/repo-growth-seo.md @@ -6,7 +6,7 @@ 首选定位: -> 适用于 Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity 和其他 AI 编码助手的 1,494+ 代理技能的可安装 GitHub 库。 +> 适用于 Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity 和其他 AI 编码助手的 1,684+ 代理技能的可安装 GitHub 库。 关键框架: @@ -20,7 +20,7 @@ 首选描述: -> 适用于 Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity 等的 1,494+ 代理技能的可安装 GitHub 库。包括安装程序 CLI、捆绑包、工作流以及官方/社区技能集合。 +> 适用于 Claude Code、Cursor、Codex CLI、Gemini CLI、Antigravity 等的 1,684+ 代理技能的可安装 GitHub 库。包括安装程序 CLI、捆绑包、工作流以及官方/社区技能集合。 首选主页: @@ -28,7 +28,7 @@ 首选社交预览: -- 使用清晰的预览图像,显示 `1,494+ 代理技能` +- 使用清晰的预览图像,显示 `1,684+ 代理技能` - 提及 Claude Code、Cursor、Codex CLI 和 Gemini CLI - 避免在社交卡片中出现密集文本和微小徽标 diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/skills-update-guide.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/skills-update-guide.md index d311551a..2a033509 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/skills-update-guide.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/skills-update-guide.md @@ -69,7 +69,7 @@ copy skills_index.json apps\web-app\public\skills.json 更新过程会刷新: - 技能索引 (`skills_index.json`) - Web 应用程序技能数据 (`apps\web-app\public\skills.json`) -- 技能目录中的所有 1,494+ 技能 +- 技能目录中的所有 1,684+ 技能 ## 更新时机 diff --git a/antigravity-awesome-skills/docs_zh-CN/maintainers/smart-auto-categorization.md b/antigravity-awesome-skills/docs_zh-CN/maintainers/smart-auto-categorization.md index 71922537..2a05ae83 100644 --- a/antigravity-awesome-skills/docs_zh-CN/maintainers/smart-auto-categorization.md +++ b/antigravity-awesome-skills/docs_zh-CN/maintainers/smart-auto-categorization.md @@ -9,26 +9,28 @@ ✅ 当前仓库通过生成的目录索引 - 大多数技能都在有意义的类别中 - 较小的尾部仍需要手动审查或更好的关键词覆盖 -- 11 个主要类别 -- 类别按技能数量排序(最多的在前) +- `skills_index.json` 是当前类别标签和计数的事实来源 +- 类别过滤器应在构建时从生成索引派生 ## 类别分布 -| 类别 | 数量 | 示例 | -|----------|-------|----------| -| Backend | 164 | Node.js、Django、Express、FastAPI | -| Web Development | 107 | React、Vue、Tailwind、CSS | -| Automation | 103 | Workflow、Scripting、RPA | -| DevOps | 83 | Docker、Kubernetes、CI/CD、Git | -| AI/ML | 79 | TensorFlow、PyTorch、NLP、LLM | -| Content | 47 | Documentation、SEO、Writing | -| Database | 44 | SQL、MongoDB、PostgreSQL | -| Testing | 38 | Jest、Cypress、Unit Testing | -| Security | 36 | Encryption、Authentication | -| Cloud | 33 | AWS、Azure、GCP | -| Mobile | 21 | React Native、Flutter、iOS | -| Game Dev | 15 | Unity、WebGL、3D | -| Data Science | 14 | Pandas、NumPy、Analytics | +不要把固定计数复制到面向用户的文档中。要查看当前分布,请从索引生成: + +```bash +node - <<'NODE' +const fs = require('fs'); +const skills = JSON.parse(fs.readFileSync('skills_index.json', 'utf8')); +const counts = new Map(); +for (const skill of skills) { + const category = skill.category || 'uncategorized'; + counts.set(category, (counts.get(category) || 0) + 1); +} +console.log(`skills=${skills.length} categories=${counts.size}`); +for (const [category, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 12)) { + console.log(`${category}: ${count}`); +} +NODE +``` ## 工作原理 @@ -91,20 +93,17 @@ Sample changes: **之后:** - 类别按技能数量排序(最多的在前,"未分类"最后) -- 显示计数:"Backend (164)" "Web Development (107)" +- 显示从生成索引计算出的计数,而不是文档中的硬编码数字 - 更易于浏览 ### 示例下拉菜单 **排序顺序:** 1. All Categories -2. Backend (164) -3. Web Development (107) -4. Automation (103) -5. DevOps (83) -6. AI/ML (79) -7. ... 更多类别 ... -8. Uncategorized (126) ← 在最后 +2. 技能数最高的生成类别 +3. 下一个生成类别 +4. ... 更多生成类别 ... +5. Uncategorized(如果存在)放在最后 ## 对于技能创建者 diff --git a/antigravity-awesome-skills/docs_zh-CN/skill-anatomy.md b/antigravity-awesome-skills/docs_zh-CN/skill-anatomy.md index d46d09b4..e82848da 100644 --- a/antigravity-awesome-skills/docs_zh-CN/skill-anatomy.md +++ b/antigravity-awesome-skills/docs_zh-CN/skill-anatomy.md @@ -46,8 +46,10 @@ skills/ name: skill-name # 必需:技能名称 description: "简要技能描述" # 必需:一句话描述,200字符以内 category: development # 必需:技能分类 -risk: safe # 必需:风险级别(safe/medium/high) -source: community # 必需:来源(community/official) +risk: safe # 必需:风险级别(none/safe/critical/offensive/unknown) +source: community # 必需:来源(community/official/self) +source_repo: owner/repo # 外部 GitHub 来源必需:上游仓库 +source_type: community # 外部 GitHub 来源必需:official/community/self date_added: "2024-01-15" # 必需:添加日期,YYYY-MM-DD格式 author: your-username # 可选:作者 tags: [react, frontend, patterns] # 可选:标签列表,最多5个 @@ -62,8 +64,10 @@ tools: [claude, cursor, gemini] # 可选:支持工具列表 | `name` | ✅ | 小写+连字符 | 技能标识符,用于`@skill-name`调用 | | `description` | ✅ | 引号字符串 | 简洁描述,说明技能用途 | | `category` | ✅ | 小写字符串 | 技能分类(见分类列表) | -| `risk` | ✅ | safe/medium/high | 风险级别,影响使用警告 | -| `source` | ✅ | community/official | 来源标识,官方或社区 | +| `risk` | ✅ | none/safe/critical/offensive/unknown | 风险级别,影响使用警告 | +| `source` | ✅ | community/official/self | 来源标识,官方、社区或本仓库原创 | +| `source_repo` | 外部来源必需 | OWNER/REPO | 外部 GitHub 来源仓库 | +| `source_type` | 外部来源必需 | official/community/self | README 来源致谢分组 | | `date_added` | ✅ | YYYY-MM-DD | 技能添加日期 | | `author` | ❌ | 字符串 | 贡献者用户名 | | `tags` | ❌ | 数组 | 搜索和分类标签 | @@ -350,8 +354,10 @@ fix: 修复登录页面重定向问题 name: react-performance-optimization description: "React应用性能优化和调试" category: frontend -risk: medium +risk: safe source: community +source_repo: owner/repo +source_type: community date_added: "2024-01-15" tags: [react, performance, optimization] tools: [claude, cursor, gemini] @@ -529,4 +535,4 @@ npm run index 这个结构指南确保了技能的一致性、可维护性和高质量。遵循这些指导方针,您可以创建出对AI开发社区有价值的实用技能。 -如果您有任何疑问或需要指导,请随时联系维护团队。🚀 \ No newline at end of file +如果您有任何疑问或需要指导,请随时联系维护团队。🚀 diff --git a/antigravity-awesome-skills/docs_zh-CN/users/bundles.md b/antigravity-awesome-skills/docs_zh-CN/users/bundles.md index a14d4146..26a2d022 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/bundles.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/bundles.md @@ -4,7 +4,7 @@ > 这些包是为人类提供的精选入门建议。`data/bundles.json` 中生成的捆绑包 ID 是更广泛的目录/工作流分组,不需要与下面的编辑包一一对应。 -> **重要提示:** 捆绑包不是可调用的大型技能,如 `@web-wizard` 或 `/essentials-bundle`。使用包中列出的各个技能,或者如果你只想在实时 Antigravity 目录中激活该捆绑包的技能,请使用激活脚本。 +> **重要提示:** 捆绑包不是可调用的大型技能,如 `@web-wizard` 或 `/essentials-bundle`。它们可以作为人工阅读清单、Claude/Codex 插件子集或 Antigravity 激活预设使用;在对话中仍应调用包中列出的各个技能。 ## 快速开始 @@ -587,4 +587,4 @@ _用于创建和维护高质量的 SKILL.md 资产。_ --- -_最后更新:2026 年 3 月 | 总技能数:1,494+ | 总捆绑包数:37_ +_最后更新:2026 年 6 月 | 总技能数:1,684+ | 编辑捆绑包数:59_ diff --git a/antigravity-awesome-skills/docs_zh-CN/users/claude-code-skills.md b/antigravity-awesome-skills/docs_zh-CN/users/claude-code-skills.md index e622fbe9..f8735cf9 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/claude-code-skills.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/claude-code-skills.md @@ -10,7 +10,7 @@ Antigravity Awesome Skills 为 Claude Code 用户提供了一个可安装的 `SK ## 为什么在 Claude Code 中使用此仓库 -- 它包含 1,494+ 个技能,而不是狭窄的单域入门包。 +- 它包含 1,684+ 个技能,而不是狭窄的单域入门包。 - 它支持标准的 `.claude/skills/` 路径和 Claude Code 插件市场流程。 - 它包括入门文档、捆绑包和工作流,因此新用户无需猜测从何处开始。 - 它涵盖日常工程任务和专业工作,如安全审查、基础设施、产品规划和文档。 diff --git a/antigravity-awesome-skills/docs_zh-CN/users/faq.md b/antigravity-awesome-skills/docs_zh-CN/users/faq.md index 1ac03f26..7bb6da63 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/faq.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/faq.md @@ -68,7 +68,7 @@ 相反,主机应该: -- 使用 `data/skills_index.json` 作为**轻量级清单**进行发现;以及 +- 使用根目录 `skills_index.json` 作为**规范轻量级清单**进行发现;`data/skills_index.json` 仅作为兼容性镜像;以及 - **仅在调用技能时**(例如,通过对话中的 `@skill-id`)加载单个 `SKILL.md` 文件。 有关具体示例(包括伪代码),请参阅: @@ -87,11 +87,11 @@ 我们对技能进行分类,以便你知道你正在运行什么。这些值直接映射到每个 `SKILL.md` 前置元数据中的 `risk:` 字段: -- 🔵 **`none`**:纯参考或规划内容 — 无 shell 命令、无变更、无网络访问。 -- ⚪ **`safe`**:非破坏性的社区技能(只读、规划、代码审查、分析)。 -- 🔴 **`critical`**:修改文件、删除数据、使用网络扫描器或执行破坏性操作的技能。**谨慎使用。** -- 🟣 **`offensive`**:专注于安全性的进攻技术(渗透测试、利用)。**仅授权使用** — 始终确认目标在范围内。 -- ⬜ **`unknown`**:遗留或未分类的内容。在使用前手动检查技能。 +- ⚪ **`unknown`**:遗留或未分类的内容。在使用前手动检查技能。 +- 🟢 **`none`**:纯参考或规划内容 — 无 shell 命令、无变更、无网络访问。 +- 🔵 **`safe`**:非破坏性指导,例如只读命令、规划、代码审查和分析。 +- 🟠 **`critical`**:修改文件、删除数据、使用网络扫描器或执行破坏性操作的技能。**谨慎使用。** +- 🔴 **`offensive`**:专注于安全性的进攻技术(渗透测试、利用)。**仅授权使用** — 始终确认目标在范围内。 ### 这些技能可以入侵我的计算机吗? diff --git a/antigravity-awesome-skills/docs_zh-CN/users/gemini-cli-skills.md b/antigravity-awesome-skills/docs_zh-CN/users/gemini-cli-skills.md index fe6a633a..e68b3570 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/gemini-cli-skills.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/gemini-cli-skills.md @@ -12,7 +12,7 @@ Antigravity Awesome Skills 通过 `.gemini/skills/` 路径支持 Gemini CLI, - 它直接安装到预期的 Gemini 技能路径中。 - 它既包括核心软件工程技能,也包括更深入的代理/LLM 导向技能。 -- 它通过捆绑包和工作流帮助新用户入门,而不是强迫从 1,494+ 个文件中冷启动。 +- 它通过捆绑包和工作流帮助新用户入门,而不是强迫从 1,684+ 个文件中冷启动。 - 无论您想要一个广泛的内部技能库,还是想要一个快速测试许多工作流的单一仓库,它都很有用。 ## 安装 Gemini CLI 技能 diff --git a/antigravity-awesome-skills/docs_zh-CN/users/getting-started.md b/antigravity-awesome-skills/docs_zh-CN/users/getting-started.md index 787404aa..a15595cd 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/getting-started.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/getting-started.md @@ -1,4 +1,4 @@ -# Antigravity Awesome Skills 入门指南 (V11.5.0) +# Antigravity Awesome Skills 入门指南 (V13.2.0) **新手入门?本指南将在 5 分钟内帮助您增强 AI 代理的能力。** @@ -30,7 +30,7 @@ AI 代理(如 **Claude Code**、**Gemini**、**Cursor**)非常智能,但 npx antigravity-awesome-skills ``` -默认情况下,这会克隆到 `~/.agents/skills`。使用 `--cursor`、`--claude`、`--gemini`、`--codex` 或 `--kiro` 为特定工具安装,或使用 `--path ` 指定自定义位置。运行 `npx antigravity-awesome-skills --help` 查看详细信息。 +默认情况下,这会克隆到 `~/.agents/skills`。使用 `--cursor`、`--claude`、`--gemini`、`--codex`、`--kiro`、`--antigravity` 或 `--agy` 为特定工具安装,或使用 `--path ` 指定自定义位置。你也可以用 `--risk`、`--category` 和 `--tags` 缩小安装范围。运行 `npx antigravity-awesome-skills --help` 查看详细信息。 如果看到 404 错误,请使用:`npx github:sickn33/antigravity-awesome-skills` @@ -103,8 +103,9 @@ git clone https://github.com/sickn33/antigravity-awesome-skills.git .agent/skill | **Kiro CLI** | ✅ 完全支持 | 全局:`~/.kiro/skills/` · 工作区:`.kiro/skills/` | | **Kiro IDE** | ✅ 完全支持 | 全局:`~/.kiro/skills/` · 工作区:`.kiro/skills/` | | **Antigravity** | ✅ 原生支持 | 全局:`~/.agents/skills/` · 工作区:`.agent/skills/` | +| **Antigravity CLI (`agy`)** | ✅ 完全支持 | `~/.gemini/antigravity-cli/skills/` | | **Cursor** | ✅ 原生支持 | `.cursor/skills/` | -| **OpenCode** | ✅ 完全支持 | `.agents/skills/` | +| **OpenCode** | ✅ 完全支持 | `.agents/skills/`(建议用 `--risk`、`--category` 或 `--tags` 做缩小安装) | | **AdaL CLI** | ✅ 完全支持 | `.adal/skills/` | | **Copilot** | ⚠️ 仅文本 | 手动复制粘贴 | @@ -112,11 +113,13 @@ git clone https://github.com/sickn33/antigravity-awesome-skills.git .agent/skill ## 信任与安全 -我们对技能进行分类,以便您了解正在运行的内容: +我们对技能进行分类,以便您了解正在运行的内容。这些值直接映射到每个 `SKILL.md` 前置元数据中的 `risk:` 字段: -- 🟣 **官方**:由 Anthropic/Google/供应商维护(高信任度)。 -- 🔵 **安全**:非破坏性的社区技能(只读/规划)。 -- 🔴 **风险**:修改系统或执行安全测试的技能(仅授权使用)。 +- ⚪ **`unknown`**:遗留或未分类内容,仍需要维护者分流。 +- 🟢 **`none`**:纯文本/推理指导。 +- 🔵 **`safe`**:只读或低风险操作指导。 +- 🟠 **`critical`**:会改变状态或影响部署的指导。 +- 🔴 **`offensive`**:渗透测试/红队指导,必须包含明确的 Authorized Use Only 警告。 添加新技能时,高风险指导会在发布前通过仓库范围的 `security:docs` 扫描进行额外审查。 diff --git a/antigravity-awesome-skills/docs_zh-CN/users/kiro-integration.md b/antigravity-awesome-skills/docs_zh-CN/users/kiro-integration.md index 9e911426..253ef63c 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/kiro-integration.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/kiro-integration.md @@ -18,7 +18,7 @@ Kiro 是 AWS 的代理式 AI IDE,结合了: Kiro 的代理能力通过以下技能得到增强: -- **领域专业知识**,涵盖 1,494+ 个专业领域 +- **领域专业知识**,涵盖 1,684+ 个专业领域 - **最佳实践**,来自 Anthropic、OpenAI、Google、Microsoft 和 AWS - **工作流自动化**,用于常见开发任务 - **AWS 特定模式**,用于无服务器、基础设施和云架构 diff --git a/antigravity-awesome-skills/docs_zh-CN/users/local-config.md b/antigravity-awesome-skills/docs_zh-CN/users/local-config.md index c6a74c4d..19a5e7b2 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/local-config.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/local-config.md @@ -1,7 +1,7 @@ -# 本地技能配置 +# 本地技能配置快照 -> **当前状态**:仓库中提供所有 96 个技能。 -> **本文档**:推荐 35 个典型常用的高优先级技能。 +> **历史快照**:此页保留 2026-01-16 的旧版 35 个本地配置推荐。它不是当前仓库目录。 +> **当前目录**:请使用 [`../../skills_index.json`](../../skills_index.json)、[`../../CATALOG.md`](../../CATALOG.md) 或 README 中的 installer 过滤器查看当前 1,684+ 技能库。 ## 📊 推荐的高优先级技能(35 个) @@ -67,17 +67,17 @@ --- -## 🗂️ 仓库结构 +## 🗂️ 快照结构 ``` -skills/ -├── [96 个活跃技能] ← 所有技能可用 -└── [4 个符号链接] ← docx, pdf, pptx, xlsx → 官方版本 +local snapshot/ +├── [此快照中的 96 个活跃技能] +└── [此快照中的 4 个符号链接] ``` --- -## 📚 其他可用技能(61 个) +## 📚 此快照中的其他技能(61 个) 仓库中的所有其他技能可根据需要使用。一些值得注意的类别: @@ -140,13 +140,13 @@ skills/ ## 🎯 此推荐的益处 ✅ **专注指导** - 35 个常见工作流的高优先级技能 -✅ **完全可用** - 所有 96 个技能在需要时可访问 +✅ **快照可用性** - 此旧本地集合中的 96 个技能当时可按需访问 ✅ **平衡覆盖** - 核心开发 + AI/自动化 + 前端卓越 ✅ **易于发现** - 所有其他可用技能的分类列表 --- -**最后更新**:2026-01-16 +**快照日期**:2026-01-16 **推荐技能**:35 个高优先级 -**总共可用**:96 个技能 + 4 个符号链接 = 100 个总计 +**快照总数**:96 个技能 + 4 个符号链接 = 100 个总计 **最近添加到推荐**:`senior-fullstack`、`concise-planning`、`address-github-comments`、`javascript-mastery`、`workflow-automation`、`llm-app-patterns`、`autonomous-agent-patterns`、`prompt-library` diff --git a/antigravity-awesome-skills/docs_zh-CN/users/usage.md b/antigravity-awesome-skills/docs_zh-CN/users/usage.md index a8acfc22..fa0dc9a5 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/usage.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/usage.md @@ -12,7 +12,7 @@ 当你运行 `npx antigravity-awesome-skills` 或克隆仓库时,你: -✅ **下载了 1,494+ 个技能文件**到你的计算机(默认路径:`~/.agents/skills/`;如果你使用了 `--path`,则是自定义路径如 `~/.agent/skills/`) +✅ **下载了 1,684+ 个技能文件**到你的计算机(默认路径:`~/.agents/skills/`;如果你使用了 `--path`,则是自定义路径如 `~/.agent/skills/`) ✅ **使它们对你的 AI 助手可用** ❌ **并未自动启用所有技能**(它们只是在那里等待使用) @@ -32,15 +32,15 @@ **类比:** -- 你安装了一个包含 1,494+ 个工具的工具箱(✅ 完成) +- 你安装了一个包含 1,684+ 个工具的工具箱(✅ 完成) - 捆绑包就像**贴有标签的整理托盘**,上面写着:"如果你是木匠,从这 10 个工具开始" -- 你不需要安装捆绑包——你从它们中**选择技能** +- 你通常从捆绑包中**选择技能**;维护者也可以把它们用作插件子集或 Antigravity 激活预设 ### 捆绑包不是什么 -❌ 单独的安装 -❌ 不同的下载命令 -❌ 大多数用户在正常安装期间需要激活的东西 +❌ 可调用的单个超级技能 +❌ 与技能本身不同的内容格式 +❌ 大多数用户每天都必须单独管理的东西 ❌ 可调用的超级技能,如 `@essentials` 或 `/web-wizard` ### 示例:"Web Wizard" 捆绑包 @@ -202,7 +202,7 @@ Use @brainstorming to plan this feature ## 步骤 5:选择你的前几个技能(实用建议) -不要试图一次使用所有 1,494+ 个技能。这里有一个明智的方法: +不要试图一次使用所有 1,684+ 个技能。这里有一个明智的方法: 如果在选择技能之前你需要特定于工具的起点,请使用: @@ -333,11 +333,11 @@ AI: [创建测试,设置 CI/CD,部署到 Vercel] ### "我可以一次将所有技能加载到模型中吗?" -不可以。即使你在本地安装了 1,494+ 个技能,你**不应该**将每个 `SKILL.md` 连接到单个系统提示词或上下文块中。 +不可以。即使你在本地安装了 1,684+ 个技能,你**不应该**将每个 `SKILL.md` 连接到单个系统提示词或上下文块中。 预期的模式是: -- 使用 `data/skills_index.json`(清单)来发现存在哪些技能;以及 +- 使用根目录 `skills_index.json`(规范清单)来发现存在哪些技能;仅在宿主必须读取 `data/` 子树时使用 `data/skills_index.json` 兼容性镜像;以及 - 仅为你实际在对话中使用的特定 `@skill-id` 值加载 `SKILL.md` 文件。 如果你正在构建自己的主机/代理(例如 Jetski/Cortex + Gemini),请参阅: diff --git a/antigravity-awesome-skills/docs_zh-CN/users/visual-guide.md b/antigravity-awesome-skills/docs_zh-CN/users/visual-guide.md index 5c4961ea..d6fa0896 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/visual-guide.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/visual-guide.md @@ -34,7 +34,7 @@ antigravity-awesome-skills/ ├── 📄 CONTRIBUTING.md ← 贡献者工作流程 ├── 📄 CATALOG.md ← 完整生成的目录 │ -├── 📁 skills/ ← 1,204+ 技能在这里 +├── 📁 skills/ ← 1,684+ 技能在这里 │ │ │ ├── 📁 brainstorming/ │ │ └── 📄 SKILL.md ← 技能定义 @@ -100,7 +100,7 @@ antigravity-awesome-skills/ ``` ┌─────────────────────────┐ - │ 1,204+ 技能 │ + │ 1,684+ 技能 │ └────────────┬────────────┘ │ ┌────────────────────────┼────────────────────────┐ diff --git a/antigravity-awesome-skills/docs_zh-CN/users/windows-truncation-recovery.md b/antigravity-awesome-skills/docs_zh-CN/users/windows-truncation-recovery.md index 15946e2f..91cc1d18 100644 --- a/antigravity-awesome-skills/docs_zh-CN/users/windows-truncation-recovery.md +++ b/antigravity-awesome-skills/docs_zh-CN/users/windows-truncation-recovery.md @@ -60,7 +60,7 @@ ## 推荐的预防措施 - 不要将每个 `SKILL.md` 连接到一个系统提示中。 -- 使用 `data/skills_index.json` 作为轻量级清单。 +- 使用根目录 `skills_index.json` 作为规范轻量级清单;仅在宿主必须读取 `data/` 子树时使用 `data/skills_index.json` 兼容性镜像。 - 仅在实际请求技能时加载 `SKILL.md` 文件。 - 为每个轮次的技能设置明确限制。 - 在参考 Jetski/Gemini 加载器中首选 `overflowBehavior: "error"`,以便主机在上下文窗口被静默过度填充之前清晰地失败。 diff --git a/antigravity-awesome-skills/package-lock.json b/antigravity-awesome-skills/package-lock.json index c3354fd9..40a66f0d 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.1.1", + "version": "13.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "antigravity-awesome-skills", - "version": "13.1.1", + "version": "13.2.0", "license": "MIT", "dependencies": { "yaml": "^2.9.0" diff --git a/antigravity-awesome-skills/package.json b/antigravity-awesome-skills/package.json index b608b157..fed741cf 100644 --- a/antigravity-awesome-skills/package.json +++ b/antigravity-awesome-skills/package.json @@ -1,7 +1,7 @@ { "name": "antigravity-awesome-skills", - "version": "13.1.1", - "description": "1,682+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", + "version": "13.2.0", + "description": "1,684+ 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 074769e3..bbbfc6a6 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.1.1", - "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,640 supported skills.", + "version": "13.2.0", + "description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,642 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/emil-design-eng/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/emil-design-eng/SKILL.md new file mode 100644 index 00000000..32beca40 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/emil-design-eng/SKILL.md @@ -0,0 +1,702 @@ +--- +name: emil-design-eng +description: "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance." +category: frontend +risk: safe +source: community +source_repo: emilkowalski/skills +source_type: community +date_added: "2026-06-25" +author: Emil Kowalski +license: MIT +license_source: "https://github.com/emilkowalski/skills/blob/main/LICENSE.txt" +tags: [frontend, design, ui, animation, motion] +tools: [claude, cursor, codex, antigravity] +--- + +# Design Engineering + +## When to Use + +- Use when the user asks for UI polish, product design critique, animation direction, or high-craft component decisions. +- Use when reviewing frontend code for motion quality, easing, duration, physicality, interaction feedback, or subtle interface details. +- Use when building or refining React, Tailwind, CSS, or Framer Motion interfaces where taste and perceived quality matter. + +## Limitations + +- This skill provides design engineering judgment; it does not replace project-specific product requirements, accessibility testing, or real-device motion review. +- Verify framework versions, installed dependencies, and rendered behavior before treating animation or UI recommendations as production-ready. +- Do not apply these rules mechanically when an existing brand system, platform convention, or user requirement calls for a different interaction language. + +## Initial Response + +When this skill is first invoked without a specific question, respond only with: + +> I'm ready to help you build interfaces that feel right, my knowledge comes from Emil Kowalski's design engineering philosophy. If you want to dive even deeper, check out Emil’s course: [animations.dev](https://animations.dev/). + +Do not provide any other information until the user asks a question. + +You are a design engineer with the craft sensibility. You build interfaces where every detail compounds into something that feels right. You understand that in a world where everyone's software is good enough, taste is the differentiator. + +## Core Philosophy + +### Taste is trained, not innate + +Good taste is not personal preference. It is a trained instinct: the ability to see beyond the obvious and recognize what elevates. You develop it by surrounding yourself with great work, thinking deeply about why something feels good, and practicing relentlessly. + +When building UI, don't just make it work. Study why the best interfaces feel the way they do. Reverse engineer animations. Inspect interactions. Be curious. + +### Unseen details compound + +Most details users never consciously notice. That is the point. When a feature functions exactly as someone assumes it should, they proceed without giving it a second thought. That is the goal. + +> "All those unseen details combine to produce something that's just stunning, like a thousand barely audible voices all singing in tune." - Paul Graham + +Every decision below exists because the aggregate of invisible correctness creates interfaces people love without knowing why. + +### Beauty is leverage + +People select tools based on the overall experience, not just functionality. Good defaults and good animations are real differentiators. Beauty is underutilized in software. Use it as leverage to stand out. + +## Review Format (Required) + +When reviewing UI code, you MUST use a markdown table with Before/After columns. Do NOT use a list with "Before:" and "After:" on separate lines. Always output an actual markdown table like this: + +| Before | After | Why | +| --- | --- | --- | +| `transition: all 300ms` | `transition: transform 200ms ease-out` | Specify exact properties; avoid `all` | +| `transform: scale(0)` | `transform: scale(0.95); opacity: 0` | Nothing in the real world appears from nothing | +| `ease-in` on dropdown | `ease-out` with custom curve | `ease-in` feels sluggish; `ease-out` gives instant feedback | +| No `:active` state on button | `transform: scale(0.97)` on `:active` | Buttons must feel responsive to press | +| `transform-origin: center` on popover | `transform-origin: var(--radix-popover-content-transform-origin)` | Popovers should scale from their trigger (not modals — modals stay centered) | + +Wrong format (never do this): + +``` +Before: transition: all 300ms +After: transition: transform 200ms ease-out +──────────────────────────── +Before: scale(0) +After: scale(0.95) +``` + +Correct format: A single markdown table with | Before | After | Why | columns, one row per issue found. The "Why" column briefly explains the reasoning. + +## The Animation Decision Framework + +Before writing any animation code, answer these questions in order: + +### 1. Should this animate at all? + +**Ask:** How often will users see this animation? + +| Frequency | Decision | +| ----------------------------------------------------------- | ---------------------------- | +| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. | +| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce | +| Occasional (modals, drawers, toasts) | Standard animation | +| Rare/first-time (onboarding, feedback forms, celebrations) | Can add delight | + +**Never animate keyboard-initiated actions.** These actions are repeated hundreds of times daily. Animation makes them feel slow, delayed, and disconnected from the user's actions. + +Raycast has no open/close animation. That is the optimal experience for something used hundreds of times a day. + +### 2. What is the purpose? + +Every animation must have a clear answer to "why does this animate?" + +Valid purposes: + +- **Spatial consistency**: toast enters and exits from the same direction, making swipe-to-dismiss feel intuitive +- **State indication**: a morphing feedback button shows the state change +- **Explanation**: a marketing animation that shows how a feature works +- **Feedback**: a button scales down on press, confirming the interface heard the user +- **Preventing jarring changes**: elements appearing or disappearing without transition feel broken + +If the purpose is just "it looks cool" and the user will see it often, don't animate. + +### 3. What easing should it use? + +Is the element entering or exiting? + Yes → ease-out (starts fast, feels responsive) + No → + Is it moving/morphing on screen? + Yes → ease-in-out (natural acceleration/deceleration) + Is it a hover/color change? + Yes → ease + Is it constant motion (marquee, progress bar)? + Yes → linear + Default → ease-out + +**Critical: use custom easing curves.** The built-in CSS easings are too weak. They lack the punch that makes animations feel intentional. + +```css +/* Strong ease-out for UI interactions */ +--ease-out: cubic-bezier(0.23, 1, 0.32, 1); + +/* Strong ease-in-out for on-screen movement */ +--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); + +/* iOS-like drawer curve (from Ionic Framework) */ +--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); +``` + +**Never use ease-in for UI animations.** It starts slow, which makes the interface feel sluggish and unresponsive. A dropdown with `ease-in` at 300ms _feels_ slower than `ease-out` at the same 300ms, because ease-in delays the initial movement — the exact moment the user is watching most closely. + +**Easing curve resources:** Don't create curves from scratch. Use [easing.dev](https://easing.dev/) or [easings.co](https://easings.co/) to find stronger custom variants of standard easings. + +### 4. How fast should it be? + +| Element | Duration | +| ------------------------ | ------------- | +| Button press feedback | 100-160ms | +| Tooltips, small popovers | 125-200ms | +| Dropdowns, selects | 150-250ms | +| Modals, drawers | 200-500ms | +| Marketing/explanatory | Can be longer | + +**Rule: UI animations should stay under 300ms.** A 180ms dropdown feels more responsive than a 400ms one. A faster-spinning spinner makes the app feel like it loads faster, even when the load time is identical. + +### Perceived performance + +Speed in animation is not just about feeling snappy — it directly affects how users perceive your app's performance: + +- A **fast-spinning spinner** makes loading feel faster (same load time, different perception) +- A **180ms select** animation feels more responsive than a **400ms** one +- **Instant tooltips** after the first one is open (skip delay + skip animation) make the whole toolbar feel faster + +The perception of speed matters as much as actual speed. Easing amplifies this: `ease-out` at 200ms _feels_ faster than `ease-in` at 200ms because the user sees immediate movement. + +## Spring Animations + +Springs feel more natural than duration-based animations because they simulate real physics. They don't have fixed durations — they settle based on physical parameters. + +### When to use springs + +- Drag interactions with momentum +- Elements that should feel "alive" (like Apple's Dynamic Island) +- Gestures that can be interrupted mid-animation +- Decorative mouse-tracking interactions + +### Spring-based mouse interactions + +Tying visual changes directly to mouse position feels artificial because it lacks motion. Use `useSpring` from Motion (formerly Framer Motion) to interpolate value changes with spring-like behavior instead of updating immediately. + +```jsx +import { useSpring } from 'framer-motion'; + +// Without spring: feels artificial, instant +const rotation = mouseX * 0.1; + +// With spring: feels natural, has momentum +const springRotation = useSpring(mouseX * 0.1, { + stiffness: 100, + damping: 10, +}); +``` + +This works because the animation is **decorative** — it doesn't serve a function. If this were a functional graph in a banking app, no animation would be better. Know when decoration helps and when it hinders. + +### Spring configuration + +**Apple's approach (recommended — easier to reason about):** + +```js +{ type: "spring", duration: 0.5, bounce: 0.2 } +``` + +**Traditional physics (more control):** + +```js +{ type: "spring", mass: 1, stiffness: 100, damping: 10 } +``` + +Keep bounce subtle (0.1-0.3) when used. Avoid bounce in most UI contexts. Use it for drag-to-dismiss and playful interactions. + +### Interruptibility advantage + +Springs maintain velocity when interrupted — CSS animations and keyframes restart from zero. This makes springs ideal for gestures users might change mid-motion. When you click an expanded item and quickly press Escape, a spring-based animation smoothly reverses from its current position. + +## Component Building Principles + +### Buttons must feel responsive + +Add `transform: scale(0.97)` on `:active`. This gives instant feedback, making the UI feel like it is truly listening to the user. + +```css +.button { + transition: transform 160ms ease-out; +} + +.button:active { + transform: scale(0.97); +} +``` + +This applies to any pressable element. The scale should be subtle (0.95-0.98). + +### Never animate from scale(0) + +Nothing in the real world disappears and reappears completely. Elements animating from `scale(0)` look like they come out of nowhere. + +Start from `scale(0.9)` or higher, combined with opacity. Even a barely-visible initial scale makes the entrance feel more natural, like a balloon that has a visible shape even when deflated. + +```css +/* Bad */ +.entering { + transform: scale(0); +} + +/* Good */ +.entering { + transform: scale(0.95); + opacity: 0; +} +``` + +### Make popovers origin-aware + +Popovers should scale in from their trigger, not from center. The default `transform-origin: center` is wrong for almost every popover. **Exception: modals.** Modals should keep `transform-origin: center` because they are not anchored to a specific trigger — they appear centered in the viewport. + +```css +/* Radix UI */ +.popover { + transform-origin: var(--radix-popover-content-transform-origin); +} + +/* Base UI */ +.popover { + transform-origin: var(--transform-origin); +} +``` + +Whether the user notices the difference individually does not matter. In the aggregate, unseen details become visible. They compound. + +### Tooltips: skip delay on subsequent hovers + +Tooltips should delay before appearing to prevent accidental activation. But once one tooltip is open, hovering over adjacent tooltips should open them instantly with no animation. This feels faster without defeating the purpose of the initial delay. + +```css +.tooltip { + transition: transform 125ms ease-out, opacity 125ms ease-out; + transform-origin: var(--transform-origin); +} + +.tooltip[data-starting-style], +.tooltip[data-ending-style] { + opacity: 0; + transform: scale(0.97); +} + +/* Skip animation on subsequent tooltips */ +.tooltip[data-instant] { + transition-duration: 0ms; +} +``` + +### Use CSS transitions over keyframes for interruptible UI + +CSS transitions can be interrupted and retargeted mid-animation. Keyframes restart from zero. For any interaction that can be triggered rapidly (adding toasts, toggling states), transitions produce smoother results. + +```css +/* Interruptible - good for UI */ +.toast { + transition: transform 400ms ease; +} + +/* Not interruptible - avoid for dynamic UI */ +@keyframes slideIn { + from { + transform: translateY(100%); + } + to { + transform: translateY(0); + } +} +``` + +### Use blur to mask imperfect transitions + +When a crossfade between two states feels off despite trying different easings and durations, add subtle `filter: blur(2px)` during the transition. + +**Why blur works:** Without blur, you see two distinct objects during a crossfade — the old state and the new state overlapping. This looks unnatural. Blur bridges the visual gap by blending the two states together, tricking the eye into perceiving a single smooth transformation instead of two objects swapping. + +Combine blur with scale-on-press (`scale(0.97)`) for a polished button state transition: + +```css +.button { + transition: transform 160ms ease-out; +} + +.button:active { + transform: scale(0.97); +} + +.button-content { + transition: filter 200ms ease, opacity 200ms ease; +} + +.button-content.transitioning { + filter: blur(2px); + opacity: 0.7; +} +``` + +Keep blur under 20px. Heavy blur is expensive, especially in Safari. + +### Animate enter states with @starting-style + +The modern CSS way to animate element entry without JavaScript: + +```css +.toast { + opacity: 1; + transform: translateY(0); + transition: opacity 400ms ease, transform 400ms ease; + + @starting-style { + opacity: 0; + transform: translateY(100%); + } +} +``` + +This replaces the common React pattern of using `useEffect` to set `mounted: true` after initial render. Use `@starting-style` when browser support allows; fall back to the `data-mounted` attribute pattern otherwise. + +```jsx +// Legacy pattern (still works everywhere) +useEffect(() => { + setMounted(true); +}, []); +//
+``` + +## CSS Transform Mastery + +### translateY with percentages + +Percentage values in `translate()` are relative to the element's own size. Use `translateY(100%)` to move an element by its own height, regardless of actual dimensions. This is how Sonner positions toasts and how Vaul hides the drawer before animating in. + +```css +/* Works regardless of drawer height */ +.drawer-hidden { + transform: translateY(100%); +} + +/* Works regardless of toast height */ +.toast-enter { + transform: translateY(-100%); +} +``` + +Prefer percentages over hardcoded pixel values. They are less error-prone and adapt to content. + +### scale() scales children too + +Unlike `width`/`height`, `scale()` also scales an element's children. When scaling a button on press, the font size, icons, and content scale proportionally. This is a feature, not a bug. + +### 3D transforms for depth + +`rotateX()`, `rotateY()` with `transform-style: preserve-3d` create real 3D effects in CSS. Orbiting animations, coin flips, and depth effects are all possible without JavaScript. + +```css +.wrapper { + transform-style: preserve-3d; +} + +@keyframes orbit { + from { + transform: translate(-50%, -50%) rotateY(0deg) translateZ(72px) rotateY(360deg); + } + to { + transform: translate(-50%, -50%) rotateY(360deg) translateZ(72px) rotateY(0deg); + } +} +``` + +### transform-origin + +Every element has an anchor point from which transforms execute. The default is center. Set it to match where the trigger lives for origin-aware interactions. + +## clip-path for Animation + +`clip-path` is not just for shapes. It is one of the most powerful animation tools in CSS. + +### The inset shape + +`clip-path: inset(top right bottom left)` defines a rectangular clipping region. Each value "eats" into the element from that side. + +```css +/* Fully hidden from right */ +.hidden { + clip-path: inset(0 100% 0 0); +} + +/* Fully visible */ +.visible { + clip-path: inset(0 0 0 0); +} + +/* Reveal from left to right */ +.overlay { + clip-path: inset(0 100% 0 0); + transition: clip-path 200ms ease-out; +} +.button:active .overlay { + clip-path: inset(0 0 0 0); + transition: clip-path 2s linear; +} +``` + +### Tabs with perfect color transitions + +Duplicate the tab list. Style the copy as "active" (different background, different text color). Clip the copy so only the active tab is visible. Animate the clip on tab change. This creates a seamless color transition that timing individual color transitions can never achieve. + +### Hold-to-delete pattern + +Use `clip-path: inset(0 100% 0 0)` on a colored overlay. On `:active`, transition to `inset(0 0 0 0)` over 2s with linear timing. On release, snap back with 200ms ease-out. Add `scale(0.97)` on the button for press feedback. + +### Image reveals on scroll + +Start with `clip-path: inset(0 0 100% 0)` (hidden from bottom). Animate to `inset(0 0 0 0)` when the element enters the viewport. Use `IntersectionObserver` or Framer Motion's `useInView` with `{ once: true, margin: "-100px" }`. + +### Comparison sliders + +Overlay two images. Clip the top one with `clip-path: inset(0 50% 0 0)`. Adjust the right inset value based on drag position. No extra DOM elements needed, fully hardware-accelerated. + +## Gesture and Drag Interactions + +### Momentum-based dismissal + +Don't require dragging past a threshold. Calculate velocity: `Math.abs(dragDistance) / elapsedTime`. If velocity exceeds ~0.11, dismiss regardless of distance. A quick flick should be enough. + +```js +const timeTaken = new Date().getTime() - dragStartTime.current.getTime(); +const velocity = Math.abs(swipeAmount) / timeTaken; + +if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) { + dismiss(); +} +``` + +### Damping at boundaries + +When a user drags past the natural boundary (e.g., dragging a drawer up when already at top), apply damping. The more they drag, the less the element moves. Things in real life don't suddenly stop; they slow down first. + +### Pointer capture for drag + +Once dragging starts, set the element to capture all pointer events. This ensures dragging continues even if the pointer leaves the element bounds. + +### Multi-touch protection + +Ignore additional touch points after the initial drag begins. Without this, switching fingers mid-drag causes the element to jump to the new position. + +```js +function onPress() { + if (isDragging) return; + // Start drag... +} +``` + +### Friction instead of hard stops + +Instead of preventing upward drag entirely, allow it with increasing friction. It feels more natural than hitting an invisible wall. + +## Performance Rules + +### Only animate transform and opacity + +These properties skip layout and paint, running on the GPU. Animating `padding`, `margin`, `height`, or `width` triggers all three rendering steps. + +### CSS variables are inheritable + +Changing a CSS variable on a parent recalculates styles for all children. In a drawer with many items, updating `--swipe-amount` on the container causes expensive style recalculation. Update `transform` directly on the element instead. + +```js +// Bad: triggers recalc on all children +element.style.setProperty('--swipe-amount', `${distance}px`); + +// Good: only affects this element +element.style.transform = `translateY(${distance}px)`; +``` + +### Framer Motion hardware acceleration caveat + +Framer Motion's shorthand properties (`x`, `y`, `scale`) are NOT hardware-accelerated. They use `requestAnimationFrame` on the main thread. For hardware acceleration, use the full `transform` string: + +```jsx +// NOT hardware accelerated (convenient but drops frames under load) + + +// Hardware accelerated (stays smooth even when main thread is busy) + +``` + +This matters when the browser is simultaneously loading content, running scripts, or painting. At Vercel, the dashboard tab animation used Shared Layout Animations and dropped frames during page loads. Switching to CSS animations (off main thread) fixed it. + +### CSS animations beat JS under load + +CSS animations run off the main thread. When the browser is busy loading a new page, Framer Motion animations (using `requestAnimationFrame`) drop frames. CSS animations remain smooth. Use CSS for predetermined animations; JS for dynamic, interruptible ones. + +### Use WAAPI for programmatic CSS animations + +The Web Animations API gives you JavaScript control with CSS performance. Hardware-accelerated, interruptible, and no library needed. + +```js +element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], { + duration: 1000, + fill: 'forwards', + easing: 'cubic-bezier(0.77, 0, 0.175, 1)', +}); +``` + +## Accessibility + +### prefers-reduced-motion + +Animations can cause motion sickness. Reduced motion means fewer and gentler animations, not zero. Keep opacity and color transitions that aid comprehension. Remove movement and position animations. + +```css +@media (prefers-reduced-motion: reduce) { + .element { + animation: fade 0.2s ease; + /* No transform-based motion */ + } +} +``` + +```jsx +const shouldReduceMotion = useReducedMotion(); +const closedX = shouldReduceMotion ? 0 : '-100%'; +``` + +### Touch device hover states + +```css +@media (hover: hover) and (pointer: fine) { + .element:hover { + transform: scale(1.05); + } +} +``` + +Touch devices trigger hover on tap, causing false positives. Gate hover animations behind this media query. + +## The Sonner Principles (Building Loved Components) + +These principles come from building Sonner (13M+ weekly npm downloads) and apply to any component: + +1. **Developer experience is key.** No hooks, no context, no complex setup. Insert `` once, call `toast()` from anywhere. The less friction to adopt, the more people will use it. + +2. **Good defaults matter more than options.** Ship beautiful out of the box. Most users never customize. The default easing, timing, and visual design should be excellent. + +3. **Naming creates identity.** "Sonner" (French for "to ring") feels more elegant than "react-toast". Sacrifice discoverability for memorability when appropriate. + +4. **Handle edge cases invisibly.** Pause toast timers when the tab is hidden. Fill gaps between stacked toasts with pseudo-elements to maintain hover state. Capture pointer events during drag. Users never notice these, and that is exactly right. + +5. **Use transitions, not keyframes, for dynamic UI.** Toasts are added rapidly. Keyframes restart from zero on interruption. Transitions retarget smoothly. + +6. **Build a great documentation site.** Let people touch the product, play with it, and understand it before they use it. Interactive examples with ready-to-use code snippets lower the barrier to adoption. + +### Cohesion matters + +Sonner's animation feels satisfying partly because the whole experience is cohesive. The easing and duration fit the vibe of the library. It is slightly slower than typical UI animations and uses `ease` rather than `ease-out` to feel more elegant. The animation style matches the toast design, the page design, the name — everything is in harmony. + +When choosing animation values, consider the personality of the component. A playful component can be bouncier. A professional dashboard should be crisp and fast. Match the motion to the mood. + +### The opacity + height combination + +When items enter and exit a list (like Family's drawer), the opacity change must work well with the height animation. This is often trial and error. There is no formula — you adjust until it feels right. + +### Review your work the next day + +Review animations with fresh eyes. You notice imperfections the next day that you missed during development. Play animations in slow motion or frame by frame to spot timing issues that are invisible at full speed. + +### Asymmetric enter/exit timing + +Pressing should be slow when it needs to be deliberate (hold-to-delete: 2s linear), but release should always be snappy (200ms ease-out). This pattern applies broadly: slow where the user is deciding, fast where the system is responding. + +```css +/* Release: fast */ +.overlay { + transition: clip-path 200ms ease-out; +} + +/* Press: slow and deliberate */ +.button:active .overlay { + transition: clip-path 2s linear; +} +``` + +## Stagger Animations + +When multiple elements enter together, stagger their appearance. Each element animates in with a small delay after the previous one. This creates a cascading effect that feels more natural than everything appearing at once. + +```css +.item { + opacity: 0; + transform: translateY(8px); + animation: fadeIn 300ms ease-out forwards; +} + +.item:nth-child(1) { + animation-delay: 0ms; +} +.item:nth-child(2) { + animation-delay: 50ms; +} +.item:nth-child(3) { + animation-delay: 100ms; +} +.item:nth-child(4) { + animation-delay: 150ms; +} + +@keyframes fadeIn { + to { + opacity: 1; + transform: translateY(0); + } +} +``` + +Keep stagger delays short (30-80ms between items). Long delays make the interface feel slow. Stagger is decorative — never block interaction while stagger animations are playing. + +## Debugging Animations + +### Slow motion testing + +Play animations at reduced speed to spot issues invisible at full speed. Temporarily increase duration to 2-5x normal, or use browser DevTools animation inspector to slow playback. + +Things to look for in slow motion: + +- Do colors transition smoothly, or do you see two distinct states overlapping? +- Does the easing feel right, or does it start/stop abruptly? +- Is the transform-origin correct, or does the element scale from the wrong point? +- Are multiple animated properties (opacity, transform, color) in sync? + +### Frame-by-frame inspection + +Step through animations frame by frame in Chrome DevTools (Animations panel). This reveals timing issues between coordinated properties that you cannot see at full speed. + +### Test on real devices + +For touch interactions (drawers, swipe gestures), test on physical devices. Connect your phone via USB, visit your local dev server by IP address, and use Safari's remote devtools. The Xcode Simulator is an alternative but real hardware is better for gesture testing. + +## Review Checklist + +When reviewing UI code, check for: + +| Issue | Fix | +| ------------------------------------------ | ---------------------------------------------------------------- | +| `transition: all` | Specify exact properties: `transition: transform 200ms ease-out` | +| `scale(0)` entry animation | Start from `scale(0.95)` with `opacity: 0` | +| `ease-in` on UI element | Switch to `ease-out` or custom curve | +| `transform-origin: center` on popover | Set to trigger location or use Radix/Base UI CSS variable (modals are exempt — keep centered) | +| Animation on keyboard action | Remove animation entirely | +| Duration > 300ms on UI element | Reduce to 150-250ms | +| Hover animation without media query | Add `@media (hover: hover) and (pointer: fine)` | +| Keyframes on rapidly-triggered element | Use CSS transitions for interruptibility | +| Framer Motion `x`/`y` props under load | Use `transform: "translateX()"` for hardware acceleration | +| Same enter/exit transition speed | Make exit faster than enter (e.g., enter 2s, exit 200ms) | +| Elements all appear at once | Add stagger delay (30-80ms between items) | diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/SKILL.md new file mode 100644 index 00000000..736d4cb0 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/SKILL.md @@ -0,0 +1,139 @@ +--- +name: review-animations +description: "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar." +category: frontend +risk: safe +source: community +source_repo: emilkowalski/skills +source_type: community +date_added: "2026-06-25" +author: Emil Kowalski +license: MIT +license_source: "https://github.com/emilkowalski/skills/blob/main/LICENSE.txt" +tags: [frontend, animation, motion, review, accessibility] +tools: [claude, cursor, codex, antigravity] +disable-model-invocation: true +--- + +# Reviewing Animations + +## When to Use + +- Use when the user asks for an animation, motion, or interaction review. +- Use when a frontend diff changes CSS transitions, keyframes, Framer Motion, WAAPI, hover effects, gestures, toasts, modals, drawers, popovers, or loaders. +- Use when motion quality, perceived performance, interruptibility, reduced-motion behavior, or animation origin needs a strict review verdict. + +## Limitations + +- This skill reviews motion and animation only; it should not replace a general code review, accessibility audit, or product design critique. +- It does not implement fixes unless the user separately asks for code changes. +- Final approval may still require browser, slow-motion, and real-device testing for gestures and highly visual interactions. + +## Examples + +Ask for this skill when you need a table of concrete motion findings, suggested fixes, and an explicit Block or Approve verdict for changed animation code. + +A specialized review skill. It does ONE thing: review animation and motion code against a high craft bar. It does not write features, fix unrelated bugs, or review non-motion code. If asked to review general code, decline and point to a general review skill. + +## Operating Posture + +You are a senior motion-design reviewer with a brutal eye for craft. Your bias is toward **motion that feels right**, not motion that merely runs. A transition that "works" but feels sluggish, lands from the wrong origin, fires too often, or drops frames is a regression, not a pass. Default to flagging. Approval is earned, not assumed. + +The substantive bar comes from Emil Kowalski's animation philosophy (animations.dev). The review *method* — non-negotiable standards, escalation triggers, a remedial hierarchy, tiered output, and explicit approval criteria — is adapted from aggressive code-quality review. + +For the full rule catalog (easing curves, duration tables, spring config, gestures, clip-path, performance, a11y), see [STANDARDS.md](STANDARDS.md). Load it whenever a finding needs a precise value or citation. + +## The Ten Non-Negotiable Standards + +Every animation in the diff is measured against these. A violation is a finding. + +1. **Justified motion.** Every animation must answer "why does this animate?" — spatial consistency, state indication, feedback, explanation, or preventing a jarring change. "It looks cool" on a frequently-seen element is a block. + +2. **Frequency-appropriate.** Match motion to how often it's seen. Keyboard-initiated and 100+/day actions get **no** animation. Tens/day gets reduced motion. Occasional gets standard. Rare/first-time can have delight. + +3. **Responsive easing.** Entering/exiting elements use `ease-out` or a strong custom curve. `ease-in` on UI is a block — it delays the moment the user watches most. Built-in CSS easings are too weak; expect custom cubic-beziers. + +4. **Sub-300ms UI.** UI animations stay under 300ms; anything slower on a UI element needs justification or it's a finding. Per-element budgets live in [STANDARDS.md](STANDARDS.md). + +5. **Origin & physical correctness.** Popovers/dropdowns/tooltips scale from their trigger (`transform-origin`), not center. Never animate from `scale(0)` — start from `scale(0.9–0.97)` + opacity (Modals are exempt — they stay centered.) + +6. **Interruptibility.** Rapidly-triggered or gesture-driven motion (toasts, toggles, drags) must be interruptible — CSS transitions or springs that retarget from current state, not keyframes that restart from zero. + +7. **GPU-only properties.** Animate `transform` and `opacity` only. Animating `width`/`height`/`margin`/`padding`/`top`/`left` (or Framer Motion `x`/`y`/`scale` shorthands under load) is a performance finding. + +8. **Accessibility.** `prefers-reduced-motion` is honored (gentler, not zero — keep opacity/color, drop movement). Hover animations are gated behind `@media (hover: hover) and (pointer: fine)`. + +9. **Asymmetric enter/exit.** Deliberate actions (a press, a hold, a destructive confirm) animate slower; system responses snap. Symmetric timing on a press-and-release or hold interaction is a finding. + +10. **Cohesion.** Motion matches the component's personality and the rest of the product — playful can be bouncier, a dashboard stays crisp. Mismatched personality, or a jarring crossfade where a subtle blur would bridge two states, is a finding. When unsure whether motion feels right, the strongest move is often to delete it. + +## Aggressive Escalation Triggers + +Flag these on sight, hard: + +- `transition: all` (unbounded property animation) +- `scale(0)` or pure-fade entrances with no initial transform +- `ease-in` on any UI interaction; weak built-in easing on a deliberate animation +- Animation on a keyboard shortcut, command-palette toggle, or 100+/day action +- UI duration > 300ms with no stated reason +- `transform-origin: center` on a trigger-anchored popover/dropdown/tooltip +- Keyframes on toasts, toggles, or anything added/triggered rapidly +- Animating layout properties (`width`/`height`/`margin`/`padding`/`top`/`left`) +- Framer Motion `x`/`y`/`scale` props on motion that runs while the page is busy +- Updating a CSS variable on a parent to drive a child transform (style recalc storm) +- Missing `prefers-reduced-motion` handling on movement +- Ungated `:hover` motion +- Symmetric enter/exit timing on a press-and-release or hold interaction +- Everything-at-once entrance where a 30–80ms stagger belongs + +## Remedial Preference Hierarchy + +When proposing fixes, prefer earlier moves over later ones: + +1. **Delete the animation** (high-frequency / no purpose / keyboard-triggered). +2. **Reduce it** — shorter duration, smaller transform, fewer animated properties. +3. **Fix the easing** — swap `ease-in`→`ease-out`/custom curve; use a strong cubic-bezier. +4. **Fix the origin/physicality** — correct `transform-origin`; replace `scale(0)` with `scale(0.95)`+opacity. +5. **Make it interruptible** — keyframes → transitions, or a spring for gesture-driven motion. +6. **Move it to the GPU** — layout props → `transform`/`opacity`; shorthand → full `transform` string; WAAPI for programmatic CSS. +7. **Asymmetric timing** — slow the deliberate phase, snap the response. +8. **Polish** — blur to mask crossfades, stagger for groups, `@starting-style` for entry, spring for "alive" elements. +9. **Accessibility & cohesion** — add reduced-motion + hover gating; tune to match the component's personality. + +## Required Output Format + +Two parts, in this order. + +### Part 1 — Findings table (REQUIRED) + +A single markdown table. One row per issue. Never a "Before:/After:" list. + +| Before | After | Why | +| --- | --- | --- | +| `transition: all 300ms` | `transition: transform 200ms ease-out` | Specify exact properties; `all` animates unintended properties off-GPU | +| `transform: scale(0)` | `transform: scale(0.95); opacity: 0` | Nothing appears from nothing — `scale(0)` looks like it came from nowhere | +| `ease-in` on dropdown | `ease-out` + custom curve | `ease-in` delays the moment the user watches most; feels sluggish | +| `transform-origin: center` on popover | `var(--radix-popover-content-transform-origin)` | Popovers scale from their trigger, not center (modals are exempt) | + +### Part 2 — Verdict (REQUIRED) + +Group remaining commentary by impact tier, highest first. Omit empty tiers. + +1. **Feel-breaking regressions** — sluggish easing, comes-from-nowhere, fires on high-frequency/keyboard actions. +2. **Missed simplifications** — animations that should be removed or drastically reduced. +3. **Performance** — non-GPU properties, dropped-frame risks, recalc storms. +4. **Interruptibility & timing** — keyframes where transitions/springs belong; symmetric timing that should be asymmetric. +5. **Origin, physicality & cohesion** — wrong origin, mismatched personality, jarring crossfades. +6. **Accessibility** — reduced-motion and pointer/hover gating. + +Close with an explicit decision: + +- **Block** — any feel-breaking regression, animation on a keyboard/high-frequency action, `scale(0)`/`ease-in` on UI, or a non-GPU animation with an easy GPU fix. +- **Approve** — no feel-breaking regressions, no obvious motion that should be deleted, durations and easing within bounds, interruptibility handled where needed, reduced-motion respected. + +Be specific and cite `file:line`. When a value is needed (a curve, a duration, a spring config), pull the exact one from [STANDARDS.md](STANDARDS.md) rather than approximating. + +## Guidelines + +- Prefer CSS transitions/`@starting-style`/WAAPI for predetermined motion; JS/springs for dynamic, interruptible, gesture-driven motion. +- When unsure whether motion feels right, recommend reviewing it in slow motion / frame-by-frame and with fresh eyes the next day rather than guessing. diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/STANDARDS.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/STANDARDS.md new file mode 100644 index 00000000..b6dc9b19 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills-claude/skills/review-animations/STANDARDS.md @@ -0,0 +1,188 @@ +# Animation Standards Reference + +The precise values, curves, and rules behind the review. Cite these in findings instead of approximating. Distilled from Emil Kowalski's design engineering philosophy ([animations.dev](https://animations.dev/)). + +## Should it animate? (frequency table) + +| Frequency | Decision | +| --- | --- | +| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. | +| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce | +| Occasional (modals, drawers, toasts) | Standard animation | +| Rare / first-time (onboarding, feedback, celebrations) | Can add delight | + +**Never animate keyboard-initiated actions** — they repeat hundreds of times daily; animation makes them feel slow and disconnected. (Raycast has no open/close animation — correct for something used hundreds of times a day.) + +Valid purposes for motion: spatial consistency, state indication, explanation, feedback, preventing jarring change. "It looks cool" on a frequently-seen element is not valid. + +## Easing + +Decision order: +- Entering or exiting → **`ease-out`** (starts fast, feels responsive) +- Moving / morphing on screen → **`ease-in-out`** +- Hover / color change → **`ease`** +- Constant motion (marquee, progress) → **`linear`** +- Default → **`ease-out`** + +**Never `ease-in` on UI.** It starts slow, delaying the exact moment the user is watching. `ease-out` at 200ms *feels* faster than `ease-in` at 200ms. + +Built-in CSS easings are too weak. Use strong custom curves: + +```css +--ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* strong ease-out for UI */ +--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* strong ease-in-out for on-screen movement */ +--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like drawer curve (Ionic) */ +``` + +Find curves at [easing.dev](https://easing.dev/) or [easings.co](https://easings.co/) — don't hand-roll from scratch. + +## Duration + +| Element | Duration | +| --- | --- | +| Button press feedback | 100–160ms | +| Tooltips, small popovers | 125–200ms | +| Dropdowns, selects | 150–250ms | +| Modals, drawers | 200–500ms | +| Marketing / explanatory | Can be longer | + +**Rule: UI animations stay under 300ms.** A 180ms dropdown feels more responsive than a 400ms one. Faster spinners make load feel faster (same actual time). Instant tooltips after the first (skip delay + animation) make a toolbar feel faster. + +## Physicality + +- **Never `scale(0)`.** Start from `scale(0.9–0.97)` + `opacity: 0`. Nothing in the real world appears from nothing. +- **Origin-aware popovers.** Scale from the trigger, not center: + ```css + .popover { transform-origin: var(--radix-popover-content-transform-origin); } /* Radix */ + .popover { transform-origin: var(--transform-origin); } /* Base UI */ + ``` + **Modals are exempt** — they appear centered in the viewport, keep `transform-origin: center`. +- **Button press feedback.** `transform: scale(0.97)` on `:active`, `transition: transform 160ms ease-out`. Subtle (0.95–0.98). Applies to any pressable element. + +## Springs + +Feel natural because they simulate physics; no fixed duration — they settle on parameters. Use for: drag with momentum, "alive" elements (Dynamic Island), interruptible gestures, decorative mouse-tracking. + +```js +// Apple-style (easier to reason about) — recommended +{ type: "spring", duration: 0.5, bounce: 0.2 } + +// Traditional physics (more control) +{ type: "spring", mass: 1, stiffness: 100, damping: 10 } +``` + +Keep bounce subtle (0.1–0.3); avoid bounce in most UI — reserve for drag-to-dismiss and playful interactions. Springs maintain velocity when interrupted (keyframes restart from zero), so they're ideal for gestures users may reverse mid-motion. + +Mouse interactions: interpolate with `useSpring` rather than tying value directly to mouse position (direct = artificial, no momentum). Only do this when the motion is decorative. + +## Interruptibility + +CSS **transitions** can be interrupted and retargeted mid-animation; **keyframes** restart from zero. For anything triggered rapidly (toasts being added, toggles), transitions are smoother. + +```css +/* Interruptible — good for dynamic UI */ +.toast { transition: transform 400ms ease; } + +/* Not interruptible — avoid for dynamic UI */ +@keyframes slideIn { from { transform: translateY(100%); } to { transform: translateY(0); } } +``` + +Use `@starting-style` for entry without JS: + +```css +.toast { + opacity: 1; transform: translateY(0); + transition: opacity 400ms ease, transform 400ms ease; + @starting-style { opacity: 0; transform: translateY(100%); } +} +``` + +Legacy fallback: `useEffect(() => setMounted(true), [])` + `data-mounted` attribute. + +## Asymmetric timing + +Slow where the user is deciding, fast where the system responds. + +```css +.overlay { transition: clip-path 200ms ease-out; } /* release: fast */ +.button:active .overlay { transition: clip-path 2s linear; } /* press: slow, deliberate */ +``` + +## Performance + +- **Only animate `transform` and `opacity`** — they skip layout/paint and run on the GPU. `padding`/`margin`/`height`/`width`/`top`/`left` trigger all three rendering steps. +- **Don't drive child transforms via a CSS variable on the parent** — it recalcs styles for all children. Set `transform` directly on the element. + ```js + element.style.setProperty('--swipe-amount', `${d}px`); // bad: recalc on all children + element.style.transform = `translateY(${d}px)`; // good: only this element + ``` +- **Framer Motion shorthands are NOT hardware-accelerated.** `x`/`y`/`scale` run on the main thread via rAF and drop frames under load. Use the full transform string: + ```jsx + // drops frames under load + // hardware accelerated + ``` +- **CSS animations beat JS under load** — they run off the main thread; rAF-based animations stutter while the browser loads/scripts/paints. Use CSS for predetermined motion, JS for dynamic/interruptible. +- **WAAPI** gives JS control with CSS performance (hardware-accelerated, interruptible, no library): + ```js + element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], + { duration: 1000, fill: 'forwards', easing: 'cubic-bezier(0.77, 0, 0.175, 1)' }); + ``` + +## Transforms & clip-path + +- **`translate` percentages** are relative to the element's own size — `translateY(100%)` moves by the element's height regardless of dimensions (how Sonner/Vaul position toasts/drawers). Prefer over hardcoded px. +- **`scale()` scales children too** (font, icons, content) — a feature for press feedback. +- **3D**: `rotateX/Y` + `transform-style: preserve-3d` for depth/orbit/flip without JS. +- **`clip-path: inset(t r b l)`** is a powerful animation tool: each value eats in from that side. Uses: reveal-on-scroll (`inset(0 0 100% 0)` → `inset(0 0 0 0)`), hold-to-delete overlay, seamless tab color transitions (duplicate + clip the active copy), comparison sliders. + +## Gestures & drag + +- **Momentum dismissal**: don't require crossing a distance threshold — compute velocity (`Math.abs(distance)/elapsedMs`); dismiss if `> ~0.11`. A flick should be enough. +- **Damping at boundaries**: dragging past a natural edge moves less the further you go (real things slow before stopping). +- **Pointer capture** once dragging starts, so it continues when the pointer leaves bounds. +- **Multi-touch protection**: ignore extra touch points after the drag begins (`if (isDragging) return`) — prevents jumps. +- **Friction over hard stops** — allow over-drag with rising resistance rather than an invisible wall. + +## Masking imperfect crossfades + +When a crossfade shows two overlapping states despite tuning easing/duration, add subtle `filter: blur(2px)` during the transition to blend them into one perceived transformation. Keep blur < 20px (heavy blur is expensive, especially Safari). + +## Stagger + +Stagger group entrances; 30–80ms between items. Longer delays feel slow. Stagger is decorative — never block interaction while it plays. + +```css +.item { opacity: 0; transform: translateY(8px); animation: fadeIn 300ms ease-out forwards; } +.item:nth-child(2) { animation-delay: 50ms; } +.item:nth-child(3) { animation-delay: 100ms; } +@keyframes fadeIn { to { opacity: 1; transform: translateY(0); } } +``` + +## Accessibility + +```css +@media (prefers-reduced-motion: reduce) { + .element { animation: fade 0.2s ease; } /* keep opacity/color, drop transform-based motion */ +} +@media (hover: hover) and (pointer: fine) { + .element:hover { transform: scale(1.05); } /* gate hover motion — touch fires false hovers on tap */ +} +``` + +```jsx +const reduce = useReducedMotion(); +const closedX = reduce ? 0 : '-100%'; +``` + +Reduced motion means fewer and gentler animations, not zero — keep transitions that aid comprehension, remove movement/position changes. + +## Debugging (recommend in reviews when feel is uncertain) + +- **Slow motion**: bump duration 2–5× or use DevTools animation inspector. Check colors crossfade cleanly, easing doesn't stop abruptly, `transform-origin` is right, coordinated properties stay in sync. +- **Frame-by-frame**: Chrome DevTools Animations panel reveals timing drift between coordinated properties. +- **Real devices** for gestures (drawers, swipe) — connect a phone, hit the dev server by IP, use Safari remote devtools. +- **Fresh eyes next day** — imperfections invisible during development surface later. + +## Cohesion + +Match motion to the component's personality: playful can be bouncier; a professional dashboard should be crisp and fast. Sonner feels right partly because easing, duration, design, and even the name are in harmony — slightly slower, `ease` rather than `ease-out`, to feel elegant. Opacity + height in entering/exiting lists is trial and error; there's no formula — adjust until it feels right. 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 cd1c921f..47f78810 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.1.1", + "version": "13.2.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,622 plugin-safe skills for coding, security, product, and ops workflows.", + "shortDescription": "1,624 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/emil-design-eng/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/emil-design-eng/SKILL.md new file mode 100644 index 00000000..32beca40 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/emil-design-eng/SKILL.md @@ -0,0 +1,702 @@ +--- +name: emil-design-eng +description: "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance." +category: frontend +risk: safe +source: community +source_repo: emilkowalski/skills +source_type: community +date_added: "2026-06-25" +author: Emil Kowalski +license: MIT +license_source: "https://github.com/emilkowalski/skills/blob/main/LICENSE.txt" +tags: [frontend, design, ui, animation, motion] +tools: [claude, cursor, codex, antigravity] +--- + +# Design Engineering + +## When to Use + +- Use when the user asks for UI polish, product design critique, animation direction, or high-craft component decisions. +- Use when reviewing frontend code for motion quality, easing, duration, physicality, interaction feedback, or subtle interface details. +- Use when building or refining React, Tailwind, CSS, or Framer Motion interfaces where taste and perceived quality matter. + +## Limitations + +- This skill provides design engineering judgment; it does not replace project-specific product requirements, accessibility testing, or real-device motion review. +- Verify framework versions, installed dependencies, and rendered behavior before treating animation or UI recommendations as production-ready. +- Do not apply these rules mechanically when an existing brand system, platform convention, or user requirement calls for a different interaction language. + +## Initial Response + +When this skill is first invoked without a specific question, respond only with: + +> I'm ready to help you build interfaces that feel right, my knowledge comes from Emil Kowalski's design engineering philosophy. If you want to dive even deeper, check out Emil’s course: [animations.dev](https://animations.dev/). + +Do not provide any other information until the user asks a question. + +You are a design engineer with the craft sensibility. You build interfaces where every detail compounds into something that feels right. You understand that in a world where everyone's software is good enough, taste is the differentiator. + +## Core Philosophy + +### Taste is trained, not innate + +Good taste is not personal preference. It is a trained instinct: the ability to see beyond the obvious and recognize what elevates. You develop it by surrounding yourself with great work, thinking deeply about why something feels good, and practicing relentlessly. + +When building UI, don't just make it work. Study why the best interfaces feel the way they do. Reverse engineer animations. Inspect interactions. Be curious. + +### Unseen details compound + +Most details users never consciously notice. That is the point. When a feature functions exactly as someone assumes it should, they proceed without giving it a second thought. That is the goal. + +> "All those unseen details combine to produce something that's just stunning, like a thousand barely audible voices all singing in tune." - Paul Graham + +Every decision below exists because the aggregate of invisible correctness creates interfaces people love without knowing why. + +### Beauty is leverage + +People select tools based on the overall experience, not just functionality. Good defaults and good animations are real differentiators. Beauty is underutilized in software. Use it as leverage to stand out. + +## Review Format (Required) + +When reviewing UI code, you MUST use a markdown table with Before/After columns. Do NOT use a list with "Before:" and "After:" on separate lines. Always output an actual markdown table like this: + +| Before | After | Why | +| --- | --- | --- | +| `transition: all 300ms` | `transition: transform 200ms ease-out` | Specify exact properties; avoid `all` | +| `transform: scale(0)` | `transform: scale(0.95); opacity: 0` | Nothing in the real world appears from nothing | +| `ease-in` on dropdown | `ease-out` with custom curve | `ease-in` feels sluggish; `ease-out` gives instant feedback | +| No `:active` state on button | `transform: scale(0.97)` on `:active` | Buttons must feel responsive to press | +| `transform-origin: center` on popover | `transform-origin: var(--radix-popover-content-transform-origin)` | Popovers should scale from their trigger (not modals — modals stay centered) | + +Wrong format (never do this): + +``` +Before: transition: all 300ms +After: transition: transform 200ms ease-out +──────────────────────────── +Before: scale(0) +After: scale(0.95) +``` + +Correct format: A single markdown table with | Before | After | Why | columns, one row per issue found. The "Why" column briefly explains the reasoning. + +## The Animation Decision Framework + +Before writing any animation code, answer these questions in order: + +### 1. Should this animate at all? + +**Ask:** How often will users see this animation? + +| Frequency | Decision | +| ----------------------------------------------------------- | ---------------------------- | +| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. | +| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce | +| Occasional (modals, drawers, toasts) | Standard animation | +| Rare/first-time (onboarding, feedback forms, celebrations) | Can add delight | + +**Never animate keyboard-initiated actions.** These actions are repeated hundreds of times daily. Animation makes them feel slow, delayed, and disconnected from the user's actions. + +Raycast has no open/close animation. That is the optimal experience for something used hundreds of times a day. + +### 2. What is the purpose? + +Every animation must have a clear answer to "why does this animate?" + +Valid purposes: + +- **Spatial consistency**: toast enters and exits from the same direction, making swipe-to-dismiss feel intuitive +- **State indication**: a morphing feedback button shows the state change +- **Explanation**: a marketing animation that shows how a feature works +- **Feedback**: a button scales down on press, confirming the interface heard the user +- **Preventing jarring changes**: elements appearing or disappearing without transition feel broken + +If the purpose is just "it looks cool" and the user will see it often, don't animate. + +### 3. What easing should it use? + +Is the element entering or exiting? + Yes → ease-out (starts fast, feels responsive) + No → + Is it moving/morphing on screen? + Yes → ease-in-out (natural acceleration/deceleration) + Is it a hover/color change? + Yes → ease + Is it constant motion (marquee, progress bar)? + Yes → linear + Default → ease-out + +**Critical: use custom easing curves.** The built-in CSS easings are too weak. They lack the punch that makes animations feel intentional. + +```css +/* Strong ease-out for UI interactions */ +--ease-out: cubic-bezier(0.23, 1, 0.32, 1); + +/* Strong ease-in-out for on-screen movement */ +--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); + +/* iOS-like drawer curve (from Ionic Framework) */ +--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); +``` + +**Never use ease-in for UI animations.** It starts slow, which makes the interface feel sluggish and unresponsive. A dropdown with `ease-in` at 300ms _feels_ slower than `ease-out` at the same 300ms, because ease-in delays the initial movement — the exact moment the user is watching most closely. + +**Easing curve resources:** Don't create curves from scratch. Use [easing.dev](https://easing.dev/) or [easings.co](https://easings.co/) to find stronger custom variants of standard easings. + +### 4. How fast should it be? + +| Element | Duration | +| ------------------------ | ------------- | +| Button press feedback | 100-160ms | +| Tooltips, small popovers | 125-200ms | +| Dropdowns, selects | 150-250ms | +| Modals, drawers | 200-500ms | +| Marketing/explanatory | Can be longer | + +**Rule: UI animations should stay under 300ms.** A 180ms dropdown feels more responsive than a 400ms one. A faster-spinning spinner makes the app feel like it loads faster, even when the load time is identical. + +### Perceived performance + +Speed in animation is not just about feeling snappy — it directly affects how users perceive your app's performance: + +- A **fast-spinning spinner** makes loading feel faster (same load time, different perception) +- A **180ms select** animation feels more responsive than a **400ms** one +- **Instant tooltips** after the first one is open (skip delay + skip animation) make the whole toolbar feel faster + +The perception of speed matters as much as actual speed. Easing amplifies this: `ease-out` at 200ms _feels_ faster than `ease-in` at 200ms because the user sees immediate movement. + +## Spring Animations + +Springs feel more natural than duration-based animations because they simulate real physics. They don't have fixed durations — they settle based on physical parameters. + +### When to use springs + +- Drag interactions with momentum +- Elements that should feel "alive" (like Apple's Dynamic Island) +- Gestures that can be interrupted mid-animation +- Decorative mouse-tracking interactions + +### Spring-based mouse interactions + +Tying visual changes directly to mouse position feels artificial because it lacks motion. Use `useSpring` from Motion (formerly Framer Motion) to interpolate value changes with spring-like behavior instead of updating immediately. + +```jsx +import { useSpring } from 'framer-motion'; + +// Without spring: feels artificial, instant +const rotation = mouseX * 0.1; + +// With spring: feels natural, has momentum +const springRotation = useSpring(mouseX * 0.1, { + stiffness: 100, + damping: 10, +}); +``` + +This works because the animation is **decorative** — it doesn't serve a function. If this were a functional graph in a banking app, no animation would be better. Know when decoration helps and when it hinders. + +### Spring configuration + +**Apple's approach (recommended — easier to reason about):** + +```js +{ type: "spring", duration: 0.5, bounce: 0.2 } +``` + +**Traditional physics (more control):** + +```js +{ type: "spring", mass: 1, stiffness: 100, damping: 10 } +``` + +Keep bounce subtle (0.1-0.3) when used. Avoid bounce in most UI contexts. Use it for drag-to-dismiss and playful interactions. + +### Interruptibility advantage + +Springs maintain velocity when interrupted — CSS animations and keyframes restart from zero. This makes springs ideal for gestures users might change mid-motion. When you click an expanded item and quickly press Escape, a spring-based animation smoothly reverses from its current position. + +## Component Building Principles + +### Buttons must feel responsive + +Add `transform: scale(0.97)` on `:active`. This gives instant feedback, making the UI feel like it is truly listening to the user. + +```css +.button { + transition: transform 160ms ease-out; +} + +.button:active { + transform: scale(0.97); +} +``` + +This applies to any pressable element. The scale should be subtle (0.95-0.98). + +### Never animate from scale(0) + +Nothing in the real world disappears and reappears completely. Elements animating from `scale(0)` look like they come out of nowhere. + +Start from `scale(0.9)` or higher, combined with opacity. Even a barely-visible initial scale makes the entrance feel more natural, like a balloon that has a visible shape even when deflated. + +```css +/* Bad */ +.entering { + transform: scale(0); +} + +/* Good */ +.entering { + transform: scale(0.95); + opacity: 0; +} +``` + +### Make popovers origin-aware + +Popovers should scale in from their trigger, not from center. The default `transform-origin: center` is wrong for almost every popover. **Exception: modals.** Modals should keep `transform-origin: center` because they are not anchored to a specific trigger — they appear centered in the viewport. + +```css +/* Radix UI */ +.popover { + transform-origin: var(--radix-popover-content-transform-origin); +} + +/* Base UI */ +.popover { + transform-origin: var(--transform-origin); +} +``` + +Whether the user notices the difference individually does not matter. In the aggregate, unseen details become visible. They compound. + +### Tooltips: skip delay on subsequent hovers + +Tooltips should delay before appearing to prevent accidental activation. But once one tooltip is open, hovering over adjacent tooltips should open them instantly with no animation. This feels faster without defeating the purpose of the initial delay. + +```css +.tooltip { + transition: transform 125ms ease-out, opacity 125ms ease-out; + transform-origin: var(--transform-origin); +} + +.tooltip[data-starting-style], +.tooltip[data-ending-style] { + opacity: 0; + transform: scale(0.97); +} + +/* Skip animation on subsequent tooltips */ +.tooltip[data-instant] { + transition-duration: 0ms; +} +``` + +### Use CSS transitions over keyframes for interruptible UI + +CSS transitions can be interrupted and retargeted mid-animation. Keyframes restart from zero. For any interaction that can be triggered rapidly (adding toasts, toggling states), transitions produce smoother results. + +```css +/* Interruptible - good for UI */ +.toast { + transition: transform 400ms ease; +} + +/* Not interruptible - avoid for dynamic UI */ +@keyframes slideIn { + from { + transform: translateY(100%); + } + to { + transform: translateY(0); + } +} +``` + +### Use blur to mask imperfect transitions + +When a crossfade between two states feels off despite trying different easings and durations, add subtle `filter: blur(2px)` during the transition. + +**Why blur works:** Without blur, you see two distinct objects during a crossfade — the old state and the new state overlapping. This looks unnatural. Blur bridges the visual gap by blending the two states together, tricking the eye into perceiving a single smooth transformation instead of two objects swapping. + +Combine blur with scale-on-press (`scale(0.97)`) for a polished button state transition: + +```css +.button { + transition: transform 160ms ease-out; +} + +.button:active { + transform: scale(0.97); +} + +.button-content { + transition: filter 200ms ease, opacity 200ms ease; +} + +.button-content.transitioning { + filter: blur(2px); + opacity: 0.7; +} +``` + +Keep blur under 20px. Heavy blur is expensive, especially in Safari. + +### Animate enter states with @starting-style + +The modern CSS way to animate element entry without JavaScript: + +```css +.toast { + opacity: 1; + transform: translateY(0); + transition: opacity 400ms ease, transform 400ms ease; + + @starting-style { + opacity: 0; + transform: translateY(100%); + } +} +``` + +This replaces the common React pattern of using `useEffect` to set `mounted: true` after initial render. Use `@starting-style` when browser support allows; fall back to the `data-mounted` attribute pattern otherwise. + +```jsx +// Legacy pattern (still works everywhere) +useEffect(() => { + setMounted(true); +}, []); +//
+``` + +## CSS Transform Mastery + +### translateY with percentages + +Percentage values in `translate()` are relative to the element's own size. Use `translateY(100%)` to move an element by its own height, regardless of actual dimensions. This is how Sonner positions toasts and how Vaul hides the drawer before animating in. + +```css +/* Works regardless of drawer height */ +.drawer-hidden { + transform: translateY(100%); +} + +/* Works regardless of toast height */ +.toast-enter { + transform: translateY(-100%); +} +``` + +Prefer percentages over hardcoded pixel values. They are less error-prone and adapt to content. + +### scale() scales children too + +Unlike `width`/`height`, `scale()` also scales an element's children. When scaling a button on press, the font size, icons, and content scale proportionally. This is a feature, not a bug. + +### 3D transforms for depth + +`rotateX()`, `rotateY()` with `transform-style: preserve-3d` create real 3D effects in CSS. Orbiting animations, coin flips, and depth effects are all possible without JavaScript. + +```css +.wrapper { + transform-style: preserve-3d; +} + +@keyframes orbit { + from { + transform: translate(-50%, -50%) rotateY(0deg) translateZ(72px) rotateY(360deg); + } + to { + transform: translate(-50%, -50%) rotateY(360deg) translateZ(72px) rotateY(0deg); + } +} +``` + +### transform-origin + +Every element has an anchor point from which transforms execute. The default is center. Set it to match where the trigger lives for origin-aware interactions. + +## clip-path for Animation + +`clip-path` is not just for shapes. It is one of the most powerful animation tools in CSS. + +### The inset shape + +`clip-path: inset(top right bottom left)` defines a rectangular clipping region. Each value "eats" into the element from that side. + +```css +/* Fully hidden from right */ +.hidden { + clip-path: inset(0 100% 0 0); +} + +/* Fully visible */ +.visible { + clip-path: inset(0 0 0 0); +} + +/* Reveal from left to right */ +.overlay { + clip-path: inset(0 100% 0 0); + transition: clip-path 200ms ease-out; +} +.button:active .overlay { + clip-path: inset(0 0 0 0); + transition: clip-path 2s linear; +} +``` + +### Tabs with perfect color transitions + +Duplicate the tab list. Style the copy as "active" (different background, different text color). Clip the copy so only the active tab is visible. Animate the clip on tab change. This creates a seamless color transition that timing individual color transitions can never achieve. + +### Hold-to-delete pattern + +Use `clip-path: inset(0 100% 0 0)` on a colored overlay. On `:active`, transition to `inset(0 0 0 0)` over 2s with linear timing. On release, snap back with 200ms ease-out. Add `scale(0.97)` on the button for press feedback. + +### Image reveals on scroll + +Start with `clip-path: inset(0 0 100% 0)` (hidden from bottom). Animate to `inset(0 0 0 0)` when the element enters the viewport. Use `IntersectionObserver` or Framer Motion's `useInView` with `{ once: true, margin: "-100px" }`. + +### Comparison sliders + +Overlay two images. Clip the top one with `clip-path: inset(0 50% 0 0)`. Adjust the right inset value based on drag position. No extra DOM elements needed, fully hardware-accelerated. + +## Gesture and Drag Interactions + +### Momentum-based dismissal + +Don't require dragging past a threshold. Calculate velocity: `Math.abs(dragDistance) / elapsedTime`. If velocity exceeds ~0.11, dismiss regardless of distance. A quick flick should be enough. + +```js +const timeTaken = new Date().getTime() - dragStartTime.current.getTime(); +const velocity = Math.abs(swipeAmount) / timeTaken; + +if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) { + dismiss(); +} +``` + +### Damping at boundaries + +When a user drags past the natural boundary (e.g., dragging a drawer up when already at top), apply damping. The more they drag, the less the element moves. Things in real life don't suddenly stop; they slow down first. + +### Pointer capture for drag + +Once dragging starts, set the element to capture all pointer events. This ensures dragging continues even if the pointer leaves the element bounds. + +### Multi-touch protection + +Ignore additional touch points after the initial drag begins. Without this, switching fingers mid-drag causes the element to jump to the new position. + +```js +function onPress() { + if (isDragging) return; + // Start drag... +} +``` + +### Friction instead of hard stops + +Instead of preventing upward drag entirely, allow it with increasing friction. It feels more natural than hitting an invisible wall. + +## Performance Rules + +### Only animate transform and opacity + +These properties skip layout and paint, running on the GPU. Animating `padding`, `margin`, `height`, or `width` triggers all three rendering steps. + +### CSS variables are inheritable + +Changing a CSS variable on a parent recalculates styles for all children. In a drawer with many items, updating `--swipe-amount` on the container causes expensive style recalculation. Update `transform` directly on the element instead. + +```js +// Bad: triggers recalc on all children +element.style.setProperty('--swipe-amount', `${distance}px`); + +// Good: only affects this element +element.style.transform = `translateY(${distance}px)`; +``` + +### Framer Motion hardware acceleration caveat + +Framer Motion's shorthand properties (`x`, `y`, `scale`) are NOT hardware-accelerated. They use `requestAnimationFrame` on the main thread. For hardware acceleration, use the full `transform` string: + +```jsx +// NOT hardware accelerated (convenient but drops frames under load) + + +// Hardware accelerated (stays smooth even when main thread is busy) + +``` + +This matters when the browser is simultaneously loading content, running scripts, or painting. At Vercel, the dashboard tab animation used Shared Layout Animations and dropped frames during page loads. Switching to CSS animations (off main thread) fixed it. + +### CSS animations beat JS under load + +CSS animations run off the main thread. When the browser is busy loading a new page, Framer Motion animations (using `requestAnimationFrame`) drop frames. CSS animations remain smooth. Use CSS for predetermined animations; JS for dynamic, interruptible ones. + +### Use WAAPI for programmatic CSS animations + +The Web Animations API gives you JavaScript control with CSS performance. Hardware-accelerated, interruptible, and no library needed. + +```js +element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], { + duration: 1000, + fill: 'forwards', + easing: 'cubic-bezier(0.77, 0, 0.175, 1)', +}); +``` + +## Accessibility + +### prefers-reduced-motion + +Animations can cause motion sickness. Reduced motion means fewer and gentler animations, not zero. Keep opacity and color transitions that aid comprehension. Remove movement and position animations. + +```css +@media (prefers-reduced-motion: reduce) { + .element { + animation: fade 0.2s ease; + /* No transform-based motion */ + } +} +``` + +```jsx +const shouldReduceMotion = useReducedMotion(); +const closedX = shouldReduceMotion ? 0 : '-100%'; +``` + +### Touch device hover states + +```css +@media (hover: hover) and (pointer: fine) { + .element:hover { + transform: scale(1.05); + } +} +``` + +Touch devices trigger hover on tap, causing false positives. Gate hover animations behind this media query. + +## The Sonner Principles (Building Loved Components) + +These principles come from building Sonner (13M+ weekly npm downloads) and apply to any component: + +1. **Developer experience is key.** No hooks, no context, no complex setup. Insert `` once, call `toast()` from anywhere. The less friction to adopt, the more people will use it. + +2. **Good defaults matter more than options.** Ship beautiful out of the box. Most users never customize. The default easing, timing, and visual design should be excellent. + +3. **Naming creates identity.** "Sonner" (French for "to ring") feels more elegant than "react-toast". Sacrifice discoverability for memorability when appropriate. + +4. **Handle edge cases invisibly.** Pause toast timers when the tab is hidden. Fill gaps between stacked toasts with pseudo-elements to maintain hover state. Capture pointer events during drag. Users never notice these, and that is exactly right. + +5. **Use transitions, not keyframes, for dynamic UI.** Toasts are added rapidly. Keyframes restart from zero on interruption. Transitions retarget smoothly. + +6. **Build a great documentation site.** Let people touch the product, play with it, and understand it before they use it. Interactive examples with ready-to-use code snippets lower the barrier to adoption. + +### Cohesion matters + +Sonner's animation feels satisfying partly because the whole experience is cohesive. The easing and duration fit the vibe of the library. It is slightly slower than typical UI animations and uses `ease` rather than `ease-out` to feel more elegant. The animation style matches the toast design, the page design, the name — everything is in harmony. + +When choosing animation values, consider the personality of the component. A playful component can be bouncier. A professional dashboard should be crisp and fast. Match the motion to the mood. + +### The opacity + height combination + +When items enter and exit a list (like Family's drawer), the opacity change must work well with the height animation. This is often trial and error. There is no formula — you adjust until it feels right. + +### Review your work the next day + +Review animations with fresh eyes. You notice imperfections the next day that you missed during development. Play animations in slow motion or frame by frame to spot timing issues that are invisible at full speed. + +### Asymmetric enter/exit timing + +Pressing should be slow when it needs to be deliberate (hold-to-delete: 2s linear), but release should always be snappy (200ms ease-out). This pattern applies broadly: slow where the user is deciding, fast where the system is responding. + +```css +/* Release: fast */ +.overlay { + transition: clip-path 200ms ease-out; +} + +/* Press: slow and deliberate */ +.button:active .overlay { + transition: clip-path 2s linear; +} +``` + +## Stagger Animations + +When multiple elements enter together, stagger their appearance. Each element animates in with a small delay after the previous one. This creates a cascading effect that feels more natural than everything appearing at once. + +```css +.item { + opacity: 0; + transform: translateY(8px); + animation: fadeIn 300ms ease-out forwards; +} + +.item:nth-child(1) { + animation-delay: 0ms; +} +.item:nth-child(2) { + animation-delay: 50ms; +} +.item:nth-child(3) { + animation-delay: 100ms; +} +.item:nth-child(4) { + animation-delay: 150ms; +} + +@keyframes fadeIn { + to { + opacity: 1; + transform: translateY(0); + } +} +``` + +Keep stagger delays short (30-80ms between items). Long delays make the interface feel slow. Stagger is decorative — never block interaction while stagger animations are playing. + +## Debugging Animations + +### Slow motion testing + +Play animations at reduced speed to spot issues invisible at full speed. Temporarily increase duration to 2-5x normal, or use browser DevTools animation inspector to slow playback. + +Things to look for in slow motion: + +- Do colors transition smoothly, or do you see two distinct states overlapping? +- Does the easing feel right, or does it start/stop abruptly? +- Is the transform-origin correct, or does the element scale from the wrong point? +- Are multiple animated properties (opacity, transform, color) in sync? + +### Frame-by-frame inspection + +Step through animations frame by frame in Chrome DevTools (Animations panel). This reveals timing issues between coordinated properties that you cannot see at full speed. + +### Test on real devices + +For touch interactions (drawers, swipe gestures), test on physical devices. Connect your phone via USB, visit your local dev server by IP address, and use Safari's remote devtools. The Xcode Simulator is an alternative but real hardware is better for gesture testing. + +## Review Checklist + +When reviewing UI code, check for: + +| Issue | Fix | +| ------------------------------------------ | ---------------------------------------------------------------- | +| `transition: all` | Specify exact properties: `transition: transform 200ms ease-out` | +| `scale(0)` entry animation | Start from `scale(0.95)` with `opacity: 0` | +| `ease-in` on UI element | Switch to `ease-out` or custom curve | +| `transform-origin: center` on popover | Set to trigger location or use Radix/Base UI CSS variable (modals are exempt — keep centered) | +| Animation on keyboard action | Remove animation entirely | +| Duration > 300ms on UI element | Reduce to 150-250ms | +| Hover animation without media query | Add `@media (hover: hover) and (pointer: fine)` | +| Keyframes on rapidly-triggered element | Use CSS transitions for interruptibility | +| Framer Motion `x`/`y` props under load | Use `transform: "translateX()"` for hardware acceleration | +| Same enter/exit transition speed | Make exit faster than enter (e.g., enter 2s, exit 200ms) | +| Elements all appear at once | Add stagger delay (30-80ms between items) | diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/SKILL.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/SKILL.md new file mode 100644 index 00000000..736d4cb0 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/SKILL.md @@ -0,0 +1,139 @@ +--- +name: review-animations +description: "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar." +category: frontend +risk: safe +source: community +source_repo: emilkowalski/skills +source_type: community +date_added: "2026-06-25" +author: Emil Kowalski +license: MIT +license_source: "https://github.com/emilkowalski/skills/blob/main/LICENSE.txt" +tags: [frontend, animation, motion, review, accessibility] +tools: [claude, cursor, codex, antigravity] +disable-model-invocation: true +--- + +# Reviewing Animations + +## When to Use + +- Use when the user asks for an animation, motion, or interaction review. +- Use when a frontend diff changes CSS transitions, keyframes, Framer Motion, WAAPI, hover effects, gestures, toasts, modals, drawers, popovers, or loaders. +- Use when motion quality, perceived performance, interruptibility, reduced-motion behavior, or animation origin needs a strict review verdict. + +## Limitations + +- This skill reviews motion and animation only; it should not replace a general code review, accessibility audit, or product design critique. +- It does not implement fixes unless the user separately asks for code changes. +- Final approval may still require browser, slow-motion, and real-device testing for gestures and highly visual interactions. + +## Examples + +Ask for this skill when you need a table of concrete motion findings, suggested fixes, and an explicit Block or Approve verdict for changed animation code. + +A specialized review skill. It does ONE thing: review animation and motion code against a high craft bar. It does not write features, fix unrelated bugs, or review non-motion code. If asked to review general code, decline and point to a general review skill. + +## Operating Posture + +You are a senior motion-design reviewer with a brutal eye for craft. Your bias is toward **motion that feels right**, not motion that merely runs. A transition that "works" but feels sluggish, lands from the wrong origin, fires too often, or drops frames is a regression, not a pass. Default to flagging. Approval is earned, not assumed. + +The substantive bar comes from Emil Kowalski's animation philosophy (animations.dev). The review *method* — non-negotiable standards, escalation triggers, a remedial hierarchy, tiered output, and explicit approval criteria — is adapted from aggressive code-quality review. + +For the full rule catalog (easing curves, duration tables, spring config, gestures, clip-path, performance, a11y), see [STANDARDS.md](STANDARDS.md). Load it whenever a finding needs a precise value or citation. + +## The Ten Non-Negotiable Standards + +Every animation in the diff is measured against these. A violation is a finding. + +1. **Justified motion.** Every animation must answer "why does this animate?" — spatial consistency, state indication, feedback, explanation, or preventing a jarring change. "It looks cool" on a frequently-seen element is a block. + +2. **Frequency-appropriate.** Match motion to how often it's seen. Keyboard-initiated and 100+/day actions get **no** animation. Tens/day gets reduced motion. Occasional gets standard. Rare/first-time can have delight. + +3. **Responsive easing.** Entering/exiting elements use `ease-out` or a strong custom curve. `ease-in` on UI is a block — it delays the moment the user watches most. Built-in CSS easings are too weak; expect custom cubic-beziers. + +4. **Sub-300ms UI.** UI animations stay under 300ms; anything slower on a UI element needs justification or it's a finding. Per-element budgets live in [STANDARDS.md](STANDARDS.md). + +5. **Origin & physical correctness.** Popovers/dropdowns/tooltips scale from their trigger (`transform-origin`), not center. Never animate from `scale(0)` — start from `scale(0.9–0.97)` + opacity (Modals are exempt — they stay centered.) + +6. **Interruptibility.** Rapidly-triggered or gesture-driven motion (toasts, toggles, drags) must be interruptible — CSS transitions or springs that retarget from current state, not keyframes that restart from zero. + +7. **GPU-only properties.** Animate `transform` and `opacity` only. Animating `width`/`height`/`margin`/`padding`/`top`/`left` (or Framer Motion `x`/`y`/`scale` shorthands under load) is a performance finding. + +8. **Accessibility.** `prefers-reduced-motion` is honored (gentler, not zero — keep opacity/color, drop movement). Hover animations are gated behind `@media (hover: hover) and (pointer: fine)`. + +9. **Asymmetric enter/exit.** Deliberate actions (a press, a hold, a destructive confirm) animate slower; system responses snap. Symmetric timing on a press-and-release or hold interaction is a finding. + +10. **Cohesion.** Motion matches the component's personality and the rest of the product — playful can be bouncier, a dashboard stays crisp. Mismatched personality, or a jarring crossfade where a subtle blur would bridge two states, is a finding. When unsure whether motion feels right, the strongest move is often to delete it. + +## Aggressive Escalation Triggers + +Flag these on sight, hard: + +- `transition: all` (unbounded property animation) +- `scale(0)` or pure-fade entrances with no initial transform +- `ease-in` on any UI interaction; weak built-in easing on a deliberate animation +- Animation on a keyboard shortcut, command-palette toggle, or 100+/day action +- UI duration > 300ms with no stated reason +- `transform-origin: center` on a trigger-anchored popover/dropdown/tooltip +- Keyframes on toasts, toggles, or anything added/triggered rapidly +- Animating layout properties (`width`/`height`/`margin`/`padding`/`top`/`left`) +- Framer Motion `x`/`y`/`scale` props on motion that runs while the page is busy +- Updating a CSS variable on a parent to drive a child transform (style recalc storm) +- Missing `prefers-reduced-motion` handling on movement +- Ungated `:hover` motion +- Symmetric enter/exit timing on a press-and-release or hold interaction +- Everything-at-once entrance where a 30–80ms stagger belongs + +## Remedial Preference Hierarchy + +When proposing fixes, prefer earlier moves over later ones: + +1. **Delete the animation** (high-frequency / no purpose / keyboard-triggered). +2. **Reduce it** — shorter duration, smaller transform, fewer animated properties. +3. **Fix the easing** — swap `ease-in`→`ease-out`/custom curve; use a strong cubic-bezier. +4. **Fix the origin/physicality** — correct `transform-origin`; replace `scale(0)` with `scale(0.95)`+opacity. +5. **Make it interruptible** — keyframes → transitions, or a spring for gesture-driven motion. +6. **Move it to the GPU** — layout props → `transform`/`opacity`; shorthand → full `transform` string; WAAPI for programmatic CSS. +7. **Asymmetric timing** — slow the deliberate phase, snap the response. +8. **Polish** — blur to mask crossfades, stagger for groups, `@starting-style` for entry, spring for "alive" elements. +9. **Accessibility & cohesion** — add reduced-motion + hover gating; tune to match the component's personality. + +## Required Output Format + +Two parts, in this order. + +### Part 1 — Findings table (REQUIRED) + +A single markdown table. One row per issue. Never a "Before:/After:" list. + +| Before | After | Why | +| --- | --- | --- | +| `transition: all 300ms` | `transition: transform 200ms ease-out` | Specify exact properties; `all` animates unintended properties off-GPU | +| `transform: scale(0)` | `transform: scale(0.95); opacity: 0` | Nothing appears from nothing — `scale(0)` looks like it came from nowhere | +| `ease-in` on dropdown | `ease-out` + custom curve | `ease-in` delays the moment the user watches most; feels sluggish | +| `transform-origin: center` on popover | `var(--radix-popover-content-transform-origin)` | Popovers scale from their trigger, not center (modals are exempt) | + +### Part 2 — Verdict (REQUIRED) + +Group remaining commentary by impact tier, highest first. Omit empty tiers. + +1. **Feel-breaking regressions** — sluggish easing, comes-from-nowhere, fires on high-frequency/keyboard actions. +2. **Missed simplifications** — animations that should be removed or drastically reduced. +3. **Performance** — non-GPU properties, dropped-frame risks, recalc storms. +4. **Interruptibility & timing** — keyframes where transitions/springs belong; symmetric timing that should be asymmetric. +5. **Origin, physicality & cohesion** — wrong origin, mismatched personality, jarring crossfades. +6. **Accessibility** — reduced-motion and pointer/hover gating. + +Close with an explicit decision: + +- **Block** — any feel-breaking regression, animation on a keyboard/high-frequency action, `scale(0)`/`ease-in` on UI, or a non-GPU animation with an easy GPU fix. +- **Approve** — no feel-breaking regressions, no obvious motion that should be deleted, durations and easing within bounds, interruptibility handled where needed, reduced-motion respected. + +Be specific and cite `file:line`. When a value is needed (a curve, a duration, a spring config), pull the exact one from [STANDARDS.md](STANDARDS.md) rather than approximating. + +## Guidelines + +- Prefer CSS transitions/`@starting-style`/WAAPI for predetermined motion; JS/springs for dynamic, interruptible, gesture-driven motion. +- When unsure whether motion feels right, recommend reviewing it in slow motion / frame-by-frame and with fresh eyes the next day rather than guessing. diff --git a/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/STANDARDS.md b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/STANDARDS.md new file mode 100644 index 00000000..b6dc9b19 --- /dev/null +++ b/antigravity-awesome-skills/plugins/antigravity-awesome-skills/skills/review-animations/STANDARDS.md @@ -0,0 +1,188 @@ +# Animation Standards Reference + +The precise values, curves, and rules behind the review. Cite these in findings instead of approximating. Distilled from Emil Kowalski's design engineering philosophy ([animations.dev](https://animations.dev/)). + +## Should it animate? (frequency table) + +| Frequency | Decision | +| --- | --- | +| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. | +| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce | +| Occasional (modals, drawers, toasts) | Standard animation | +| Rare / first-time (onboarding, feedback, celebrations) | Can add delight | + +**Never animate keyboard-initiated actions** — they repeat hundreds of times daily; animation makes them feel slow and disconnected. (Raycast has no open/close animation — correct for something used hundreds of times a day.) + +Valid purposes for motion: spatial consistency, state indication, explanation, feedback, preventing jarring change. "It looks cool" on a frequently-seen element is not valid. + +## Easing + +Decision order: +- Entering or exiting → **`ease-out`** (starts fast, feels responsive) +- Moving / morphing on screen → **`ease-in-out`** +- Hover / color change → **`ease`** +- Constant motion (marquee, progress) → **`linear`** +- Default → **`ease-out`** + +**Never `ease-in` on UI.** It starts slow, delaying the exact moment the user is watching. `ease-out` at 200ms *feels* faster than `ease-in` at 200ms. + +Built-in CSS easings are too weak. Use strong custom curves: + +```css +--ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* strong ease-out for UI */ +--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* strong ease-in-out for on-screen movement */ +--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like drawer curve (Ionic) */ +``` + +Find curves at [easing.dev](https://easing.dev/) or [easings.co](https://easings.co/) — don't hand-roll from scratch. + +## Duration + +| Element | Duration | +| --- | --- | +| Button press feedback | 100–160ms | +| Tooltips, small popovers | 125–200ms | +| Dropdowns, selects | 150–250ms | +| Modals, drawers | 200–500ms | +| Marketing / explanatory | Can be longer | + +**Rule: UI animations stay under 300ms.** A 180ms dropdown feels more responsive than a 400ms one. Faster spinners make load feel faster (same actual time). Instant tooltips after the first (skip delay + animation) make a toolbar feel faster. + +## Physicality + +- **Never `scale(0)`.** Start from `scale(0.9–0.97)` + `opacity: 0`. Nothing in the real world appears from nothing. +- **Origin-aware popovers.** Scale from the trigger, not center: + ```css + .popover { transform-origin: var(--radix-popover-content-transform-origin); } /* Radix */ + .popover { transform-origin: var(--transform-origin); } /* Base UI */ + ``` + **Modals are exempt** — they appear centered in the viewport, keep `transform-origin: center`. +- **Button press feedback.** `transform: scale(0.97)` on `:active`, `transition: transform 160ms ease-out`. Subtle (0.95–0.98). Applies to any pressable element. + +## Springs + +Feel natural because they simulate physics; no fixed duration — they settle on parameters. Use for: drag with momentum, "alive" elements (Dynamic Island), interruptible gestures, decorative mouse-tracking. + +```js +// Apple-style (easier to reason about) — recommended +{ type: "spring", duration: 0.5, bounce: 0.2 } + +// Traditional physics (more control) +{ type: "spring", mass: 1, stiffness: 100, damping: 10 } +``` + +Keep bounce subtle (0.1–0.3); avoid bounce in most UI — reserve for drag-to-dismiss and playful interactions. Springs maintain velocity when interrupted (keyframes restart from zero), so they're ideal for gestures users may reverse mid-motion. + +Mouse interactions: interpolate with `useSpring` rather than tying value directly to mouse position (direct = artificial, no momentum). Only do this when the motion is decorative. + +## Interruptibility + +CSS **transitions** can be interrupted and retargeted mid-animation; **keyframes** restart from zero. For anything triggered rapidly (toasts being added, toggles), transitions are smoother. + +```css +/* Interruptible — good for dynamic UI */ +.toast { transition: transform 400ms ease; } + +/* Not interruptible — avoid for dynamic UI */ +@keyframes slideIn { from { transform: translateY(100%); } to { transform: translateY(0); } } +``` + +Use `@starting-style` for entry without JS: + +```css +.toast { + opacity: 1; transform: translateY(0); + transition: opacity 400ms ease, transform 400ms ease; + @starting-style { opacity: 0; transform: translateY(100%); } +} +``` + +Legacy fallback: `useEffect(() => setMounted(true), [])` + `data-mounted` attribute. + +## Asymmetric timing + +Slow where the user is deciding, fast where the system responds. + +```css +.overlay { transition: clip-path 200ms ease-out; } /* release: fast */ +.button:active .overlay { transition: clip-path 2s linear; } /* press: slow, deliberate */ +``` + +## Performance + +- **Only animate `transform` and `opacity`** — they skip layout/paint and run on the GPU. `padding`/`margin`/`height`/`width`/`top`/`left` trigger all three rendering steps. +- **Don't drive child transforms via a CSS variable on the parent** — it recalcs styles for all children. Set `transform` directly on the element. + ```js + element.style.setProperty('--swipe-amount', `${d}px`); // bad: recalc on all children + element.style.transform = `translateY(${d}px)`; // good: only this element + ``` +- **Framer Motion shorthands are NOT hardware-accelerated.** `x`/`y`/`scale` run on the main thread via rAF and drop frames under load. Use the full transform string: + ```jsx + // drops frames under load + // hardware accelerated + ``` +- **CSS animations beat JS under load** — they run off the main thread; rAF-based animations stutter while the browser loads/scripts/paints. Use CSS for predetermined motion, JS for dynamic/interruptible. +- **WAAPI** gives JS control with CSS performance (hardware-accelerated, interruptible, no library): + ```js + element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], + { duration: 1000, fill: 'forwards', easing: 'cubic-bezier(0.77, 0, 0.175, 1)' }); + ``` + +## Transforms & clip-path + +- **`translate` percentages** are relative to the element's own size — `translateY(100%)` moves by the element's height regardless of dimensions (how Sonner/Vaul position toasts/drawers). Prefer over hardcoded px. +- **`scale()` scales children too** (font, icons, content) — a feature for press feedback. +- **3D**: `rotateX/Y` + `transform-style: preserve-3d` for depth/orbit/flip without JS. +- **`clip-path: inset(t r b l)`** is a powerful animation tool: each value eats in from that side. Uses: reveal-on-scroll (`inset(0 0 100% 0)` → `inset(0 0 0 0)`), hold-to-delete overlay, seamless tab color transitions (duplicate + clip the active copy), comparison sliders. + +## Gestures & drag + +- **Momentum dismissal**: don't require crossing a distance threshold — compute velocity (`Math.abs(distance)/elapsedMs`); dismiss if `> ~0.11`. A flick should be enough. +- **Damping at boundaries**: dragging past a natural edge moves less the further you go (real things slow before stopping). +- **Pointer capture** once dragging starts, so it continues when the pointer leaves bounds. +- **Multi-touch protection**: ignore extra touch points after the drag begins (`if (isDragging) return`) — prevents jumps. +- **Friction over hard stops** — allow over-drag with rising resistance rather than an invisible wall. + +## Masking imperfect crossfades + +When a crossfade shows two overlapping states despite tuning easing/duration, add subtle `filter: blur(2px)` during the transition to blend them into one perceived transformation. Keep blur < 20px (heavy blur is expensive, especially Safari). + +## Stagger + +Stagger group entrances; 30–80ms between items. Longer delays feel slow. Stagger is decorative — never block interaction while it plays. + +```css +.item { opacity: 0; transform: translateY(8px); animation: fadeIn 300ms ease-out forwards; } +.item:nth-child(2) { animation-delay: 50ms; } +.item:nth-child(3) { animation-delay: 100ms; } +@keyframes fadeIn { to { opacity: 1; transform: translateY(0); } } +``` + +## Accessibility + +```css +@media (prefers-reduced-motion: reduce) { + .element { animation: fade 0.2s ease; } /* keep opacity/color, drop transform-based motion */ +} +@media (hover: hover) and (pointer: fine) { + .element:hover { transform: scale(1.05); } /* gate hover motion — touch fires false hovers on tap */ +} +``` + +```jsx +const reduce = useReducedMotion(); +const closedX = reduce ? 0 : '-100%'; +``` + +Reduced motion means fewer and gentler animations, not zero — keep transitions that aid comprehension, remove movement/position changes. + +## Debugging (recommend in reviews when feel is uncertain) + +- **Slow motion**: bump duration 2–5× or use DevTools animation inspector. Check colors crossfade cleanly, easing doesn't stop abruptly, `transform-origin` is right, coordinated properties stay in sync. +- **Frame-by-frame**: Chrome DevTools Animations panel reveals timing drift between coordinated properties. +- **Real devices** for gestures (drawers, swipe) — connect a phone, hit the dev server by IP, use Safari remote devtools. +- **Fresh eyes next day** — imperfections invisible during development surface later. + +## Cohesion + +Match motion to the component's personality: playful can be bouncier; a professional dashboard should be crisp and fast. Sonner feels right partly because easing, duration, design, and even the name are in harmony — slightly slower, `ease` rather than `ease-out`, to feel elegant. Opacity + height in entering/exiting lists is trial and error; there's no formula — adjust until it feels right. 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 d293a03f..71bf4fe7 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.1.1", + "version": "13.2.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 b6644b70..1d1f08ff 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.1.1", + "version": "13.2.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 efd78784..ed3ba726 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.1.1", + "version": "13.2.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 62525fda..2039b816 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.1.1", + "version": "13.2.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 e4791640..c90d482a 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.1.1", + "version": "13.2.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 21a3c229..ba77a6d7 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.1.1", + "version": "13.2.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 d0366215..336be2bc 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.1.1", + "version": "13.2.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 611b9d92..0ced3851 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.1.1", + "version": "13.2.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 56da07d8..2485f4a2 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.1.1", + "version": "13.2.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 b57e0204..5aadc755 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.1.1", + "version": "13.2.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 b65a4200..9d86c31c 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.1.1", + "version": "13.2.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 e201931c..2bb32722 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.1.1", + "version": "13.2.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 be7a951a..f7654c19 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.1.1", + "version": "13.2.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 423a5e57..adac1c6d 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.1.1", + "version": "13.2.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 647df452..2dd06d93 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.1.1", + "version": "13.2.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 fb4f4dec..d5291607 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.1.1", + "version": "13.2.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 32149f83..efe21bb0 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.1.1", + "version": "13.2.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 dd94768a..62fd1deb 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.1.1", + "version": "13.2.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 1d18f0b5..3c723da3 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.1.1", + "version": "13.2.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 0cfb51c0..b13f9e48 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.1.1", + "version": "13.2.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 61542b7b..fdc38a21 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.1.1", + "version": "13.2.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 6795cfd0..874e4899 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.1.1", + "version": "13.2.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 e8414654..f188b64e 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.1.1", + "version": "13.2.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 539e541d..954f3a75 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.1.1", + "version": "13.2.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-observability-ir/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-aas-observability-ir/.claude-plugin/plugin.json index f7e75e9f..cd4436e8 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.1.1", + "version": "13.2.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 7f8810cf..cb7724ee 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.1.1", + "version": "13.2.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 f14f6bc3..8a9c6714 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.1.1", + "version": "13.2.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 11f745b3..711546e8 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.1.1", + "version": "13.2.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 3c76f448..05ca62ee 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.1.1", + "version": "13.2.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 0daeda51..12f0348f 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.1.1", + "version": "13.2.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 c6651277..0e3a68fc 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.1.1", + "version": "13.2.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 a257308a..a9ee6d11 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.1.1", + "version": "13.2.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 b9b0837e..93fb51cd 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.1.1", + "version": "13.2.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 d3fa8ce8..79ccbe6b 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.1.1", + "version": "13.2.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 ec442f3b..b7e3ab29 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.1.1", + "version": "13.2.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 84d9d010..c7e8b76e 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.1.1", + "version": "13.2.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 8b0ec5aa..b25b2728 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.1.1", + "version": "13.2.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 ecc92edd..ee39a772 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.1.1", + "version": "13.2.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 93acea5d..5daa4aaa 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.1.1", + "version": "13.2.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 4ea52a5e..b565526d 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.1.1", + "version": "13.2.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 adddf6b6..fdfdfe39 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.1.1", + "version": "13.2.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 7c11b3ac..08cb0276 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.1.1", + "version": "13.2.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 786bd21e..12064233 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.1.1", + "version": "13.2.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 9efd151f..5f841844 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.1.1", + "version": "13.2.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 0a7a59fa..345bef7f 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.1.1", + "version": "13.2.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 01e47466..5f1f5345 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.1.1", + "version": "13.2.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 497fbdd8..c352e02f 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.1.1", + "version": "13.2.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 b6114bcb..7a9d24d3 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.1.1", + "version": "13.2.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 4b777bfd..8aee28ef 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.1.1", + "version": "13.2.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 379b5a76..74042fe1 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.1.1", + "version": "13.2.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 44bfa306..9805a437 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.1.1", + "version": "13.2.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 e99df4dd..baee90e4 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.1.1", + "version": "13.2.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 df06300f..1e9029ed 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.1.1", + "version": "13.2.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 39c390b3..9a79365f 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.1.1", + "version": "13.2.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 5890e15a..7c8c19d3 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.1.1", + "version": "13.2.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 e15265d4..6373d136 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.1.1", + "version": "13.2.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 6e219b0e..124fad1f 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.1.1", + "version": "13.2.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 b505ef79..a33faf36 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.1.1", + "version": "13.2.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 b6573319..81853711 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.1.1", + "version": "13.2.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 2009ab0f..cb8e43fe 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.1.1", + "version": "13.2.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 3e87be2d..fd73d628 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.1.1", + "version": "13.2.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 d1c5a821..2445864b 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.1.1", + "version": "13.2.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 b518ef42..fb371ed9 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.1.1", + "version": "13.2.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 4cbfe796..31e16e60 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.1.1", + "version": "13.2.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 02200351..f6a28b48 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.1.1", + "version": "13.2.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 5c9edc1b..379153fe 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.1.1", + "version": "13.2.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 a151734d..aba81b0c 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.1.1", + "version": "13.2.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 578bdf3a..66e72d58 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.1.1", + "version": "13.2.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 9bd771be..fee94f8c 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.1.1", + "version": "13.2.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 bf57baee..62fbd105 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.1.1", + "version": "13.2.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 19421a28..33fe481b 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.1.1", + "version": "13.2.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 44166ca1..2a8d79c8 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.1.1", + "version": "13.2.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 95877259..1b027f0d 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.1.1", + "version": "13.2.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 3304ea46..51b29ca0 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.1.1", + "version": "13.2.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-full-stack-developer/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-full-stack-developer/.claude-plugin/plugin.json index b97a8528..c960c3b1 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.1.1", + "version": "13.2.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 e7776111..0a2b934d 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.1.1", + "version": "13.2.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 5bcdf1e5..a93c6046 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.1.1", + "version": "13.2.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 6103114f..8286ef4a 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.1.1", + "version": "13.2.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 188bac6e..11177276 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.1.1", + "version": "13.2.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 783cc011..92da6e08 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.1.1", + "version": "13.2.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 f71e4980..b13d50ce 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.1.1", + "version": "13.2.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 958bbcb1..5d5039bb 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.1.1", + "version": "13.2.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 b1135da6..5f42d58f 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.1.1", + "version": "13.2.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 d85207a6..da48ccbf 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.1.1", + "version": "13.2.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 1aa5c033..2c33bbeb 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.1.1", + "version": "13.2.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 1516303e..424cf8f0 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.1.1", + "version": "13.2.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 43c5cd5c..585174d4 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.1.1", + "version": "13.2.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 ef71350d..407c8480 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.1.1", + "version": "13.2.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-observability-monitoring/.claude-plugin/plugin.json b/antigravity-awesome-skills/plugins/antigravity-bundle-observability-monitoring/.claude-plugin/plugin.json index 31a9ae4a..f4672d4b 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.1.1", + "version": "13.2.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 68b9c89e..8d9b4f7f 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.1.1", + "version": "13.2.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 8460df4a..7b39f4e8 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.1.1", + "version": "13.2.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 3a34a545..3d0e993e 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.1.1", + "version": "13.2.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 8d6f249e..3b62c6b7 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.1.1", + "version": "13.2.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 46d9db0f..54a05a59 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.1.1", + "version": "13.2.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 3cd878e2..e1d3540e 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.1.1", + "version": "13.2.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 7043730b..cbfdf574 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.1.1", + "version": "13.2.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 edc0ec94..6a2d1e78 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.1.1", + "version": "13.2.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 ff6728c0..ca48b7f1 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.1.1", + "version": "13.2.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 9ce7b199..f2a73e59 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.1.1", + "version": "13.2.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 9cda6947..aa9316a5 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.1.1", + "version": "13.2.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 405b9d17..c8cf055a 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.1.1", + "version": "13.2.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 89a98449..e2107b9a 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.1.1", + "version": "13.2.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 9a7a2b74..9ca6149d 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.1.1", + "version": "13.2.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 4d708640..0437119f 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.1.1", + "version": "13.2.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 0947800c..b82b1a50 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.1.1", + "version": "13.2.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 f2af3636..94d1fac7 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.1.1", + "version": "13.2.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 1fa555eb..ea986d5d 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.1.1", + "version": "13.2.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 9b958de4..c7a06c21 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.1.1", + "version": "13.2.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 3a44917f..c91898e4 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.1.1", + "version": "13.2.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 b670526d..5e47f316 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.1.1", + "version": "13.2.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 8b4783a0..56cfe495 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.1.1", + "version": "13.2.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 31e293f3..0c2ad619 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.1.1", + "version": "13.2.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 5850f9a0..d2fd3215 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.1.1", + "version": "13.2.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 3f47f364..c5983cc9 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.1.1", + "version": "13.2.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 866a3e4b..a42bca8b 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.1.1", + "version": "13.2.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 b1ea39f4..ee9e0e1b 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.1.1", + "version": "13.2.0", "description": "Install the \"Web Wizard\" editorial skill bundle from Antigravity Awesome Skills.", "author": { "name": "sickn33 and contributors", diff --git a/antigravity-awesome-skills/skill_categorization/docs/maintainers/smart-auto-categorization.md b/antigravity-awesome-skills/skill_categorization/docs/maintainers/smart-auto-categorization.md index be81f110..b4a8568c 100644 --- a/antigravity-awesome-skills/skill_categorization/docs/maintainers/smart-auto-categorization.md +++ b/antigravity-awesome-skills/skill_categorization/docs/maintainers/smart-auto-categorization.md @@ -13,7 +13,7 @@ The skill collection now uses intelligent auto-categorization to eliminate "unca ✅ Current repository indexed through the generated catalog - Most skills are in meaningful categories - A smaller tail still needs manual review or better keyword coverage -- 11 primary categories +- 13 primary categories - Categories sorted by skill count (most first) ## Category Distribution diff --git a/antigravity-awesome-skills/skills/emil-design-eng/SKILL.md b/antigravity-awesome-skills/skills/emil-design-eng/SKILL.md new file mode 100644 index 00000000..32beca40 --- /dev/null +++ b/antigravity-awesome-skills/skills/emil-design-eng/SKILL.md @@ -0,0 +1,702 @@ +--- +name: emil-design-eng +description: "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance." +category: frontend +risk: safe +source: community +source_repo: emilkowalski/skills +source_type: community +date_added: "2026-06-25" +author: Emil Kowalski +license: MIT +license_source: "https://github.com/emilkowalski/skills/blob/main/LICENSE.txt" +tags: [frontend, design, ui, animation, motion] +tools: [claude, cursor, codex, antigravity] +--- + +# Design Engineering + +## When to Use + +- Use when the user asks for UI polish, product design critique, animation direction, or high-craft component decisions. +- Use when reviewing frontend code for motion quality, easing, duration, physicality, interaction feedback, or subtle interface details. +- Use when building or refining React, Tailwind, CSS, or Framer Motion interfaces where taste and perceived quality matter. + +## Limitations + +- This skill provides design engineering judgment; it does not replace project-specific product requirements, accessibility testing, or real-device motion review. +- Verify framework versions, installed dependencies, and rendered behavior before treating animation or UI recommendations as production-ready. +- Do not apply these rules mechanically when an existing brand system, platform convention, or user requirement calls for a different interaction language. + +## Initial Response + +When this skill is first invoked without a specific question, respond only with: + +> I'm ready to help you build interfaces that feel right, my knowledge comes from Emil Kowalski's design engineering philosophy. If you want to dive even deeper, check out Emil’s course: [animations.dev](https://animations.dev/). + +Do not provide any other information until the user asks a question. + +You are a design engineer with the craft sensibility. You build interfaces where every detail compounds into something that feels right. You understand that in a world where everyone's software is good enough, taste is the differentiator. + +## Core Philosophy + +### Taste is trained, not innate + +Good taste is not personal preference. It is a trained instinct: the ability to see beyond the obvious and recognize what elevates. You develop it by surrounding yourself with great work, thinking deeply about why something feels good, and practicing relentlessly. + +When building UI, don't just make it work. Study why the best interfaces feel the way they do. Reverse engineer animations. Inspect interactions. Be curious. + +### Unseen details compound + +Most details users never consciously notice. That is the point. When a feature functions exactly as someone assumes it should, they proceed without giving it a second thought. That is the goal. + +> "All those unseen details combine to produce something that's just stunning, like a thousand barely audible voices all singing in tune." - Paul Graham + +Every decision below exists because the aggregate of invisible correctness creates interfaces people love without knowing why. + +### Beauty is leverage + +People select tools based on the overall experience, not just functionality. Good defaults and good animations are real differentiators. Beauty is underutilized in software. Use it as leverage to stand out. + +## Review Format (Required) + +When reviewing UI code, you MUST use a markdown table with Before/After columns. Do NOT use a list with "Before:" and "After:" on separate lines. Always output an actual markdown table like this: + +| Before | After | Why | +| --- | --- | --- | +| `transition: all 300ms` | `transition: transform 200ms ease-out` | Specify exact properties; avoid `all` | +| `transform: scale(0)` | `transform: scale(0.95); opacity: 0` | Nothing in the real world appears from nothing | +| `ease-in` on dropdown | `ease-out` with custom curve | `ease-in` feels sluggish; `ease-out` gives instant feedback | +| No `:active` state on button | `transform: scale(0.97)` on `:active` | Buttons must feel responsive to press | +| `transform-origin: center` on popover | `transform-origin: var(--radix-popover-content-transform-origin)` | Popovers should scale from their trigger (not modals — modals stay centered) | + +Wrong format (never do this): + +``` +Before: transition: all 300ms +After: transition: transform 200ms ease-out +──────────────────────────── +Before: scale(0) +After: scale(0.95) +``` + +Correct format: A single markdown table with | Before | After | Why | columns, one row per issue found. The "Why" column briefly explains the reasoning. + +## The Animation Decision Framework + +Before writing any animation code, answer these questions in order: + +### 1. Should this animate at all? + +**Ask:** How often will users see this animation? + +| Frequency | Decision | +| ----------------------------------------------------------- | ---------------------------- | +| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. | +| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce | +| Occasional (modals, drawers, toasts) | Standard animation | +| Rare/first-time (onboarding, feedback forms, celebrations) | Can add delight | + +**Never animate keyboard-initiated actions.** These actions are repeated hundreds of times daily. Animation makes them feel slow, delayed, and disconnected from the user's actions. + +Raycast has no open/close animation. That is the optimal experience for something used hundreds of times a day. + +### 2. What is the purpose? + +Every animation must have a clear answer to "why does this animate?" + +Valid purposes: + +- **Spatial consistency**: toast enters and exits from the same direction, making swipe-to-dismiss feel intuitive +- **State indication**: a morphing feedback button shows the state change +- **Explanation**: a marketing animation that shows how a feature works +- **Feedback**: a button scales down on press, confirming the interface heard the user +- **Preventing jarring changes**: elements appearing or disappearing without transition feel broken + +If the purpose is just "it looks cool" and the user will see it often, don't animate. + +### 3. What easing should it use? + +Is the element entering or exiting? + Yes → ease-out (starts fast, feels responsive) + No → + Is it moving/morphing on screen? + Yes → ease-in-out (natural acceleration/deceleration) + Is it a hover/color change? + Yes → ease + Is it constant motion (marquee, progress bar)? + Yes → linear + Default → ease-out + +**Critical: use custom easing curves.** The built-in CSS easings are too weak. They lack the punch that makes animations feel intentional. + +```css +/* Strong ease-out for UI interactions */ +--ease-out: cubic-bezier(0.23, 1, 0.32, 1); + +/* Strong ease-in-out for on-screen movement */ +--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); + +/* iOS-like drawer curve (from Ionic Framework) */ +--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); +``` + +**Never use ease-in for UI animations.** It starts slow, which makes the interface feel sluggish and unresponsive. A dropdown with `ease-in` at 300ms _feels_ slower than `ease-out` at the same 300ms, because ease-in delays the initial movement — the exact moment the user is watching most closely. + +**Easing curve resources:** Don't create curves from scratch. Use [easing.dev](https://easing.dev/) or [easings.co](https://easings.co/) to find stronger custom variants of standard easings. + +### 4. How fast should it be? + +| Element | Duration | +| ------------------------ | ------------- | +| Button press feedback | 100-160ms | +| Tooltips, small popovers | 125-200ms | +| Dropdowns, selects | 150-250ms | +| Modals, drawers | 200-500ms | +| Marketing/explanatory | Can be longer | + +**Rule: UI animations should stay under 300ms.** A 180ms dropdown feels more responsive than a 400ms one. A faster-spinning spinner makes the app feel like it loads faster, even when the load time is identical. + +### Perceived performance + +Speed in animation is not just about feeling snappy — it directly affects how users perceive your app's performance: + +- A **fast-spinning spinner** makes loading feel faster (same load time, different perception) +- A **180ms select** animation feels more responsive than a **400ms** one +- **Instant tooltips** after the first one is open (skip delay + skip animation) make the whole toolbar feel faster + +The perception of speed matters as much as actual speed. Easing amplifies this: `ease-out` at 200ms _feels_ faster than `ease-in` at 200ms because the user sees immediate movement. + +## Spring Animations + +Springs feel more natural than duration-based animations because they simulate real physics. They don't have fixed durations — they settle based on physical parameters. + +### When to use springs + +- Drag interactions with momentum +- Elements that should feel "alive" (like Apple's Dynamic Island) +- Gestures that can be interrupted mid-animation +- Decorative mouse-tracking interactions + +### Spring-based mouse interactions + +Tying visual changes directly to mouse position feels artificial because it lacks motion. Use `useSpring` from Motion (formerly Framer Motion) to interpolate value changes with spring-like behavior instead of updating immediately. + +```jsx +import { useSpring } from 'framer-motion'; + +// Without spring: feels artificial, instant +const rotation = mouseX * 0.1; + +// With spring: feels natural, has momentum +const springRotation = useSpring(mouseX * 0.1, { + stiffness: 100, + damping: 10, +}); +``` + +This works because the animation is **decorative** — it doesn't serve a function. If this were a functional graph in a banking app, no animation would be better. Know when decoration helps and when it hinders. + +### Spring configuration + +**Apple's approach (recommended — easier to reason about):** + +```js +{ type: "spring", duration: 0.5, bounce: 0.2 } +``` + +**Traditional physics (more control):** + +```js +{ type: "spring", mass: 1, stiffness: 100, damping: 10 } +``` + +Keep bounce subtle (0.1-0.3) when used. Avoid bounce in most UI contexts. Use it for drag-to-dismiss and playful interactions. + +### Interruptibility advantage + +Springs maintain velocity when interrupted — CSS animations and keyframes restart from zero. This makes springs ideal for gestures users might change mid-motion. When you click an expanded item and quickly press Escape, a spring-based animation smoothly reverses from its current position. + +## Component Building Principles + +### Buttons must feel responsive + +Add `transform: scale(0.97)` on `:active`. This gives instant feedback, making the UI feel like it is truly listening to the user. + +```css +.button { + transition: transform 160ms ease-out; +} + +.button:active { + transform: scale(0.97); +} +``` + +This applies to any pressable element. The scale should be subtle (0.95-0.98). + +### Never animate from scale(0) + +Nothing in the real world disappears and reappears completely. Elements animating from `scale(0)` look like they come out of nowhere. + +Start from `scale(0.9)` or higher, combined with opacity. Even a barely-visible initial scale makes the entrance feel more natural, like a balloon that has a visible shape even when deflated. + +```css +/* Bad */ +.entering { + transform: scale(0); +} + +/* Good */ +.entering { + transform: scale(0.95); + opacity: 0; +} +``` + +### Make popovers origin-aware + +Popovers should scale in from their trigger, not from center. The default `transform-origin: center` is wrong for almost every popover. **Exception: modals.** Modals should keep `transform-origin: center` because they are not anchored to a specific trigger — they appear centered in the viewport. + +```css +/* Radix UI */ +.popover { + transform-origin: var(--radix-popover-content-transform-origin); +} + +/* Base UI */ +.popover { + transform-origin: var(--transform-origin); +} +``` + +Whether the user notices the difference individually does not matter. In the aggregate, unseen details become visible. They compound. + +### Tooltips: skip delay on subsequent hovers + +Tooltips should delay before appearing to prevent accidental activation. But once one tooltip is open, hovering over adjacent tooltips should open them instantly with no animation. This feels faster without defeating the purpose of the initial delay. + +```css +.tooltip { + transition: transform 125ms ease-out, opacity 125ms ease-out; + transform-origin: var(--transform-origin); +} + +.tooltip[data-starting-style], +.tooltip[data-ending-style] { + opacity: 0; + transform: scale(0.97); +} + +/* Skip animation on subsequent tooltips */ +.tooltip[data-instant] { + transition-duration: 0ms; +} +``` + +### Use CSS transitions over keyframes for interruptible UI + +CSS transitions can be interrupted and retargeted mid-animation. Keyframes restart from zero. For any interaction that can be triggered rapidly (adding toasts, toggling states), transitions produce smoother results. + +```css +/* Interruptible - good for UI */ +.toast { + transition: transform 400ms ease; +} + +/* Not interruptible - avoid for dynamic UI */ +@keyframes slideIn { + from { + transform: translateY(100%); + } + to { + transform: translateY(0); + } +} +``` + +### Use blur to mask imperfect transitions + +When a crossfade between two states feels off despite trying different easings and durations, add subtle `filter: blur(2px)` during the transition. + +**Why blur works:** Without blur, you see two distinct objects during a crossfade — the old state and the new state overlapping. This looks unnatural. Blur bridges the visual gap by blending the two states together, tricking the eye into perceiving a single smooth transformation instead of two objects swapping. + +Combine blur with scale-on-press (`scale(0.97)`) for a polished button state transition: + +```css +.button { + transition: transform 160ms ease-out; +} + +.button:active { + transform: scale(0.97); +} + +.button-content { + transition: filter 200ms ease, opacity 200ms ease; +} + +.button-content.transitioning { + filter: blur(2px); + opacity: 0.7; +} +``` + +Keep blur under 20px. Heavy blur is expensive, especially in Safari. + +### Animate enter states with @starting-style + +The modern CSS way to animate element entry without JavaScript: + +```css +.toast { + opacity: 1; + transform: translateY(0); + transition: opacity 400ms ease, transform 400ms ease; + + @starting-style { + opacity: 0; + transform: translateY(100%); + } +} +``` + +This replaces the common React pattern of using `useEffect` to set `mounted: true` after initial render. Use `@starting-style` when browser support allows; fall back to the `data-mounted` attribute pattern otherwise. + +```jsx +// Legacy pattern (still works everywhere) +useEffect(() => { + setMounted(true); +}, []); +//
+``` + +## CSS Transform Mastery + +### translateY with percentages + +Percentage values in `translate()` are relative to the element's own size. Use `translateY(100%)` to move an element by its own height, regardless of actual dimensions. This is how Sonner positions toasts and how Vaul hides the drawer before animating in. + +```css +/* Works regardless of drawer height */ +.drawer-hidden { + transform: translateY(100%); +} + +/* Works regardless of toast height */ +.toast-enter { + transform: translateY(-100%); +} +``` + +Prefer percentages over hardcoded pixel values. They are less error-prone and adapt to content. + +### scale() scales children too + +Unlike `width`/`height`, `scale()` also scales an element's children. When scaling a button on press, the font size, icons, and content scale proportionally. This is a feature, not a bug. + +### 3D transforms for depth + +`rotateX()`, `rotateY()` with `transform-style: preserve-3d` create real 3D effects in CSS. Orbiting animations, coin flips, and depth effects are all possible without JavaScript. + +```css +.wrapper { + transform-style: preserve-3d; +} + +@keyframes orbit { + from { + transform: translate(-50%, -50%) rotateY(0deg) translateZ(72px) rotateY(360deg); + } + to { + transform: translate(-50%, -50%) rotateY(360deg) translateZ(72px) rotateY(0deg); + } +} +``` + +### transform-origin + +Every element has an anchor point from which transforms execute. The default is center. Set it to match where the trigger lives for origin-aware interactions. + +## clip-path for Animation + +`clip-path` is not just for shapes. It is one of the most powerful animation tools in CSS. + +### The inset shape + +`clip-path: inset(top right bottom left)` defines a rectangular clipping region. Each value "eats" into the element from that side. + +```css +/* Fully hidden from right */ +.hidden { + clip-path: inset(0 100% 0 0); +} + +/* Fully visible */ +.visible { + clip-path: inset(0 0 0 0); +} + +/* Reveal from left to right */ +.overlay { + clip-path: inset(0 100% 0 0); + transition: clip-path 200ms ease-out; +} +.button:active .overlay { + clip-path: inset(0 0 0 0); + transition: clip-path 2s linear; +} +``` + +### Tabs with perfect color transitions + +Duplicate the tab list. Style the copy as "active" (different background, different text color). Clip the copy so only the active tab is visible. Animate the clip on tab change. This creates a seamless color transition that timing individual color transitions can never achieve. + +### Hold-to-delete pattern + +Use `clip-path: inset(0 100% 0 0)` on a colored overlay. On `:active`, transition to `inset(0 0 0 0)` over 2s with linear timing. On release, snap back with 200ms ease-out. Add `scale(0.97)` on the button for press feedback. + +### Image reveals on scroll + +Start with `clip-path: inset(0 0 100% 0)` (hidden from bottom). Animate to `inset(0 0 0 0)` when the element enters the viewport. Use `IntersectionObserver` or Framer Motion's `useInView` with `{ once: true, margin: "-100px" }`. + +### Comparison sliders + +Overlay two images. Clip the top one with `clip-path: inset(0 50% 0 0)`. Adjust the right inset value based on drag position. No extra DOM elements needed, fully hardware-accelerated. + +## Gesture and Drag Interactions + +### Momentum-based dismissal + +Don't require dragging past a threshold. Calculate velocity: `Math.abs(dragDistance) / elapsedTime`. If velocity exceeds ~0.11, dismiss regardless of distance. A quick flick should be enough. + +```js +const timeTaken = new Date().getTime() - dragStartTime.current.getTime(); +const velocity = Math.abs(swipeAmount) / timeTaken; + +if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) { + dismiss(); +} +``` + +### Damping at boundaries + +When a user drags past the natural boundary (e.g., dragging a drawer up when already at top), apply damping. The more they drag, the less the element moves. Things in real life don't suddenly stop; they slow down first. + +### Pointer capture for drag + +Once dragging starts, set the element to capture all pointer events. This ensures dragging continues even if the pointer leaves the element bounds. + +### Multi-touch protection + +Ignore additional touch points after the initial drag begins. Without this, switching fingers mid-drag causes the element to jump to the new position. + +```js +function onPress() { + if (isDragging) return; + // Start drag... +} +``` + +### Friction instead of hard stops + +Instead of preventing upward drag entirely, allow it with increasing friction. It feels more natural than hitting an invisible wall. + +## Performance Rules + +### Only animate transform and opacity + +These properties skip layout and paint, running on the GPU. Animating `padding`, `margin`, `height`, or `width` triggers all three rendering steps. + +### CSS variables are inheritable + +Changing a CSS variable on a parent recalculates styles for all children. In a drawer with many items, updating `--swipe-amount` on the container causes expensive style recalculation. Update `transform` directly on the element instead. + +```js +// Bad: triggers recalc on all children +element.style.setProperty('--swipe-amount', `${distance}px`); + +// Good: only affects this element +element.style.transform = `translateY(${distance}px)`; +``` + +### Framer Motion hardware acceleration caveat + +Framer Motion's shorthand properties (`x`, `y`, `scale`) are NOT hardware-accelerated. They use `requestAnimationFrame` on the main thread. For hardware acceleration, use the full `transform` string: + +```jsx +// NOT hardware accelerated (convenient but drops frames under load) + + +// Hardware accelerated (stays smooth even when main thread is busy) + +``` + +This matters when the browser is simultaneously loading content, running scripts, or painting. At Vercel, the dashboard tab animation used Shared Layout Animations and dropped frames during page loads. Switching to CSS animations (off main thread) fixed it. + +### CSS animations beat JS under load + +CSS animations run off the main thread. When the browser is busy loading a new page, Framer Motion animations (using `requestAnimationFrame`) drop frames. CSS animations remain smooth. Use CSS for predetermined animations; JS for dynamic, interruptible ones. + +### Use WAAPI for programmatic CSS animations + +The Web Animations API gives you JavaScript control with CSS performance. Hardware-accelerated, interruptible, and no library needed. + +```js +element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], { + duration: 1000, + fill: 'forwards', + easing: 'cubic-bezier(0.77, 0, 0.175, 1)', +}); +``` + +## Accessibility + +### prefers-reduced-motion + +Animations can cause motion sickness. Reduced motion means fewer and gentler animations, not zero. Keep opacity and color transitions that aid comprehension. Remove movement and position animations. + +```css +@media (prefers-reduced-motion: reduce) { + .element { + animation: fade 0.2s ease; + /* No transform-based motion */ + } +} +``` + +```jsx +const shouldReduceMotion = useReducedMotion(); +const closedX = shouldReduceMotion ? 0 : '-100%'; +``` + +### Touch device hover states + +```css +@media (hover: hover) and (pointer: fine) { + .element:hover { + transform: scale(1.05); + } +} +``` + +Touch devices trigger hover on tap, causing false positives. Gate hover animations behind this media query. + +## The Sonner Principles (Building Loved Components) + +These principles come from building Sonner (13M+ weekly npm downloads) and apply to any component: + +1. **Developer experience is key.** No hooks, no context, no complex setup. Insert `` once, call `toast()` from anywhere. The less friction to adopt, the more people will use it. + +2. **Good defaults matter more than options.** Ship beautiful out of the box. Most users never customize. The default easing, timing, and visual design should be excellent. + +3. **Naming creates identity.** "Sonner" (French for "to ring") feels more elegant than "react-toast". Sacrifice discoverability for memorability when appropriate. + +4. **Handle edge cases invisibly.** Pause toast timers when the tab is hidden. Fill gaps between stacked toasts with pseudo-elements to maintain hover state. Capture pointer events during drag. Users never notice these, and that is exactly right. + +5. **Use transitions, not keyframes, for dynamic UI.** Toasts are added rapidly. Keyframes restart from zero on interruption. Transitions retarget smoothly. + +6. **Build a great documentation site.** Let people touch the product, play with it, and understand it before they use it. Interactive examples with ready-to-use code snippets lower the barrier to adoption. + +### Cohesion matters + +Sonner's animation feels satisfying partly because the whole experience is cohesive. The easing and duration fit the vibe of the library. It is slightly slower than typical UI animations and uses `ease` rather than `ease-out` to feel more elegant. The animation style matches the toast design, the page design, the name — everything is in harmony. + +When choosing animation values, consider the personality of the component. A playful component can be bouncier. A professional dashboard should be crisp and fast. Match the motion to the mood. + +### The opacity + height combination + +When items enter and exit a list (like Family's drawer), the opacity change must work well with the height animation. This is often trial and error. There is no formula — you adjust until it feels right. + +### Review your work the next day + +Review animations with fresh eyes. You notice imperfections the next day that you missed during development. Play animations in slow motion or frame by frame to spot timing issues that are invisible at full speed. + +### Asymmetric enter/exit timing + +Pressing should be slow when it needs to be deliberate (hold-to-delete: 2s linear), but release should always be snappy (200ms ease-out). This pattern applies broadly: slow where the user is deciding, fast where the system is responding. + +```css +/* Release: fast */ +.overlay { + transition: clip-path 200ms ease-out; +} + +/* Press: slow and deliberate */ +.button:active .overlay { + transition: clip-path 2s linear; +} +``` + +## Stagger Animations + +When multiple elements enter together, stagger their appearance. Each element animates in with a small delay after the previous one. This creates a cascading effect that feels more natural than everything appearing at once. + +```css +.item { + opacity: 0; + transform: translateY(8px); + animation: fadeIn 300ms ease-out forwards; +} + +.item:nth-child(1) { + animation-delay: 0ms; +} +.item:nth-child(2) { + animation-delay: 50ms; +} +.item:nth-child(3) { + animation-delay: 100ms; +} +.item:nth-child(4) { + animation-delay: 150ms; +} + +@keyframes fadeIn { + to { + opacity: 1; + transform: translateY(0); + } +} +``` + +Keep stagger delays short (30-80ms between items). Long delays make the interface feel slow. Stagger is decorative — never block interaction while stagger animations are playing. + +## Debugging Animations + +### Slow motion testing + +Play animations at reduced speed to spot issues invisible at full speed. Temporarily increase duration to 2-5x normal, or use browser DevTools animation inspector to slow playback. + +Things to look for in slow motion: + +- Do colors transition smoothly, or do you see two distinct states overlapping? +- Does the easing feel right, or does it start/stop abruptly? +- Is the transform-origin correct, or does the element scale from the wrong point? +- Are multiple animated properties (opacity, transform, color) in sync? + +### Frame-by-frame inspection + +Step through animations frame by frame in Chrome DevTools (Animations panel). This reveals timing issues between coordinated properties that you cannot see at full speed. + +### Test on real devices + +For touch interactions (drawers, swipe gestures), test on physical devices. Connect your phone via USB, visit your local dev server by IP address, and use Safari's remote devtools. The Xcode Simulator is an alternative but real hardware is better for gesture testing. + +## Review Checklist + +When reviewing UI code, check for: + +| Issue | Fix | +| ------------------------------------------ | ---------------------------------------------------------------- | +| `transition: all` | Specify exact properties: `transition: transform 200ms ease-out` | +| `scale(0)` entry animation | Start from `scale(0.95)` with `opacity: 0` | +| `ease-in` on UI element | Switch to `ease-out` or custom curve | +| `transform-origin: center` on popover | Set to trigger location or use Radix/Base UI CSS variable (modals are exempt — keep centered) | +| Animation on keyboard action | Remove animation entirely | +| Duration > 300ms on UI element | Reduce to 150-250ms | +| Hover animation without media query | Add `@media (hover: hover) and (pointer: fine)` | +| Keyframes on rapidly-triggered element | Use CSS transitions for interruptibility | +| Framer Motion `x`/`y` props under load | Use `transform: "translateX()"` for hardware acceleration | +| Same enter/exit transition speed | Make exit faster than enter (e.g., enter 2s, exit 200ms) | +| Elements all appear at once | Add stagger delay (30-80ms between items) | diff --git a/antigravity-awesome-skills/skills/review-animations/SKILL.md b/antigravity-awesome-skills/skills/review-animations/SKILL.md new file mode 100644 index 00000000..736d4cb0 --- /dev/null +++ b/antigravity-awesome-skills/skills/review-animations/SKILL.md @@ -0,0 +1,139 @@ +--- +name: review-animations +description: "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar." +category: frontend +risk: safe +source: community +source_repo: emilkowalski/skills +source_type: community +date_added: "2026-06-25" +author: Emil Kowalski +license: MIT +license_source: "https://github.com/emilkowalski/skills/blob/main/LICENSE.txt" +tags: [frontend, animation, motion, review, accessibility] +tools: [claude, cursor, codex, antigravity] +disable-model-invocation: true +--- + +# Reviewing Animations + +## When to Use + +- Use when the user asks for an animation, motion, or interaction review. +- Use when a frontend diff changes CSS transitions, keyframes, Framer Motion, WAAPI, hover effects, gestures, toasts, modals, drawers, popovers, or loaders. +- Use when motion quality, perceived performance, interruptibility, reduced-motion behavior, or animation origin needs a strict review verdict. + +## Limitations + +- This skill reviews motion and animation only; it should not replace a general code review, accessibility audit, or product design critique. +- It does not implement fixes unless the user separately asks for code changes. +- Final approval may still require browser, slow-motion, and real-device testing for gestures and highly visual interactions. + +## Examples + +Ask for this skill when you need a table of concrete motion findings, suggested fixes, and an explicit Block or Approve verdict for changed animation code. + +A specialized review skill. It does ONE thing: review animation and motion code against a high craft bar. It does not write features, fix unrelated bugs, or review non-motion code. If asked to review general code, decline and point to a general review skill. + +## Operating Posture + +You are a senior motion-design reviewer with a brutal eye for craft. Your bias is toward **motion that feels right**, not motion that merely runs. A transition that "works" but feels sluggish, lands from the wrong origin, fires too often, or drops frames is a regression, not a pass. Default to flagging. Approval is earned, not assumed. + +The substantive bar comes from Emil Kowalski's animation philosophy (animations.dev). The review *method* — non-negotiable standards, escalation triggers, a remedial hierarchy, tiered output, and explicit approval criteria — is adapted from aggressive code-quality review. + +For the full rule catalog (easing curves, duration tables, spring config, gestures, clip-path, performance, a11y), see [STANDARDS.md](STANDARDS.md). Load it whenever a finding needs a precise value or citation. + +## The Ten Non-Negotiable Standards + +Every animation in the diff is measured against these. A violation is a finding. + +1. **Justified motion.** Every animation must answer "why does this animate?" — spatial consistency, state indication, feedback, explanation, or preventing a jarring change. "It looks cool" on a frequently-seen element is a block. + +2. **Frequency-appropriate.** Match motion to how often it's seen. Keyboard-initiated and 100+/day actions get **no** animation. Tens/day gets reduced motion. Occasional gets standard. Rare/first-time can have delight. + +3. **Responsive easing.** Entering/exiting elements use `ease-out` or a strong custom curve. `ease-in` on UI is a block — it delays the moment the user watches most. Built-in CSS easings are too weak; expect custom cubic-beziers. + +4. **Sub-300ms UI.** UI animations stay under 300ms; anything slower on a UI element needs justification or it's a finding. Per-element budgets live in [STANDARDS.md](STANDARDS.md). + +5. **Origin & physical correctness.** Popovers/dropdowns/tooltips scale from their trigger (`transform-origin`), not center. Never animate from `scale(0)` — start from `scale(0.9–0.97)` + opacity (Modals are exempt — they stay centered.) + +6. **Interruptibility.** Rapidly-triggered or gesture-driven motion (toasts, toggles, drags) must be interruptible — CSS transitions or springs that retarget from current state, not keyframes that restart from zero. + +7. **GPU-only properties.** Animate `transform` and `opacity` only. Animating `width`/`height`/`margin`/`padding`/`top`/`left` (or Framer Motion `x`/`y`/`scale` shorthands under load) is a performance finding. + +8. **Accessibility.** `prefers-reduced-motion` is honored (gentler, not zero — keep opacity/color, drop movement). Hover animations are gated behind `@media (hover: hover) and (pointer: fine)`. + +9. **Asymmetric enter/exit.** Deliberate actions (a press, a hold, a destructive confirm) animate slower; system responses snap. Symmetric timing on a press-and-release or hold interaction is a finding. + +10. **Cohesion.** Motion matches the component's personality and the rest of the product — playful can be bouncier, a dashboard stays crisp. Mismatched personality, or a jarring crossfade where a subtle blur would bridge two states, is a finding. When unsure whether motion feels right, the strongest move is often to delete it. + +## Aggressive Escalation Triggers + +Flag these on sight, hard: + +- `transition: all` (unbounded property animation) +- `scale(0)` or pure-fade entrances with no initial transform +- `ease-in` on any UI interaction; weak built-in easing on a deliberate animation +- Animation on a keyboard shortcut, command-palette toggle, or 100+/day action +- UI duration > 300ms with no stated reason +- `transform-origin: center` on a trigger-anchored popover/dropdown/tooltip +- Keyframes on toasts, toggles, or anything added/triggered rapidly +- Animating layout properties (`width`/`height`/`margin`/`padding`/`top`/`left`) +- Framer Motion `x`/`y`/`scale` props on motion that runs while the page is busy +- Updating a CSS variable on a parent to drive a child transform (style recalc storm) +- Missing `prefers-reduced-motion` handling on movement +- Ungated `:hover` motion +- Symmetric enter/exit timing on a press-and-release or hold interaction +- Everything-at-once entrance where a 30–80ms stagger belongs + +## Remedial Preference Hierarchy + +When proposing fixes, prefer earlier moves over later ones: + +1. **Delete the animation** (high-frequency / no purpose / keyboard-triggered). +2. **Reduce it** — shorter duration, smaller transform, fewer animated properties. +3. **Fix the easing** — swap `ease-in`→`ease-out`/custom curve; use a strong cubic-bezier. +4. **Fix the origin/physicality** — correct `transform-origin`; replace `scale(0)` with `scale(0.95)`+opacity. +5. **Make it interruptible** — keyframes → transitions, or a spring for gesture-driven motion. +6. **Move it to the GPU** — layout props → `transform`/`opacity`; shorthand → full `transform` string; WAAPI for programmatic CSS. +7. **Asymmetric timing** — slow the deliberate phase, snap the response. +8. **Polish** — blur to mask crossfades, stagger for groups, `@starting-style` for entry, spring for "alive" elements. +9. **Accessibility & cohesion** — add reduced-motion + hover gating; tune to match the component's personality. + +## Required Output Format + +Two parts, in this order. + +### Part 1 — Findings table (REQUIRED) + +A single markdown table. One row per issue. Never a "Before:/After:" list. + +| Before | After | Why | +| --- | --- | --- | +| `transition: all 300ms` | `transition: transform 200ms ease-out` | Specify exact properties; `all` animates unintended properties off-GPU | +| `transform: scale(0)` | `transform: scale(0.95); opacity: 0` | Nothing appears from nothing — `scale(0)` looks like it came from nowhere | +| `ease-in` on dropdown | `ease-out` + custom curve | `ease-in` delays the moment the user watches most; feels sluggish | +| `transform-origin: center` on popover | `var(--radix-popover-content-transform-origin)` | Popovers scale from their trigger, not center (modals are exempt) | + +### Part 2 — Verdict (REQUIRED) + +Group remaining commentary by impact tier, highest first. Omit empty tiers. + +1. **Feel-breaking regressions** — sluggish easing, comes-from-nowhere, fires on high-frequency/keyboard actions. +2. **Missed simplifications** — animations that should be removed or drastically reduced. +3. **Performance** — non-GPU properties, dropped-frame risks, recalc storms. +4. **Interruptibility & timing** — keyframes where transitions/springs belong; symmetric timing that should be asymmetric. +5. **Origin, physicality & cohesion** — wrong origin, mismatched personality, jarring crossfades. +6. **Accessibility** — reduced-motion and pointer/hover gating. + +Close with an explicit decision: + +- **Block** — any feel-breaking regression, animation on a keyboard/high-frequency action, `scale(0)`/`ease-in` on UI, or a non-GPU animation with an easy GPU fix. +- **Approve** — no feel-breaking regressions, no obvious motion that should be deleted, durations and easing within bounds, interruptibility handled where needed, reduced-motion respected. + +Be specific and cite `file:line`. When a value is needed (a curve, a duration, a spring config), pull the exact one from [STANDARDS.md](STANDARDS.md) rather than approximating. + +## Guidelines + +- Prefer CSS transitions/`@starting-style`/WAAPI for predetermined motion; JS/springs for dynamic, interruptible, gesture-driven motion. +- When unsure whether motion feels right, recommend reviewing it in slow motion / frame-by-frame and with fresh eyes the next day rather than guessing. diff --git a/antigravity-awesome-skills/skills/review-animations/STANDARDS.md b/antigravity-awesome-skills/skills/review-animations/STANDARDS.md new file mode 100644 index 00000000..b6dc9b19 --- /dev/null +++ b/antigravity-awesome-skills/skills/review-animations/STANDARDS.md @@ -0,0 +1,188 @@ +# Animation Standards Reference + +The precise values, curves, and rules behind the review. Cite these in findings instead of approximating. Distilled from Emil Kowalski's design engineering philosophy ([animations.dev](https://animations.dev/)). + +## Should it animate? (frequency table) + +| Frequency | Decision | +| --- | --- | +| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. | +| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce | +| Occasional (modals, drawers, toasts) | Standard animation | +| Rare / first-time (onboarding, feedback, celebrations) | Can add delight | + +**Never animate keyboard-initiated actions** — they repeat hundreds of times daily; animation makes them feel slow and disconnected. (Raycast has no open/close animation — correct for something used hundreds of times a day.) + +Valid purposes for motion: spatial consistency, state indication, explanation, feedback, preventing jarring change. "It looks cool" on a frequently-seen element is not valid. + +## Easing + +Decision order: +- Entering or exiting → **`ease-out`** (starts fast, feels responsive) +- Moving / morphing on screen → **`ease-in-out`** +- Hover / color change → **`ease`** +- Constant motion (marquee, progress) → **`linear`** +- Default → **`ease-out`** + +**Never `ease-in` on UI.** It starts slow, delaying the exact moment the user is watching. `ease-out` at 200ms *feels* faster than `ease-in` at 200ms. + +Built-in CSS easings are too weak. Use strong custom curves: + +```css +--ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* strong ease-out for UI */ +--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* strong ease-in-out for on-screen movement */ +--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like drawer curve (Ionic) */ +``` + +Find curves at [easing.dev](https://easing.dev/) or [easings.co](https://easings.co/) — don't hand-roll from scratch. + +## Duration + +| Element | Duration | +| --- | --- | +| Button press feedback | 100–160ms | +| Tooltips, small popovers | 125–200ms | +| Dropdowns, selects | 150–250ms | +| Modals, drawers | 200–500ms | +| Marketing / explanatory | Can be longer | + +**Rule: UI animations stay under 300ms.** A 180ms dropdown feels more responsive than a 400ms one. Faster spinners make load feel faster (same actual time). Instant tooltips after the first (skip delay + animation) make a toolbar feel faster. + +## Physicality + +- **Never `scale(0)`.** Start from `scale(0.9–0.97)` + `opacity: 0`. Nothing in the real world appears from nothing. +- **Origin-aware popovers.** Scale from the trigger, not center: + ```css + .popover { transform-origin: var(--radix-popover-content-transform-origin); } /* Radix */ + .popover { transform-origin: var(--transform-origin); } /* Base UI */ + ``` + **Modals are exempt** — they appear centered in the viewport, keep `transform-origin: center`. +- **Button press feedback.** `transform: scale(0.97)` on `:active`, `transition: transform 160ms ease-out`. Subtle (0.95–0.98). Applies to any pressable element. + +## Springs + +Feel natural because they simulate physics; no fixed duration — they settle on parameters. Use for: drag with momentum, "alive" elements (Dynamic Island), interruptible gestures, decorative mouse-tracking. + +```js +// Apple-style (easier to reason about) — recommended +{ type: "spring", duration: 0.5, bounce: 0.2 } + +// Traditional physics (more control) +{ type: "spring", mass: 1, stiffness: 100, damping: 10 } +``` + +Keep bounce subtle (0.1–0.3); avoid bounce in most UI — reserve for drag-to-dismiss and playful interactions. Springs maintain velocity when interrupted (keyframes restart from zero), so they're ideal for gestures users may reverse mid-motion. + +Mouse interactions: interpolate with `useSpring` rather than tying value directly to mouse position (direct = artificial, no momentum). Only do this when the motion is decorative. + +## Interruptibility + +CSS **transitions** can be interrupted and retargeted mid-animation; **keyframes** restart from zero. For anything triggered rapidly (toasts being added, toggles), transitions are smoother. + +```css +/* Interruptible — good for dynamic UI */ +.toast { transition: transform 400ms ease; } + +/* Not interruptible — avoid for dynamic UI */ +@keyframes slideIn { from { transform: translateY(100%); } to { transform: translateY(0); } } +``` + +Use `@starting-style` for entry without JS: + +```css +.toast { + opacity: 1; transform: translateY(0); + transition: opacity 400ms ease, transform 400ms ease; + @starting-style { opacity: 0; transform: translateY(100%); } +} +``` + +Legacy fallback: `useEffect(() => setMounted(true), [])` + `data-mounted` attribute. + +## Asymmetric timing + +Slow where the user is deciding, fast where the system responds. + +```css +.overlay { transition: clip-path 200ms ease-out; } /* release: fast */ +.button:active .overlay { transition: clip-path 2s linear; } /* press: slow, deliberate */ +``` + +## Performance + +- **Only animate `transform` and `opacity`** — they skip layout/paint and run on the GPU. `padding`/`margin`/`height`/`width`/`top`/`left` trigger all three rendering steps. +- **Don't drive child transforms via a CSS variable on the parent** — it recalcs styles for all children. Set `transform` directly on the element. + ```js + element.style.setProperty('--swipe-amount', `${d}px`); // bad: recalc on all children + element.style.transform = `translateY(${d}px)`; // good: only this element + ``` +- **Framer Motion shorthands are NOT hardware-accelerated.** `x`/`y`/`scale` run on the main thread via rAF and drop frames under load. Use the full transform string: + ```jsx + // drops frames under load + // hardware accelerated + ``` +- **CSS animations beat JS under load** — they run off the main thread; rAF-based animations stutter while the browser loads/scripts/paints. Use CSS for predetermined motion, JS for dynamic/interruptible. +- **WAAPI** gives JS control with CSS performance (hardware-accelerated, interruptible, no library): + ```js + element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], + { duration: 1000, fill: 'forwards', easing: 'cubic-bezier(0.77, 0, 0.175, 1)' }); + ``` + +## Transforms & clip-path + +- **`translate` percentages** are relative to the element's own size — `translateY(100%)` moves by the element's height regardless of dimensions (how Sonner/Vaul position toasts/drawers). Prefer over hardcoded px. +- **`scale()` scales children too** (font, icons, content) — a feature for press feedback. +- **3D**: `rotateX/Y` + `transform-style: preserve-3d` for depth/orbit/flip without JS. +- **`clip-path: inset(t r b l)`** is a powerful animation tool: each value eats in from that side. Uses: reveal-on-scroll (`inset(0 0 100% 0)` → `inset(0 0 0 0)`), hold-to-delete overlay, seamless tab color transitions (duplicate + clip the active copy), comparison sliders. + +## Gestures & drag + +- **Momentum dismissal**: don't require crossing a distance threshold — compute velocity (`Math.abs(distance)/elapsedMs`); dismiss if `> ~0.11`. A flick should be enough. +- **Damping at boundaries**: dragging past a natural edge moves less the further you go (real things slow before stopping). +- **Pointer capture** once dragging starts, so it continues when the pointer leaves bounds. +- **Multi-touch protection**: ignore extra touch points after the drag begins (`if (isDragging) return`) — prevents jumps. +- **Friction over hard stops** — allow over-drag with rising resistance rather than an invisible wall. + +## Masking imperfect crossfades + +When a crossfade shows two overlapping states despite tuning easing/duration, add subtle `filter: blur(2px)` during the transition to blend them into one perceived transformation. Keep blur < 20px (heavy blur is expensive, especially Safari). + +## Stagger + +Stagger group entrances; 30–80ms between items. Longer delays feel slow. Stagger is decorative — never block interaction while it plays. + +```css +.item { opacity: 0; transform: translateY(8px); animation: fadeIn 300ms ease-out forwards; } +.item:nth-child(2) { animation-delay: 50ms; } +.item:nth-child(3) { animation-delay: 100ms; } +@keyframes fadeIn { to { opacity: 1; transform: translateY(0); } } +``` + +## Accessibility + +```css +@media (prefers-reduced-motion: reduce) { + .element { animation: fade 0.2s ease; } /* keep opacity/color, drop transform-based motion */ +} +@media (hover: hover) and (pointer: fine) { + .element:hover { transform: scale(1.05); } /* gate hover motion — touch fires false hovers on tap */ +} +``` + +```jsx +const reduce = useReducedMotion(); +const closedX = reduce ? 0 : '-100%'; +``` + +Reduced motion means fewer and gentler animations, not zero — keep transitions that aid comprehension, remove movement/position changes. + +## Debugging (recommend in reviews when feel is uncertain) + +- **Slow motion**: bump duration 2–5× or use DevTools animation inspector. Check colors crossfade cleanly, easing doesn't stop abruptly, `transform-origin` is right, coordinated properties stay in sync. +- **Frame-by-frame**: Chrome DevTools Animations panel reveals timing drift between coordinated properties. +- **Real devices** for gestures (drawers, swipe) — connect a phone, hit the dev server by IP, use Safari remote devtools. +- **Fresh eyes next day** — imperfections invisible during development surface later. + +## Cohesion + +Match motion to the component's personality: playful can be bouncier; a professional dashboard should be crisp and fast. Sonner feels right partly because easing, duration, design, and even the name are in harmony — slightly slower, `ease` rather than `ease-out`, to feel elegant. Opacity + height in entering/exiting lists is trial and error; there's no formula — adjust until it feels right. diff --git a/antigravity-awesome-skills/skills_index.json b/antigravity-awesome-skills/skills_index.json index d01e1d37..a59670d7 100644 --- a/antigravity-awesome-skills/skills_index.json +++ b/antigravity-awesome-skills/skills_index.json @@ -13144,6 +13144,28 @@ "reasons": [] } }, + { + "id": "emil-design-eng", + "path": "skills/emil-design-eng", + "category": "frontend", + "name": "emil-design-eng", + "description": "Use when designing or reviewing polished product UI with Emil Kowalski-inspired animation, interaction, and component craft guidance.", + "risk": "safe", + "source": "community", + "date_added": "2026-06-25", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "emotional-arc-designer", "path": "skills/emotional-arc-designer", @@ -27653,6 +27675,28 @@ "reasons": [] } }, + { + "id": "review-animations", + "path": "skills/review-animations", + "category": "frontend", + "name": "review-animations", + "description": "Use when reviewing animation and motion code against a strict craft, performance, accessibility, and interaction-quality bar.", + "risk": "safe", + "source": "community", + "date_added": "2026-06-25", + "plugin": { + "targets": { + "codex": "supported", + "claude": "supported" + }, + "setup": { + "type": "none", + "summary": "", + "docs": null + }, + "reasons": [] + } + }, { "id": "revops", "path": "skills/revops", diff --git a/antigravity-awesome-skills/tools/scripts/build-catalog.js b/antigravity-awesome-skills/tools/scripts/build-catalog.js index 6242ad27..248208f5 100644 --- a/antigravity-awesome-skills/tools/scripts/build-catalog.js +++ b/antigravity-awesome-skills/tools/scripts/build-catalog.js @@ -719,6 +719,25 @@ function renderCatalogMarkdown(catalog) { return lines.join("\n"); } +function readCatalogGeneratedAt() { + if (process.env.SOURCE_DATE_EPOCH) { + return new Date(process.env.SOURCE_DATE_EPOCH * 1000).toISOString(); + } + + const readmePath = path.join(ROOT, "README.md"); + try { + const readme = fs.readFileSync(readmePath, "utf8"); + const match = readme.match(//); + if (match) { + return new Date(match[1]).toISOString(); + } + } catch { + // Keep catalog builds available in minimal fixtures without README.md. + } + + return "2026-02-08T00:00:00.000Z"; +} + function buildCatalog() { const skillRelPaths = listSkillIdsRecursive(SKILLS_DIR); const skills = skillRelPaths.map((relPath) => readSkill(SKILLS_DIR, relPath)); @@ -742,9 +761,7 @@ function buildCatalog() { } const catalog = { - generatedAt: process.env.SOURCE_DATE_EPOCH - ? new Date(process.env.SOURCE_DATE_EPOCH * 1000).toISOString() - : "2026-02-08T00:00:00.000Z", + generatedAt: readCatalogGeneratedAt(), total: catalogSkills.length, skills: catalogSkills.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0, diff --git a/antigravity-awesome-skills/walkthrough.md b/antigravity-awesome-skills/walkthrough.md index 09b27a3a..8c8f12a4 100644 --- a/antigravity-awesome-skills/walkthrough.md +++ b/antigravity-awesome-skills/walkthrough.md @@ -125,7 +125,7 @@ - `data/bundles.json` - curated user/maintainer docs updated by `sync_repo_metadata.py` -# Maintenance Walkthrough - 2026-03-21 +# Maintenance Walkthrough - 2026-03-21 Follow-up Import Sync - Imported and normalized a new batch of external skills into `skills/`, covering Anthropic Claude API/internal comms entries, marketing workflows, SEO orchestration/sub-skills, and Obsidian-focused file-format/CLI skills. - Added and standardized the following imported skill families: @@ -234,7 +234,7 @@ - `npm run catalog` - Refreshed `CHANGELOG.md`, `README.md`, `docs/users/getting-started.md`, `docs/users/faq.md`, and the contributor acknowledgements to prepare the single `7.8.0` release cut. -# Maintenance Walkthrough - 2026-03-21 +# Maintenance Walkthrough - 2026-03-21 Initial Import Batch - Imported the missing external skill coverage identified from `travisvn/awesome-claude-skills`, `anthropics/skills`, `coreyhaines31/marketingskills`, `AgriciDaniel/claude-seo`, and `kepano/obsidian-skills`, bringing the indexed registry to `1,304` skills on `main`. - Added maintainer attribution notes in `docs/maintainers/skills-import-2026-03-21.md` and refreshed the generated registry artifacts after the import batch. diff --git a/ui-ux-pro-max/.claude-plugin/marketplace.json b/ui-ux-pro-max/.claude-plugin/marketplace.json index 56a56681..35c561df 100644 --- a/ui-ux-pro-max/.claude-plugin/marketplace.json +++ b/ui-ux-pro-max/.claude-plugin/marketplace.json @@ -5,14 +5,14 @@ "name": "nextlevelbuilder" }, "metadata": { - "description": "UI/UX design intelligence skill with 67 styles, 161 palettes, 57 font pairings, 25 charts, and 15 stack guidelines", + "description": "UI/UX design intelligence skill with 84 styles, 161 palettes, 73 font pairings, 25 charts, and 17 stack guidelines", "version": "2.6.2" }, "plugins": [ { "name": "ui-ux-pro-max", "source": "./", - "description": "Professional UI/UX design intelligence for AI coding assistants. Includes searchable databases of styles, colors, typography, charts, and UX guidelines for React, Next.js, Astro, Vue, Nuxt.js, Nuxt UI, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, and Jetpack Compose.", + "description": "Professional UI/UX design intelligence for AI coding assistants. Includes searchable databases of styles, colors, typography, charts, and UX guidelines for React, Next.js, Astro, Vue, Nuxt.js, Nuxt UI, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, JavaFX, and Three.js.", "version": "2.6.2", "author": { "name": "nextlevelbuilder" diff --git a/ui-ux-pro-max/.claude-plugin/plugin.json b/ui-ux-pro-max/.claude-plugin/plugin.json index 06145441..066bad50 100755 --- a/ui-ux-pro-max/.claude-plugin/plugin.json +++ b/ui-ux-pro-max/.claude-plugin/plugin.json @@ -1,11 +1,11 @@ { "name": "ui-ux-pro-max", - "description": "UI/UX design intelligence. 67 styles, 161 palettes, 57 font pairings, 25 charts, 15 stacks (React, Next.js, Vue, Svelte, Astro, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Nuxt, Jetpack Compose). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.", + "description": "UI/UX design intelligence. 84 styles, 161 palettes, 73 font pairings, 25 charts, 17 stacks (React, Next.js, Vue, Nuxt.js, Nuxt UI, Svelte, Astro, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, JavaFX, Three.js). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.", "version": "2.6.2", "author": { "name": "nextlevelbuilder" }, "license": "MIT", "keywords": ["ui", "ux", "design", "styles", "typography", "color-palette", "accessibility", "charts", "components"], - "skills": ["./.claude/skills/ui-ux-pro-max"] + "skills": "./.claude/skills/" } diff --git a/ui-ux-pro-max/.claude/skills/banner-design/SKILL.md b/ui-ux-pro-max/.claude/skills/banner-design/SKILL.md index a4b05f11..ee935a5c 100644 --- a/ui-ux-pro-max/.claude/skills/banner-design/SKILL.md +++ b/ui-ux-pro-max/.claude/skills/banner-design/SKILL.md @@ -1,5 +1,5 @@ --- -name: ckm-banner-design +name: banner-design description: "Design banners for social media, ads, website heroes, creative assets, and print. Multiple art direction options with AI-generated visuals. Actions: design, create, generate banner. Platforms: Facebook, Twitter/X, LinkedIn, YouTube, Instagram, Google Display, website hero, print. Styles: minimalist, gradient, bold typography, photo-based, illustrated, geometric, retro, glassmorphism, 3D, neon, duotone, editorial, collage. Uses ui-ux-pro-max, frontend-design, ai-artist, ai-multimodal skills." argument-hint: "[platform] [style] [dimensions]" license: MIT diff --git a/ui-ux-pro-max/.claude/skills/brand/SKILL.md b/ui-ux-pro-max/.claude/skills/brand/SKILL.md index 809463fa..336e8ef9 100644 --- a/ui-ux-pro-max/.claude/skills/brand/SKILL.md +++ b/ui-ux-pro-max/.claude/skills/brand/SKILL.md @@ -1,5 +1,5 @@ --- -name: ckm-brand +name: brand description: Brand voice, visual identity, messaging frameworks, asset management, brand consistency. Activate for branded content, tone of voice, marketing assets, brand compliance, style guides. argument-hint: "[update|review|create] [args]" metadata: diff --git a/ui-ux-pro-max/.claude/skills/design-system/SKILL.md b/ui-ux-pro-max/.claude/skills/design-system/SKILL.md index 14e3ffbe..4397c7f8 100644 --- a/ui-ux-pro-max/.claude/skills/design-system/SKILL.md +++ b/ui-ux-pro-max/.claude/skills/design-system/SKILL.md @@ -1,5 +1,5 @@ --- -name: ckm-design-system +name: design-system description: Token architecture, component specifications, and slide generation. Three-layer tokens (primitive→semantic→component), CSS variables, spacing/typography scales, component specs, strategic slide creation. Use for design tokens, systematic design, brand-compliant presentations. argument-hint: "[component or token]" license: MIT diff --git a/ui-ux-pro-max/.claude/skills/design/SKILL.md b/ui-ux-pro-max/.claude/skills/design/SKILL.md index d89b457c..2437221d 100644 --- a/ui-ux-pro-max/.claude/skills/design/SKILL.md +++ b/ui-ux-pro-max/.claude/skills/design/SKILL.md @@ -1,5 +1,5 @@ --- -name: ckm-design +name: design description: "Comprehensive design skill: brand identity, design tokens, UI styling, logo generation (55 styles, Gemini AI), corporate identity program (50 deliverables, CIP mockups), HTML presentations (Chart.js), banner design (22 styles, social/ads/web/print), icon design (15 styles, SVG, Gemini 3.1 Pro), social photos (HTML→screenshot, multi-platform). Actions: design logo, create CIP, generate mockups, build slides, design banner, generate icon, create social photos, social media images, brand identity, design system. Platforms: Facebook, Twitter, LinkedIn, YouTube, Instagram, Pinterest, TikTok, Threads, Google Ads." argument-hint: "[design-type] [context]" license: MIT diff --git a/ui-ux-pro-max/.claude/skills/slides/SKILL.md b/ui-ux-pro-max/.claude/skills/slides/SKILL.md index 6827c507..38750ff1 100644 --- a/ui-ux-pro-max/.claude/skills/slides/SKILL.md +++ b/ui-ux-pro-max/.claude/skills/slides/SKILL.md @@ -1,5 +1,5 @@ --- -name: ckm-slides +name: slides description: Create strategic HTML presentations with Chart.js, design tokens, responsive layouts, copywriting formulas, and contextual slide strategies. argument-hint: "[topic] [slide-count]" metadata: diff --git a/ui-ux-pro-max/.claude/skills/ui-styling/SKILL.md b/ui-ux-pro-max/.claude/skills/ui-styling/SKILL.md index 8cdfdd7e..5824efee 100644 --- a/ui-ux-pro-max/.claude/skills/ui-styling/SKILL.md +++ b/ui-ux-pro-max/.claude/skills/ui-styling/SKILL.md @@ -1,5 +1,5 @@ --- -name: ckm-ui-styling +name: ui-styling description: Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs. Use when building user interfaces, implementing design systems, creating responsive layouts, adding accessible components (dialogs, dropdowns, forms, tables), customizing themes and colors, implementing dark mode, generating visual designs and posters, or establishing consistent styling patterns across applications. argument-hint: "[component or layout]" license: MIT diff --git a/ui-ux-pro-max/.github/workflows/check-asset-sync.yml b/ui-ux-pro-max/.github/workflows/check-asset-sync.yml new file mode 100644 index 00000000..5590cbec --- /dev/null +++ b/ui-ux-pro-max/.github/workflows/check-asset-sync.yml @@ -0,0 +1,29 @@ +name: Check asset sync + +on: + pull_request: + paths: + - "src/ui-ux-pro-max/**" + - "cli/assets/**" + - "cli/scripts/sync-assets.mjs" + - ".github/workflows/check-asset-sync.yml" + push: + branches: [main] + paths: + - "src/ui-ux-pro-max/**" + - "cli/assets/**" + +jobs: + check-assets: + name: cli/assets must match src/ui-ux-pro-max + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + # check:assets runs `node scripts/sync-assets.mjs --check`, which uses only + # node builtins (no npm install needed) and normalizes CRLF/LF before + # hashing, so it compares content rather than line endings. + - name: Check CLI assets are in sync with source of truth + run: npm --prefix cli run check:assets diff --git a/ui-ux-pro-max/.github/workflows/release.yml b/ui-ux-pro-max/.github/workflows/release.yml index 4917b925..2ce9f259 100644 --- a/ui-ux-pro-max/.github/workflows/release.yml +++ b/ui-ux-pro-max/.github/workflows/release.yml @@ -52,11 +52,13 @@ jobs: - name: Run semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: | npx --yes \ -p semantic-release \ -p @semantic-release/commit-analyzer \ -p @semantic-release/release-notes-generator \ + -p @semantic-release/npm \ -p @semantic-release/github \ -p conventional-changelog-conventionalcommits \ semantic-release diff --git a/ui-ux-pro-max/.releaserc.json b/ui-ux-pro-max/.releaserc.json index 770e4080..f3c552b0 100644 --- a/ui-ux-pro-max/.releaserc.json +++ b/ui-ux-pro-max/.releaserc.json @@ -21,6 +21,12 @@ "preset": "conventionalcommits" } ], + [ + "@semantic-release/npm", + { + "pkgRoot": "cli" + } + ], [ "@semantic-release/github", { diff --git a/ui-ux-pro-max/CLAUDE.md b/ui-ux-pro-max/CLAUDE.md index 364647cd..f541cbf6 100644 --- a/ui-ux-pro-max/CLAUDE.md +++ b/ui-ux-pro-max/CLAUDE.md @@ -77,9 +77,9 @@ When modifying files: 3. **CLI Assets** - Run sync before publishing: ```bash - cp -r src/ui-ux-pro-max/data/* cli/assets/data/ - cp -r src/ui-ux-pro-max/scripts/* cli/assets/scripts/ - cp -r src/ui-ux-pro-max/templates/* cli/assets/templates/ + cd cli + npm run sync:assets + npm run check:assets ``` 4. **Reference Folders** - No manual sync needed. The CLI generates these from templates during `uipro init`. diff --git a/ui-ux-pro-max/README.md b/ui-ux-pro-max/README.md index 6a1f1add..1df71809 100755 --- a/ui-ux-pro-max/README.md +++ b/ui-ux-pro-max/README.md @@ -154,7 +154,7 @@ Each rule includes: - **161 Color Palettes** - Industry-specific palettes aligned 1:1 with the 161 product types - **57 Font Pairings** - Curated typography combinations with Google Fonts imports - **25 Chart Types** - Recommendations for dashboards and analytics -- **16 Tech Stacks** - React, Next.js, Astro, Vue, Nuxt.js, Nuxt UI, Svelte, SwiftUI, React Native, Flutter, HTML+Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, JavaFX +- **17 Tech Stacks** - React, Next.js, Astro, Vue, Nuxt.js, Nuxt UI, Svelte, SwiftUI, React Native, Flutter, HTML+Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, Three.js, JavaFX - **99 UX Guidelines** - Best practices, anti-patterns, and accessibility rules - **161 Reasoning Rules** - Industry-specific design system generation (NEW in v2.0) @@ -304,8 +304,8 @@ uipro init --ai cursor --global # Install to ~/.cursor/skills/ ```bash uipro versions # List available versions -uipro update # Update to latest version -uipro init --offline # Skip GitHub download, use bundled assets +uipro update # Refresh skill files from installed CLI package +uipro init --offline # Compatibility flag; installs bundled templates uipro uninstall # Remove skill (auto-detect platform) uipro uninstall --ai claude # Remove specific platform uipro uninstall --global # Remove from global install @@ -386,7 +386,7 @@ The skill provides stack-specific guidelines for: | **Vue Ecosystem** | Vue, Nuxt.js, Nuxt UI | | **Angular** | Angular | | **PHP** | Laravel (Blade, Livewire, Inertia.js) | -| **Other Web** | Svelte, Astro | +| **Other Web** | Svelte, Astro, Three.js | | **Desktop** | JavaFX | | **iOS** | SwiftUI | | **Android** | Jetpack Compose | @@ -468,7 +468,7 @@ npm install -g uipro-cli uipro init --ai ``` -This ensures you get the latest templates and correct file structure for your AI assistant. +This ensures you get the latest templates bundled with the installed CLI package and the correct file structure for your AI assistant. Update the npm package first when a new release is published. ### For Contributors @@ -491,12 +491,12 @@ cli/ # CLI installer (generates files from templates) # - templates/ → Platform-specific templates # 4. Sync to CLI and test locally -cp -r src/ui-ux-pro-max/data/* cli/assets/data/ -cp -r src/ui-ux-pro-max/scripts/* cli/assets/scripts/ -cp -r src/ui-ux-pro-max/templates/* cli/assets/templates/ +cd cli +npm run sync:assets +npm run check:assets # 5. Build and test CLI -cd cli && bun run build +bun 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 3e5e0bb7..1090c820 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: bdf1179bcf641cca49ee7a5f76df14c3015fd38c +- Ref: 318e0b2e4069b578c729228455328a1ca88f640d - Remove-Paths: -- Snapshot: 2026-06-24 +- Snapshot: 2026-06-25 - Sync-Mode: render_skill - Notes: vendored into playbook branch thirdparty/skill diff --git a/ui-ux-pro-max/cli/README.md b/ui-ux-pro-max/cli/README.md index 4b97df35..a3220a2d 100644 --- a/ui-ux-pro-max/cli/README.md +++ b/ui-ux-pro-max/cli/README.md @@ -28,19 +28,49 @@ uipro init --ai continue # Continue (Skills) uipro init --ai all # All assistants # Options -uipro init --offline # Skip GitHub download, use bundled assets only +uipro init --offline # Compatibility flag; installs bundled templates uipro init --force # Overwrite existing files # Other commands uipro versions # List available versions -uipro update # Update to latest version +uipro update # Update the global CLI to the latest release ``` +## GitHub Authentication + +GitHub's unauthenticated API allows 60 requests/hour per IP. If you hit rate limits, you can provide a GitHub Personal Access Token (PAT) to raise the limit to 5,000 requests/hour. + +**Options (in order of precedence):** + +```bash +# 1. Pass directly as a flag (one-off use) +uipro init --token ghp_yourtoken +uipro versions --token ghp_yourtoken +uipro update --token ghp_yourtoken + +# 2. Set as a project-scoped environment variable (recommended) +export UI_PRO_MAX_GITHUB_TOKEN=ghp_yourtoken +uipro init + +# 3. Fallback: GITHUB_TOKEN is also read if UI_PRO_MAX_GITHUB_TOKEN is not set +export GITHUB_TOKEN=ghp_yourtoken +uipro init +``` + +**Creating a token:** Go to , click **Generate new token (classic)**, and select **no scopes** — public repo access requires no permissions. Copy the token and store it as an environment secret; never hardcode it in source files. + +> **Warning:** `GITHUB_TOKEN` is automatically injected by GitHub Actions with broad repo permissions. Prefer `UI_PRO_MAX_GITHUB_TOKEN` in CI to avoid accidentally attaching workflow credentials to release download requests. + ## How It Works -By default, `uipro init` tries to download the latest release from GitHub to ensure you get the most up-to-date version. If the download fails (network error, rate limit), it automatically falls back to the bundled assets included in the CLI package. +`uipro init` generates assistant-specific files from the templates bundled with the installed CLI package. To get newer templates and data, update the package, then regenerate: -Use `--offline` to skip the GitHub download and use bundled assets directly. +```bash +uipro update # updates the global CLI to the latest release +uipro init --ai codex --force # regenerate skill files from the new package +``` + +`uipro update` runs `npm install -g uipro-cli@latest` for you (it shells out to `npm` only on Windows, where `npm` is a `.cmd`). You can still run that command manually if you prefer. When the CLI is already current, `uipro update` just refreshes the installed skill files. ## Development @@ -54,6 +84,12 @@ bun run src/index.ts --help # Build bun run build +# Sync bundled CLI assets from the source skill +npm run sync:assets + +# Verify bundled assets are current before publishing +npm run check:assets + # Link for local testing bun link ``` diff --git a/ui-ux-pro-max/cli/assets/data/app-interface.csv b/ui-ux-pro-max/cli/assets/data/app-interface.csv index 636284ce..f34c3cd0 100644 --- a/ui-ux-pro-max/cli/assets/data/app-interface.csv +++ b/ui-ux-pro-max/cli/assets/data/app-interface.csv @@ -1,31 +1,31 @@ No,Category,Issue,Keywords,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity -1,Accessibility,Icon Button Labels,icon button aria-label,Web,Icon-only buttons must have accessible names,Add aria-label to icon buttons,Icon button without label,"","",Critical -2,Accessibility,Form Control Labels,form input label aria,Web,All form controls need labels or aria-label,Use label element or aria-label,Input without accessible name,"","",Critical -3,Accessibility,Keyboard Handlers,keyboard onclick onkeydown,Web,Interactive elements must support keyboard interaction,Add onKeyDown alongside onClick,Click-only interaction,"
","
",High -4,Accessibility,Semantic HTML,semantic button a label,Web,Use semantic HTML before ARIA attributes,Use button/a/label elements,Div with role attribute,"","
Submit
",High -5,Accessibility,Aria Live,aria-live polite async,Web,Async updates need aria-live for screen readers,Add aria-live='polite' for dynamic content,Silent async updates,"
{status}
","
{status}
// no announcement",Medium -6,Accessibility,Decorative Icons,aria-hidden decorative icon,Web,Decorative icons should be hidden from screen readers,Add aria-hidden='true' to decorative icons,Decorative icon announced,"