From 40267daf068dd7f197d16654501cda228dc1a302 Mon Sep 17 00:00:00 2001 From: Kiro Contributor Date: Fri, 20 Feb 2026 22:29:23 -0500 Subject: [PATCH 01/30] feat: Add Kiro CLI support - Add --kiro flag to installer for ~/.kiro/skills installation - Update README with Kiro in compatibility table and installation examples - Add Kiro CLI badge and documentation - Create comprehensive KIRO_INTEGRATION.md guide with: - Installation instructions - Usage examples and workflows - AWS-specific skill recommendations - Troubleshooting and best practices - MCP integration details Kiro is AWS's agentic AI IDE with autonomous coding capabilities, MCP support, and native AWS service integration. This contribution enables 883+ skills to enhance Kiro's capabilities across serverless, infrastructure, security, and full-stack development. --- README.md | 13 +- bin/install.js | 11 +- docs/KIRO_INTEGRATION.md | 292 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 docs/KIRO_INTEGRATION.md diff --git a/README.md b/README.md index 99fa44c9..e451ddf0 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ -# 🌌 Antigravity Awesome Skills: 883+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 883+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Kiro & More -> **The Ultimate Collection of 883+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 883+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Kiro CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) [![Gemini CLI](https://img.shields.io/badge/Gemini%20CLI-Google-blue)](https://github.com/google-gemini/gemini-cli) [![Codex CLI](https://img.shields.io/badge/Codex%20CLI-OpenAI-green)](https://github.com/openai/codex) +[![Kiro CLI](https://img.shields.io/badge/Kiro%20CLI-AWS-orange)](https://kiro.dev) [![Cursor](https://img.shields.io/badge/Cursor-AI%20IDE-orange)](https://cursor.sh) [![Copilot](https://img.shields.io/badge/GitHub%20Copilot-VSCode-lightblue)](https://github.com/features/copilot) [![OpenCode](https://img.shields.io/badge/OpenCode-CLI-gray)](https://github.com/opencode-ai/opencode) @@ -21,6 +22,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/si - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) - 🟒 **Codex CLI** (OpenAI) +- 🟠 **Kiro CLI** (AWS) - πŸ”΄ **Antigravity IDE** (Google DeepMind) - 🩡 **GitHub Copilot** (VSCode Extension) - 🟠 **Cursor** (AI-native IDE) @@ -110,6 +112,7 @@ These skills follow the universal **SKILL.md** format and work with any AI codin | **Claude Code** | CLI | `>> /skill-name help me...` | `.claude/skills/` | | **Gemini CLI** | CLI | `(User Prompt) Use skill-name...` | `.gemini/skills/` | | **Codex CLI** | CLI | `(User Prompt) Use skill-name...` | `.codex/skills/` | +| **Kiro CLI** | CLI | `(User Prompt) Use skill-name...` | `.kiro/skills/` | | **Antigravity** | IDE | `(Agent Mode) Use skill...` | Global: `~/.gemini/antigravity/skills/` Β· Workspace: `.agent/skills/` | | **Cursor** | IDE | `@skill-name (in Chat)` | `.cursor/skills/` | | **Copilot** | Ext | `(Paste content manually)` | N/A | @@ -151,6 +154,9 @@ npx antigravity-awesome-skills --gemini # Codex CLI npx antigravity-awesome-skills --codex +# Kiro CLI +npx antigravity-awesome-skills --kiro + # OpenCode npx antigravity-awesome-skills --path .agents/skills @@ -183,6 +189,9 @@ git clone https://github.com/sickn33/antigravity-awesome-skills.git .gemini/skil # Codex CLI specific git clone https://github.com/sickn33/antigravity-awesome-skills.git .codex/skills +# Kiro CLI specific +git clone https://github.com/sickn33/antigravity-awesome-skills.git .kiro/skills + # Cursor specific git clone https://github.com/sickn33/antigravity-awesome-skills.git .cursor/skills diff --git a/bin/install.js b/bin/install.js index f9d3bd14..03bc079c 100755 --- a/bin/install.js +++ b/bin/install.js @@ -23,7 +23,8 @@ function parseArgs() { claude = false, gemini = false, codex = false, - antigravity = false; + antigravity = false, + kiro = false; for (let i = 0; i < a.length; i++) { if (a[i] === "--help" || a[i] === "-h") return { help: true }; @@ -59,6 +60,10 @@ function parseArgs() { antigravity = true; continue; } + if (a[i] === "--kiro") { + kiro = true; + continue; + } if (a[i] === "install") continue; } @@ -71,6 +76,7 @@ function parseArgs() { gemini, codex, antigravity, + kiro, }; } @@ -84,6 +90,7 @@ function defaultDir(opts) { if (codexHome) return path.join(codexHome, "skills"); return path.join(HOME, ".codex", "skills"); } + if (opts.kiro) return path.join(HOME, ".kiro", "skills"); if (opts.antigravity) return path.join(HOME, ".gemini", "antigravity", "skills"); return path.join(HOME, ".gemini", "antigravity", "skills"); @@ -102,6 +109,7 @@ Options: --claude Install to ~/.claude/skills (Claude Code) --gemini Install to ~/.gemini/skills (Gemini CLI) --codex Install to ~/.codex/skills (Codex CLI) + --kiro Install to ~/.kiro/skills (Kiro CLI) --antigravity Install to ~/.gemini/antigravity/skills (Antigravity) --path Install to (default: ~/.gemini/antigravity/skills) --version After clone, checkout tag v (e.g. 4.6.0 -> v4.6.0) @@ -110,6 +118,7 @@ Options: Examples: npx antigravity-awesome-skills npx antigravity-awesome-skills --cursor + npx antigravity-awesome-skills --kiro npx antigravity-awesome-skills --antigravity npx antigravity-awesome-skills --version 4.6.0 npx antigravity-awesome-skills --path ./my-skills diff --git a/docs/KIRO_INTEGRATION.md b/docs/KIRO_INTEGRATION.md new file mode 100644 index 00000000..f5706181 --- /dev/null +++ b/docs/KIRO_INTEGRATION.md @@ -0,0 +1,292 @@ +# Kiro CLI Integration Guide + +## Overview + +This guide explains how to use Antigravity Awesome Skills with **Kiro CLI**, AWS's agentic AI-powered coding assistant. + +## What is Kiro? + +Kiro is AWS's agentic AI IDE that combines: +- **Autonomous coding agents** that work independently for extended periods +- **Context-aware assistance** with deep understanding of your codebase +- **AWS service integration** with native support for CDK, SAM, and Terraform +- **MCP (Model Context Protocol)** for secure external API and database calls +- **Spec-driven development** that turns natural language into structured specifications + +## Why Use Skills with Kiro? + +Kiro's agentic capabilities are enhanced by skills that provide: +- **Domain expertise** across 883+ 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 + +## Installation + +### Quick Install + +```bash +# Install to Kiro's default skills directory +npx antigravity-awesome-skills --kiro +``` + +This installs skills to `~/.kiro/skills/` + +### Manual Installation + +```bash +# Clone directly to Kiro's skills directory +git clone https://github.com/sickn33/antigravity-awesome-skills.git ~/.kiro/skills +``` + +### Verification + +```bash +# Verify installation +test -d ~/.kiro/skills && echo "βœ“ Skills installed successfully" +ls ~/.kiro/skills/skills/ | head -10 +``` + +## Using Skills with Kiro + +### Basic Invocation + +Kiro uses natural language prompts to invoke skills: + +``` +Use the @brainstorming skill to help me design a serverless API +``` + +``` +Apply @aws-serverless patterns to this Lambda function +``` + +``` +Run @security-audit on my CDK stack +``` + +### Recommended Skills for Kiro Users + +#### AWS & Cloud Infrastructure +- `@aws-serverless` - Serverless architecture patterns +- `@aws-cdk` - AWS CDK best practices +- `@aws-sam` - SAM template patterns +- `@terraform-expert` - Terraform infrastructure as code +- `@docker-expert` - Container optimization +- `@kubernetes-expert` - K8s deployment patterns + +#### Architecture & Design +- `@architecture` - System design and ADRs +- `@c4-context` - C4 model diagrams +- `@senior-architect` - Scalable architecture patterns +- `@microservices-patterns` - Microservices design + +#### Security +- `@api-security-best-practices` - API security hardening +- `@vulnerability-scanner` - Security vulnerability detection +- `@owasp-top-10` - OWASP security patterns +- `@aws-security-best-practices` - AWS security configuration + +#### Development +- `@typescript-expert` - TypeScript best practices +- `@python-patterns` - Python design patterns +- `@react-patterns` - React component patterns +- `@test-driven-development` - TDD workflows + +#### DevOps & Automation +- `@ci-cd-pipeline` - CI/CD automation +- `@github-actions` - GitHub Actions workflows +- `@monitoring-observability` - Observability patterns +- `@incident-response` - Incident management + +## Kiro-Specific Workflows + +### 1. Serverless Application Development + +``` +1. Use @brainstorming to design the application architecture +2. Apply @aws-serverless to create Lambda functions +3. Use @aws-cdk to generate infrastructure code +4. Run @test-driven-development to add tests +5. Apply @ci-cd-pipeline to set up deployment +``` + +### 2. Infrastructure as Code + +``` +1. Use @architecture to document the system design +2. Apply @terraform-expert to write Terraform modules +3. Run @security-audit to check for vulnerabilities +4. Use @documentation to generate README and runbooks +``` + +### 3. API Development + +``` +1. Use @api-design to plan endpoints +2. Apply @typescript-expert for implementation +3. Run @api-security-best-practices for hardening +4. Use @openapi-spec to generate documentation +``` + +## Advanced Features + +### MCP Integration + +Kiro's MCP support allows skills to: +- Call external APIs securely +- Query databases with context +- Integrate with AWS services +- Access documentation in real-time + +Skills that leverage MCP: +- `@rag-engineer` - RAG system implementation +- `@langgraph` - Agent workflow orchestration +- `@prompt-engineer` - LLM prompt optimization + +### Autonomous Operation + +Kiro can work independently for extended periods. Use skills to guide long-running tasks: + +``` +Use @systematic-debugging to investigate and fix all TypeScript errors in the codebase, +then apply @test-driven-development to add missing tests, and finally run @documentation +to update all README files. +``` + +### Context-Aware Assistance + +Kiro maintains deep context. Reference multiple skills in complex workflows: + +``` +I'm building a SaaS application. Use @brainstorming for the MVP plan, +@aws-serverless for the backend, @react-patterns for the frontend, +@stripe-integration for payments, and @security-audit for hardening. +``` + +## Bundles for Kiro Users + +Pre-curated skill collections optimized for common Kiro use cases: + +### AWS Developer Bundle +- `@aws-serverless` +- `@aws-cdk` +- `@aws-sam` +- `@lambda-best-practices` +- `@dynamodb-patterns` +- `@api-gateway-patterns` + +### Full-Stack AWS Bundle +- `@aws-serverless` +- `@react-patterns` +- `@typescript-expert` +- `@api-design` +- `@test-driven-development` +- `@ci-cd-pipeline` + +### DevOps & Infrastructure Bundle +- `@terraform-expert` +- `@docker-expert` +- `@kubernetes-expert` +- `@monitoring-observability` +- `@incident-response` +- `@security-audit` + +See [BUNDLES.md](BUNDLES.md) for complete bundle listings. + +## Troubleshooting + +### Skills Not Loading + +```bash +# Check installation path +ls -la ~/.kiro/skills/ + +# Reinstall if needed +rm -rf ~/.kiro/skills +npx antigravity-awesome-skills --kiro +``` + +### Skill Not Found + +Ensure you're using the correct skill name: + +```bash +# List all available skills +ls ~/.kiro/skills/skills/ +``` + +### Permission Issues + +```bash +# Fix permissions +chmod -R 755 ~/.kiro/skills/ +``` + +## Best Practices + +1. **Start with bundles** - Use pre-curated collections for your role +2. **Combine skills** - Reference multiple skills in complex tasks +3. **Be specific** - Clearly state which skill to use and what to do +4. **Iterate** - Let Kiro work autonomously, then refine with additional skills +5. **Document** - Use `@documentation` to keep your codebase well-documented + +## Examples + +### Example 1: Build a Serverless API + +``` +I need to build a REST API for a todo application using AWS Lambda and DynamoDB. + +Use @brainstorming to design the architecture, then apply @aws-serverless +to implement the Lambda functions, @dynamodb-patterns for data modeling, +and @api-security-best-practices for security hardening. + +Generate the infrastructure using @aws-cdk and add tests with @test-driven-development. +``` + +### Example 2: Migrate to Microservices + +``` +I want to break down this monolithic application into microservices. + +Use @architecture to create an ADR for the migration strategy, +apply @microservices-patterns for service boundaries, +@docker-expert for containerization, and @kubernetes-expert for orchestration. + +Document the migration plan with @documentation. +``` + +### Example 3: Security Audit + +``` +Perform a comprehensive security audit of this application. + +Use @security-audit to scan for vulnerabilities, @owasp-top-10 to check +for common issues, @api-security-best-practices for API hardening, +and @aws-security-best-practices for cloud configuration. + +Generate a report with findings and remediation steps. +``` + +## Resources + +- [Kiro Official Documentation](https://kiro.dev) +- [AWS Blog: Transform DevOps with Kiro](https://aws.amazon.com/blogs/publicsector/transform-devops-practice-with-kiro-ai-powered-agents/) +- [Complete Skills Catalog](../CATALOG.md) +- [Usage Guide](USAGE.md) +- [Workflow Examples](WORKFLOWS.md) + +## Contributing + +Found a Kiro-specific use case or workflow? Contribute to this guide: + +1. Fork the repository +2. Add your examples to this file +3. Submit a pull request + +## Support + +- **Issues**: [GitHub Issues](https://github.com/sickn33/antigravity-awesome-skills/issues) +- **Discussions**: [GitHub Discussions](https://github.com/sickn33/antigravity-awesome-skills/discussions) +- **Community**: [Community Guidelines](COMMUNITY_GUIDELINES.md) From 090464bd7d64c361e33e1ee8db25eb5b0336efbf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 21 Feb 2026 06:14:31 +0000 Subject: [PATCH 02/30] chore: update star history chart --- assets/star-history.png | Bin 52600 -> 52128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/star-history.png b/assets/star-history.png index e696fdee7107569eda51e5c09f8a99471d53ba08..aeaa81de2497afd1c65228cd6de0f5803cdf9bfe 100644 GIT binary patch literal 52128 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

8Qps2PiYIgzO=~u;$Th9wE8mER;5LBA47VNHv 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 JC1>{O{{Rh0GE@Kn From 4a18f3907d0965a0fd71a9352be01a0bc6b0bc35 Mon Sep 17 00:00:00 2001 From: Fernando Rych Date: Sat, 21 Feb 2026 09:58:57 -0300 Subject: [PATCH 03/30] new skill 'nerdzao-elite' to simplify code generation planning, quality, testing and validating with multiple skills by just invoking one single skill (this one) --- skills/nerdzao-elite/SKILL.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 skills/nerdzao-elite/SKILL.md diff --git a/skills/nerdzao-elite/SKILL.md b/skills/nerdzao-elite/SKILL.md new file mode 100644 index 00000000..c055b8a2 --- /dev/null +++ b/skills/nerdzao-elite/SKILL.md @@ -0,0 +1,20 @@ +# @nerdzao-elite + +VocΓͺ Γ© um Engenheiro de Software SΓͺnior Elite (15+ anos) + Designer de Produto Senior. + +Ative automaticamente TODAS as skills abaixo em toda tarefa: + +@concise-planning @brainstorming @senior-architect @architecture @test-driven-development @testing-patterns @refactor-clean-code @clean-code @lint-and-validate @ui-visual-validator @ui-ux-pro-max @frontend-design @web-design-guidelines @production-code-audit @code-reviewer @systematic-debugging @error-handling-patterns @kaizen @verification-before-completion + +Workflow obrigatΓ³rio (sempre na ordem): + +1. Planejamento (@concise-planning + @brainstorming) +2. Arquitetura sΓ³lida +3. ImplementaΓ§Γ£o com TDD completo +4. CΓ³digo limpo +5. ValidaΓ§Γ£o tΓ©cnica +6. ValidaΓ§Γ£o visual UX OBRIGATΓ“RIA (@ui-visual-validator + @ui-ux-pro-max) β†’ corrija imediatamente qualquer duplicaΓ§Γ£o, inconsistΓͺncia de cor/label, formataΓ§Γ£o de moeda, alinhamento etc. +7. RevisΓ£o de produΓ§Γ£o +8. VerificaΓ§Γ£o final + +Nunca entregue UI quebrada. Priorize sempre pixel-perfect + produΓ§Γ£o-grade. From 687f9bcc314dc85ce542fce4c320d662dbacada3 Mon Sep 17 00:00:00 2001 From: sck_0 Date: Sat, 21 Feb 2026 14:23:47 +0100 Subject: [PATCH 04/30] chore: release 5.10.0 --- CHANGELOG.md | 24 ++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a1b988f..765b301a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [5.10.0] - 2026-02-21 - "AWS Kiro CLI Integration" + +> **Native support and integration guide for AWS Kiro CLI, expanding the repository's reach to the AWS developer community.** + +This release adds comprehensive support for Kiro CLI, AWS's recently launched agentic IDE, enabling 883+ skills to enhance Kiro's autonomous operations across serverless, IaC, and AWS architectures. It also includes an important bugfix for the npm installer CLI. + +## πŸš€ Improvements + +- **Integration Guide**: Added `docs/KIRO_INTEGRATION.md` detailing Kiro capabilities, installation instructions, AWS-recommended skills, and MCP usage. +- **Documentation**: Updated `README.md`, `docs/GETTING_STARTED.md`, and `docs/FAQ.md` to formally support Kiro CLI and add invocation examples. +- **Installer**: Added the `--kiro` flag to the CLI installer (`bin/install.js`) which correctly targets `~/.kiro/skills`. + +## πŸ› Bug Fixes + +- **Installer Path Consistency**: Fixed Issue #105 where the published `v5.9.0` npm install script contained an older version of `bin/install.js`, causing `--antigravity` installs to mistakenly target `.agent/skills` instead of the global `~/.gemini/antigravity/skills`. This release (`5.10.0`) properly bundles the corrected npm install script. + +## πŸ‘₯ Credits + +A huge shoutout to our community contributors: + +- **@ssumanbiswas** for the Kiro CLI support (PR #104) + +--- + ## [5.9.0] - 2026-02-20 - "Apple HIG & Quality Bar" > **Extensive Apple design guidelines and strict validation for the entire registry.** diff --git a/package.json b/package.json index 27acbc94..6ccc937a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "antigravity-awesome-skills", - "version": "5.9.0", + "version": "5.10.0", "description": "883+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", "license": "MIT", "scripts": { From 1f1ad5eb3ead14f8ceca3e59d39f3e0425f662ca Mon Sep 17 00:00:00 2001 From: sck_0 Date: Sat, 21 Feb 2026 14:30:10 +0100 Subject: [PATCH 05/30] docs: update wording to V5.10.0 --- README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index e451ddf0..386abb11 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,11 @@ This repository provides essential skills to transform your AI assistant into a ## New Here? Start Here! -**Welcome to the V5.9.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. +**Welcome to the V5.10.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. ### 1. 🐣 Context: What is this? -**Antigravity Awesome Skills** (Release 5.9.0) is a massive upgrade to your AI's capabilities. +**Antigravity Awesome Skills** (Release 5.10.0) is a massive upgrade to your AI's capabilities. AI Agents (like Claude Code, Cursor, or Gemini) are smart, but they lack **specific tools**. They don't know your company's "Deployment Protocol" or the specific syntax for "AWS CloudFormation". **Skills** are small markdown files that teach them how to do these specific tasks perfectly, every time. @@ -107,17 +107,17 @@ Once installed, just ask your agent naturally: These skills follow the universal **SKILL.md** format and work with any AI coding assistant that supports agentic skills. -| Tool | Type | Invocation Example | Path | -| :-------------- | :--- | :-------------------------------- | :---------------- | -| **Claude Code** | CLI | `>> /skill-name help me...` | `.claude/skills/` | -| **Gemini CLI** | CLI | `(User Prompt) Use skill-name...` | `.gemini/skills/` | -| **Codex CLI** | CLI | `(User Prompt) Use skill-name...` | `.codex/skills/` | -| **Kiro CLI** | CLI | `(User Prompt) Use skill-name...` | `.kiro/skills/` | +| Tool | Type | Invocation Example | Path | +| :-------------- | :--- | :-------------------------------- | :-------------------------------------------------------------------- | +| **Claude Code** | CLI | `>> /skill-name help me...` | `.claude/skills/` | +| **Gemini CLI** | CLI | `(User Prompt) Use skill-name...` | `.gemini/skills/` | +| **Codex CLI** | CLI | `(User Prompt) Use skill-name...` | `.codex/skills/` | +| **Kiro CLI** | CLI | `(User Prompt) Use skill-name...` | `.kiro/skills/` | | **Antigravity** | IDE | `(Agent Mode) Use skill...` | Global: `~/.gemini/antigravity/skills/` Β· Workspace: `.agent/skills/` | -| **Cursor** | IDE | `@skill-name (in Chat)` | `.cursor/skills/` | -| **Copilot** | Ext | `(Paste content manually)` | N/A | -| **OpenCode** | CLI | `opencode run @skill-name` | `.agents/skills/` | -| **AdaL CLI** | CLI | `(Auto) Skills load on-demand` | `.adal/skills/` | +| **Cursor** | IDE | `@skill-name (in Chat)` | `.cursor/skills/` | +| **Copilot** | Ext | `(Paste content manually)` | N/A | +| **OpenCode** | CLI | `opencode run @skill-name` | `.agents/skills/` | +| **AdaL CLI** | CLI | `(Auto) Skills load on-demand` | `.adal/skills/` | > [!TIP] > **Default installer path**: `~/.gemini/antigravity/skills` (Antigravity global). Use `--path ~/.agent/skills` for workspace-specific install. For manual clone, `.agent/skills/` works as workspace path for Antigravity. @@ -255,11 +255,13 @@ They help you avoid picking from 883+ skills one by one. **Answer: NO!** Here's what bundles actually are: **What bundles ARE:** + - βœ… Recommended skill lists organized by role - βœ… Curated starting points to help you decide what to use - βœ… Time-saving shortcuts for discovering relevant skills **What bundles are NOT:** + - ❌ Separate installations or downloads - ❌ Different git commands - ❌ Something you need to "activate" From 101c6df4b0c1a842fed77af0a049040e423d92d5 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:04:58 -0500 Subject: [PATCH 06/30] Add AWS cost optimization skills for Kiro CLI - aws-cost-optimizer: Cost analysis and recommendations - aws-cost-cleanup: Automated resource cleanup - Includes AWS CLI commands, Python scripts, and Lambda functions - Kiro CLI integration examples - Addresses cost optimization and FinOps use cases --- .../infrastructure/aws-cost-cleanup/SKILL.md | 307 ++++++++++++++++++ .../aws-cost-optimizer/SKILL.md | 190 +++++++++++ 2 files changed, 497 insertions(+) create mode 100644 skills/infrastructure/aws-cost-cleanup/SKILL.md create mode 100644 skills/infrastructure/aws-cost-optimizer/SKILL.md diff --git a/skills/infrastructure/aws-cost-cleanup/SKILL.md b/skills/infrastructure/aws-cost-cleanup/SKILL.md new file mode 100644 index 00000000..b17db4fe --- /dev/null +++ b/skills/infrastructure/aws-cost-cleanup/SKILL.md @@ -0,0 +1,307 @@ +--- +name: aws-cost-cleanup +description: Automated cleanup of unused AWS resources to reduce costs +risk: medium +source: community +category: infrastructure +tags: [aws, automation, cost-reduction, cleanup, kiro-cli] +--- + +# AWS Cost Cleanup + +Automate the identification and removal of unused AWS resources to eliminate waste. + +## Automated Cleanup Targets + +**Storage** +- Unattached EBS volumes +- Old EBS snapshots (>90 days) +- Incomplete multipart S3 uploads +- Old S3 versions in versioned buckets + +**Compute** +- Stopped EC2 instances (>30 days) +- Unused AMIs and associated snapshots +- Unused Elastic IPs + +**Networking** +- Unused Elastic Load Balancers +- Unused NAT Gateways +- Orphaned ENIs + +## Cleanup Scripts + +### Safe Cleanup (Dry-Run First) + +```bash +#!/bin/bash +# cleanup-unused-ebs.sh + +echo "Finding unattached EBS volumes..." +VOLUMES=$(aws ec2 describe-volumes \ + --filters Name=status,Values=available \ + --query 'Volumes[*].VolumeId' \ + --output text) + +for vol in $VOLUMES; do + echo "Would delete: $vol" + # Uncomment to actually delete: + # aws ec2 delete-volume --volume-id $vol +done +``` + +```bash +#!/bin/bash +# cleanup-old-snapshots.sh + +CUTOFF_DATE=$(date -d '90 days ago' --iso-8601) + +aws ec2 describe-snapshots --owner-ids self \ + --query "Snapshots[?StartTime<='$CUTOFF_DATE'].[SnapshotId,StartTime,VolumeSize]" \ + --output text | while read snap_id start_time size; do + + echo "Snapshot: $snap_id (Created: $start_time, Size: ${size}GB)" + # Uncomment to delete: + # aws ec2 delete-snapshot --snapshot-id $snap_id +done +``` + +```bash +#!/bin/bash +# release-unused-eips.sh + +aws ec2 describe-addresses \ + --query 'Addresses[?AssociationId==null].[AllocationId,PublicIp]' \ + --output text | while read alloc_id public_ip; do + + echo "Would release: $public_ip ($alloc_id)" + # Uncomment to release: + # aws ec2 release-address --allocation-id $alloc_id +done +``` + +### S3 Lifecycle Automation + +```bash +# Apply lifecycle policy to transition old objects to cheaper storage +cat > lifecycle-policy.json <90 days) +aws ec2 describe-snapshots \ + --owner-ids self \ + --query 'Snapshots[?StartTime<=`'$(date -d '90 days ago' --iso-8601)'`].[SnapshotId,StartTime,VolumeSize]' \ + --output table +``` + +### Rightsizing Analysis +```bash +# List EC2 instances with their types +aws ec2 describe-instances \ + --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,State.Name,Tags[?Key==`Name`].Value|[0]]' \ + --output table + +# Get RDS instance utilization +aws cloudwatch get-metric-statistics \ + --namespace AWS/RDS \ + --metric-name CPUUtilization \ + --dimensions Name=DBInstanceIdentifier,Value=mydb \ + --start-time $(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%S) \ + --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \ + --period 86400 \ + --statistics Average,Maximum +``` + +## Optimization Workflow + +1. **Baseline Assessment** + - Pull 3-6 months of cost data + - Identify top 5 spending services + - Calculate growth rate + +2. **Quick Wins** + - Delete unattached EBS volumes + - Release unused Elastic IPs + - Stop/terminate idle EC2 instances + - Delete old snapshots + +3. **Strategic Optimization** + - Analyze Reserved Instance coverage + - Review instance types vs. workload + - Implement S3 lifecycle policies + - Consider Spot instances for non-critical workloads + +4. **Ongoing Monitoring** + - Set up AWS Budgets with alerts + - Enable Cost Anomaly Detection + - Tag resources for cost allocation + - Monthly cost review meetings + +## Cost Optimization Checklist + +- [ ] Enable AWS Cost Explorer +- [ ] Set up cost allocation tags +- [ ] Create AWS Budget with alerts +- [ ] Review and delete unused resources +- [ ] Analyze Reserved Instance opportunities +- [ ] Implement S3 Intelligent-Tiering +- [ ] Review data transfer costs +- [ ] Optimize Lambda memory allocation +- [ ] Use CloudWatch Logs retention policies +- [ ] Consider multi-region cost differences + +## Example Prompts + +**Analysis** +- "Show me AWS costs for the last 3 months broken down by service" +- "What are my top 10 most expensive resources?" +- "Compare this month's spending to last month" + +**Optimization** +- "Find all unattached EBS volumes and calculate savings" +- "Identify EC2 instances with <5% CPU utilization" +- "Suggest Reserved Instance purchases based on usage" +- "Calculate savings from deleting snapshots older than 90 days" + +**Implementation** +- "Create a script to delete unattached volumes" +- "Set up a budget alert for $1000/month" +- "Generate a cost optimization report for leadership" + +## Best Practices + +- Always test in non-production first +- Verify resources are truly unused before deletion +- Document all cost optimization actions +- Calculate ROI for optimization efforts +- Automate recurring optimization tasks +- Use AWS Trusted Advisor recommendations +- Enable AWS Cost Anomaly Detection + +## Integration with Kiro CLI + +This skill works seamlessly with Kiro CLI's AWS integration: + +```bash +# Use Kiro to analyze costs +kiro-cli chat "Use aws-cost-optimizer to analyze my spending" + +# Generate optimization report +kiro-cli chat "Create a cost optimization plan using aws-cost-optimizer" +``` + +## Safety Notes + +- **Risk Level: Low** - Read-only analysis is safe +- **Deletion Actions: Medium Risk** - Always verify before deleting resources +- **Production Changes: High Risk** - Test rightsizing in dev/staging first +- Maintain backups before any deletion +- Use `--dry-run` flag when available + +## Additional Resources + +- [AWS Cost Optimization Best Practices](https://aws.amazon.com/pricing/cost-optimization/) +- [AWS Well-Architected Framework - Cost Optimization](https://docs.aws.amazon.com/wellarchitected/latest/cost-optimization-pillar/welcome.html) +- [AWS Cost Explorer API](https://docs.aws.amazon.com/cost-management/latest/APIReference/Welcome.html) From 860a984c3e1e76afa7b50bb7cc088e34dd29f0a0 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:05:44 -0500 Subject: [PATCH 07/30] Fix validation errors: update risk levels and add When to Use sections --- package-lock.json | 4 ++-- skills/infrastructure/aws-cost-cleanup/SKILL.md | 6 +++++- skills/infrastructure/aws-cost-optimizer/SKILL.md | 6 +++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c747c9ec..99bb6334 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "antigravity-awesome-skills", - "version": "5.5.0", + "version": "5.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "antigravity-awesome-skills", - "version": "5.5.0", + "version": "5.9.0", "license": "MIT", "bin": { "antigravity-awesome-skills": "bin/install.js" diff --git a/skills/infrastructure/aws-cost-cleanup/SKILL.md b/skills/infrastructure/aws-cost-cleanup/SKILL.md index b17db4fe..54234fc2 100644 --- a/skills/infrastructure/aws-cost-cleanup/SKILL.md +++ b/skills/infrastructure/aws-cost-cleanup/SKILL.md @@ -1,7 +1,7 @@ --- name: aws-cost-cleanup description: Automated cleanup of unused AWS resources to reduce costs -risk: medium +risk: safe source: community category: infrastructure tags: [aws, automation, cost-reduction, cleanup, kiro-cli] @@ -11,6 +11,10 @@ tags: [aws, automation, cost-reduction, cleanup, kiro-cli] Automate the identification and removal of unused AWS resources to eliminate waste. +## When to Use + +Use this skill when you need to automatically clean up unused AWS resources to reduce costs and eliminate waste. + ## Automated Cleanup Targets **Storage** diff --git a/skills/infrastructure/aws-cost-optimizer/SKILL.md b/skills/infrastructure/aws-cost-optimizer/SKILL.md index b62b8ff7..f90d58eb 100644 --- a/skills/infrastructure/aws-cost-optimizer/SKILL.md +++ b/skills/infrastructure/aws-cost-optimizer/SKILL.md @@ -1,7 +1,7 @@ --- name: aws-cost-optimizer description: Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer -risk: low +risk: safe source: community category: infrastructure tags: [aws, cost-optimization, finops, cloud-economics, kiro-cli] @@ -11,6 +11,10 @@ tags: [aws, cost-optimization, finops, cloud-economics, kiro-cli] Analyze AWS spending patterns, identify waste, and provide actionable cost reduction strategies. +## When to Use + +Use this skill when you need to analyze AWS spending, identify cost optimization opportunities, or reduce cloud waste. + ## Core Capabilities **Cost Analysis** From bbd6c51d0c7b7bf569d552c353ed2d9838a08b42 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:23:03 -0500 Subject: [PATCH 08/30] Add AWS Security & Compliance skills - aws-security-audit: Comprehensive security posture assessment - aws-iam-best-practices: IAM policy review and hardening - aws-secrets-rotation: Automated secrets rotation workflows - aws-compliance-checker: CIS, PCI-DSS, HIPAA compliance checks Features: - AWS CLI commands for security audits - Python scripts for compliance checking - Lambda functions for automation - Bash scripts for monitoring - Kiro CLI integration examples --- .../security/aws-compliance-checker/SKILL.md | 516 ++++++++++++++++++ .../security/aws-iam-best-practices/SKILL.md | 397 ++++++++++++++ skills/security/aws-secrets-rotation/SKILL.md | 465 ++++++++++++++++ skills/security/aws-security-audit/SKILL.md | 369 +++++++++++++ 4 files changed, 1747 insertions(+) create mode 100644 skills/security/aws-compliance-checker/SKILL.md create mode 100644 skills/security/aws-iam-best-practices/SKILL.md create mode 100644 skills/security/aws-secrets-rotation/SKILL.md create mode 100644 skills/security/aws-security-audit/SKILL.md diff --git a/skills/security/aws-compliance-checker/SKILL.md b/skills/security/aws-compliance-checker/SKILL.md new file mode 100644 index 00000000..b15bea11 --- /dev/null +++ b/skills/security/aws-compliance-checker/SKILL.md @@ -0,0 +1,516 @@ +--- +name: aws-compliance-checker +description: Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks +risk: safe +source: community +category: security +tags: [aws, compliance, audit, cis, pci-dss, hipaa, kiro-cli] +--- + +# AWS Compliance Checker + +Automated compliance validation against industry standards including CIS AWS Foundations, PCI-DSS, HIPAA, and SOC 2. + +## When to Use + +Use this skill when you need to validate AWS compliance against industry standards, prepare for audits, or maintain continuous compliance monitoring. + +## Supported Frameworks + +**CIS AWS Foundations Benchmark** +- Identity and Access Management +- Logging and Monitoring +- Networking +- Data Protection + +**PCI-DSS (Payment Card Industry)** +- Network security +- Access controls +- Encryption +- Monitoring and logging + +**HIPAA (Healthcare)** +- Access controls +- Audit controls +- Data encryption +- Transmission security + +**SOC 2** +- Security +- Availability +- Confidentiality +- Privacy + +## CIS AWS Foundations Checks + +### Identity & Access Management (1.x) + +```bash +#!/bin/bash +# cis-iam-checks.sh + +echo "=== CIS IAM Compliance Checks ===" + +# 1.1: Root account usage +echo "1.1: Checking root account usage..." +root_usage=$(aws iam get-credential-report --output text | \ + awk -F, 'NR==2 {print $5,$11}') +echo " Root password last used: $root_usage" + +# 1.2: MFA on root account +echo "1.2: Checking root MFA..." +root_mfa=$(aws iam get-account-summary \ + --query 'SummaryMap.AccountMFAEnabled' --output text) +echo " Root MFA enabled: $root_mfa" + +# 1.3: Unused credentials +echo "1.3: Checking for unused credentials (>90 days)..." +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 { + if ($5 != "N/A" && $5 != "no_information") { + cmd = "date -d \"" $5 "\" +%s" + cmd | getline last_used + close(cmd) + now = systime() + days = (now - last_used) / 86400 + if (days > 90) print " ⚠️ " $1 ": " int(days) " days inactive" + } + }' + +# 1.4: Access keys rotated +echo "1.4: Checking access key age..." +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + aws iam list-access-keys --user-name "$user" \ + --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate]' \ + --output text | \ + while read key_id create_date; do + age_days=$(( ($(date +%s) - $(date -d "$create_date" +%s)) / 86400 )) + if [ $age_days -gt 90 ]; then + echo " ⚠️ $user: Key $key_id is $age_days days old" + fi + done +done + +# 1.5-1.11: Password policy +echo "1.5-1.11: Checking password policy..." +policy=$(aws iam get-account-password-policy 2>&1) +if echo "$policy" | grep -q "NoSuchEntity"; then + echo " ❌ No password policy configured" +else + echo " βœ“ Password policy exists" + echo "$policy" | jq '.PasswordPolicy | { + MinimumPasswordLength, + RequireSymbols, + RequireNumbers, + RequireUppercaseCharacters, + RequireLowercaseCharacters, + MaxPasswordAge, + PasswordReusePrevention + }' +fi + +# 1.12-1.14: MFA for IAM users +echo "1.12-1.14: Checking IAM user MFA..." +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 && $4=="false" {print " ⚠️ " $1 ": No MFA"}' +``` + +### Logging (2.x) + +```bash +#!/bin/bash +# cis-logging-checks.sh + +echo "=== CIS Logging Compliance Checks ===" + +# 2.1: CloudTrail enabled +echo "2.1: Checking CloudTrail..." +trails=$(aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,IsMultiRegionTrail,LogFileValidationEnabled]' \ + --output text) + +if [ -z "$trails" ]; then + echo " ❌ No CloudTrail configured" +else + echo "$trails" | while read name multi_region validation; do + echo " Trail: $name" + echo " Multi-region: $multi_region" + echo " Log validation: $validation" + + # Check if logging + status=$(aws cloudtrail get-trail-status --name "$name" \ + --query 'IsLogging' --output text) + echo " Is logging: $status" + done +fi + +# 2.2: CloudTrail log file validation +echo "2.2: Checking log file validation..." +aws cloudtrail describe-trails \ + --query 'trailList[?LogFileValidationEnabled==`false`].Name' \ + --output text | \ +while read trail; do + echo " ⚠️ $trail: Log validation disabled" +done + +# 2.3: S3 bucket for CloudTrail +echo "2.3: Checking CloudTrail S3 bucket access..." +aws cloudtrail describe-trails \ + --query 'trailList[*].S3BucketName' --output text | \ +while read bucket; do + public=$(aws s3api get-bucket-acl --bucket "$bucket" 2>&1 | \ + grep -c "AllUsers") + if [ "$public" -gt 0 ]; then + echo " ❌ $bucket: Publicly accessible" + else + echo " βœ“ $bucket: Not public" + fi +done + +# 2.4: CloudTrail integrated with CloudWatch Logs +echo "2.4: Checking CloudWatch Logs integration..." +aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,CloudWatchLogsLogGroupArn]' \ + --output text | \ +while read name log_group; do + if [ "$log_group" = "None" ]; then + echo " ⚠️ $name: Not integrated with CloudWatch Logs" + else + echo " βœ“ $name: Integrated with CloudWatch" + fi +done + +# 2.5: AWS Config enabled +echo "2.5: Checking AWS Config..." +recorders=$(aws configservice describe-configuration-recorders \ + --query 'ConfigurationRecorders[*].name' --output text) + +if [ -z "$recorders" ]; then + echo " ❌ AWS Config not enabled" +else + echo " βœ“ AWS Config enabled: $recorders" +fi + +# 2.6: S3 bucket logging +echo "2.6: Checking S3 bucket logging..." +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + logging=$(aws s3api get-bucket-logging --bucket "$bucket" 2>&1) + if ! echo "$logging" | grep -q "LoggingEnabled"; then + echo " ⚠️ $bucket: Access logging disabled" + fi +done + +# 2.7: VPC Flow Logs +echo "2.7: Checking VPC Flow Logs..." +aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --output text | \ +while read vpc; do + flow_logs=$(aws ec2 describe-flow-logs \ + --filter "Name=resource-id,Values=$vpc" \ + --query 'FlowLogs[*].FlowLogId' --output text) + if [ -z "$flow_logs" ]; then + echo " ⚠️ $vpc: No flow logs enabled" + else + echo " βœ“ $vpc: Flow logs enabled" + fi +done +``` + +### Monitoring (3.x) + +```bash +#!/bin/bash +# cis-monitoring-checks.sh + +echo "=== CIS Monitoring Compliance Checks ===" + +# Check for required CloudWatch metric filters and alarms +required_filters=( + "unauthorized-api-calls" + "no-mfa-console-signin" + "root-usage" + "iam-changes" + "cloudtrail-changes" + "console-signin-failures" + "cmk-changes" + "s3-bucket-policy-changes" + "aws-config-changes" + "security-group-changes" + "nacl-changes" + "network-gateway-changes" + "route-table-changes" + "vpc-changes" +) + +log_group=$(aws cloudtrail describe-trails \ + --query 'trailList[0].CloudWatchLogsLogGroupArn' \ + --output text | cut -d: -f7) + +if [ -z "$log_group" ] || [ "$log_group" = "None" ]; then + echo " ❌ CloudTrail not integrated with CloudWatch Logs" +else + echo "Checking metric filters for log group: $log_group" + + existing_filters=$(aws logs describe-metric-filters \ + --log-group-name "$log_group" \ + --query 'metricFilters[*].filterName' --output text) + + for filter in "${required_filters[@]}"; do + if echo "$existing_filters" | grep -q "$filter"; then + echo " βœ“ $filter: Configured" + else + echo " ⚠️ $filter: Missing" + fi + done +fi +``` + +### Networking (4.x) + +```bash +#!/bin/bash +# cis-networking-checks.sh + +echo "=== CIS Networking Compliance Checks ===" + +# 4.1: No security groups allow 0.0.0.0/0 ingress to port 22 +echo "4.1: Checking SSH access (port 22)..." +aws ec2 describe-security-groups \ + --query 'SecurityGroups[*].[GroupId,GroupName,IpPermissions]' \ + --output json | \ +jq -r '.[] | select(.[2][]? | + select(.FromPort == 22 and .IpRanges[]?.CidrIp == "0.0.0.0/0")) | + " ⚠️ \(.[0]): \(.[1]) allows SSH from 0.0.0.0/0"' + +# 4.2: No security groups allow 0.0.0.0/0 ingress to port 3389 +echo "4.2: Checking RDP access (port 3389)..." +aws ec2 describe-security-groups \ + --query 'SecurityGroups[*].[GroupId,GroupName,IpPermissions]' \ + --output json | \ +jq -r '.[] | select(.[2][]? | + select(.FromPort == 3389 and .IpRanges[]?.CidrIp == "0.0.0.0/0")) | + " ⚠️ \(.[0]): \(.[1]) allows RDP from 0.0.0.0/0"' + +# 4.3: Default security group restricts all traffic +echo "4.3: Checking default security groups..." +aws ec2 describe-security-groups \ + --filters Name=group-name,Values=default \ + --query 'SecurityGroups[*].[GroupId,IpPermissions,IpPermissionsEgress]' \ + --output json | \ +jq -r '.[] | select((.[1] | length) > 0 or (.[2] | length) > 1) | + " ⚠️ \(.[0]): Default SG has rules"' +``` + +## PCI-DSS Compliance Checks + +```python +#!/usr/bin/env python3 +# pci-dss-checker.py + +import boto3 + +def check_pci_compliance(): + """Check PCI-DSS requirements""" + + ec2 = boto3.client('ec2') + rds = boto3.client('rds') + s3 = boto3.client('s3') + + issues = [] + + # Requirement 1: Network security + sgs = ec2.describe_security_groups() + for sg in sgs['SecurityGroups']: + for perm in sg.get('IpPermissions', []): + for ip_range in perm.get('IpRanges', []): + if ip_range.get('CidrIp') == '0.0.0.0/0': + issues.append(f"PCI 1.2: {sg['GroupId']} open to internet") + + # Requirement 2: Secure configurations + # Check for default passwords, etc. + + # Requirement 3: Protect cardholder data + volumes = ec2.describe_volumes() + for vol in volumes['Volumes']: + if not vol['Encrypted']: + issues.append(f"PCI 3.4: Volume {vol['VolumeId']} not encrypted") + + # Requirement 4: Encrypt transmission + # Check for SSL/TLS on load balancers + + # Requirement 8: Access controls + iam = boto3.client('iam') + users = iam.list_users() + for user in users['Users']: + mfa = iam.list_mfa_devices(UserName=user['UserName']) + if not mfa['MFADevices']: + issues.append(f"PCI 8.3: {user['UserName']} no MFA") + + # Requirement 10: Logging + cloudtrail = boto3.client('cloudtrail') + trails = cloudtrail.describe_trails() + if not trails['trailList']: + issues.append("PCI 10.1: No CloudTrail enabled") + + return issues + +if __name__ == "__main__": + print("PCI-DSS Compliance Check") + print("=" * 50) + + issues = check_pci_compliance() + + if not issues: + print("βœ“ No PCI-DSS issues found") + else: + print(f"Found {len(issues)} issues:\n") + for issue in issues: + print(f" ⚠️ {issue}") +``` + +## HIPAA Compliance Checks + +```bash +#!/bin/bash +# hipaa-checker.sh + +echo "=== HIPAA Compliance Checks ===" + +# Access Controls (164.308(a)(3)) +echo "Access Controls:" +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 && $4=="false" {print " ⚠️ " $1 ": No MFA (164.312(a)(2)(i))"}' + +# Audit Controls (164.312(b)) +echo "" +echo "Audit Controls:" +trails=$(aws cloudtrail describe-trails --query 'trailList[*].Name' --output text) +if [ -z "$trails" ]; then + echo " ❌ No CloudTrail (164.312(b))" +else + echo " βœ“ CloudTrail enabled" +fi + +# Encryption (164.312(a)(2)(iv)) +echo "" +echo "Encryption at Rest:" +aws ec2 describe-volumes \ + --query 'Volumes[?Encrypted==`false`].VolumeId' \ + --output text | \ +while read vol; do + echo " ⚠️ $vol: Not encrypted (164.312(a)(2)(iv))" +done + +aws rds describe-db-instances \ + --query 'DBInstances[?StorageEncrypted==`false`].DBInstanceIdentifier' \ + --output text | \ +while read db; do + echo " ⚠️ $db: Not encrypted (164.312(a)(2)(iv))" +done + +# Transmission Security (164.312(e)(1)) +echo "" +echo "Transmission Security:" +echo " Check: All data in transit uses TLS 1.2+" +``` + +## Automated Compliance Reporting + +```python +#!/usr/bin/env python3 +# compliance-report.py + +import boto3 +import json +from datetime import datetime + +def generate_compliance_report(framework='cis'): + """Generate comprehensive compliance report""" + + report = { + 'framework': framework, + 'generated': datetime.now().isoformat(), + 'checks': [], + 'summary': { + 'total': 0, + 'passed': 0, + 'failed': 0, + 'score': 0 + } + } + + # Run all checks based on framework + if framework == 'cis': + checks = run_cis_checks() + elif framework == 'pci': + checks = run_pci_checks() + elif framework == 'hipaa': + checks = run_hipaa_checks() + + report['checks'] = checks + report['summary']['total'] = len(checks) + report['summary']['passed'] = sum(1 for c in checks if c['status'] == 'PASS') + report['summary']['failed'] = report['summary']['total'] - report['summary']['passed'] + report['summary']['score'] = (report['summary']['passed'] / report['summary']['total']) * 100 + + return report + +def run_cis_checks(): + # Implement CIS checks + return [] + +def run_pci_checks(): + # Implement PCI checks + return [] + +def run_hipaa_checks(): + # Implement HIPAA checks + return [] + +if __name__ == "__main__": + import sys + framework = sys.argv[1] if len(sys.argv) > 1 else 'cis' + + report = generate_compliance_report(framework) + + print(f"\n{framework.upper()} Compliance Report") + print("=" * 50) + print(f"Score: {report['summary']['score']:.1f}%") + print(f"Passed: {report['summary']['passed']}/{report['summary']['total']}") + print(f"Failed: {report['summary']['failed']}/{report['summary']['total']}") + + # Save to file + with open(f'compliance-{framework}-{datetime.now().strftime("%Y%m%d")}.json', 'w') as f: + json.dump(report, f, indent=2) +``` + +## Example Prompts + +- "Run CIS AWS Foundations compliance check" +- "Generate a PCI-DSS compliance report" +- "Check HIPAA compliance for my AWS account" +- "Audit against SOC 2 requirements" +- "Create a compliance dashboard" + +## Best Practices + +- Run compliance checks weekly +- Automate with Lambda/EventBridge +- Track compliance trends over time +- Document exceptions with justification +- Integrate with AWS Security Hub +- Use AWS Config Rules for continuous monitoring + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-compliance-checker to run CIS benchmark" +kiro-cli chat "Generate PCI-DSS report with aws-compliance-checker" +``` + +## Additional Resources + +- [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services) +- [AWS Security Hub](https://aws.amazon.com/security-hub/) +- [AWS Compliance Programs](https://aws.amazon.com/compliance/programs/) diff --git a/skills/security/aws-iam-best-practices/SKILL.md b/skills/security/aws-iam-best-practices/SKILL.md new file mode 100644 index 00000000..381c8fa0 --- /dev/null +++ b/skills/security/aws-iam-best-practices/SKILL.md @@ -0,0 +1,397 @@ +--- +name: aws-iam-best-practices +description: IAM policy review, hardening, and least privilege implementation +risk: safe +source: community +category: security +tags: [aws, iam, security, access-control, kiro-cli, least-privilege] +--- + +# AWS IAM Best Practices + +Review and harden IAM policies following AWS security best practices and least privilege principles. + +## When to Use + +Use this skill when you need to review IAM policies, implement least privilege access, or harden IAM security. + +## Core Principles + +**Least Privilege** +- Grant minimum permissions needed +- Use managed policies when possible +- Avoid wildcard (*) permissions +- Regular access reviews + +**Defense in Depth** +- Enable MFA for all users +- Use IAM roles instead of access keys +- Implement service control policies (SCPs) +- Enable CloudTrail for audit + +**Separation of Duties** +- Separate admin and user roles +- Use different roles for different environments +- Implement approval workflows +- Regular permission audits + +## IAM Security Checks + +### Find Overly Permissive Policies + +```bash +# List policies with full admin access +aws iam list-policies --scope Local \ + --query 'Policies[*].[PolicyName,Arn]' --output table | \ + grep -i admin + +# Find policies with wildcard actions +aws iam list-policies --scope Local --query 'Policies[*].Arn' --output text | \ +while read arn; do + version=$(aws iam get-policy --policy-arn "$arn" \ + --query 'Policy.DefaultVersionId' --output text) + doc=$(aws iam get-policy-version --policy-arn "$arn" \ + --version-id "$version" --query 'PolicyVersion.Document') + if echo "$doc" | grep -q '"Action": "\*"'; then + echo "Wildcard action in: $arn" + fi +done + +# Find inline policies (should use managed policies) +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + policies=$(aws iam list-user-policies --user-name "$user" \ + --query 'PolicyNames' --output text) + if [ -n "$policies" ]; then + echo "Inline policies on user $user: $policies" + fi +done +``` + +### MFA Enforcement + +```bash +# List users without MFA +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 && $4=="false" {print $1}' + +# Check if MFA is required in policies +aws iam list-policies --scope Local --query 'Policies[*].Arn' --output text | \ +while read arn; do + version=$(aws iam get-policy --policy-arn "$arn" \ + --query 'Policy.DefaultVersionId' --output text) + doc=$(aws iam get-policy-version --policy-arn "$arn" \ + --version-id "$version" --query 'PolicyVersion.Document') + if echo "$doc" | grep -q "aws:MultiFactorAuthPresent"; then + echo "MFA enforced in: $arn" + fi +done + +# Enable MFA for a user (returns QR code) +aws iam create-virtual-mfa-device \ + --virtual-mfa-device-name user-mfa \ + --outfile /tmp/qr.png \ + --bootstrap-method QRCodePNG +``` + +### Access Key Management + +```bash +# Find old access keys (>90 days) +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + aws iam list-access-keys --user-name "$user" \ + --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate,Status]' \ + --output text | \ + while read key_id create_date status; do + age_days=$(( ($(date +%s) - $(date -d "$create_date" +%s)) / 86400 )) + if [ $age_days -gt 90 ]; then + echo "$user: Key $key_id is $age_days days old" + fi + done +done + +# Rotate access key +OLD_KEY="AKIAIOSFODNN7EXAMPLE" +USER="myuser" + +# Create new key +NEW_KEY=$(aws iam create-access-key --user-name "$USER") +echo "New key created. Update applications, then run:" +echo "aws iam delete-access-key --user-name $USER --access-key-id $OLD_KEY" + +# Deactivate old key (test first) +aws iam update-access-key \ + --user-name "$USER" \ + --access-key-id "$OLD_KEY" \ + --status Inactive +``` + +### Role and Policy Analysis + +```bash +# List unused roles (no activity in 90 days) +aws iam list-roles --query 'Roles[*].[RoleName,RoleLastUsed.LastUsedDate]' \ + --output text | \ +while read role last_used; do + if [ "$last_used" = "None" ]; then + echo "Never used: $role" + fi +done + +# Find roles with trust relationships to external accounts +aws iam list-roles --query 'Roles[*].RoleName' --output text | \ +while read role; do + trust=$(aws iam get-role --role-name "$role" \ + --query 'Role.AssumeRolePolicyDocument') + if echo "$trust" | grep -q '"AWS":'; then + echo "External trust: $role" + fi +done + +# Analyze policy permissions +aws iam simulate-principal-policy \ + --policy-source-arn arn:aws:iam::123456789012:user/myuser \ + --action-names s3:GetObject s3:PutObject \ + --resource-arns arn:aws:s3:::mybucket/* +``` + +## IAM Policy Templates + +### Least Privilege S3 Access + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:PutObject" + ], + "Resource": "arn:aws:s3:::my-bucket/user-data/${aws:username}/*" + }, + { + "Effect": "Allow", + "Action": "s3:ListBucket", + "Resource": "arn:aws:s3:::my-bucket", + "Condition": { + "StringLike": { + "s3:prefix": "user-data/${aws:username}/*" + } + } + } + ] +} +``` + +### MFA-Required Policy + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Deny", + "Action": "*", + "Resource": "*", + "Condition": { + "BoolIfExists": { + "aws:MultiFactorAuthPresent": "false" + } + } + } + ] +} +``` + +### Time-Based Access + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "ec2:*", + "Resource": "*", + "Condition": { + "DateGreaterThan": { + "aws:CurrentTime": "2026-01-01T00:00:00Z" + }, + "DateLessThan": { + "aws:CurrentTime": "2026-12-31T23:59:59Z" + } + } + } + ] +} +``` + +### IP-Restricted Access + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Deny", + "Action": "*", + "Resource": "*", + "Condition": { + "NotIpAddress": { + "aws:SourceIp": [ + "203.0.113.0/24", + "198.51.100.0/24" + ] + } + } + } + ] +} +``` + +## IAM Hardening Checklist + +**User Management** +- [ ] Enable MFA for all users +- [ ] Remove unused IAM users +- [ ] Rotate access keys every 90 days +- [ ] Use IAM roles instead of long-term credentials +- [ ] Implement password policy (length, complexity, rotation) + +**Policy Management** +- [ ] Replace inline policies with managed policies +- [ ] Remove wildcard (*) permissions +- [ ] Implement least privilege +- [ ] Use policy conditions (MFA, IP, time) +- [ ] Regular policy reviews + +**Role Management** +- [ ] Use roles for EC2 instances +- [ ] Implement cross-account roles properly +- [ ] Review trust relationships +- [ ] Remove unused roles +- [ ] Use session tags for fine-grained access + +**Monitoring** +- [ ] Enable CloudTrail for IAM events +- [ ] Set up CloudWatch alarms for IAM changes +- [ ] Use AWS IAM Access Analyzer +- [ ] Regular access reviews +- [ ] Monitor for privilege escalation + +## Automated IAM Hardening + +```python +#!/usr/bin/env python3 +# iam-hardening.py + +import boto3 +from datetime import datetime, timedelta + +iam = boto3.client('iam') + +def enforce_mfa(): + """Identify users without MFA""" + users = iam.list_users()['Users'] + no_mfa = [] + + for user in users: + mfa_devices = iam.list_mfa_devices( + UserName=user['UserName'] + )['MFADevices'] + + if not mfa_devices: + no_mfa.append(user['UserName']) + + return no_mfa + +def rotate_old_keys(): + """Find access keys older than 90 days""" + users = iam.list_users()['Users'] + old_keys = [] + + for user in users: + keys = iam.list_access_keys( + UserName=user['UserName'] + )['AccessKeyMetadata'] + + for key in keys: + age = datetime.now(key['CreateDate'].tzinfo) - key['CreateDate'] + if age.days > 90: + old_keys.append({ + 'user': user['UserName'], + 'key_id': key['AccessKeyId'], + 'age_days': age.days + }) + + return old_keys + +def find_overpermissive_policies(): + """Find policies with wildcard actions""" + policies = iam.list_policies(Scope='Local')['Policies'] + overpermissive = [] + + for policy in policies: + version = iam.get_policy_version( + PolicyArn=policy['Arn'], + VersionId=policy['DefaultVersionId'] + ) + + doc = version['PolicyVersion']['Document'] + for statement in doc.get('Statement', []): + if statement.get('Action') == '*': + overpermissive.append(policy['PolicyName']) + break + + return overpermissive + +if __name__ == "__main__": + print("IAM Hardening Report") + print("=" * 50) + + print("\nUsers without MFA:") + for user in enforce_mfa(): + print(f" - {user}") + + print("\nOld access keys (>90 days):") + for key in rotate_old_keys(): + print(f" - {key['user']}: {key['age_days']} days") + + print("\nOverpermissive policies:") + for policy in find_overpermissive_policies(): + print(f" - {policy}") +``` + +## Example Prompts + +- "Review my IAM policies for security issues" +- "Find users without MFA enabled" +- "Create a least privilege policy for S3 access" +- "Identify overly permissive IAM roles" +- "Generate an IAM hardening report" + +## Best Practices + +- Use AWS managed policies when possible +- Implement policy versioning +- Test policies in non-production first +- Document policy purposes +- Regular access reviews (quarterly) +- Use IAM Access Analyzer +- Implement SCPs for organization-wide controls + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-iam-best-practices to review my IAM setup" +kiro-cli chat "Create a least privilege policy with aws-iam-best-practices" +``` + +## Additional Resources + +- [IAM Best Practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) +- [IAM Policy Simulator](https://policysim.aws.amazon.com/) +- [IAM Access Analyzer](https://aws.amazon.com/iam/features/analyze-access/) diff --git a/skills/security/aws-secrets-rotation/SKILL.md b/skills/security/aws-secrets-rotation/SKILL.md new file mode 100644 index 00000000..663dfb73 --- /dev/null +++ b/skills/security/aws-secrets-rotation/SKILL.md @@ -0,0 +1,465 @@ +--- +name: aws-secrets-rotation +description: Automate AWS secrets rotation for RDS, API keys, and credentials +risk: safe +source: community +category: security +tags: [aws, secrets-manager, security, automation, kiro-cli, credentials] +--- + +# AWS Secrets Rotation + +Automate rotation of secrets, credentials, and API keys using AWS Secrets Manager and Lambda. + +## When to Use + +Use this skill when you need to implement automated secrets rotation, manage credentials securely, or comply with security policies requiring regular key rotation. + +## Supported Secret Types + +**AWS Services** +- RDS database credentials +- DocumentDB credentials +- Redshift credentials +- ElastiCache credentials + +**Third-Party Services** +- API keys +- OAuth tokens +- SSH keys +- Custom credentials + +## Secrets Manager Setup + +### Create a Secret + +```bash +# Create RDS secret +aws secretsmanager create-secret \ + --name prod/db/mysql \ + --description "Production MySQL credentials" \ + --secret-string '{ + "username": "admin", + "password": "CHANGE_ME", + "engine": "mysql", + "host": "mydb.cluster-abc.us-east-1.rds.amazonaws.com", + "port": 3306, + "dbname": "myapp" + }' + +# Create API key secret +aws secretsmanager create-secret \ + --name prod/api/stripe \ + --secret-string '{ + "api_key": "sk_live_xxxxx", + "webhook_secret": "whsec_xxxxx" + }' + +# Create secret from file +aws secretsmanager create-secret \ + --name prod/ssh/private-key \ + --secret-binary fileb://~/.ssh/id_rsa +``` + +### Retrieve Secrets + +```bash +# Get secret value +aws secretsmanager get-secret-value \ + --secret-id prod/db/mysql \ + --query 'SecretString' --output text + +# Get specific field +aws secretsmanager get-secret-value \ + --secret-id prod/db/mysql \ + --query 'SecretString' --output text | \ + jq -r '.password' + +# Get binary secret +aws secretsmanager get-secret-value \ + --secret-id prod/ssh/private-key \ + --query 'SecretBinary' --output text | \ + base64 -d > private-key.pem +``` + +## Automatic Rotation Setup + +### Enable RDS Rotation + +```bash +# Enable automatic rotation (30 days) +aws secretsmanager rotate-secret \ + --secret-id prod/db/mysql \ + --rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRDSMySQLRotation \ + --rotation-rules AutomaticallyAfterDays=30 + +# Rotate immediately +aws secretsmanager rotate-secret \ + --secret-id prod/db/mysql + +# Check rotation status +aws secretsmanager describe-secret \ + --secret-id prod/db/mysql \ + --query 'RotationEnabled' +``` + +### Lambda Rotation Function + +```python +# lambda_rotation.py +import boto3 +import json +import os + +secrets_client = boto3.client('secretsmanager') +rds_client = boto3.client('rds') + +def lambda_handler(event, context): + """Rotate RDS MySQL password""" + + secret_arn = event['SecretId'] + token = event['ClientRequestToken'] + step = event['Step'] + + # Get current secret + current = secrets_client.get_secret_value(SecretId=secret_arn) + secret = json.loads(current['SecretString']) + + if step == "createSecret": + # Generate new password + new_password = generate_password() + secret['password'] = new_password + + # Store as pending + secrets_client.put_secret_value( + SecretId=secret_arn, + ClientRequestToken=token, + SecretString=json.dumps(secret), + VersionStages=['AWSPENDING'] + ) + + elif step == "setSecret": + # Update RDS password + rds_client.modify_db_instance( + DBInstanceIdentifier=secret['dbInstanceIdentifier'], + MasterUserPassword=secret['password'], + ApplyImmediately=True + ) + + elif step == "testSecret": + # Test new credentials + import pymysql + conn = pymysql.connect( + host=secret['host'], + user=secret['username'], + password=secret['password'], + database=secret['dbname'] + ) + conn.close() + + elif step == "finishSecret": + # Mark as current + secrets_client.update_secret_version_stage( + SecretId=secret_arn, + VersionStage='AWSCURRENT', + MoveToVersionId=token, + RemoveFromVersionId=current['VersionId'] + ) + + return {'statusCode': 200} + +def generate_password(length=32): + import secrets + import string + alphabet = string.ascii_letters + string.digits + "!@#$%^&*()" + return ''.join(secrets.choice(alphabet) for _ in range(length)) +``` + +### Custom Rotation for API Keys + +```python +# api_key_rotation.py +import boto3 +import requests +import json + +secrets_client = boto3.client('secretsmanager') + +def rotate_stripe_key(secret_arn, token, step): + """Rotate Stripe API key""" + + current = secrets_client.get_secret_value(SecretId=secret_arn) + secret = json.loads(current['SecretString']) + + if step == "createSecret": + # Create new Stripe key via API + response = requests.post( + 'https://api.stripe.com/v1/api_keys', + auth=(secret['api_key'], ''), + data={'name': f'rotated-{token[:8]}'} + ) + new_key = response.json()['secret'] + + secret['api_key'] = new_key + secrets_client.put_secret_value( + SecretId=secret_arn, + ClientRequestToken=token, + SecretString=json.dumps(secret), + VersionStages=['AWSPENDING'] + ) + + elif step == "testSecret": + # Test new key + response = requests.get( + 'https://api.stripe.com/v1/balance', + auth=(secret['api_key'], '') + ) + if response.status_code != 200: + raise Exception("New key failed validation") + + elif step == "finishSecret": + # Revoke old key + old_key = json.loads(current['SecretString'])['api_key'] + requests.delete( + f'https://api.stripe.com/v1/api_keys/{old_key}', + auth=(secret['api_key'], '') + ) + + # Promote to current + secrets_client.update_secret_version_stage( + SecretId=secret_arn, + VersionStage='AWSCURRENT', + MoveToVersionId=token + ) +``` + +## Rotation Monitoring + +### CloudWatch Alarms + +```bash +# Create alarm for rotation failures +aws cloudwatch put-metric-alarm \ + --alarm-name secrets-rotation-failures \ + --alarm-description "Alert on secrets rotation failures" \ + --metric-name RotationFailed \ + --namespace AWS/SecretsManager \ + --statistic Sum \ + --period 300 \ + --evaluation-periods 1 \ + --threshold 1 \ + --comparison-operator GreaterThanThreshold \ + --alarm-actions arn:aws:sns:us-east-1:123456789012:alerts +``` + +### Rotation Audit Script + +```bash +#!/bin/bash +# audit-rotations.sh + +echo "Secrets Rotation Audit" +echo "=====================" + +aws secretsmanager list-secrets --query 'SecretList[*].[Name,RotationEnabled,LastRotatedDate]' \ + --output text | \ +while read name enabled last_rotated; do + echo "" + echo "Secret: $name" + echo " Rotation Enabled: $enabled" + echo " Last Rotated: $last_rotated" + + if [ "$enabled" = "True" ]; then + # Check rotation schedule + rules=$(aws secretsmanager describe-secret --secret-id "$name" \ + --query 'RotationRules.AutomaticallyAfterDays' --output text) + echo " Rotation Schedule: Every $rules days" + + # Calculate days since last rotation + if [ "$last_rotated" != "None" ]; then + days_ago=$(( ($(date +%s) - $(date -d "$last_rotated" +%s)) / 86400 )) + echo " Days Since Rotation: $days_ago" + + if [ $days_ago -gt $rules ]; then + echo " ⚠️ OVERDUE for rotation!" + fi + fi + fi +done +``` + +## Application Integration + +### Python SDK + +```python +import boto3 +import json + +def get_secret(secret_name): + """Retrieve secret from Secrets Manager""" + client = boto3.client('secretsmanager') + + try: + response = client.get_secret_value(SecretId=secret_name) + return json.loads(response['SecretString']) + except Exception as e: + print(f"Error retrieving secret: {e}") + raise + +# Usage +db_creds = get_secret('prod/db/mysql') +connection = pymysql.connect( + host=db_creds['host'], + user=db_creds['username'], + password=db_creds['password'], + database=db_creds['dbname'] +) +``` + +### Node.js SDK + +```javascript +const AWS = require('aws-sdk'); +const secretsManager = new AWS.SecretsManager(); + +async function getSecret(secretName) { + try { + const data = await secretsManager.getSecretValue({ + SecretId: secretName + }).promise(); + + return JSON.parse(data.SecretString); + } catch (err) { + console.error('Error retrieving secret:', err); + throw err; + } +} + +// Usage +const dbCreds = await getSecret('prod/db/mysql'); +const connection = mysql.createConnection({ + host: dbCreds.host, + user: dbCreds.username, + password: dbCreds.password, + database: dbCreds.dbname +}); +``` + +## Rotation Best Practices + +**Planning** +- [ ] Identify all secrets requiring rotation +- [ ] Define rotation schedules (30, 60, 90 days) +- [ ] Test rotation in non-production first +- [ ] Document rotation procedures +- [ ] Plan for emergency rotation + +**Implementation** +- [ ] Use AWS managed rotation when possible +- [ ] Implement proper error handling +- [ ] Add CloudWatch monitoring +- [ ] Test application compatibility +- [ ] Implement gradual rollout + +**Operations** +- [ ] Monitor rotation success/failure +- [ ] Set up alerts for failures +- [ ] Regular rotation audits +- [ ] Document troubleshooting steps +- [ ] Maintain rotation runbooks + +## Emergency Rotation + +```bash +# Immediate rotation (compromise detected) +aws secretsmanager rotate-secret \ + --secret-id prod/db/mysql \ + --rotate-immediately + +# Force rotation even if recently rotated +aws secretsmanager rotate-secret \ + --secret-id prod/api/stripe \ + --rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:RotateStripeKey \ + --rotate-immediately + +# Verify rotation completed +aws secretsmanager describe-secret \ + --secret-id prod/db/mysql \ + --query 'LastRotatedDate' +``` + +## Compliance Tracking + +```python +#!/usr/bin/env python3 +# compliance-report.py + +import boto3 +from datetime import datetime, timedelta + +client = boto3.client('secretsmanager') + +def generate_compliance_report(): + secrets = client.list_secrets()['SecretList'] + + compliant = [] + non_compliant = [] + + for secret in secrets: + name = secret['Name'] + rotation_enabled = secret.get('RotationEnabled', False) + last_rotated = secret.get('LastRotatedDate') + + if not rotation_enabled: + non_compliant.append({ + 'name': name, + 'issue': 'Rotation not enabled' + }) + continue + + if last_rotated: + days_ago = (datetime.now(last_rotated.tzinfo) - last_rotated).days + if days_ago > 90: + non_compliant.append({ + 'name': name, + 'issue': f'Not rotated in {days_ago} days' + }) + else: + compliant.append(name) + else: + non_compliant.append({ + 'name': name, + 'issue': 'Never rotated' + }) + + print(f"Compliant Secrets: {len(compliant)}") + print(f"Non-Compliant Secrets: {len(non_compliant)}") + print("\nNon-Compliant Details:") + for item in non_compliant: + print(f" - {item['name']}: {item['issue']}") + +if __name__ == "__main__": + generate_compliance_report() +``` + +## Example Prompts + +- "Set up automatic rotation for my RDS credentials" +- "Create a Lambda function to rotate API keys" +- "Audit all secrets for rotation compliance" +- "Implement emergency rotation for compromised credentials" +- "Generate a secrets rotation report" + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-secrets-rotation to set up RDS credential rotation" +kiro-cli chat "Create a rotation audit report with aws-secrets-rotation" +``` + +## Additional Resources + +- [AWS Secrets Manager Rotation](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html) +- [Rotation Lambda Templates](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas) +- [Best Practices for Secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html) diff --git a/skills/security/aws-security-audit/SKILL.md b/skills/security/aws-security-audit/SKILL.md new file mode 100644 index 00000000..350d976f --- /dev/null +++ b/skills/security/aws-security-audit/SKILL.md @@ -0,0 +1,369 @@ +--- +name: aws-security-audit +description: Comprehensive AWS security posture assessment using AWS CLI and security best practices +risk: safe +source: community +category: security +tags: [aws, security, audit, compliance, kiro-cli, security-assessment] +--- + +# AWS Security Audit + +Perform comprehensive security assessments of AWS environments to identify vulnerabilities and misconfigurations. + +## When to Use + +Use this skill when you need to audit AWS security posture, identify vulnerabilities, or prepare for compliance assessments. + +## Audit Categories + +**Identity & Access Management** +- Overly permissive IAM policies +- Unused IAM users and roles +- MFA enforcement gaps +- Root account usage +- Access key rotation + +**Network Security** +- Open security groups (0.0.0.0/0) +- Public S3 buckets +- Unencrypted data in transit +- VPC flow logs disabled +- Network ACL misconfigurations + +**Data Protection** +- Unencrypted EBS volumes +- Unencrypted RDS instances +- S3 bucket encryption disabled +- Backup policies missing +- KMS key rotation disabled + +**Logging & Monitoring** +- CloudTrail disabled +- CloudWatch alarms missing +- VPC Flow Logs disabled +- S3 access logging disabled +- Config recording disabled + +## Security Audit Commands + +### IAM Security Checks + +```bash +# List users without MFA +aws iam get-credential-report --output text | \ + awk -F, '$4=="false" && $1!="" {print $1}' + +# Find unused IAM users (no activity in 90 days) +aws iam list-users --query 'Users[*].[UserName]' --output text | \ +while read user; do + last_used=$(aws iam get-user --user-name "$user" \ + --query 'User.PasswordLastUsed' --output text) + echo "$user: $last_used" +done + +# List overly permissive policies (AdministratorAccess) +aws iam list-policies --scope Local \ + --query 'Policies[?PolicyName==`AdministratorAccess`]' + +# Find access keys older than 90 days +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + aws iam list-access-keys --user-name "$user" \ + --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate]' \ + --output text +done + +# Check root account access keys +aws iam get-account-summary \ + --query 'SummaryMap.AccountAccessKeysPresent' +``` + +### Network Security Checks + +```bash +# Find security groups open to the world +aws ec2 describe-security-groups \ + --query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]].[GroupId,GroupName]' \ + --output table + +# List public S3 buckets +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + acl=$(aws s3api get-bucket-acl --bucket "$bucket" 2>/dev/null) + if echo "$acl" | grep -q "AllUsers"; then + echo "PUBLIC: $bucket" + fi +done + +# Check VPC Flow Logs status +aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --output text | \ +while read vpc; do + flow_logs=$(aws ec2 describe-flow-logs \ + --filter "Name=resource-id,Values=$vpc" \ + --query 'FlowLogs[*].FlowLogId' --output text) + if [ -z "$flow_logs" ]; then + echo "No flow logs: $vpc" + fi +done + +# Find RDS instances without encryption +aws rds describe-db-instances \ + --query 'DBInstances[?StorageEncrypted==`false`].[DBInstanceIdentifier]' \ + --output table +``` + +### Data Protection Checks + +```bash +# Find unencrypted EBS volumes +aws ec2 describe-volumes \ + --query 'Volumes[?Encrypted==`false`].[VolumeId,Size,State]' \ + --output table + +# Check S3 bucket encryption +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + encryption=$(aws s3api get-bucket-encryption \ + --bucket "$bucket" 2>&1) + if echo "$encryption" | grep -q "ServerSideEncryptionConfigurationNotFoundError"; then + echo "No encryption: $bucket" + fi +done + +# Find RDS snapshots that are public +aws rds describe-db-snapshots \ + --query 'DBSnapshots[*].[DBSnapshotIdentifier]' --output text | \ +while read snapshot; do + attrs=$(aws rds describe-db-snapshot-attributes \ + --db-snapshot-identifier "$snapshot" \ + --query 'DBSnapshotAttributesResult.DBSnapshotAttributes[?AttributeName==`restore`].AttributeValues' \ + --output text) + if echo "$attrs" | grep -q "all"; then + echo "PUBLIC SNAPSHOT: $snapshot" + fi +done + +# Check KMS key rotation +aws kms list-keys --query 'Keys[*].KeyId' --output text | \ +while read key; do + rotation=$(aws kms get-key-rotation-status --key-id "$key" \ + --query 'KeyRotationEnabled' --output text 2>/dev/null) + if [ "$rotation" = "False" ]; then + echo "Rotation disabled: $key" + fi +done +``` + +### Logging & Monitoring Checks + +```bash +# Check CloudTrail status +aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,IsMultiRegionTrail,LogFileValidationEnabled]' \ + --output table + +# Verify CloudTrail is logging +aws cloudtrail get-trail-status --name my-trail \ + --query 'IsLogging' + +# Check if AWS Config is enabled +aws configservice describe-configuration-recorders \ + --query 'ConfigurationRecorders[*].[name,roleARN]' \ + --output table + +# List S3 buckets without access logging +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + logging=$(aws s3api get-bucket-logging --bucket "$bucket" 2>&1) + if ! echo "$logging" | grep -q "LoggingEnabled"; then + echo "No access logging: $bucket" + fi +done +``` + +## Automated Security Audit Script + +```bash +#!/bin/bash +# comprehensive-security-audit.sh + +echo "=== AWS Security Audit Report ===" +echo "Generated: $(date)" +echo "" + +# IAM Checks +echo "## IAM Security" +echo "Users without MFA:" +aws iam get-credential-report --output text | \ + awk -F, '$4=="false" && $1!="" {print " - " $1}' + +echo "" +echo "Root account access keys:" +aws iam get-account-summary \ + --query 'SummaryMap.AccountAccessKeysPresent' --output text + +# Network Checks +echo "" +echo "## Network Security" +echo "Security groups open to 0.0.0.0/0:" +aws ec2 describe-security-groups \ + --query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]].GroupId' \ + --output text | wc -l + +# Data Protection +echo "" +echo "## Data Protection" +echo "Unencrypted EBS volumes:" +aws ec2 describe-volumes \ + --query 'Volumes[?Encrypted==`false`].VolumeId' \ + --output text | wc -l + +echo "" +echo "Unencrypted RDS instances:" +aws rds describe-db-instances \ + --query 'DBInstances[?StorageEncrypted==`false`].DBInstanceIdentifier' \ + --output text | wc -l + +# Logging +echo "" +echo "## Logging & Monitoring" +echo "CloudTrail status:" +aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,IsLogging]' \ + --output table + +echo "" +echo "=== End of Report ===" +``` + +## Security Score Calculator + +```python +#!/usr/bin/env python3 +# security-score.py + +import boto3 +import json + +def calculate_security_score(): + iam = boto3.client('iam') + ec2 = boto3.client('ec2') + s3 = boto3.client('s3') + + score = 100 + issues = [] + + # Check MFA + try: + report = iam.get_credential_report() + users_without_mfa = 0 + # Parse report and count + if users_without_mfa > 0: + score -= 10 + issues.append(f"{users_without_mfa} users without MFA") + except: + pass + + # Check open security groups + sgs = ec2.describe_security_groups() + open_sgs = 0 + for sg in sgs['SecurityGroups']: + for perm in sg.get('IpPermissions', []): + for ip_range in perm.get('IpRanges', []): + if ip_range.get('CidrIp') == '0.0.0.0/0': + open_sgs += 1 + break + + if open_sgs > 0: + score -= 15 + issues.append(f"{open_sgs} security groups open to internet") + + # Check unencrypted volumes + volumes = ec2.describe_volumes() + unencrypted = sum(1 for v in volumes['Volumes'] if not v['Encrypted']) + + if unencrypted > 0: + score -= 20 + issues.append(f"{unencrypted} unencrypted EBS volumes") + + print(f"Security Score: {score}/100") + print("\nIssues Found:") + for issue in issues: + print(f" - {issue}") + + return score + +if __name__ == "__main__": + calculate_security_score() +``` + +## Compliance Mapping + +**CIS AWS Foundations Benchmark** +- 1.1: Root account usage +- 1.2-1.14: IAM policies and MFA +- 2.1-2.9: Logging (CloudTrail, Config, VPC Flow Logs) +- 4.1-4.3: Monitoring and alerting + +**PCI-DSS** +- Requirement 1: Network security controls +- Requirement 2: Secure configurations +- Requirement 8: Access controls and MFA +- Requirement 10: Logging and monitoring + +**HIPAA** +- Access controls (IAM) +- Audit controls (CloudTrail) +- Encryption (EBS, RDS, S3) +- Transmission security (TLS/SSL) + +## Remediation Priorities + +**Critical (Fix Immediately)** +- Root account access keys +- Public RDS snapshots +- Security groups open to 0.0.0.0/0 on sensitive ports +- CloudTrail disabled + +**High (Fix Within 7 Days)** +- Users without MFA +- Unencrypted data at rest +- Missing VPC Flow Logs +- Overly permissive IAM policies + +**Medium (Fix Within 30 Days)** +- Old access keys (>90 days) +- Missing S3 access logging +- Unused IAM users +- KMS key rotation disabled + +## Example Prompts + +- "Run a comprehensive security audit on my AWS account" +- "Check for IAM security issues" +- "Find all unencrypted resources" +- "Generate a security compliance report" +- "Calculate my AWS security score" + +## Best Practices + +- Run audits weekly +- Automate with Lambda/EventBridge +- Export results to S3 for trending +- Integrate with SIEM tools +- Track remediation progress +- Document exceptions with business justification + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-security-audit to assess my security posture" +kiro-cli chat "Generate a security audit report with aws-security-audit" +``` + +## Additional Resources + +- [AWS Security Best Practices](https://aws.amazon.com/security/best-practices/) +- [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services) +- [AWS Security Hub](https://aws.amazon.com/security-hub/) From baf41677b4b0611983d5183e7a6bc0175a4a3e96 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:33:25 -0500 Subject: [PATCH 09/30] chore: sync generated registry files --- README.md | 10 +++++----- skills_index.json | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 99fa44c9..b94865b8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 883+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 887+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 883+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 887+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) @@ -16,7 +16,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **883 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **887 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) @@ -39,7 +39,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [πŸ“¦ Features & Categories](#features--categories) -- [πŸ“š Browse 883+ Skills](#browse-883-skills) +- [πŸ“š Browse 887+ Skills](#browse-887-skills) - [🀝 How to Contribute](#how-to-contribute) - [🀝 Community](#community) - [β˜• Support the Project](#support-the-project) @@ -307,7 +307,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 883+ Skills +## Browse 887+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. diff --git a/skills_index.json b/skills_index.json index 9aa6336a..1366a2d7 100644 --- a/skills_index.json +++ b/skills_index.json @@ -539,6 +539,24 @@ "risk": "unknown", "source": "community" }, + { + "id": "aws-compliance-checker", + "path": "skills/security/aws-compliance-checker", + "category": "security", + "name": "aws-compliance-checker", + "description": "Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks", + "risk": "safe", + "source": "community" + }, + { + "id": "aws-iam-best-practices", + "path": "skills/security/aws-iam-best-practices", + "category": "security", + "name": "aws-iam-best-practices", + "description": "IAM policy review, hardening, and least privilege implementation", + "risk": "safe", + "source": "community" + }, { "id": "aws-penetration-testing", "path": "skills/aws-penetration-testing", @@ -548,6 +566,24 @@ "risk": "unknown", "source": "community" }, + { + "id": "aws-secrets-rotation", + "path": "skills/security/aws-secrets-rotation", + "category": "security", + "name": "aws-secrets-rotation", + "description": "Automate AWS secrets rotation for RDS, API keys, and credentials", + "risk": "safe", + "source": "community" + }, + { + "id": "aws-security-audit", + "path": "skills/security/aws-security-audit", + "category": "security", + "name": "aws-security-audit", + "description": "Comprehensive AWS security posture assessment using AWS CLI and security best practices", + "risk": "safe", + "source": "community" + }, { "id": "aws-serverless", "path": "skills/aws-serverless", From 069df9410ef88045ae2a0d557b2651a08d037286 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:40:59 -0500 Subject: [PATCH 10/30] chore: sync all generated files (README, index, catalog, data) --- CATALOG.md | 8 ++++--- README.md | 10 ++++----- data/aliases.json | 2 ++ data/catalog.json | 57 ++++++++++++++++++++++++++++++++++++++++++++++- skills_index.json | 18 +++++++++++++++ 5 files changed, 86 insertions(+), 9 deletions(-) diff --git a/CATALOG.md b/CATALOG.md index 2516fa29..88444eac 100644 --- a/CATALOG.md +++ b/CATALOG.md @@ -2,7 +2,7 @@ Generated at: 2026-02-08T00:00:00.000Z -Total skills: 883 +Total skills: 885 ## architecture (58) @@ -406,7 +406,7 @@ Total skills: 883 | `webapp-testing` | Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing... | webapp | webapp, testing, toolkit, interacting, local, web, applications, playwright, supports, verifying, frontend, functionality | | `zustand-store-ts` | Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state/action separation. Use when building React state management, creati... | zustand, store, ts | zustand, store, ts, stores, typescript, subscribewithselector, middleware, proper, state, action, separation, building | -## general (216) +## general (217) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -541,6 +541,7 @@ Total skills: 883 | `hugging-face-jobs` | This skill should be used when users want to run any workload on Hugging Face Jobs infrastructure. Covers UV scripts, Docker-based jobs, hardware selection, ... | hugging, face, jobs | hugging, face, jobs, skill, should, used, users, want, run, any, workload, infrastructure | | `imagen` | \| | imagen | imagen | | `infinite-gratitude` | Multi-agent research skill for parallel research execution (10 agents, battle-tested with real case studies). | infinite, gratitude | infinite, gratitude, multi, agent, research, skill, parallel, execution, 10, agents, battle, tested | +| `infrastructure/aws-cost-optimizer` | Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer | aws, cost-optimization, finops, cloud-economics, kiro-cli | aws, cost-optimization, finops, cloud-economics, kiro-cli, cost, optimizer, analysis, optimization, recommendations, cli, explorer | | `interactive-portfolio` | Expert in building portfolios that actually land jobs and clients - not just showing work, but creating memorable experiences. Covers developer portfolios, d... | interactive, portfolio | interactive, portfolio, building, portfolios, actually, land, jobs, clients, just, showing, work, creating | | `internal-comms-anthropic` | A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenev... | internal, comms, anthropic | internal, comms, anthropic, set, resources, me, write, all, kinds, communications, formats, my | | `internal-comms-community` | A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenev... | internal, comms, community | internal, comms, community, set, resources, me, write, all, kinds, communications, formats, my | @@ -846,7 +847,7 @@ Total skills: 883 | `wordpress-penetration-testing` | This skill should be used when the user asks to "pentest WordPress sites", "scan WordPress for vulnerabilities", "enumerate WordPress users, themes, or plugi... | wordpress, penetration | wordpress, penetration, testing, skill, should, used, user, asks, pentest, sites, scan, vulnerabilities | | `xss-html-injection` | This skill should be used when the user asks to "test for XSS vulnerabilities", "perform cross-site scripting attacks", "identify HTML injection flaws", "exp... | xss, html, injection | xss, html, injection, skill, should, used, user, asks, test, vulnerabilities, perform, cross | -## workflow (81) +## workflow (82) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -890,6 +891,7 @@ Total skills: 883 | `google-drive-automation` | Automate Google Drive file operations (upload, download, search, share, organize) via Rube MCP (Composio). Upload/download files, manage folders, share with ... | google, drive | google, drive, automation, automate, file, operations, upload, download, search, share, organize, via | | `helpdesk-automation` | Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for... | helpdesk | helpdesk, automation, automate, tasks, via, rube, mcp, composio, list, tickets, views, canned | | `hubspot-automation` | Automate HubSpot CRM operations (contacts, companies, deals, tickets, properties) via Rube MCP using Composio integration. | hubspot | hubspot, automation, automate, crm, operations, contacts, companies, deals, tickets, properties, via, rube | +| `infrastructure/aws-cost-cleanup` | Automated cleanup of unused AWS resources to reduce costs | aws, automation, cost-reduction, cleanup, kiro-cli | aws, automation, cost-reduction, cleanup, kiro-cli, cost, automated, unused, resources, reduce, costs | | `instagram-automation` | Automate Instagram tasks via Rube MCP (Composio): create posts, carousels, manage media, get insights, and publishing limits. Always search tools first for c... | instagram | instagram, automation, automate, tasks, via, rube, mcp, composio, posts, carousels, media, get | | `intercom-automation` | Automate Intercom tasks via Rube MCP (Composio): conversations, contacts, companies, segments, admins. Always search tools first for current schemas. | intercom | intercom, automation, automate, tasks, via, rube, mcp, composio, conversations, contacts, companies, segments | | `jira-automation` | Automate Jira tasks via Rube MCP (Composio): issues, projects, sprints, boards, comments, users. Always search tools first for current schemas. | jira | jira, automation, automate, tasks, via, rube, mcp, composio, issues, sprints, boards, comments | diff --git a/README.md b/README.md index 99fa44c9..fee8e8d6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 883+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 885+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 883+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 885+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) @@ -16,7 +16,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **883 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **885 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) @@ -39,7 +39,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [πŸ“¦ Features & Categories](#features--categories) -- [πŸ“š Browse 883+ Skills](#browse-883-skills) +- [πŸ“š Browse 885+ Skills](#browse-885-skills) - [🀝 How to Contribute](#how-to-contribute) - [🀝 Community](#community) - [β˜• Support the Project](#support-the-project) @@ -307,7 +307,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 883+ Skills +## Browse 885+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. diff --git a/data/aliases.json b/data/aliases.json index e23fb537..557cc4ba 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -75,6 +75,8 @@ "web-games": "game-development/web-games", "git-pr-workflow": "git-pr-workflows-git-workflow", "incident-response": "incident-response-incident-response", + "aws-cost-cleanup": "infrastructure/aws-cost-cleanup", + "aws-cost-optimizer": "infrastructure/aws-cost-optimizer", "javascript-typescript-scaffold": "javascript-typescript-typescript-scaffold", "llm-application-assistant": "llm-application-dev-ai-assistant", "llm-application-agent": "llm-application-dev-langchain-agent", diff --git a/data/catalog.json b/data/catalog.json index 37c59b90..f1cb7258 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,6 +1,6 @@ { "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 883, + "total": 885, "skills": [ { "id": "3d-web-experience", @@ -11233,6 +11233,61 @@ ], "path": "skills/infinite-gratitude/SKILL.md" }, + { + "id": "infrastructure/aws-cost-cleanup", + "name": "aws-cost-cleanup", + "description": "Automated cleanup of unused AWS resources to reduce costs", + "category": "workflow", + "tags": [ + "aws", + "automation", + "cost-reduction", + "cleanup", + "kiro-cli" + ], + "triggers": [ + "aws", + "automation", + "cost-reduction", + "cleanup", + "kiro-cli", + "cost", + "automated", + "unused", + "resources", + "reduce", + "costs" + ], + "path": "skills/infrastructure/aws-cost-cleanup/SKILL.md" + }, + { + "id": "infrastructure/aws-cost-optimizer", + "name": "aws-cost-optimizer", + "description": "Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer", + "category": "general", + "tags": [ + "aws", + "cost-optimization", + "finops", + "cloud-economics", + "kiro-cli" + ], + "triggers": [ + "aws", + "cost-optimization", + "finops", + "cloud-economics", + "kiro-cli", + "cost", + "optimizer", + "analysis", + "optimization", + "recommendations", + "cli", + "explorer" + ], + "path": "skills/infrastructure/aws-cost-optimizer/SKILL.md" + }, { "id": "inngest", "name": "inngest", diff --git a/skills_index.json b/skills_index.json index 9aa6336a..dab694b4 100644 --- a/skills_index.json +++ b/skills_index.json @@ -539,6 +539,24 @@ "risk": "unknown", "source": "community" }, + { + "id": "aws-cost-cleanup", + "path": "skills/infrastructure/aws-cost-cleanup", + "category": "infrastructure", + "name": "aws-cost-cleanup", + "description": "Automated cleanup of unused AWS resources to reduce costs", + "risk": "safe", + "source": "community" + }, + { + "id": "aws-cost-optimizer", + "path": "skills/infrastructure/aws-cost-optimizer", + "category": "infrastructure", + "name": "aws-cost-optimizer", + "description": "Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer", + "risk": "safe", + "source": "community" + }, { "id": "aws-penetration-testing", "path": "skills/aws-penetration-testing", From be8d2847341575172aaf5f42c91776325a595893 Mon Sep 17 00:00:00 2001 From: Fernando Rych Date: Sat, 21 Feb 2026 18:20:09 -0300 Subject: [PATCH 11/30] Novo skill @nerdzao-elite-gemini-high e Cards do precificador agora responsivos --- skills/nerdzao-elite-gemini-high/SKILL.md | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 skills/nerdzao-elite-gemini-high/SKILL.md diff --git a/skills/nerdzao-elite-gemini-high/SKILL.md b/skills/nerdzao-elite-gemini-high/SKILL.md new file mode 100644 index 00000000..84f64fd2 --- /dev/null +++ b/skills/nerdzao-elite-gemini-high/SKILL.md @@ -0,0 +1,46 @@ +--- +name: nerdzao-elite-gemini-high +description: "Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade mΓ‘xima e eficiΓͺncia de tokens." +risk: "safe" +source: "community" +--- + +# @nerdzao-elite-gemini-high + +VocΓͺ Γ© um Engenheiro de Software SΓͺnior Elite (15+ anos) + Designer de Produto Senior, operando no modo Gemini 3.1 Pro (High). + +Ative automaticamente este workflow completo em TODA tarefa: + +1. **Planejamento ultra-rΓ‘pido** + @concise-planning + @brainstorming + +2. **Arquitetura sΓ³lida** + @senior-architect + @architecture + +3. **ImplementaΓ§Γ£o TDD** + @test-driven-development + @testing-patterns + +4. **CΓ³digo produΓ§Γ£o-grade** + @refactor-clean-code + @clean-code + +5. **ValidaΓ§Γ£o tΓ©cnica** + @lint-and-validate + @production-code-audit + @code-reviewer + +6. **ValidaΓ§Γ£o Visual & UX OBRIGATΓ“RIA (High priority)** + @ui-visual-validator + @ui-ux-pro-max + @frontend-design + + Analise e corrija IMEDIATAMENTE: duplicaΓ§Γ£o de elementos, inconsistΓͺncia de cores/labels, formataΓ§Γ£o de moeda (R$ XX,XX com vΓ­rgula), alinhamento, spacing, hierarquia visual e responsividade. + Se qualquer coisa estiver quebrada, conserte antes de mostrar o cΓ³digo final. + +7. **VerificaΓ§Γ£o final** + @verification-before-completion + @kaizen + +**Regras especΓ­ficas para Gemini 3.1 Pro High:** + +- Sempre pense passo a passo de forma clara e numerada (chain-of-thought). +- Seja extremamente preciso com UI/UX β€” nunca entregue interface com qualquer quebra visual. +- Responda de forma concisa: mostre apenas o cΓ³digo final + explicaΓ§Γ£o breve de mudanΓ§as visuais corrigidas. +- Nunca adicione comentΓ‘rios ou texto longo desnecessΓ‘rio. +- Priorize: pixel-perfect + cΓ³digo limpo + performance + seguranΓ§a. + +VocΓͺ estΓ‘ no modo High: mΓ‘ximo de qualidade com mΓ­nimo de tokens desperdiΓ§ados. From 2904b39c44ab65bb7047130aa3d13c4c5b1767cd Mon Sep 17 00:00:00 2001 From: amartelr Date: Sat, 21 Feb 2026 22:24:04 +0000 Subject: [PATCH 12/30] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20antigravity-wor?= =?UTF-8?q?kspace-manager=20to=20community=20contributors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 386abb11..7a04519c 100644 --- a/README.md +++ b/README.md @@ -399,6 +399,7 @@ This collection would not be possible without the incredible work of the Claude ### Community Contributors - **[rmyndharis/antigravity-skills](https://github.com/rmyndharis/antigravity-skills)**: For the massive contribution of 300+ Enterprise skills and the catalog generation logic. +- **[amartelr/antigravity-workspace-manager](https://github.com/amartelr/antigravity-workspace-manager)**: Official Workspace Manager CLI companion to dynamically auto-provision subsets of skills across unlimited local development environments. - **[obra/superpowers](https://github.com/obra/superpowers)**: The original "Superpowers" by Jesse Vincent. - **[guanyang/antigravity-skills](https://github.com/guanyang/antigravity-skills)**: Core Antigravity extensions. From e086bafea905b9386ecb394671bbeda7251afda3 Mon Sep 17 00:00:00 2001 From: Vonfry Date: Sun, 22 Feb 2026 10:12:40 +0800 Subject: [PATCH 13/30] fix(front-matter): architect-review, code-reviewer and etc. --- skills/architect-review/SKILL.md | 2 +- skills/c-pro/SKILL.md | 2 +- skills/code-reviewer/SKILL.md | 2 +- skills/design-orchestration/SKILL.md | 2 +- skills/haskell-pro/SKILL.md | 2 +- skills/multi-agent-brainstorming/SKILL.md | 2 +- skills/performance-engineer/SKILL.md | 2 +- skills/search-specialist/SKILL.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/skills/architect-review/SKILL.md b/skills/architect-review/SKILL.md index 1af17c57..2067f790 100644 --- a/skills/architect-review/SKILL.md +++ b/skills/architect-review/SKILL.md @@ -1,6 +1,6 @@ --- name: architect-review -description: "Master software architect specializing in modern architecture" +description: Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system designs and code changes for architectural integrity, scalability, and maintainability. Use PROACTIVELY for architectural decisions. diff --git a/skills/c-pro/SKILL.md b/skills/c-pro/SKILL.md index cf6c1547..eaeaa980 100644 --- a/skills/c-pro/SKILL.md +++ b/skills/c-pro/SKILL.md @@ -1,6 +1,6 @@ --- name: c-pro -description: "Write efficient C code with proper memory management, pointer" +description: Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critical code. Use PROACTIVELY for C optimization, memory issues, or system programming. diff --git a/skills/code-reviewer/SKILL.md b/skills/code-reviewer/SKILL.md index 3c65fad7..335740f8 100644 --- a/skills/code-reviewer/SKILL.md +++ b/skills/code-reviewer/SKILL.md @@ -1,6 +1,6 @@ --- name: code-reviewer -description: "Elite code review expert specializing in modern AI-powered code" +description: Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Masters static analysis tools, security scanning, and configuration review with 2024/2025 best practices. Use PROACTIVELY for code diff --git a/skills/design-orchestration/SKILL.md b/skills/design-orchestration/SKILL.md index cf7104db..f41b654a 100644 --- a/skills/design-orchestration/SKILL.md +++ b/skills/design-orchestration/SKILL.md @@ -1,6 +1,6 @@ --- name: design-orchestration -description: ">" +description: Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature implementation, diff --git a/skills/haskell-pro/SKILL.md b/skills/haskell-pro/SKILL.md index 648aeeec..f29160b1 100644 --- a/skills/haskell-pro/SKILL.md +++ b/skills/haskell-pro/SKILL.md @@ -1,6 +1,6 @@ --- name: haskell-pro -description: "Expert Haskell engineer specializing in advanced type systems, pure" +description: Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance. metadata: diff --git a/skills/multi-agent-brainstorming/SKILL.md b/skills/multi-agent-brainstorming/SKILL.md index aa8a3de2..bb4b173b 100644 --- a/skills/multi-agent-brainstorming/SKILL.md +++ b/skills/multi-agent-brainstorming/SKILL.md @@ -1,6 +1,6 @@ --- name: multi-agent-brainstorming -description: ">" +description: Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-agent design review where each agent diff --git a/skills/performance-engineer/SKILL.md b/skills/performance-engineer/SKILL.md index e67e5399..a463deec 100644 --- a/skills/performance-engineer/SKILL.md +++ b/skills/performance-engineer/SKILL.md @@ -1,6 +1,6 @@ --- name: performance-engineer -description: "Expert performance engineer specializing in modern observability," +description: Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distributed tracing, load testing, multi-tier caching, Core Web Vitals, and performance monitoring. Handles end-to-end optimization, real user diff --git a/skills/search-specialist/SKILL.md b/skills/search-specialist/SKILL.md index c9844e62..75dbee62 100644 --- a/skills/search-specialist/SKILL.md +++ b/skills/search-specialist/SKILL.md @@ -1,6 +1,6 @@ --- name: search-specialist -description: "Expert web researcher using advanced search techniques and" +description: Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles competitive analysis and fact-checking. Use PROACTIVELY for deep research, information gathering, or trend analysis. From b46236568b38ac1fb9f406c7162145c9802b2148 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 06:17:08 +0000 Subject: [PATCH 14/30] chore: update star history chart --- assets/star-history.png | Bin 52128 -> 52820 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/star-history.png b/assets/star-history.png index aeaa81de2497afd1c65228cd6de0f5803cdf9bfe..2863e7591398df5d63550a42c08aa2d0ded321b0 100644 GIT binary patch literal 52820 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 literal 52128 zcmcG$g@hy33#&=@yjk?z_(WyWjU8 z+~XrWaQ0byuC?ZxbBrW3xXhAdAS!F5QIz*K}e(+Xy7*$Oq&ki8=9G- z>qU-@M1EO-Zyc;1O0Oj%pi)t}@fN+9JIW28tw(Rd)pW`gY% z?DsK9bzfvVklk9iRk-rw`jnS8n+fYzdW=6$u%2T1Xh;!_`E$%!S^qn}Hup+Wu7V-S zvFxv}RwgW@XJ=mySX(6z`-|h!hZ9I)F#NyylE_F$wSz(+)nnT1eYPRcoSJL-;lt8Z zm|IZEN2>XoCX+KL>vsS3!(W{@(~6 z?!??*WKb0*{7K{H3VSO@LQWm~0|mC2h*dI&!eef8)N6B6V)KCsg}i$*e&pYG70)|+ z1Md&`XM)tB^U%@5lzQX?Tn&B1fFD0~svwMVAWP^Uv^gxMVp3KdCJb3Q>3^e37kMG{^@#l*6Zpge>4O?eKycS-E_hputKv!rRT(8=4nukV8$SD zAfo4%`}k%JlC{)i4ZxDkNVc{>VOt{Q=aF0$nSEW3k_RL3FAGNLI9-`Kg_446i5K|E zka}?2%U_&8YZlPd3$}Ln9<(MQgx7IS*l&$=aiSxD#}J+v7K;RSSX~BZ+Nm;Q=E6h% zJ2{4&XBw;o%SneGi#l`x=TRP#DZC@Ek^qG@YQnMW4IY(#00Rjp&(R;={8FB9qqs6? z8Fd6rG;f2(gId`R)blrlu&TuHH${yFg_Zc-4$15IRQf{b zo9!|K1zRs>uSL`(HHt1ls3PnY>b!GEw_~T;kotyZzEsBn3jUT*YpOqTK7ZbnPa3oa zrJ=VLjolGIOh|8F%P1o#t=du)%R$`v{DgC`<*7Z9b_##*#psbRUJ40hJi|P*sGv6O z4PGT)H$9L1mVBzsn68U}V6qolblHZVobUG3<_(8!MNbldj zcq8w``4&|pmZngED%=Mx*ou3NT)2Y-gBcS~64K#iDMl+{dj02{2h1By8S;#Ba^dPhyI!!Ahu;uP3VI$krviJ)C*F~nGIZ@2kP;4KFn6RLw) z&<}{=^4B@;{*FR^IpdXt`!g^R3S$%eW$_X0%fXRhcR~2{LEUF)@?`dWj_`V6al4f` z?_AV2B*!EZ_A2V!o%QN&nlE2R=u2dM3FlGn22BaYE)+Irl_(R!{Mw%7e8^ODG=~r6{_IPE`2~p! zvo!Y8gNRpf*hdTuoQ;#-bE$o@*RzB9gCp2eDQ`U4T84ade{8RQzjl8)lYr}o`=cHj z^J`s?pPmwcN`4GSh8>gP`}v55ozF zPx`v4<-piRta=Y!`Hh%2xS@36#RMoZS}bV((a+6<=G zS5iZzh%*dh!^A-04Huw~cEC7+(_^$2zD9-P!)}ONH?pBSJX6w>p$WK{$nKvvj%`@t z_A67)()YaWlzzLNN*e{Q((}ot@1f(6w--m4>cmbspA`l8t2p&D9@yn_83GLqY73D?~Yn_Q7FkbC)|YcwB;xhv0xI%!0! z(lo^QK%AnZ70Q9R@SIrbwM)>c_eJbMpNL0g)30D1?^(9_C7mZdReXH6XjRThHwNF} zgbD5^hv(co2Zb-*D1vpZfT*sqGl17#(&ucZiKvVN;fmyg}qtjlQ9;lU@olV!8KKUfcsU z9o*kRxW6k#N6=vLMR-5gF-_;uMqkTXm0~x>cGA5XA=FsGMiNm{ zI&mNq3P4+K&qJpl4aGM-4^*l9*ld2&Rvfjc*L=P@7&xCxm`Gs;DMbdg?Mpg4rI7t~ zZzi6}{X`o$+*m&4W+;Ar*_eC!6dwGN%>=jAi>XR*W;+j)2$R7=;=i=YyOZVI|G|=p z2W|S5O)<2GiW1WK?h(T#62Bpt;L4Q|j!3c*!2l6G7W@$k22OTW><~QmeIA`13x*4- zSF$hF$-6@1sKst`&7TbJXlXC7{mwL}ky>rluui@o`};TM*1>4cO?8o5Ir<)rWb)lo z`SCpe!MSn!9POj%AI}$sGfHG0UFz1aChw)jL%JtZ1M*F&oH9 ztM&S(Gey0J)_UX0E`v1>4-_H&C|o72{32>4&6S}VxI1nOJ4Tr%Oo-QJ7s-bnMex(| z&l+7N0)aL@RM!D{F9+72W2g6a+;|N6>vB3}tw{ue_))l56`Svr3%EzzPrj_@@vCy5 z1rFT(>!ddudF)_F6a-xfwqh(F9UP^-*$v$2jc?d@YxL&v%eS~ksa~Fy?Uebw8>ht9qL$LnF{Xg$Yh~W2nrP|{_VCw{B%+Zzu}0n zE*eMZ;V~9O8!lEMCw!t`s5N3w=OlYh(CiE~@U-mrkGhlpNzGf|ZPSh2gP5xBu_uB6 z3K09B`8|e>ZGsompMo*;_S!>TIlrJ5l2iFmp=*Ykl0JBf9m<7Utbc=4LevtElObkCAwkJ#^qw;mMkRPR4oVob`5Z#d=CAx6vQ9DY!8g zDUb6;KV(te@8{k6&pbKULH9v{_`3pmPYJqsA2%Og0r)*;dl0D~q=6JD@F!TR;!sZJ zgs_NDicZhoxo7lDY>_F*fxg!b6++0s|uItfkv*L_7{lk=F3 z0}&%$Wbbng6WiVCPpYx)S|2DF5G1wY#jjG*TRy??^jUG<`+5GWEL)X>_3hbPKa8sl z#dgUhlS6DM3wPQ6WS8Et0jcBuR9^=>a538X{Imrh#+pBM@In)B*?Yu3%;T$k#A56d+N(ybC^~eru^$#2*)wG$ z$SpJiE|*qei#Po?f}9k7^oU#n{~x$sY&vMDsca0vkHX{0?MRO?X)FKPj-C9@jEt*F z`q#(~ii<4kj;~}|S3~FOD#23+3HR)(qEbBT?4$FtR(t-Qcl}s_;pP6{`^6>ck}f0$ zNmRj3Jopc4l-24e)y|gQiTCB#3CGy+s%ASxNxx5YN$`{L{k1k< zJMiL1g|zBo!$%f@Y1_x>5y+xZSZF7Ct4bqlVc`T-!~Yq3nqugoP}*ykv+pAKPciH7 zoRUVQ%-KW!&rM?)HnV$p@#Y;a*F`>>4^_wyy?gIi{$TBp?B`P|E zvM#{sC1M_cClHSwMrDeGtRras!SIJnnWJ!!z;rGBE99}M#5YqDVJTRM&w+FB)l0jo z;C=J)Ky3C9uNSSk09qCoCnuVZpbz%C4NMI$+91K3<|c@q1b*^?;IPSSL_;#332)g!O2!a4*=&|ZZdW5IXF;J6um?KEw5 z%i=gAXpCiu!5$o5sg=N9k6>3hZEPw*1jx5SPgktzPQ+N-4hm@eOj5j{#f2Rnm_(3I zyDbzMIrTXr!8&r0Nf~p$ozU-Y2T2WU`OCq!O}D^r89tf$ToV}e$gv~!Ny`9!`w)`p z?m7?FiG&3@{2?SBWs(|2=U+_3n}1FF24V5hx-QC zFP{fPG&Gh?VrJCHCt7kC-boYW_;UFBTavphiUrgv=|f7(lj=4aKL&gBCgj|sgJV1o zGNSWW60tZjRe9^?I8DcRBgZ`~JH0DW9DiOrFcvhcCP)A@#+F2T7`BVo&VXLMG_cj6@E=kHM@;ItU`7|S$}C;6w> z0Q-bf&tANevrJ)#jhR~7RbKl!c)EVx~hdw;I}`SS{L5unyLG|ZwTCN5|)d^Wgx zXj4>F6w_<*$E!J;HRgMZF~{-st(3L(7RyTil7t#7Y?tku*!=jG?uiI0vRrN%=~0N>b1vGLKuN^5Ji4*Xh6 ztEx1L%gR2~InG&?mzKWo>+4gJk&!{(EM1DL1g0v5Mosgghmn3uQT*FIOnU2D*Gj zr9}e=>Pi?s_q_rT(JAA7o{jd6oMCc<9zoR*V^e|=R&ix!VpU)ZHC|LoMn>_^uCC%I zPoBhdua1t5k3VQ$7&13A`~CCh3wAy}ZBLa_{e$K}iqot*#;qG2NJwGq9{5}6&RApslF_Zi}a5TP5WrS~Wl3NrPBaL9M zi{+|fpdcw}X`w+MS==C(<^@XVXLomr$`{T4fdL#}5n6U(Vd3{_Xjx>TIzJYR{dRn27fD^fXgce4EFD z#d9>}RDb;bJxOg#i=p57f_FBncBu;=KmU}=5Mb|`8@&7=8O57Ld|B5gc!7p;s2W>o zPrm+;Tma5oUa6X2CF|Zkf7fsN#oe0)+O+3_FGZOwp)J2N-v0tMs1bzE5rLPg=;^B^ z%T%MuoDUy9lSe$QnCeeTN_zEWeCAZ~+2+6VYdv4z#jm#6y(QoEY~p-;LKUFbg;Pgt zePI?-{5ieK#_T1yE|3d*22p3BLoGN%IS#h$Y(QAWmvH8Lab=xQ^^CCN>%hRk2r8N3 z2n8A07d&2D5@g|Y5Ly$>T4{# z>{xkR8H=!ONxzHD|ed5u^VhZ|I}I4n1BU#JJUTz<%}lR(E&qI0ug%B>o4!gaxSd zrw|)(qWMjav5~a!M3WC(MC5*Wgg|Is!#E3u3#`;+;SBvU5S*5Bc@|npzdqe7=--pD zJo~ytaSKg2`#J_GvF(fmUV|i|rS;%14a1s_b^TnNBzaa?1_BVFqoRk$=rPJhKHoKg zGBI3mB_4;J!88x}e~~_=X#U6~FugfX_uDnUq6cDP@4NmBjm*!pUEbb>E#7VI)-QRL z>s5Ev)z3LEw#?iN@C;Lbi=GJWq-SMiP1e`f_wwJbsjI^R?mpHw(0yQkdDu1zR8gfmP@1T68UIHTrSRfx}W;tG&{$j!ED|t4Gr@%*#L#lv~w1UI@4dJxW=tsKf z->>)E_X7?((O2XCo^DSW+#N)TtGQ=NPZO((5MKAOR-8}~xD2_DEAu}JJ|5&Zf^~=C zi;>@VqSJWmd>_Ig@w1^tTT<1K?sy-4(f6IeYE*cU|`7jfK0Wbg5jCjqdAS zK{topS_bt_?6+6j75&G@$6-2#t}wF!GimlVhp?|L; zM{CXMJ6T#=&XjtG88hFj%`dBHJjxdLoLvW7B^8rOnS6uo?bqDQb10^ZOM!%7mL4C5 z$bSDO(8-?<>A}#S(bg54_SSF|sNlLze+1nTF63FfwBq6-L6t$6|AQDKdZjiQn7uMuacx3{+#Waboh11tOpDTmn_ z+dBs7NEW!5qPM(!bZ-x_I?0NMP%Q!`adC0ksi>&rGHhvA7(33j1vU$ci<{(dnMdA# z$qlMvdi=PAf`S4Ia+s<5wR7lG1I+ilJoZE5hm1j zduG52H5fiaU>^2o&-k)E#^gg5rNx5pZ_iUey5nVKEm;y*0mJ@j^4u;(WMnU|I&R;i zwQ~O$_jttdI6gX(ijIyhewQHZz4tthT2LcCE^Y$KD=$}Jd-CL+iqPh#@_lIlSPdH8 zKDUD3QuA2F2J}7oaw5M3+?HMZ{-#=nL}qPmEu2|3hnh28$>?%)WQ4xluyJg1a*~3lYBDLyIlSwaWOID>xakT;~`gZ^tx6>d=BaK9_8^ z=~)-{#`T)*>EyzN5_~?%&irGCZf?()DweazPJ&qCPGxp;TTK>@u6Rxd@BKdJyB^*u zpT6C5DDvO+dKg0Rb&;dyVUL6#HNr zhj*+MEmgmCog5w6MRse(g=Ey%7+=O>#Dc2@hiEiEkx*IP{c-apCau^!qX=Xc5y2LLWDJ^jhsk6&94zGL&=eoh7-x9m?L zf^Pn%nv^dtc##=-sN37w*?m2~l22y#b#C6Rduc8RJOThe@(cmjj~rkO77Qd1tFE^h z#glqdkJsz* zDY#z@4Gg>o2wp0q@PWud2l6Q(i2cLE__1{2i_W$Bwdw^gQ7I`YV+7Vw!2N6^HuzlGcZFm)acX z>WpH!oD6kVD}9gufz>HU5R38Sa2vv2^xH0bn%w*8@87?uk5#fZ+#3z;5Eg@2)Ew*R z=H?b!KkueERoienX+Q-#K&SP|W4*6v-fQ|-Y2JMm_m`vX;-d%y1H=2oL;|6^i`82I zuSJ31-gI5sXK1@j>RH!j4oYj+b^L$509KA5X5OvF3lHtPHU0+pteVwX{A!~>A+`TA zGc$8!S1biFfsA^lu(y*eC;7as1CQUyMu(nt_C!v0Hv2j-b9Hs~0l3&{zM;|sv9N$r z0RBFegsinU7mL}?S;7CfhTON#aLitS*~ z-FIvb52Ne(`T1pK{)OKbY{S{Y^?_$QGc;XCh+PnpPil%!2jN`k^tWa!B7=EeIFGKP zuj11KohIyygxRUpy~uWO$Ac-ve|5Zbp!2MY5@{x;|P%Zc6VR7m+&1 zIE<-l;fojT!S+u@&zU~^ScxSB>|}`Qvo>4!jkKSB8MDa+OnUlB%){W#sV?8U{T zJM)dzC3(}rklr^_$&&6>^~o{=9jnrkvNHDKuU}dAXy7CyBs-LV_qu=}pY7 ziKY;R`OOC%<03w+crs(3*9ICI8o7C|LD+t9KJTvj<8;boDJv<7s0kc210Y!Bx;L)p z_)~(dj{h&U16ms?c6%~Ti@FvW8Tn8?sRo2s@4vrNO@j0aZS|-4-jcEx6U(Txa&U0O z<48F0Wu8swn0x@6aT9bu1i;DYdFIkhVTsGdm?DQ3@^UM7dMk3`lu2-_0s+ch@8jH8 zyH(+xw$!Pe{_0qQmk_W>s}I|EDEbWR?XSTM!4BpQv@~{AL29@7oQoVJ!4~= ze~=!<&dweIf^SPO!pFLr`Z?NLEWd|iikbWV`5D~?Qe)4TY%hJCS=l(s2N$>d!All9 zj3B-@BGxC)G#{u4EFiS_^gc?h0q2a*VOk9fet+---)L%j|9qbf4F4~S3{YCqrUj=* z+{+g?$HV=P|c3qm~ZagwMsV(5KF=7g0>CyGleOqq>t&Xv;r6QnD zX7dRKbq-Is(v@Zb0vFO5Bz7_)eR}&hwa^yTsoo&)VkK((;nV{X5|2Q9 zM&v|92${92wtaU^Z37XB6^;oTfwbF93qthl!O}-z{5}&z;R#*l^mk48pY$Il&vFE% zFwyDU4o_A%oM}X_-Z;A{21;CQEyO;WW#JXe>%O=V^=ZEv_*_?iwkg=h`{9YFmX%f2 zi`%T?;#l{1qh_!4Si(9KNeN?PJH^p@GIj<)bWvShUAHfA;WX_seari`WYw%HwrWDg zm*F2hlWzaK<=E*@N`1o99;Pn~p+)f+->OTSjRPkFM%HBpk zX$d+Rm8B|Be&&1B`}mraO?Sk04IiR*AK-Fxa41FOeg{Bc4As>cl+!pF4#ri*JwN}g z>VIZ$((F|xT19-9^hk03_}}2RN2B2_-+Hvw%J+yeR-JN>SK8VN@WuCg+1`t;CP9~f z9a}R+W%>pOaV@Q^o*GxAIxaL#v^dW39fL!$GgoD)sDr)<-2H;jdC|eq-kunt9U)-l ze$#e&Aubi)w1u7(5G4M@(+IQiSPdM&Iso6H0sQZe`2FQDT7jOCpI=jx%gXmjUi(P_ zs8yZ@a+s?dEM>XcwW-x_95rhe~m2(3TG4X`|erx^A^uKBI zgb%}l>sbhbw&!*7L`GdrTia?2=z`E~22ki)hR*?up^I%jo3+=>@!xBlMVQOpJhz_1 z67wAhd`zop5NE)}f!a?~vbgK&VBoP)@gMbmBq1ejb4lnzoP@EL6yv1$M%Bmnaf?l- z2&V-s#h;pVoL*kzw}h1KS6&$dXU<2TU($4T00pUj!OLL$2flb#Vp0gWSK}IP$mF1PIEQrNH9J??P7~Gzg#T>&u!{CJC7_aEv1bpX=o65FfunR zTYkSvcRyVhbbHkYB0&;>2~B&5*#rZpxsF{s2H{l4X{PFPOI4Ly>iFiG`@ex+8)xVJ zrlpi;Mq6n-)+*K(uL0WFPl$W_mMSGTH#hKX#`=qi-{$9{EO&BL1!o%6Mnc0j<*x6Sb{*3Wdm(R=RB)}Cc# zWR#y6yL6&v<3)u5t*ze)ng;%l;2)Sq1Zii>z`6BrQAx?R!urlk^=(FB zDa#tV|goNJDK4O7ZI*9$7uTbP9+z z=wfBMN96isTy-~=YuQGbJ~-qY**(f1lWmTc(L|(EMK%A|lK};Q2x{AfRr_ z`)#VozsP?8#Jq$^UcUhU!Os@;_nOsI75$5e7RL4`sCY5g93lHWCsC$N>3zP*kyYuQ zf6jZxwfrkTcfTcKlXp>81WV$qRJ2csKQH0p_ciX`{(N8#H(Dq0+&+OFzW9xcro4P_ zIXH9QLbxKgE84{_ORI;rctS}=M8)B3{mnFS{XoSksc36DMZ_9*gE}@l_@kIVaOVqD zY*G(eKtwtpuxblj&2<4^zdshgAD{pIn~Bn$9t8X0|CS_Z9Ft+PF~yAk0IIsog_2na4w23SzItSooB(hVXe`tR0GiDVS6 z{30_s8ORZB9^Z%+4Y+W*tQl81rbqzEHXK^^Zof9tFfho})zGLa0RgQ6oVc}k;XRv} zfhh#T{QXru1mR_XlDS_44+>0TT6wRja#*2X+jn=lo;!z-`(1>xsYfdEfl)v+G7MZ> zEvsKF)~k0iYMgQS7t4hZPHMq%P~6PDJNfbtNVe*^(@ukD4f=3sS4N0j@Kx<0DUv(UayZ}RH zOvsxKF1I%=idT>V1lf6)AGnVE^DfeJKp^sx=E0Z`xw2UskF&SyCU&3ugoy4Y*pzfw~1Mnnok2FO7u7YI4yTuaAjg0d`K z$KpzG9V0@j)Z1|)`2IY&UKEfB*94IxxdDVahM?K3apzXUIlKHBPhab0n(h4&f?PJxP~;s}C-Oc49V1BZ<&pv(n^c9=znS)7#%j;`!HnLI;-Q@K_9D1LfT?Y9L z&LL==Fvv0|y~&TQfh1b!=FRwSH?GIL?ebsd5J*e{j%z*dULGqH!vL}Pq1*d=hukUU zpX*RLDgpM8fuMPRX~y|Vr^;OCOJ4fGQ#=7bbS8-gG^SaXhKynfk6$P3JDg~pD;m3x zm3R5oSe`!RX4kJ_>Du4`^`aRNZ%h$YBtLYzNc)P`x>FFT+f)r!(5fyod;NS;T5>WY)h!<)4I)H>mUr!Lpac^2l$G`K z-~Lq4*a~1k!X*F`O0%i6@i#X&1bI_@2sj8J!AG>&`lTR$MN7-in;+jkQ_yP95&wui68s5?$pgWy8XC1ek#D1Jz4H87k}QChlV0)u7#)S>FM=l3A(p(wNo0^-;~5fQ zoV}fq2ElIwC|F*6K+OWk)H=tvtJUmRjM!8#;I?g`5~u406gWY^l>#A7>mlkTM3x4$ zh<`9kuzFjU%+N)0{b1$CU&UvQOqL5xp4!Ue%jefKv$gh)pvLkZeI%@r%p_oRVr=Xo zbT!fjGByuFNI-)Fh4l)64XG(3ZzDH#^>VuL~G}k zrA2nLKe`hHNZ>nqHAu!dc~cT6LDC*gwQ1NDc1cMZ(q?Y@J@3W@G z^%vHSCY)upWYiBpSn9H}u)qO&U?Xk9V}w*(4RrQTh3&&400Ssb8T&i-gK(a)cIb1o z;{^~SnBwI0H2LZ5qUV$md+_z#(pE*&RxwEdN9SUqW%})3j$nCm9xEj;DJiMFi^J9G zsZu@jU;yX0pS4~5DbL$l&ke52a_yo>2QO(J9-b%!eq!g~P&ICJv-|)uMwWX3fMxMO zR5``?S>Es`CLZK9A3zW?Usul@A=JZCkgD5$+128GE#S+$7eZ+6{Gx!J9TvQd>jUuD zee9znzuQ{R2$+sRtM9Q@KL}0LPOYbtKM`Wfs8#jh^z>b3F9kSJn@u3U3C}xumv^uB zE&#Z83iN!3xVl{#GNa$dYHFr}o1c;cZgHQQ3S6!whXKN3e%yM#n8^vo&pI9!ZLgx>z`9$`{ObS&O8)mBKBOllC%b2>Sns(Hi;}qmE6*>@`2(*!+L`1IWO+i>O#sfZ{pSnz8|Mvs}#E zxBZ~B+Xz1R11SW409fu6vY+xWpdcl{z52n+6}fLe2a@RJX!_QRVV{{VW6Dn|$gh35g! z;Iy&jz`Uox^c;|FyUup!(5b^+hOViPLA}GJ9i$XqK!F}YxE(>KJfIhcTL82RJwj*Z zUe<@qI~oQA?n7Mfrr%UxDWD4nhOOicuLY8mqvf%f`Le*1jOTtsa)*}z5w{acI|;?b zPb)zbQ;?HWb9ZxlFIww~e)4@0+))`|YrtegNXiN>@5Y|vf})iMD9ESf0fdTy%O9vB#W1{ARNMHs6O5^rV9bM#2^UMJPNa zH9=3Se(BZ~U*|VUNyTEjpX@I3AGgM{tyJr=aS#^5q7)8bP=5-$JD|{f-N4n9L0Lvo zog@H+3au!!11|rwotoI#*w;Y(G^nv59K>`bc|-orF`?EKu@LN3398lh1Kf16xv1Zm zTz-cfRe z@z4*Q5))cJ^kIPnrF6@*7fqJJrRDc$c6;A(xE-k=D04!n9%E#hKr>oa0R#to1N0*Rymg-N8OqKaeiDe9#G)p2Gl)!|w>YMoH? zr{vY#2M>o1BWLCge~mt$S>98F#>l$&<_sP~5=u(%8$l%;EJn{LJG^Mw;TgFG`N(&{ zV69iktUOaXXX$JgHZriDJsJBWGt@lLC}I~Q#cqbd&>pYG65iLRfO)l)FKxAq1`NKP zLnIfHU)$tAY+S-SE}w=R4!gCnmC@|f&?vA#Gp#nf478A#UWy*5+We&h#c6d-O~%RJ zzvZA=Xhi%Om;z3k!;KZ57ZHR_j`e&TnSAhBclM| z-(MIzLJG8opl$HvbORgxd0goPT`csvz=7NW(TA=S3PL#;H2ne| zs_EJLFhJ?~vCtN~BN69-&*hBvg(v$pA-V_BG9wI?ess6oQ40qDQ_+4Wbc@JjAhUga zma0fBL)eV{0%T=9Ev*l)OiVbg0>nr$P{{KVI+$V}BDzAupJV*k`DT&DyI`9$EH#7T~k&;q~P-j5p!Ohs1ww7*N7R;uk zq=Xp!{|u6S@AfGc5E7(VNX)XcvqQOFRe&)6@R$!&)&~3fG}uV{O>?DQb(#`@!~X|? z>kxH1L^lzr4FW|@8v)_AwziZ;#U95zR8>^O{`Kou5zyZi0M^O?_7;Br{A6=;GX`W6 zFeL9k6+#)p;^K#Z)dOLPfdGRO^!L=%)?$L*mD-w`H&tvr?MuT-%*3fox5H{~ZdDIs z9u9!U87mr4n=~?c3Yv7l1i@9HP6YD!b-$ z>5=PcI=lgZ?FIz^BTTTWV~Exc+e+PrLR*$6Pq;pSpcxSn@eh>Wia-JY5S2&k)vL7g zGepOcI!Pla#{r$2S)Qm=yQHxADQHg`*gwbK-Q5jk>%YFO_OP-l%*xH>@CU6(09?EW zX#v3sE-x<;g*-2vyvgUdU>P<1{hPnpPd(EFF#$9OuxRV(C<3ECF6~=`9w#6gk!56N z%E+iAx+o&07{HBqhIrj_L64bmw#p!jF3^`BK%nrVf72k{08NH-Q$QHa9)3JMq6JD^MZI_{cI~ zRqYCP2)-xf*>EuUK<0J6+8dBx*lz^)yqYHfVP^p)XKYIg3l>2^!F(XT4DNcJ3;RV9 zu7Rqr0>XKYj@*hsTOCk4t%{3_xp#kw7D&=L_M&&-bl`P>rUx~3_1EQJzjlCv^ck-` zTHIkEcPQoRB4?Ts^Rt+T{Ck9;RBrSvl@v7E%z_&;Grt6FU9Ui^nH9<*XoSiDwQTUi zKM$ceQ%r~e2Mu&}4P4~sH#O-eS*AaUK>`6{?G!&ao&u&97}%-{atIJ~yg>(6F~}z- zNC%Ygp|DhQ5VFwv$X1*5p)S`BoFOkHpZdzr8>yWtQ~5EocrrRTrYvwfXj6SL0r@}` zvQ|j4AVUd>$}HV^A}*Xyb}*YycEq%SD!Mv@8~DDg6_ahv<*E-nTou&H*b=<@dcc;5 zc+pwvqUB{o?lH__|5qin5n&GrKp_c{d+zV^bDIwX=w)cF^Kwg2N3d@7wF>+n3Q+jr zribqZD8mv_I~sF07Z`!3P1u3~r^(O7zV9>K%!D7f?yR7X)H9Do?fK76*LPmf z&M?wquGGj21Y9*oK);bMU>(hnHnI(bJ0}NnN9mXzquZ+?F_dnBuH|)VRW8~9vyF_T zCcrxLx8y2dy>MgGnW?Rc#bhGN445I_@>3c0XAmc;-^%#gy*yJgxW)!*v(d^ayT7Xv zp`YXci`uX7DaDOv4YkPRJ<1D6c^3Tp-BKK{nDd(R($PfaHlOzNRyoXbyj&S(d6g1H z7q_zBgY-rHO)3oKoV&IBz+LKMhDDb$!jNJC7UCM)I#Z9m;A=;s5vLv*3omnpHh0)5 z7D9~oZ>eC`!cEviUGsQdjW5tXVQxG-u$FEowJk0#^l4orub8rTa@gVF4JTaQg9p*X zfM5L%S|?N+dYYxL^8^H`?j9i5$Ruo~4T z7t^iCM#v9g0lxSdVIgmOW9hl zM4gc}mmQnf(&_9wsWcWWhB&1p!UAhjWJbc?9*^9zdVOMriJ-PZr7VI=gddHkfsBAr+Kws2w63j%fv#IDU>Y%0HWekuE4Y=pe(|s8zPmMJ5Zh zChU9a4wJm8@DtliZi$!UtW6>R!3R0IXYBu&ho*fX=Ajvt!j-T%dv6k4uO>Wn^d_{Q z*sXl#s=P?z1=aws3Fl8)tnIB-%R?%#gW%TqV@ik$&U1Ef*$aeCs$^!S-7d|r<_q`s)F7fqF0FKmCmTX8!sidVWGfGUZ<$GoSlZNC3MdMwI%;Mmqk_MM3~^g2CiirI438Gprsnhih*=9=9K9unlJgT{ zYahF=tRstZpdxS=hMv1t|V40|rQ-$Ed33jR{S|NbsO z+v6o^x-GJmK#iz}|64uX-qIG$ycI)8d&n1k_2!Pd_LJ?maZdrt0hJ9MNjkrC1_&Q# z**#(;EYY`hau{E{Vz)L2`GWWaT36m#_!Rz*_%WVWBFOBBxUIgj*+?3PtrK=g!r6s_ zp*pKCT(5FnWxxE88)|>K;zxTDMEN)(^^4>_`6AZx@j;V2B!X|sb0R1`^!B2KtmEj- zU*#2#cw7$mjn1FuBkMT653WkL?~wz8-m%|)+E#&rpo;ME^Y2bW3{_#xG|xvtg&%=% z6$!0*hE$+1REa0nol|2$pD@wSCn^ZxBKY)=%r5T^j;)~X2$Nil)-y|yE57L2h#Z*Q zb5*Ha&s#!BHGHZpM6A1ePXq&Ohsj3vMDCV#a}U*1v@3`4|Mp;wrP_Q9Bei4Z)llLO z0jVroRaP<0UDGeyE?sECutf8Ev@0 zAkV}Yx-XDy6>;_?#C52l!#lsjW#7nwA4q(>6#sAW;@uu;R+mwap}-SR2`oat4eT7J z;sMX|jv7~PQj+hGN5XNc3p0o4q(Nb!GrlNj0AZHmsEkqlisqf{69B- z7mkd?WcwUhn2?&G>moskG?;wHg9eiYiXNgpYzhPqwft|xe$|a8qAYuxx`ZC;Ke#E` z;i#Vk-X4z<bv$u?JiDj=o1vtZ zsHaaT+KQix3!XL%m#&f{9|u^DxGt3-s1Q8TD}`}+zq8;QVEEVb{&2XFr(m!-j%*E; zqsoDCk{qc^!h*Aq8S}HUoE%2J_*kLsk$uMV%_Kfs+swj2j={;qx*2ICy}TI)<}NfC z8qv2OPh;78tK!ZBC-`{IZ|)ijd`f>M?NnBz>|dXb+2=I6?@zolHXTe~7aS&}ct}ko zi)>)w!tk#wvchg~Z+x;DwGic#{VosvY^ctQ7cVT{=z1??MN58nV)RRB5e+xdn%EH| z@-_^MBT6J5$9V%@Jp?X~QGPjnSe^>8#`SMxI(fVrZ_lZLG?xB1ZUWT^F$hLOtKU`6 z$PM#1BGU?CRpmg7+sTGi%GmdCkCde>bsqYM;3X}Q#+JS{P37wCP05Bs7cE@asembG zE#r#*-`mzIj#^spUXx{Bv+<9i#m)RVhyX*B{x<|_>ytVbaHAJ%u`D_B+(Jw(Fdm-i zEmAQNf4xBac~@L*1qsC47Cmm?zOl3LuTnzZ!ijR9?9K4()ijaD^nz9zQ_Q2mWN^&3 zNrxzMl$c48SK);nH-9Pc9p}m2b;B}<2nfN8qDmpsRU3mp1QiY4mG%v=Q3cp|=}Bj~ zkn;#J3uJv@rut-{v8f>nZRFnIV0vJCtZ?~%m!-G3R?SuaXNUwVRj^0t>nUNJAGWB$ zYT3i8;*aRFeHV5Aw-#ZEVU|g~n+#sakQF=T_x;O5<)XjO)sWoGo=TA+%m_Dba+}?N z|NM(KzR(MI_Vbdtt@gT!8g-*&feBW=`@d@z!C%#2^X!0`9&=I2W~sHY_$i^cp>zmQ zVmVEps2yesV)y7Z>uWv=*hjzR^r!K$=?aD6U6I0Hfy9G)&Ww84c!Di@q#)5WDRw;S_5J^@&=ahf zMXPBU3Dcn_&Yruqm@oCuyJ@D>KK|#PbWtik2=m|Ikb5e!zRYkX{-^2Uj92+VM%l6C zPrUtCb)>Oc`9|46_OcD zyKlS6-cK*ze6W%bV(q80Cu0LX@eZ~%VZUw&f3)Ya?l3?-9Ax&7F)kBvON565*W&%} z93iXy_>*3cMB0LVZa*NmGN0`veU7uo9(8t7v3S_Nkh7b_a5S~ z?hUfqOZJ>SEv8cgW2p~+K}=CDc#Xip5cJ4%uKgdPzB(+*=X-mD5T(0I0TGarP89^C zM39z{QaYqtl#&#sTNI?bV-YFoZdgK)T9$5jXZ?JC*ZU`2&(1S*=EQyOb7r0r{uGF9 z=cP;h9)VLQI|)$bFRp@=m`VBBo4Hz8{5>K{e0kH4c&ih%nh~WnywbFpEmM*cVoqb| zqT_;s2T5p{$6soSiK$E}I2qiWw|)W+2>ET#atPZ+O9+cS0Y;Y8xchf98)JpBMg<1? z{L)F4(c*3mNg;>=^UI1a(Z&A!sL2%%uvtAj;hx&I8vo{4Qdm$d$)(6~O}aMFE466v z{Vt#-t<3o{4u{d*$60a=c%T+6o98uF80%Loq%Sn>F5DIM4?GWX49A~IXqTBRXFCn8 zPdioz1J9(2q%-OeW3+gyAC|f{Y$)r@!3Fo1{Uej&ib&;F=R5F|}!X<@}-J*)Z2qv|VXN*E~dUl?? z-WQ8HUZN4YAH5?}dUYx<)LEq&RNDA6?> zOlMAew}xJD+y+7?{Yo&=pZGUtKFS66**e6s1Uu08a(r)cQ+L5E^@cmj+UCIUNl zcbV5ks%7UaM!R%2LmTBDm<^4nbooOJ0yYE2XZhh*EbbX|92A%Q@^caLz`9oO^BW3Z znN#1f7ulLaRs=lgf70c*Qp%8D=Xl!x)v5EYujXHxn6C)yDC3`_UpB+Ww|zx+bm`E( zNayUN&nOiLB}`^TcMm#b`;^o1G10<#bif}3otG%D%zexTiM44Da8N|tn0FZJ?W8Z| z?*B;acSq&)CL0r6(@_5Jc7t*e%JCwJu*BU0XUJBe($x2f>HB`%wG_7O9wz8Y>?wadk+blro(%)<=AZ)wr!kSwWPRN9C`TWM`OUecRPWi5 zMGqU4-^-UNSSXl1wmmHVkl5I7@gj?{p8}&dFdJP%Pc};?NJg06Pm?IPmxOW)`^W-BGg(oT&y|D%n;>tj#q5wZ)Y2_4CVX& z(WV6cJAi1gVdd*>w*R7h*VnN-6=ACb)WQ=HcTP|cX{+^Wi|K7^$51ZlRI+y}v@zM; zM>}Mqp`7PlK?>bRr)lda2OfH^8%60$b;;5~Ty8Cc_LqF6jY{exz{dNWp z>f2`UhtuDC9k^bi7%(Jv(|iH=PDPyS;0C&Mq1u|dqCW~?JP=GKa~#z=@w-yOHu&xj zNEu_LsvcNgEzXwdgw}t)CO}ILMQPW-l*2xK;M?&V__HJ_b37Y(jq5{l!Z&o(Kn3$x z*D{=+6DUxJ^dUrCc74C4?C+5gQ)GU`SSri8V&hEd)85CO)xqn%3u!IZ71G4`bRB$N6LP#G!Gqq#R65Pa(u%(r63C4@Mb4cPpN<-q1~&70 z(yD5Sl+#TbW_ql;6n1u5XZNEpPSBZF$k5=_?;WxS$ug;Yu1xsSshhX@jbP@(yTz;r zJ|%ye)jFUis!%g1Pb(?L5WdnD(3 z?`d_9S*qaPdQ_7Z#&>y3qM2P62NO{!{zRU);m3lRcV(`cdfZmK=}v_9p3x7lJg_Dn zq1)=;yAI;rJi>%R5-|%`;N5P#dpa8ew|jEbIiq>l=hVrT8x8#IOq|I5Xr7xG#bsem zQcPV##qkLWp1aaY)aC`N%sO?if5pnFu=8AwnmG#xZ&M7E)K?wuB526i$eq|yM8_dTryGXb?AyZxRX{9?Ysn}ROK8Sl5|M)to5=mI>M zl)Q*pCwV}SP&CbzxZt&~J8#?6x+PJ%K}7>6i1EEj9SpKEUu59f*DRQ!Zkm|6j>&O* z!%sF_dvELzjEp94$OM!31-#{HL0`!JFSeI#=?XYe%TI02U2dDS2Rn4-TsC|W+C1)H zNJ-TL^NL^a;UoJG{RAO4PIIEn6^y^Q&Rbau&R+6iU03H;d8UOAgfQ~7Zg69NUXz;m zFZ)r-Hx{sY_o2HcaaVzmN-T%Jp`nQLVv$1K;Z2l;wAelX(QcHT69M$$T>p?jp!IfD zT<16HU2T^Zg1nn$i%@%$dvEwSI_HQeEA*T5mfU8 zG7NH_u`+Z!TKz>+$O_n*LbIP)Pu^oJ-xKv7`BK?3&BAm^y9RkFi!B>q#o$)ATkd%h z$sBj}Cn7mgzyE$GK;cP#9GD-xtR*6);whHoSa0QFbiU>BVX<8{bVdWM?|$u;Uv=2* zqHQ4ec^M!fy%%9LLg@rHw^pMcXEsHIMl;#SH_cV`)0(hDdI*iER({g=)>$- zquHE$fpwMbOD_c=1qS!l;d*)C4roY0m=>}38?~ew_391HFrP>Tf z3TCwr15%coXL{pJFD8eJ2Cy8FsV`CtmZDzbFoKQyGZC=$Fl`XP5Od<0w|^@6i`Xob z`!2@u4c}Pao^$HOm&Dp2xQ3#7Dw1r?W>8BnUsP>Y&OTL3CXMOevyvr*PSwKxxjY7I zhwpiB7gFn}Cvqbfl#vy!9g9Zc(BS3f-;3vrlVtJ=QMLuV^Ukj|B8AstHGwy%sMzbs zzXn#KR*x6IAp=y%TsGf8UxPlUEi4N+j!sF1Fl#pQBkXu$QR~%baU2gWv}C_# zqReY^Bk8w}ZAZ%EF;VAMF|A5?U16LU_#f+6Q0C>Oq-pcrR>ffQ6VFY_m%_HyDQQ+G zD|~$(iukvB@6F{s@F_RNgGAt;*tc2FU49$f3PTJJ4A3{32F;cHS#$Q{1R7enripP0 z{f!LD?1VN?qti)~BP*CC*dIKJ{~o?3)Bp}UG2K9<%og?bDg=I^Z- zww9|@T)Ls+HVHcq1-l0^QQ+bw!vi=*eap}(N}&7ILTfXWxBeI`o+9bOBI3Ca@TpOq4 zm?dj2$4u%<`M#&1h*k=j3WI9Tdoc62g`ATAbbJ!f_bU-5JzOT|-2ok6MTPV_W@1^% zbR-Y@`u^N{Hr{60De_@*zv8&WzfWs|=r5{-rg{!7h11};@lH6skFsjprD92r zTHnoV39)r{HeT!ZEEe^bz|HE^V8{AjCaN}t$yhDJi)U7s#)q0qiv;_j#lRK^wW*mbJ3$lj&e zsl-y)Jg+oeU98_9Mgne?YWlsFU-# z>y?YD?NbQ-;2O_-S3?0kA5)Xm?L>GHN?M$+AD)3DEUhnWaoZ^)fWN#cc$r$}{S0N> zrex`wAft5LZ+2@d>2fzsZkZfKnV|`q7#ezS7ebJM;CM)s%7`=v1*QdTb<^P@?tI43 zDEQ*h+HtA<2aBfV=GLJDy|h&1rd0gByuUtn!f^v5T1C-|mXrZjEM2f4c{4aG)?!hR z28N?WTY`v4mTDTJ8VKF<{_!-0qvIx;8m-}Xt8(?86E)g)(jHcoZw=(UFfTJQ!AA29(H(H3+Zrc$p|m&2 z^b3z1xuHX9x?oB0LEo6#O0P2y^)H69)29@M2FhAeB92$_d0#Dx+D042{WRl;kRy7PgkEEKR(aP(n9Pluh`DQZ9H9#{mu_4R#Jx z5P#fWY&Q}%=>?eNPU;Sn7hZG7a{n3czj%`C*7~{Zn?+kOUSy3W(o2x;vOxqJ9NYBA z-fA5bAi8q%Y}7!##q#)u$oec*xL%e-5U|D+iS&auKYUG>l_G-jPE|ggZvDx?X+rm&$=g>^T3aeh9 zx^D&ZMzAm1KTv}SW#p`?M^b!DS79B zmJhB6uOoa&pcvH{lIPGZ123o-xv@iGxK2^|?E!qxP_QMMx{hhX~ zl_f3Jm!i>$yKUn!3aiD2H3Lz`$vmu=vc?OBGLN-FuO6VWO?XOc+QdQv52a?;oU*Z2 zqr>8#SCO(&I^f0+`R+kA1m)o4Z$+EMk3}m|Ht|n5kPe}rVo;xmp3Q}T|6NU`HPIkC7Q;6r@FAEaw8ge0vD-giWGt4FIG*I+ebYBr z)A-TmdEJgHSt+?kPRI^Fn?oTR#zwGLOy~-7)opKue`kX~5f*Lxs6?fH_-R*I%*EbJ z)as#$AySR&$@pA2|MMYM$F^*oE?%*typZ)jG^8ovKdYN4dd5!F&6zQK@iJR4hHPr? z<2f~&CHs5uF^tY-*`1Uk-hUHoqFRLDsr#-z-Oyf<&+R~CQi>X5?8ecLCwnPG!mi#J zg8AV0S^F13GOPr%#S5I8n{B^IYsG{q_wj;N?=XkaMS0sVYAJno@SvqRHUwCmlh$*GPm{L z9eUNP%T}*4N{oB;GCzG({Z{m9WLC(SIl27Oh^XufNnde}^FS4rGRO(6s*CHL4OvTX z-Ox4fNC~7NWLvFk`4Q}CpR3dv1)=Mkf;RW`PQz>)LauIRwN&m5*6U2u!Nn6v31eHA z%}HahG#J`H$W@U(44IgKXKXJrO1Mm@uAay(r_L^ixlQJCJQc9VYX0ng@g11R86n3# zNeA|6&Vu*Fbez?6-DNBAf5>aNsAFTDjhsStz)Oj+{L z0A80sHp7o*Lff_`f2Vcmpajb0V#LnHS`+KhrE`qHZhOuEa+`Z?}l3T zofVt9jOCVkv65v%U2m@wJz%N9IaI}oLM$q5*TidmlxQy#?iK@W`Os7G*$mc73cIlC zv2W{W$9o!|j=q0Y)l8os&i?ht{Pl(n%o+C?!7NPj)&s~$n5Cd}s>D^R(d=3c!cH#i zsh`IAKH@rS?dJ|~gzC~tqo0Yh`!{Ni9p`exKE?2o2uW?-)3~>RHdHPJQ-EZsTQ7(H z)-(Oh+Y!`GJrSt-VV0KjxXrSeaE->@Uo`g57+=!Ve0fD>UA|k8HhJic!QYd`dg%IcIB7RcOdF9Wd_;gL!8_3}bz4VEeiR))^%3yRc(Lvve*Ze$CYKL{3&B?-Uq(9Kw|`6cV3{C9H!^o=EBM>#d-BxZ zqn0fknh?8H$&e4x$fOXfqRGJ&9+bSCUv7y*F}Tenm&6whm0`&*xXX4=?pm}oKL&aP zKf43qHcq4ji^qr$DVf3xwbumiMA(sM5xe54&jmlBA|6!CR@bGw9yj5Xh>nMP+YzI! zg;VSly(~9DevG?x`9{v187RYE3qsBWHdI~^4R3)pr+NGG3>9m`^*a4k1~&EpIEjTW zNh=!aOG%BWSH+bE!vg|3{V>wRPxbAxxs z??|4qD?U~MB*m+`&rk|ke)K)Ke}@UR2I+8m>KxREs~Lk1&WfwUvrUFqNV-ekKEFq! zWm&cv=Ji_jVotjb#bfCy2iaX|Z znDpX!e|oIB$HJOxkmc@i4~o+^J=iDL;2mfQio!Y9WiQ8Gv=M&SUvpqS1sC3I&WhsN zvh$H5`UG&!5yo&EzJ23{{X7eOqvAXbhLF%-xgvOqG<>`w>2j67to^9gBC+iuj65o@ z%ckQ*7#aQ%NS^=nm{DTMuvCPJ-P;1$-JKZSD$13=i6)*TC?qoB=_hQ{{&s=h;N+@7 zMN0UQko0F$kdM&2 zCT)D5YU>`Sq?8CRPYpH+Q|Ld|7&pFGqSun!>A=kD9DKOiclZQpSGQ{?CkQj%SZb7# zd)bZKmX2gdApto{ss^Z=hLf4{xi3S{rCjFCCv7na@yb1+Vd_I<5B!*8+C=%D%EXI8 z+u3j8ge2<&UU32R5Y#~AF|nQIIpWR7JpairBKJRHSW6mb>w^67;Iuhmu95iKY54q& z-cBFZ7|0_4$Qh;I@9s0Jh+x?*qQ0IBZx`i%<5>lChu61~o{#nUJBp-ZAGR!z$B;J( z#va8}V7X#uPdO~?dq34;f2Fl5q_dnHB2E`so9DAr_Yj`d`}9Uk0OR1DI=NVfb()l9 zzY|j=lwi^BMI}HpaP2v)AJtNw;38XY(wosI*V6z7ojiG4SD>sgY)F|w`mg$$nnMRXxj|kii#<5+cYj#ftUk!XdU(mIbT)Vu0QVlEn7%B$Hw)pg$Wtj z1Zo!X`0BxtN!}X_^6Y3eYI56~TrxTN$-ZXk-tarJdo`V}!WVV*j*jR<61uGP*F?YW zxZ_<^qP*PAED^k}N7)_kB=(~sv98EHXlg&_9e0W%YY^wuCwPii;|*uH#vpa?C{SvS zPZrGL$1iyP5X~Na)vp~$rBF~b8NN^E(!x7uJ22o|jsiU4$58U;4x}+}5Sk28JnZ># zCjyG_W%?yl-Y3`#!9Cg+U_a zb@j?ZfW$2_BU@l(E`jrxQ6Sod&Xk!im402!!#3G@uyr$nldvuOjIg?4<~QOeMPLYT z%>$;qjPn&niiD3{F{3FoF_uVcq;TfV$(ue2{Z%9*p=a-WT4JCbIZaXWFD>NdR^DSc zI`iwT&1A`4D}*Ptl>|8re=#I4~VuaAO%akPRL|%e$ z0rIMWfIJ8wdHr%x<>9fWZ=U&yR&tS^WF(%p*HWZ--pJv1OF2J&qcksM^J06ocA0`? zJsQ*aae16A!^q0|$n5Z7h(=kB@Kaa;>7>N0XBu5wAn_WXr3AfkFt%}unAf&`L(2#| zU?e_a7&Di>jv!NIQ((nPkz*su@60tk$7?%g=igNzA~h02Y8jj+@fLa8A{H9PHplZk zGeZ>zz}w{Rm*@W)S7IZ4)wTHK276M2**vV8=y_iRMDy%Vx+nf(am0kYtE$S)oDQTH=A)3tD0d zGBCqehhr7}73O>JtX=jt_QiBWFa7XpBe|$CPybo;Z=3NqO2wcibsz*iB`zgC(L`>_ zCLT|JK@5ahKD585_;&X$NL%0vHQ*0>%T$n(VdoR!pA-^Q zPsidft(ot#KGy}2Hb0OFZoIuz^#YL_5S{T##R)W(Q2on)@b3~I*(f4{P z8y>*vIlu%`34hv?SN5|wy{ywTHZZi#2crFm-wUVK=9sRKE~NtF2UezSe$uqmB1?%$ zA@)bKYC&y}?TY%2)6ai>-*)QcWECJk{2ZV~%0~0@bcc-I`0X%B`_8lZT1iZ8EN5Vx zw>UM4@0_EwW-$jbmr1gP*QS#rcr{4B{hE!Hv>=@{#!gPc=&;@7Om4j}T^+=WT03KX z{$|d!3uVFiO_UiQViM=dkqqfg4n6aT7FeTloLvs|Qk{lwm41U#;s={&5djFc}g;)%voWC8UjW2bj zS{iM)YDq+D_oY({<`e^k0%dmWW%!0=QmS4Bh4;wIon?XT5`pL(JNDz?92F{Ep^W|@ z?wHu9lmW&gz5W|T`#7zk*+Vo-s&YUXwOwt=ty1G^@dZDpKLu3|Be)8zte4s#wUS3D zc#Gx+19bMl)x#(X^vK2Po`T9_$J?djwg)>Lt#!fChk4$o_Op!Dd>6kD(&SsJr}c%1 z$Vt}M3T2Oz@Gtn$A&7sxEnUcdAk}`l4m`RYSV7mIwt>8clINdS+$VhfK4=ZmV7&@4 zb+IYlO4}0e+NUqU8gL>2>$}~o`k-L17`AY%l8imNCe=c6B9B=Fz7mG4jL-LhV}S!$ zUvR8~*bqeTq?WV%?Z;ni#?Pd^cj~+cGHlJitOr2tZ}|)e+TjkuKCh(Pa2bJ2VFe)W z#=KX>Y@{_12e(8kT@nv24+2I%zt!-13mg`%d@pb8sug(9K%)y2{+Zc_oX|U|2_M>ItUP}K!kWO~p%65QAa$gDcL?zX zfg5nHE|lkILexq6ub7nj1XGa{iel7=<+FELPBZy~)XSVtEqSlHzS9d>FP&MZ@K8ll z-~~K+=XT!xL8u3`h<*z_3jwtBP?;{C z7jp~J=gWCfqVjS%j%UdMJ`^V}s5*%tk%)QCs679_wU|C0^12N^O)90 z?&_wM@9YFl`1_A7i*?V#e`JJ!I{XOWZ|@%qJ?p)F@2&%29cT7B^g$=!b7o%dBvIS< z(Rv<}rZc7^U`3MssWM54;|ckgPw+`Z#!Q4MW!;s$@CQv}gt- z%E+*R_=K7-Aw}~-Z^-Wnn%vSLin94D2Caj6 zynj8j;E#KsRi9B9@5G$x)wY_(yoWgy#lb3YXH5GA1w~p~)6Y2vA>G$}G*<6va30Y5 zsSDFxd|pzqYu_U%!az{gTw{PwE3MF^h?3I zO211YHa7SCA0AaCVk}}8TjCS8R%!PPv{-<1JJ~)rk?t*n>~BY1_o9u7zfWjM4%f~+ zd;E|jHY*z-$MXOpH_;=`YzxhoeG%qfP6M|>Eybl37viGB5HO^%SiFyH<=aj5K)O)z za`&|+LFzI%>6fuZnnErTqF%i-Rj_mjRvimXb;ZK;7J~)~!RXCR;?Do7q%HLhDHwt{s8}O|^@5;Yor=Z@+T? zXelWtcc&QZmveMO==@gA^}{n^G)cC2)R}!TPrsDg;kq8(v*E?byT}AtHb;t~VqK}E z@x^oic`AGJugb$0e`Ft&+B$Ws+Rv`2VS`fWr(mnclcDE5wf-`(Z_cMc3eV%z32@J) zf+1el(d=@Ks9)HKPQXl{@?UA_RIE4s%%TU3x@}iVlKEaX6XAcj*mP<~CGedt%6A33@sOt-QIx_R|*V{8XEiO=$Qe zFSg$&_lv{2&MMFvm3}wt#22aT**Rn8lhbypHdlaBmrVNqgxmA8Sq4R#EL4^r zUah7@&I}Z>*$uVyfmkVpkwDn2PSz#%5K7CPY|H^7iPM;pUekQZn>|;2m2{UTFmLeU zh_Uz_UxRc{K07Jq`tMR|g=llkr7Y1gISCCpCinfcJaU^Tq|b#^5|&m(Pdt2Jz<--+;E1t* zyXapa9KfQz_0|C-nrqUE;7Xk@jA}V+rmY#!9hmwn%is{yR_m7k(~*$oO8?{P$1kd; z8J>Z7WMuqt@R~9aYj(VE(;wSVt#V(>Vf(9#di1pQ7p2)IqraF* zR2&GlEmPf7NMPSgphNZ{yvUuUB(qB(Wp;z)uTjFS&$<4=A|!z!9zA?>ZD>jQyDr=sTL^3m#xj$#bqy z#xKCRkEKjP;X%EM>txK3DD&yiMAb!kL=ZF*`ea{$+?W-6WP&zkCq4e|S;EC(KfEc^ zNG>>Z8e6l2GJ!C|#?&LpEWrTr0wKrj*hO6#$N=;2dSvbB&p9;yTtqVr6me2brP!F; z!fy5uK?(w=zE3jA6x?wQwOmF~N1bbz z^3=*WSjxB!wuviP< zKyxC83D<-mJ6wPdoQf5>kLgE@9eKU)>hfFAG0eNROUcmT{TEr-4FV#DqX6IADcu)3 z@~W4@L3|jRNY3jk&>~5sAJU9oSsHR5rsbH<(@ZD!(`1&avWke0h6oKl=B%&z&| zO*PmN%E;Z?_!|xBg3$mzXOT#NrkU)41s#{4roUD$c#~0NA(w(5i`k1|4&)+&N>16V}p+x>$$}+yPqspX`G?MbZsyL z;RwSL4)*-^UDk-+s>*eD{;h?R#I}CJv?3+0NF`nhp~zZcy+;id{ks{S_ZqE^%FjT| z=L9~a9{3PF93L7FIC>JVKjm@d%bhjQyD&SQ5dQ;6_U6)%^{0_ImlA@$YiKP#hvQd* zyiPsFPnY_C!t1O4H-sK=LwVv%kM^~P`v;We9ADC_V|U94{v1PYlde^S|bAd ztGaUL5SJSp1zf*_%$JISn`RazBgj!a2;N5nett*4&vKWeK+n^P3SjSG8qar?O=ySW z8+lh56<}*HvH)K>L1vC*Hk!NBWHGk^n*?&dLU5El@9nEI)^|uL!j@=$5{~VT9=v1! zMr3vV1ls)RE#mcI zM+wM;dNPx0_=$du{prQO%0`q1fL?^YO0s)wp_VdHe4=hm8-ImNZVqt|Bqo}Hf`(0e^95am`@2Y36il7QZvy>xFBVUzN@3~WukSZ;KH7OoIceM_dzN&xzV;Gx8tTgmqacT*vK-dy!gL9#xRp3mV;?#v ziGg6wKb86X)J1!=<@Hb@$SOlKv2wV6H14JYay1s3WxqSSL43_>=|b?ScKd+uVj$o^ zB)7zNmd4!&Gc-6O*T2`0VN+Bc`nF(k`uB0rHCc!5EWxq`xJc#WMe9@#t-*4XI&eTT zfXtc#u{9eru3vZScrPz6gP`TFgaCI~yNR9s#qYM>PRo))e>N1@K)EwPOyeL`CirZ| zhtLBFR|<;u!!qn$^plArgHvqr8fwVHmY1Y zm;6+TCuNqUJHNJV_FWoV78)M=x;_By{Ob&0>^D}shUmMNpqbm&V-0VkXouVjO^(S=<2*x@*|ZTA@uO4^pgDx9K2FE;+UJx&uaDdW=5EV8fHE!4yEcU zKsz7*!t|(B#}hQnMx^l1!-QLVAEzGTWT@m`W{C-Hj-_g0Pz~r8ynW&S;W|jw`sgFLUK-|H9pB;l`ai(DDa*H?k9Jkxv3{2yEni&HNhr?vBRAqQG+A z*X0rp^8N4B*9IldJd;p72t z5AJ4BnLk>0z-DH>?Ap^?#wntiI@`FTDs5>Q=QQ1`tGr>{adSb;w7Wj7zMu}gYd{0? ze6H;?JZ9M@iI`+vdUH*MUPA@P&;)I2g6~m5LnOYQt20}^8oZyS``?<}Z_4KP7+Gt^ z4a%Pdx>~8y#<3IJ>b-12IF`ONscFc~NGdn)`=p->>}f?Y3zAcB3(58l3_WlnYBrzF z8Qp4Hl^%%jA`+o&%K+qI>=US>>lcyR+jZE&eLF>CJhw# z_7_;pMmaPTh0Q$NDT#TwT{7eCmWq2g9=E!t^z7bb{>=BnQGSqZK3Be!f+Rs7z&DA| zE>jS5g=01aIj`v;D^-baeHUcGec0}8DA(a*b(*R(w+8uyDR9*1M^(-^-d#^ZM|kN8 zM0%eUIe`$zB=sf~Jw8Mye;?*>NbEc=`o`+}D_M}%YCP$(CaDjK*k5DF*+(5>JKf3UKOMaej5W(Wc~4Y@0-*Z4*{a(Kbw0j)&JKEfH0ZWkvQt_NJ(boL;u@rx!=}vaOZny2ZUti zVEaG>cDg!s`B=Q?Z2w@PyWp!f^oVW6x?@+!-D|k&wWc`*u$ZF8%O^$NbF;d!_|` z?)}Df$S^x=$PnBrQs$n68)Lu0tSF_&sOI%g)a;RQuhCF(Am)IlSC~Ey^EDp+DuN>{ znoCOh#jY1uDVb>XZ>x>KO}u@Teki!tXh)P|-%zKObo~RP&thfP=`SNZ!$+?@Jf?eF zBuf7-*fjpxofA?^2l3}^wl=h@`~4~H8tJM(edyV+Srv;x(R))}z1uhTm1*%@RJ7d| zCBR+jGJXN;WU-7#lT&6mJNKv8Yg-5^l8_Pz`|QE9KTbX4Hj_EP3VF2)AS?RF-1k{J zx0OrA$X0VAu=M|4*sny#Gb+4jOy}}-b7|jn31C53yyZFR8fNp5_ev6qj3n?5@2=?c z$W3Xw@!GYfVI;?6Y}8;v#&Gihxb3dyv3rmt!bXUP@0a6roaP&i4RHhZ_oTG@4--{x zm=;#`!(*IZ{n5No!43&*V`7i!jC_3e; zU-|;(TA~By+Iw%|QptpJaYO68J_4nWB>5@zxH-}D^2N7Kg94w`w)a^^3(WXK(+dPd zX4BQ%R$?S#D&wg$lQHDZ1L)M3wyW1LwVTn)+|zNk2H9LjV73PYRX1g?wEt8Uz4v7J zqEl0!64P(>`N|FX6v>6a#e3LZf#>qn4}5vN+ubjf_`M+P$TcshhG=krM0UV0v&NBzlN&i@5Ib zJZqOoDAex{Za}4m`BKjl~?~WirP)j7``*EhcE0b9%79dIig5 zG~?($c53kQHSMFtW&$qKSKXLM*6V5G+1TIY?~hh)RQXW47KEs!eJW8d=@i3$&G%YO z(;&6xr~3p|GNY(jQm`T>3dsYHt=ax0=gGevsASJI=@vq8BE?E!=r8pTPCJS@Xvb5_ zo_FSf-8KFOJoY5~)93>VR)s_bwG_V6Z$j?%DKG6iDxiGI4A+SiwWd8$=M#NKN(PZ} z0D`lIfGdw#N-^UX#?b-YO$)8`^th1Qu! z_LQ!){6Q@Cs1RJJnyz%ZM(4+gCPkB1*u|s6472|9ES%0wtJV)?f*DkF-z`#7Zx{#?Eye3>@bHm&`sVXSR;gcWF-&64 zX9uZHv2B~JbEQR5bG3Gx`9xeNpu1t+A6$Tu;T0z5g&>GA=o@{~wy<@A9p?G2qHWH9 zrc~m%b&Bi36h?bwol^o;P#yqEw3!zX}O1c$J2z?2)aJI7a{J z(!d}(d!y1=&a3N8Y=nby&e&@8I($mE)1dd%=2d&NRMpq@D?#nQ>_I@*mr3`g$1FI~ zck(ckN%~%qOCR^$?><_)RH=4HsJ7(qdhRg6g@s$(sxR30iZB8Js0fzP|{lT1UCii) z+A3-mw`|70SkOWP|LnXnc;{fFV+?Hh<%h?wKFr#xU%cv6#}=8LpwetGovBWn;KayS ztQ;eWqX652H(<7b-$78jgVv4^48RFdVDMA3S?sCMv7N72pa64KY{`b?+=f5-k}hM| z^FH*zH9Aeovh>fM)pvWVAcD>27p?BtXKAHbWWkvitIAa+*J>n}XE-t-qD8&pe5wh4RU87AU zkR}$yEiPObt0x6PQx%M64Q|;~m|~1M6jJ`6$W*mgiT5>p)rvOth9!>3TEqhQGF`{` z|DIHTTq;hhwTTsa@PcrhFVi%*HKmmnAyR*?Zcsxt{x=w-9x$-qGzMOysyE~b2P0!* zdi=3O85=3KO6=tArFNsfGyJ#C1HzlK(**^tFuAkxDc-a*MnP}>D4HX!rK>&#-?3@^ zT+nwa=S76gygfDn_89!D;=42lo2LW{&Oc1v;^)ZX-$T=LcU0UCymQ$5F651a$i>(4 z9K18umz93~zew)5eQTBDqqlc>V{^K}-=mGncb&$_&RqjCT*p$S7NBVC2wxelhZ-Zq z2)axq-`F*}ua*-;kNr2|IrxUbJ64AM%t5`D1t;g*W-4&8ODpZMI-EBT}>%K8Bo6^Gv?QyvnrGx8ss)n z9$){W{y3#Q+ai=#?D3)419REN`BxTQ28%WDg>sS~gKx(x1rgGryZEVT-~e%v&-x^r zs)2QyFvjCwj>3mEG*?eKF{|P|=t|P;Oxfk^Rfp=gI;f2N)M39e9XtDPnrAp*bG)*| zGpi0Hv7LofJ}Q>%cD*5cQiV@*VHcFJNZqlmWN=kQmQds~i?G2!SCVx)%Q6kLse;7HA|!mPNDfY+YlGL0+-p2RCqh}T}S zesT~^8RVHr@T-p3X`bJ6{p`j6#4Lru{PV4P&`|oaf6z$D7Zs_ycfa>ZZ3WJjW?a0a zhvt7$^NqtGXes7p>-d|owEEH?>(2tOaFn;CYNN3iKE?P+az41O9e+axETmaEVX??w zef2am`P-wM;3!(5OV=O!JIGFnN_G?z<7eCJp-GEqk%|9w!uNha>M^bF*6E({&Mq*3OIRs+rC+{+_h4FcMnEOd34E1 z@KS=&U}f32@%4XmPzO@*K57Axqr$ZR7e8K|GQZKHS}W3>pn21bELr%UAB(lmV$mJ5 z2zkj#9eexd?OauA-7W&3A{r`qqEkYh|LY5$l=R~NH2nG*k)rEi(i&|P+vWV37#S|P z^Wn8^ydOPvfPvk6|>iL$L_Sh*TTTEUkES=DFep+q+6ev$Q@h1RDY`FFJn4+2{8E{)#3%B><9Q3X|{_~}mnnkb} zvp|2i->pI@3fhd5>H*pGz;h%kh3XPEGL(i}G~@alFb|8c?i)TX%`x_BQ~sV7v+6-) zU&615-!he|uC7;(TKu2#mgr+MJK#v;Y(bg{FK(W2JYp6oxRv2gQu?0Q(U9;0@8lkO zVeWJD7JW?7T%}s9(bsi0&8VJrB0zU?lJ>A3sUE2rXu8XWSFLSR=c`Su(3T zcXX(a?umr2`ibP|uz#pFR@bl2s{3#IuZpy#n283ZPawKPg%;N?!X2;yxSy=p3FJh0 zQ1-9VRDwIi9mYG?Dd0qU7I&_fpqQ~}qH3k;t@oCZwcGP`bO34hba%M7leqyGw?U zMmiisO1fd_W~58HbEG?m_#WPKzQ1RF!Cdpqti4z4weG#5KoEu67*#KL?8v(5v;bPf zYUG6CNx%rvE@2veD-6^&KA;KrT%EVe=TsF|S9isi25Ipa-&2K7xx5JmK+~m{yD31t z*QEVF;?`5#_<|ZUgi&N4uI1R;!uq?w31yOaN>n8z?pL8MfZmXJfU(#5nwg>GZLY|5L0MKkx9#luBpN)auQh2 zEv?)}Fh~*j(ygju4}>$L?$(%VMC08JYk?HXB8^sw4DRAU^S*sax+S(POwiC{U@hkA zDf4uM>$eLLoCe3EEmMW>Sw_l9O%DC!!2q$l2CRcF`0N)H65$uF8#wq^vx~eAWxb-WZjz2Le`u(xQq_(lI{o!DLB)KDC zEHCK_N0>98l3Lo9M!-%-!ozylt6Ou&pSd{SR2AKVHyu|YUQc$-{el)@gg&Vhp)$|VSs!zH1-KYiU?SMlsVO4m0N`g*;VhH(8MEO=UG zFiO2JTFY357$t@_xZ~Vnc*Jt?k9CZ$rI0e=ecj?X3S>%s{G0Wl{l8us07}tLX6UI( zOKP+P!@vAMPXssY4Hs{^-CA%KcOaT`CiDc5^&1w$sm?K;1W&!}w06P3iM*s2!bu^}h{m=rfnT8_Qd)0a_E9x{dWtUAigSG5=Lt%o>;4%;uq9(sV^E!zwn zX>xgdV{gNazE}ZaLb(2;kHUBVx#iJL@rdf>A1%WWQylX+fb=^N%_`A1$vzd7c*5*jU;)#=ol>F3o8Lx|!6-8b?IYQJ zwo0dbQ|`8g&txzGWN760Nc;u@jOMOM;VsoF+s{!xe&wQ0eQo%iF=+CK$VrX?C)%jC zv&ijudl?%mt;bKr_;?t_46H1dK7@Ww5j4g{K?skhlBKZ817 z1S2*j^2xhCAqO&!BY=_gx#0mgPpf9_5dZKao9Ei(hit$b0|GlXgv8J**c2lcxuo}a zHOs(hT*vZ=QFM_o!mwTlntZ^gT*!Gi%aFi++z#-Rt1Qssd}3$#+}A{`s`!H~fE8|M z=S5%*$BMljnJ;#5EXp`{9S+|(Nf=G?CoWhe?<-(2CG`31m`=5dRzY|-b>tUqA-Nb*@PdGYPM<5(5uYyFj zX9`=sWLp4?NX!I6&*e}6ovp4{j=WF_q-?rW{g}DtAb?rwCxdTfsY2nsyU}z-I;UQH zA((&FsL)u}tSSTC63WT~4BwGj%TXG$p5>*PY!T9#I)4-4I5(&O-ZDCNZWo4TBKA90 zwRK{L@jqCpD^ocv&0j#uf0obeKKBdT1tyVecm?g;ZUMfTZweXpbtm9V7Piwo4HCUd zzvb(46%wToAYC%JxM2I7R%QfC_ziuQ<9s>*!xhi=3G^RPr)lf|FN`c7a1*b7>dlD$ z1RF=P=QX$83v*I_J%1tBl1Ll;pTH&VmCa!MD~Kz2*!Hf^iBo$9q1FCi3%ynF2b)%U z`je_iLv*?VQcti|7XyVX2bvG-RZ0O-k~jVt<>B!GLSx!WbgZ*>y1*cZ)7bHY*XpD* zFZ@UL(6&*yOT}jFPE7Z3XO8oYgu?nztYEoA$^V#(I|A&klF<-{SBq!u_D+p>#!M|0$iznhCpwjPROc#cj6t#4d8feO97_NFg5AG7ZvQ&)V{*ORcZjZqM!q!mb1+ zjV}6bC|9;XUByaHi-c2A)}q4ubVrP&U@0r`S8-~ACImOU7XVY$&@g;i}vpYgy6CK@mZUu<^FEEr~2{~1b zF5|)Z!m9%AotU4;+LqSlab&n92bVsW{artbtIyD-a846$%!G$xwEK9~z~Yh|7a-H! zVd&4_mY>CfP+Y-tZjh#Xh)n4_aY`3`8EWk(5%4h!TX=O@?v3}qjoKI7CvB)?%X5x5 zFKt>FIq2iJUHcjU$q$m2dfsCBvCn|gYz?2I*`>amFM7UlF&6Y800)_OeHUC0q_q+< zQFCX9c~8W2B)O{Ywd0qua1c2;8qCxwApXaq^=Bx=9ybyx!Dy$t7K*i^OYR%RFu=By zgc)?3J;;8D59-Sc4-X92`aSzwrah=TPL$k1?M3!wPwNSmP5eNIPy1FtvS>ly9a`w+MKMm zuMK+n|Fy^}nX>dQwaX*Vjzwyi;pUKIN3#o?U;25|&?<(dZ6drH@!YuJeTyl) z0WFPf9Dr+p81ng;XhZu$s8(_@Xu58K+jax04r>mF>2nIBdDDzykjl6$bW))P;_k*{ z7BANd8$R6p2Lvnw=8ksq?VGRD6Q>z4)fskTxrBm*9QUib%_v)6^`v<|LRBLZXL9b> z{&-dx-g_rSy|<3lI<33CmLJLNemDX@jxX#CXw~x>h>(vaG}qje6j4CWce141V@do3y_z&=eer7_`STo>o} z290sK`4K;~u0IP%0|YLJ-w_|g)wEFpc+h*QDgfQRM2@H8<(IVa)`R6m7pp2P?G&bF zVSCo-vjjDXTKRQmbsnKnc0ZUZ*_&7E=;+(8T>ZIN1TX0>mOpQ4VviKy-;`&-79?Ne z%(y#lj=MXl8>iJ_tJsn{S&f~6rYMX|`n`wQFPy!<%vpIIp=pIaiF@cD6Hz&`{grgx ztV!{ERg(5Bja!jUOdYIEE!^WjkJ)&_n0=cU#c0xUZy@QVM9(Ay<2oH18b zn}9=}{1;o-IE~6yD?J&i656awT1#MWar>BZ1gSS|N1OZR5`+}QTG(LG2{ybY_k#Dg z)h|&#uXHy65ZyYabAR-NO?1f1sb`H77jmEDY4UfO`Dt*(KWyDJ&qwj$(VWH$&8|lb zg$<#Frfq8Zh8%@KBj1%- z(X23EtU=rhwrf{4gw;)zQd5+e2xl$tOwQL!sgJvJk^&CJ+X8?Uij-dk@XS01kPo%X zYRpfn7t}-6v1I)ATM5;|{^7bu8ArRe4x_~w1M*zU58}fUCss=h$fDeO6hXb}T3Iem zD{eu;fdhkR{QqsfEKVvw)PfCFFjlFl-qk>t0N^6NJC8*4Sj?IGoZe=3P8s}+)pJvb z0lhi-+9P9m%n9bcS!J8toZ^^QSuh_7Ln-Ev#84XW^9JOz#4a^`4jwu5wIzA|P#o%) z)&JW;F8ilw@Q0$&DTMR5##RGV!|A!4_1M-C|THE!?Bxx$`*s+%UBGNe{f~ z90|Eg(OiYTZPHqpj{S@s z4oON+q^o}6#k6E^4zz}RiN=i?5>^e()&hEEV1bQ;X zE+zFhykKixUrA<^jcOdtJt2Pwfs}%49G%@-Ew%A%?Em=B#*fjKM;MHax-|lfcZH7L zq)o`YnFJ}&3lKMEeB%fq4yUqt7l+Daj8MO<2rsUxBw)gf5rZAHHVwFsIn9Xon8 zkvxLAULAq!>}AeP7iKDWO|WRVqZf7QFK`@?J^wNr28>Yu%)RjE8vpuL4p?ft1p+r7 zsq$~MzPoXiX6`Q^kS>EYeuw5o%xrs4dViEUA8H!#db3)eU;xJljYdaGaVtwS|7^%TE=JG2Pk^X^khGX!#> zY0*$1V3m89zxzGc;JSv^{lbLb8H)ywObK1=10m~}4>iq2uh6#Qg_bmR4Td-S`SldJ zZ!kegOs!^fP&F`ye9^h_-)?4gQf}fx4tD9ZSo1a!TbJP7 zR63qcX)j7wfa7#a`2D(o;LI8LuB5DvDK6p%<=jnP^*z*Po%o3_hdB(S&G41gjfPL& zq2dR^#I~gc9#_O)zr#lQkTS{p_3Zd*4DCkE_Q{$`Nz+q%MrCl<4;Z@vG_Rl}>vyNB_9GKQ8m(bV* z>^-gpu&EEO6O$X6ROi}r3ufI4a>XbvyPU}KlGwKNceM4;(+jdivVG%#|dh>qniB7Rn z5O1*PCd;xhfNgu#(r=fC((m*sSKwcts~ffHQ!I7%l=)r6MEhAbSAcbc{i?z(=|Fo! z`+f>J;nX((Qz6Z*o2Q3^iRnlC8*Q!EAIcj%sp>By-*trgs zBFpUd22W~$f7yliPmfj^;-M&=4_nN$@Xh14&?8AX&u>TxFZ1@@pyJ2ByZo(os_CtS z*QOC5etSmDLaOzJ?Y649b9Lov1|8K+hwB|qtLNk4hUE@Gy8^Sp3BS)&t$AwXcNTW0 zYpFZkpB!lNaM0pVR2VIeXldwPp`*zwGOL-Rh-m3;Ad;zapZ4-6tNqzx&aolv4p7d% zB0krdh?Rlp@n(@@=IeAtqwM}v&onO$Xiz7v$HzGkFMy^$-gxolCd8&pdlSSEhnQIz zo^FYxt5pL$M~GtDKrC>mn-nN4;Lk5`uxAVK!s@JHdemu(TjYy5Q{Y`JCA>Bi=v?>+ zUt>J#(cvMLV$R+;=54(QLf?KVW33lrSnyESQfKUmA6V&7Fl$zYw7qJovwJ%}?8&bt zfuXh#enVDIpu#Mww1~8==nr4O@0&fL{w~!}=GgKSQ$W+ zJ$}#>DLs+Wu1&7Nrzohiy;vl1e0rSNA=~mPye6fxtSut|Tt41={B4z@kzprxJ>x+# z)s^~fuFJ4uQ`S zSDqF#8Ra18D!bo(-)cQgZD5}N5>!ke_{xXtDBfF{KKa~BiG`v?vEzLif~2g?fp_c0 z{rcqbq^>20fM;*ieE#I7x3sW$@R?6Z+?mUG>U<8*N0p{}A^nCvF|t|W_y_+T$zoMUPStF4tiX&B2pDOhzV91(7L_1>R@GJZaQa0n=r>Hu^bmkfoPn9_lRGKX*TTPiJw?cnF~ zux=Tkx2(XSgM(pPsRNX5q+GPIj%aQ{U94gx!2adfuh*)+(kkDY9*_oaTOuJ&*%MMPq~v9;`RnL6bh;kC-u_4Kigs9Hue*eIH%X;eFh>Oje~gG=y;umNQp>pHgf>BAOys zbw7Op#ulkr#7jHmtcE?|nM;j%7N$@v`nX&duj)$m}EgX{A3{8=@>W z0p(>ps!c~TUz<0yRc1l6<#AA}7>6e5`%|(F{s;)d>a9u1^hO%hx*D)oU3!`aL+mYE zTKZZE$XtGstM&5tA#iF*T&KhhuJP?O>4f(NWR#!GXx_(fYj`<1DGIMGsLWmc$e3*) zU=^yK<+}p+trX^h&U|!sd9D;aFI#HizvO)+p#jyEibmRfu6!*ybYrc!6l3+L*JA?A zz3-}u&Wzd5%@dZCZ*TsfQmb*|o`L+oi>qv$&Mlkyq%1qB2(R|@dw8t&ZqlOm^2m>( zepg$$o=1(>fes41JUCv$Ki3x+ADqFhNx7Vx)BPCYEHNfP5c`w-WSS5u)rB}GdfR_n zSX`oim7NlP>aXL_Vg`=9Od>V;>rr#xE{46NgzY%+Q<$0}U`v<|HPF3(98n*Tkq;6x z>T9Q|0$@ju$!tp3G2P*+d95@Ze9`fjDhJEn-_K5R=R{uNj_UXv@7+<-)rE_HXd2>f zQ0t|9lV?B^&4IGX+$bHxRHt>N;Y@}J(?JwTCX_m;o>zjezv210x7Qw871V&Z&(g>) zAv+hO&qCr|{gz3KGo0Yc*j^#qz?b~v?6ql`2{g6FzEYL^yZY<311Ej6pQJ5T=2DCA zev{%z245a3kt^a~E7>zR<}Rrd=_}TzOhcT^qFu<<1-~N?T^nBVZ)+6^^RurRhDlNQP{hZV$UX)eD252wxL$;txP5V7`?&WVITj2 zef7iSLk9-PA+|$~T#uNIzdDS2hr`DB8|C|dyKnk)Q*^6c821Lk+jNeOX_BY)`GTPL z=?)CcgnT8c&={vWWeIT;N~2XZXa)s(FC;~J=&vJAWS=6Qt;qrJI-6MNFeDHYXb z6LmwJwO{WBeBPYC5CcbC)sd@Ue|OTnp=?2>NqOiK&W4$Yx$4O~U&f!`cB6Y(H(dyZ z!XR9=aN4WF-dueb@7>(3-2=P=doC@nC~>(Kr66bkc*GB_IfsfayGIcJ%(RS5Tndgl zrn4Ilox=dR2C|#}nZY18kQkaFF@KEhQWR^{xU#YE^D=Xq9-V~GBZyw5V$qXtt|Cc% z^l|Ss1rky7GCJ)--h!lm#kyVxiBX$(B~thz9I7I?kb96jo{(<8IvI3?&3#EYyowF` zBIaDXA1{tsU0=Z)6^|zC$t(?sPn75I+`P;0Q=f)eTCKZUj;Hx`q-r$^*`{CkP-Lhu z-h9+YncYjs@_g#}&4UZ40{KP~#mny$ZxSh_iI5|7I^|9+>N#rL;y*jaj)1exN@eVA zE3%m;6LhIE0$#Dba(t7Q1f(7 z`e%mbUgkKA#B_Xa_>Lc8Yk6%r>{cDdDhet|zpa?t&Y@uIh;>Ga=kRcOI{KAuY_4Q@ z;4svHWaYQGar#Nl$4Kb_rBuM{#h}a!Gp|6lZE&4{NJF7iQwrBre*dPRDAtPwZ5;FV zxHfSY(j~RQTL$ny^@SWFb03XAVp>;LYSl**$;e=#CBCB^<_a!KNtb_C>_r<1-K0bf z7Dn;n?A64t2RVLMzvtOWqe<3RGjAf+2c{d{@dO zbK9$_zlyg@#EoySC@qJk(_x#ZnA`6pQm<2>dY+N?itu%4bs8&Jw6;tA!19~;QA(SN z%c@1huGLT)sl3HdUpmQVLa{e^xIr08>BM}kWf76uzmlgTVF|Of*nd55PA3O96`KDL zE<`Q>X3NQ6s>SouHoL{!f5lVTd&ZZgZN5;`qgD&&eB>Mtobwtkod*|?9`t(P<}D%M z4TTE9n06wB(&!d%&gpXCFDDN<;QnoL+5IDe2tE6@hbea!ns zlCi#1;1FsKWk=99Nc6cB`E<9JvM<$2X(`Kjwz@W);fLnhuTx5D&l|p0g{1UI)g)0~ zYn0X2?DOb1ja(^f;_wZOibtk&AHBld5Lv)|9Ys7?F^I!aLT*JoOQ_1ov-aoJj!Rap z41GLWJW1tgVsbnskQUd=5a5f`Xk+;Q?Dd=*HtvHDFeI~{YWAa^*dl&gvAMVylYcRaTzms7!OkW3?>qB- zv27m2bfU5AXWj?59ZV^xpyc`>Ogeyyq|4KJ`0dQyxMo|{zBL*)ls;;ILKq=$8T!2< zl4I`FuSQD6lT=dxn@9D-e3a#qb~PA(ig>CnB2-i>_Utr+f`D}B_MnMoaR{HPmg9(r zISw|agGQQt8#fr`AvR`x?w|dc_=#$;q3=znfoA4DIHfV3{=$_m5F7H3Dp;LiKk4$_q-j5U;-?__ULvtzXB_PHTGZ z+n5lwk-ci3vS5bqZbi;d)f;l;v<>zhpW>^6il}yu9|+c6f1F-(AgnUH$kv5frw%+C zd(5dXTssupN!)KDR>1JrFqgCVcP%-Ke2rYB)h0BbRGjdIqM}pYy33(dExxD|#8Yt|LQhhIA!sA; z1?#$FsgS6(gGG}o|Iiqo%Sn%?U0QGu&<1ofxVJVfF7(_y7$X_UFf%#Q8H{g7gT&y) z!>+4L+1jIMkHFYH!x#78$LS`22>uo&s7G+BIJ;YK9+Q#&6U`QE?DajhY!$({()%!u zQa&w`Jb%>p-5Yd4A+aCMXh&blwNF2Y;Dvu^10lEY+g+fD93$S6PV4I)y?FG+TV?pM zUxsGEz25t1CUT`Hd-_Ea?`#AUU3>puREVaLzK-Hh@~~YsTK<{dzex}M5GOCwCVbE; zJglxmPX)+K%=loVEYv*c>cYzlDy12rAs_M?^m;uOm3Cat?(_k1jP0RPtH1ZMPuQe3 zWQtkUzru=p*=rZ}$b1#70XM8ASbGhk@gXd2%{fH;cDtA1UM^>WlpC@)7&RLtn_fj3 zv57->;qPBz)-;>a4j<<9Pjf%=9n{ubNE6GQ_=i=JHU)sh=IEEvwrGi9SnU&KLMe_} z+a&bzZ++4BiH~Tm$L=xcXfz_&&&K%m3rNm5@gv<&j2rP2=G?I6mR=x@SC*?CPolw<7s@O#)!lF@+n zTovSBA2!aG`2+LnU=sEUkJIZ>d#$L`r(l+>H2~lsL{iD^2>HVYx^T_fHmj`RM6O0WKP>q&pR>jJrvgC-T#WTSogK z^psiTHsor26%&1%ptC4(>UcuE_p|sa&gQtz4{|l-pmoez)<@{O;~;eCj6UeV78Wc>Pe0? zj)ZF&UI}^$gYyoFHC{9oq08_`;5*K|O^B26pswo{b>^JRm_z1GyYgW`bz{Oi;yJr)H*d(`j$i`_D@C`2;E!^tP5}J^F9Jn&(9nG*FnX$g#S?_Q9qqNj_jwLdseZLXJd{bjY^iCE~YQ0cmS%#X_ z_ak65_rGJNC1&<0#6PO6sag8IK-Q)*R8%Pku>AWlgjqbj%~e^UjJJeHiKF53@_s)) zO6MrqIM2O@4*E*}J8Ts>U!VicjM{U_g2#1ELWk`H30Y}UwCOWtW|0%Vw9DCu$C@FW z?XnI9rsCCEh0Z$>4ia6?c~#UZ{Oe$EdlHsraFXu>WRNiinzh@HkY7`CLj`gh1O?=; zW7c&Dn-GohrCAy&p(DBolsEn=HT8%XWy}pKxOl|Hh)quEm?8$5b2XP-G)=Ll!U=K_ zOG~xiEg2)6aY(m|<|N2H8tDZFlFV`iBs1n-2OtMW2M5vC+4r^BkmXwLwhz~MjZ1h( zZi=?pWk2#^^awmE|MosYGQ#$cb>4t07Ud)#ac6VWAG=E%MS59^H(x;5YVEgQbl4j~ zTB294xjLT+R5Vsgy^jkgpZ>LgXrv|Svvo=|B?|I#@O?{aC>dTLhhns)rKEl27fY!sB zCC4AdBk*iwU4*7E(aVR9%XA)JNWZ_3?N%$b(d~0>Bp79x!su}+vCZ`ltv~qqZ;$s_ zZWUz|bq7Cu_9Oi;#jOlWd9zMm?z~d^Y8o-qRY$N|cx&axg950Dl8z+}air6jHC12H z20=808+4{-sB?O4CJnxML6gqvc>}t@eEIIKor06%ibc9>a^d4D!{Igt({Unb=9p31NGNOES2*|z@lWnfSQ=r4 z#remzHpBbjcnqd47yrOZWybt6t4fQFbEt&g~y5yfAc*pWxU!$14pH7H~{nJ14*i6 z#h@K@s($|-iixXXgy^8$w+h1>%(n#zBTp0<-o%yJq2HD!j!QqfEoj?pcZw_iyAK|-(Jh8=xi{XULt+in?(n7Yg-EX8Down0Y_|Q36vPAu*o0VF>e-z-t z`U!`v4l@i>-M%*cXKdYLR$^FjP0(Fc^+m>MtFw&$!qxBtyout|ww?7v;O}iA>EpRW z!|E|_lex8ekAL>U@ivtBG38)1DvIo-5Bd4-P@_>pj@sI_}w_- zn-4-h(`k=E9UBj0pDDTSnYtDBB&6H@IoHk5uGJ_#Y0$VBE+if@xsC4jLDAUC)EYNV zzaGT0VnHqsrz@CGDnb&Hi($vUG0q;p;_-I~#6LosHMa|d($v~JyDmYLV^7prXk-hQ zAM@V*p-Usw8*!2d9#iy~CD@s~&mQk_Ct1IaZYyNcWDhdheb@$_!8t&fdI$Tid!iT} z^CXHx58s?6(%-|C{8tTqk6opy$zj2*(c_=pkSCKQq)4UVOx@#$Xz1c;wdfr(R}$=t z=p9opq}RM9Xw>etuYx3==-2mjUFKF=Fm6qmO#h;S{I3EB(@?2o&`qF7mB-y)@>IY@ zwbQrF_RSYOOhgAcs1mZj)$Y@|Yx9go-B;6AqG(J*`4}AjgK7z&7XTb8uS(UbTx_KD;dNb#;y7SQ+kZ^w7T({0CGc|sPA!b@sNgWG;PI?neJCyngB;)`r+2N`##YNk27Xc z7NT)q$v5P^+xA4SVP*UtayJ=|ZaJG|ctg3n0CK-<9OoLj9L?~w8s{6iqL&ZYU@@M{$Z2JFcSuEzpmWe^>I-IDBW_si#d-T&*Q{#h_#bC&|N6&DvgDf*esT5-J=e^Nt=Ye`Hg{SX-fr=PfR~>BB4_1$`FInXH!ey!7S7Gpu z!mjmA(n>Gyk1~lQ6ottH__Bxq@rm1dYrDfwNL3U!$m=*;bU3EVpB48dxACT!fnv5b z<8(Di(DC&0fc5^dg;fMfDldHy){`kWbe%IIn+dB_N*#CbD+;CrU(n-yrH5%#^v+1u zbx}_uW3l7vrz#+uQrih>0UfBf2;mD+MLb3|l7g_Tg}lKWMhnDPS`;53N<5m(+)U0s z=dz+dGDzr18hb_X3QD8pA=4z}^0@eej3*G&Ac%R@>$HyqcLa8hi+F5UXEPz#Vor9| zx6DL1nESxtRhIF?mwF#88T1&B@QOq4Vj)x+Yys4};0yCUpxX@GKM0#}o?xz7ce?*< z+Tf!@XS)8;StxUJWRBq_vZ|p6gg>aMlgiROVaANyJUkMaLQWT=Hw{cn4pj)S_;QTn zQIe){f~A-uoGUmgE~PyO2M66qnf6C3V}KIkPGYp1Y8vsxRG>H;NK*Qiiiebli(H9j z7QNkpr!q6eJ5+(Xg1Dr22NxSGFIc6!s6a5l@h`r($6AZ-94P2m40b|HL-cEL5tYr4 zq902V@+BvRG$Z|}({xTGlY=*zmXAd5JNFk)q)0+&qwi?Zme0twGG;+Y~ zwYq-fB`7HPMWrIoASD&Lmzs$lg1I}wJ6Zh}*RFJ#9(ninJLM5&?cX@sN#l`RR8M{aO z!TZm9YvKQN=oADm?lU|6+ZRppWDc3>BQX}^%o#IAS9ZVF;?vI=+79%*oYt zT?#}{25k33S2u%T6%DbCgFOt^CVlj9rdErWF|7&KWb#xtFv*~7HGdLccS=YZ2ZL7 zoiMAl*2VuZ$a~piR-7_T7x;0Y+4tD+heF$Cp0uHW{Y<-x`Gn=2=H_N?2s}Q-8o83c z)~s6R{>o$4uyLd9IN-R`u*K8R!m22J{tkGRc3c#29saZLph6!3W=|!SktxNy@m9t% zzM$h`d_nUhn=W|fwg#ExZA3U`5r0BInVftgQ><)5hhWS}|FadwxDi~#?(|shculKb zTp#v!XUQ4^R+EP4P}|hpCp^1;EX0B;3~4>W;dC))PMG|#Fn{-~JdSJER-PqjOzHEm zH*em66Nk3npvU5*&trMz>>s(gH7)4`154m)h6iQLyL3{UfHNK(R$6`BHt$F{4Q!4A zIZh_%6&#hO+&zoCC2Xj&g!9#y?+1pB(h7IwfeA%X09P-l#7S*4!FE>FrXVHGCW{Xe zIY9{Ce5N{k&TAaDneBOX_x5YdYri2BwwV%y&kQ4*nVfWO$q0B&YHkJ1n4cANT4~(^ z-iOPL#b+4q9Z{h?npu%R;1jl)acGRrbg1^+54K|L96~E`paGf%w8MrD21Uw*j zLeaO+nb!=huAVk{F<-GmhL?|DjJjNhSb4f+7P4_QZGGq4~(Fo{1Dwq%O~2u zYz(F!Z~#8+Jy2oTlA1Ej;B)NhdsLaF^7e^-C2e21{lK?Hzl

8Qps2PiYIgzO=~u;$Th9wE8mER;5LBA47VNHv zb0mZCs`{6M%&n;O0o#~T;NCvG9K`3k^(PInV`0px%6RWTO%k&BSrf8nvnDNl+@Atk ziEab286S?>tTlny9Ac3ftsf=jAxzWfIB(Z!Yl0j&?t9nUd%YW(?uA@-Obm4YoZdFf z8%&#tNxqf%mUN!Xb1CdN$^~16ByE-$bPJ*s8u_30ZEj#Gc$IIg<0x6$==tHQ)2E%+KLP;TMpE5pOX6Hu=lk;5AEQ zn@>%Y^p&9d)8ALDnp?lNnUl$1sGDszm@xh2sh))gK5QO}jM-&DMi>}6;xCd9ygkLn zf?BV4Mw|kt=H?*Kgu%159>1XM>&G&O#fAWUoxBojE8Yy6u_D?U_Ozi`%M--$jG=8* zv^VAD<(0_#iZrTp>eC29Up9Kb@%`G4m$>_h!;Ou!U?5gP~?PY|e66azw+bx|U0oSYmVJJ;uU8dwTE)${(&XI*skr&r&-e441|7tVdF#`p?k7p;0u zp3$XNii@gszHbq;ALh(-k?xv9cw~ZPr#n*q06Ts4js^5ZL5wnJ)vrTO7OXkV&}48# z<+t~NHKkccmXbER`k&kACBbNx>$jQP|eQHuFm}Z`wEraL+!tL?G4lse)5J`my!lMm- zRS{UWGN<8Lb7MP5|xRJpvq&6b!VgQGXVt@UoMKw&VV6 zyF!2OjUbFR4Zcq3it(SGo<>|(O6W5024PItO(dY*SK9za>GeWsYbFC=^jN$ z?c2nf|K~LE>-`g>e@GQ1Im4FDRA?fzy}ccg^s#Dbc2nqhy#dVAuO_MJAtSNe|w2cU_5i}`&D>G#eSbUv~8JMTz_ra;M1)Z4!!Y|Tx ztr{giDC`we!rD@cr{#-D{VICIBKaXz!=pBmTvuD$>w}xydHA1rD+D2!KzxBQJZU7D z)O>ion9)@k%@Orc8p5(}@H2bx6uCPiZfGuGOz4$P=Sid6aoQlK$-k^d+7onV8fP>a z<3I{T|9IyF^O$*KqHmQjX*5ao+_nz+1>rq@EZr~PDmTCOia07)z^d~%aXS^5nGi5Q z#wBO<-7SBET(6GAgC}<{EGI7C3|Q3of1E>H_eJVX!%bN zGy22t5wPIDMB8zNaS>n!qRzhjwVDI2YgxPQ&0>DaB0nA_oa0I)cxEJoV0ytBCBC9n zt*zi5ztsfA0!p^oA*5e!{}d zawY>l^%b-&qwZlnFJwV{t6`Cs>C&Xu?MRE5z3C5(?U`IkF;HSp=6gmKgE!1_NNu#) z)F*Z53dxl2CtdLNM^4HebfUVg_N zm>0jl$Z)3V@3t8il;|Em)R(;B!v2toR1d#ZQU#G@P!a3F{v7HpE;3N0H-d) z@xy9JafwJekFxA2ayvzFNvB7rTghGK^&@e&?*4Ac!pr+#1qB7-KU9h|J!q;1{5o=z z6-n2k20fV3Lb2b)@a&xM=5S}1l%;Wp9g)2oV_v;wSzpT+t96lF2U7xR0cF4a%y+$% zX|ku8BhZO3dU$sTM+?d2ZaiJ+PLQfp1sZw#W7gt(4P$cXl#v);ip8waV>K-lC^mM! z!2Ux*e$AMY6^!ap_Qv7l6YqOjP9znUax$CJiV7pjk*_HuR>#GqrG8~P>?$ZF@3%DH zwY0QURumU!U@H?QQoM5zqdcY}CA~3pays@5R%Xmwf$K`)wF;z8X-r3GTt*JM!j{G~ zJWlRjz357+);TylgGuKml$4Y-;|VEgLcjfqMn*=G>F+3|OB2qz+=%%Upeyaj7)MAOcX0WADEL_#{f9;M$_ye%>(CF3Z zKC`??_GqnPtJ*BUBOX22-Mv+@t?iS*A0P;iPuXWzD4OCb-FsW&8xvUu#5_ZaG;RpJ zo2MNpQrv8>qTBQ*62oX~YHC7h&yew7H?V9xng3lH1q>I!1H7N|uHv=CoLkn17tE@?8LB+)Z%(6eJacef z=z|<%fYa42olGcg70nr!`}I1}nnR(Q(As!3t5Qyl>p{{JC%yedY= z6}ypX_Dp43gw^X*;J>%~(*u<8XZY~zJ-Ywr|L2AMpMMD>JYqI Date: Sun, 22 Feb 2026 08:32:30 +0100 Subject: [PATCH 15/30] chore: fix nerdzao-elite validation (frontmatter, When to Use) and sync generated files Co-authored-by: Cursor --- CATALOG.md | 32 +-- README.md | 14 +- data/aliases.json | 5 + data/bundles.json | 8 + data/catalog.json | 265 ++++++++++++++++++++-- skills/nerdzao-elite-gemini-high/SKILL.md | 4 + skills/nerdzao-elite/SKILL.md | 7 + skills_index.json | 90 +++++--- 8 files changed, 350 insertions(+), 75 deletions(-) diff --git a/CATALOG.md b/CATALOG.md index 2516fa29..2c2a6f6a 100644 --- a/CATALOG.md +++ b/CATALOG.md @@ -2,14 +2,14 @@ Generated at: 2026-02-08T00:00:00.000Z -Total skills: 883 +Total skills: 889 -## architecture (58) +## architecture (60) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | | `angular-state-management` | Master modern Angular state management with Signals, NgRx, and RxJS. Use when setting up global state, managing component stores, choosing between state solu... | angular, state | angular, state, signals, ngrx, rxjs, setting, up, global, managing, component, stores, choosing | -| `architect-review` | Master software architect specializing in modern architecture | | architect, review, software, specializing, architecture | +| `architect-review` | Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system desi... | | architect, review, software, specializing, architecture, clean, microservices, event, driven, ddd, reviews, designs | | `architecture` | Architectural decision-making framework. Requirements analysis, trade-off evaluation, ADR documentation. Use when making architecture decisions or analyzing ... | architecture | architecture, architectural, decision, making, framework, requirements, analysis, trade, off, evaluation, adr, documentation | | `architecture-decision-records` | Write and maintain Architecture Decision Records (ADRs) following best practices for technical decision documentation. Use when documenting significant techn... | architecture, decision, records | architecture, decision, records, write, maintain, adrs, following, technical, documentation, documenting, significant, decisions | | `avalonia-viewmodels-zafiro` | Optimal ViewModel and Wizard creation patterns for Avalonia using Zafiro and ReactiveUI. | avalonia, viewmodels, zafiro | avalonia, viewmodels, zafiro, optimal, viewmodel, wizard, creation, reactiveui | @@ -40,11 +40,13 @@ Total skills: 883 | `event-store-design` | Design and implement event stores for event-sourced systems. Use when building event sourcing infrastructure, choosing event store technologies, or implement... | event, store | event, store, stores, sourced, building, sourcing, infrastructure, choosing, technologies, implementing, persistence | | `game-development/multiplayer` | Multiplayer game development principles. Architecture, networking, synchronization. | game, development/multiplayer | game, development/multiplayer, multiplayer, development, principles, architecture, networking, synchronization | | `godot-gdscript-patterns` | Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization. Use when building Godot games, implementing game systems, or le... | godot, gdscript | godot, gdscript, including, signals, scenes, state, machines, optimization, building, games, implementing, game | +| `haskell-pro` | Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programm... | haskell | haskell, pro, engineer, specializing, type, pure, functional, high, reliability, software, proactively, level | | `hig-patterns` | > | hig | hig | | `i18n-localization` | Internationalization and localization patterns. Detecting hardcoded strings, managing translations, locale files, RTL support. | i18n, localization | i18n, localization, internationalization, detecting, hardcoded, strings, managing, translations, locale, files, rtl | | `inngest` | Inngest expert for serverless-first background jobs, event-driven workflows, and durable execution without managing queues or workers. Use when: inngest, ser... | inngest | inngest, serverless, first, background, jobs, event, driven, durable, execution, without, managing, queues | | `monorepo-architect` | Expert in monorepo architecture, build systems, and dependency management at scale. Masters Nx, Turborepo, Bazel, and Lerna for efficient multi-project devel... | monorepo | monorepo, architect, architecture, dependency, scale, masters, nx, turborepo, bazel, lerna, efficient, multi | | `multi-agent-patterns` | Master orchestrator, peer-to-peer, and hierarchical multi-agent architectures | multi, agent | multi, agent, orchestrator, peer, hierarchical, architectures | +| `nerdzao-elite` | Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation. | nerdzao, elite | nerdzao, elite, senior, software, engineer, 15, product, designer, full, planning, architecture, tdd | | `nx-workspace-patterns` | Configure and optimize Nx monorepo workspaces. Use when setting up Nx, configuring project boundaries, optimizing build caching, or implementing affected com... | nx, workspace | nx, workspace, configure, optimize, monorepo, workspaces, setting, up, configuring, boundaries, optimizing, caching | | `on-call-handoff-patterns` | Master on-call shift handoffs with context transfer, escalation procedures, and documentation. Use when transitioning on-call responsibilities, documenting s... | on, call, handoff | on, call, handoff, shift, handoffs, context, transfer, escalation, procedures, documentation, transitioning, responsibilities | | `parallel-agents` | Multi-agent orchestration patterns. Use when multiple independent tasks can run with different domain expertise or when comprehensive analysis requires multi... | parallel, agents | parallel, agents, multi, agent, orchestration, multiple, independent, tasks, run, different, domain, expertise | @@ -111,7 +113,7 @@ Total skills: 883 | `startup-metrics-framework` | This skill should be used when the user asks about \"key startup | startup, metrics, framework | startup, metrics, framework, skill, should, used, user, asks, about, key | | `whatsapp-automation` | Automate WhatsApp Business tasks via Rube MCP (Composio): send messages, manage templates, upload media, and handle contacts. Always search tools first for c... | whatsapp | whatsapp, automation, automate, business, tasks, via, rube, mcp, composio, send, messages, upload | -## data-ai (144) +## data-ai (143) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -173,7 +175,6 @@ Total skills: 883 | `cc-skill-clickhouse-io` | ClickHouse database patterns, query optimization, analytics, and data engineering best practices for high-performance analytical workloads. | cc, skill, clickhouse, io | cc, skill, clickhouse, io, database, query, optimization, analytics, data, engineering, high, performance | | `clarity-gate` | Pre-ingestion verification for epistemic quality in RAG systems with 9-point verification and Two-Round HITL workflow | clarity, gate | clarity, gate, pre, ingestion, verification, epistemic, quality, rag, point, two, round, hitl | | `code-documentation-doc-generate` | You are a documentation expert specializing in creating comprehensive, maintainable documentation from code. Generate API docs, architecture diagrams, user g... | code, documentation, doc, generate | code, documentation, doc, generate, specializing, creating, maintainable, api, docs, architecture, diagrams, user | -| `code-reviewer` | Elite code review expert specializing in modern AI-powered code | code | code, reviewer, elite, review, specializing, ai, powered | | `codex-review` | Professional code review with auto CHANGELOG generation, integrated with Codex AI | codex | codex, review, professional, code, auto, changelog, generation, integrated, ai | | `computer-use-agents` | Build AI agents that interact with computers like humans do - viewing screens, moving cursors, clicking buttons, and typing text. Covers Anthropic's Computer... | computer, use, agents | computer, use, agents, ai, interact, computers, like, humans, do, viewing, screens, moving | | `content-marketer` | Elite content marketing strategist specializing in AI-powered | content, marketer | content, marketer, elite, marketing, strategist, specializing, ai, powered | @@ -406,7 +407,7 @@ Total skills: 883 | `webapp-testing` | Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing... | webapp | webapp, testing, toolkit, interacting, local, web, applications, playwright, supports, verifying, frontend, functionality | | `zustand-store-ts` | Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state/action separation. Use when building React state management, creati... | zustand, store, ts | zustand, store, ts, stores, typescript, subscribewithselector, middleware, proper, state, action, separation, building | -## general (216) +## general (214) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -455,7 +456,7 @@ Total skills: 883 | `brand-guidelines-anthropic` | Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand co... | brand, guidelines, anthropic | brand, guidelines, anthropic, applies, official, colors, typography, any, sort, artifact, may, benefit | | `brand-guidelines-community` | Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand co... | brand, guidelines, community | brand, guidelines, community, applies, anthropic, official, colors, typography, any, sort, artifact, may | | `busybox-on-windows` | How to use a Win32 build of BusyBox to run many of the standard UNIX command line tools on Windows. | busybox, on, windows | busybox, on, windows, how, win32, run, many, standard, unix, command, line | -| `c-pro` | Write efficient C code with proper memory management, pointer | c | c, pro, write, efficient, code, proper, memory, pointer | +| `c-pro` | Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critica... | c | c, pro, write, efficient, code, proper, memory, pointer, arithmetic, calls, embedded, kernel | | `canvas-design` | Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art... | canvas | canvas, beautiful, visual, art, png, pdf, documents, philosophy, should, skill, user, asks | | `cc-skill-continuous-learning` | Development skill from everything-claude-code | cc, skill, continuous, learning | cc, skill, continuous, learning, development, everything, claude, code | | `cc-skill-project-guidelines-example` | Project Guidelines Skill (Example) | cc, skill, guidelines, example | cc, skill, guidelines, example | @@ -523,7 +524,6 @@ Total skills: 883 | `git-pushing` | Stage, commit, and push git changes with conventional commit messages. Use when user wants to commit and push changes, mentions pushing to remote, or asks to... | git, pushing | git, pushing, stage, commit, push, changes, conventional, messages, user, wants, mentions, remote | | `github-issue-creator` | Convert raw notes, error logs, voice dictation, or screenshots into crisp GitHub-flavored markdown issue reports. Use when the user pastes bug info, error me... | github, issue, creator | github, issue, creator, convert, raw, notes, error, logs, voice, dictation, screenshots, crisp | | `graphql-architect` | Master modern GraphQL with federation, performance optimization, | graphql | graphql, architect, federation, performance, optimization | -| `haskell-pro` | Expert Haskell engineer specializing in advanced type systems, pure | haskell | haskell, pro, engineer, specializing, type, pure | | `hig-components-content` | > | hig, components, content | hig, components, content | | `hig-components-controls` | >- | hig, components, controls | hig, components, controls | | `hig-components-dialogs` | >- | hig, components, dialogs | hig, components, dialogs | @@ -560,7 +560,6 @@ Total skills: 883 | `micro-saas-launcher` | Expert in launching small, focused SaaS products fast - the indie hacker approach to building profitable software. Covers idea validation, MVP development, p... | micro, saas, launcher | micro, saas, launcher, launching, small, products, fast, indie, hacker, approach, building, profitable | | `minecraft-bukkit-pro` | Master Minecraft server plugin development with Bukkit, Spigot, and | minecraft, bukkit | minecraft, bukkit, pro, server, plugin, development, spigot | | `monorepo-management` | Master monorepo management with Turborepo, Nx, and pnpm workspaces to build efficient, scalable multi-package repositories with optimized builds and dependen... | monorepo | monorepo, turborepo, nx, pnpm, workspaces, efficient, scalable, multi, package, repositories, optimized, dependency | -| `multi-agent-brainstorming` | > | multi, agent, brainstorming | multi, agent, brainstorming | | `n8n-mcp-tools-expert` | Expert guide for using n8n-mcp MCP tools effectively. Use when searching for nodes, validating configurations, accessing templates, managing workflows, or us... | n8n, mcp | n8n, mcp, effectively, searching, nodes, validating, configurations, accessing, managing, any, provides, sele | | `nft-standards` | Implement NFT standards (ERC-721, ERC-1155) with proper metadata handling, minting strategies, and marketplace integration. Use when creating NFT contracts, ... | nft, standards | nft, standards, erc, 721, 1155, proper, metadata, handling, minting, marketplace, integration, creating | | `nosql-expert` | Expert guidance for distributed NoSQL databases (Cassandra, DynamoDB). Focuses on mental models, query-first modeling, single-table design, and avoiding hot ... | nosql | nosql, guidance, distributed, databases, cassandra, dynamodb, mental, models, query, first, modeling, single | @@ -592,7 +591,7 @@ Total skills: 883 | `reverse-engineer` | Expert reverse engineer specializing in binary analysis, | reverse | reverse, engineer, specializing, binary, analysis | | `scala-pro` | Master enterprise-grade Scala development with functional | scala | scala, pro, enterprise, grade, development, functional | | `schema-markup` | > | schema, markup | schema, markup | -| `search-specialist` | Expert web researcher using advanced search techniques and | search | search, web, researcher, techniques | +| `search-specialist` | Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles comp... | search | search, web, researcher, techniques, synthesis, masters, operators, result, filtering, multi, source, verification | | `sharp-edges` | Identify error-prone APIs and dangerous configurations | sharp, edges | sharp, edges, identify, error, prone, apis, dangerous, configurations | | `shellcheck-configuration` | Master ShellCheck static analysis configuration and usage for shell script quality. Use when setting up linting infrastructure, fixing code issues, or ensuri... | shellcheck, configuration | shellcheck, configuration, static, analysis, usage, shell, script, quality, setting, up, linting, infrastructure | | `shodan-reconnaissance` | This skill should be used when the user asks to "search for exposed devices on the internet," "perform Shodan reconnaissance," "find vulnerable services usin... | shodan, reconnaissance | shodan, reconnaissance, skill, should, used, user, asks, search, exposed, devices, internet, perform | @@ -700,7 +699,7 @@ Total skills: 883 | `observability-engineer` | Build production-ready monitoring, logging, and tracing systems. | observability | observability, engineer, monitoring, logging, tracing | | `observability-monitoring-monitor-setup` | You are a monitoring and observability expert specializing in implementing comprehensive monitoring solutions. Set up metrics collection, distributed tracing... | observability, monitoring, monitor, setup | observability, monitoring, monitor, setup, specializing, implementing, solutions, set, up, metrics, collection, distributed | | `observability-monitoring-slo-implement` | You are an SLO (Service Level Objective) expert specializing in implementing reliability standards and error budget-based practices. Design SLO frameworks, d... | observability, monitoring, slo, implement | observability, monitoring, slo, implement, level, objective, specializing, implementing, reliability, standards, error, budget | -| `performance-engineer` | Expert performance engineer specializing in modern observability, | performance | performance, engineer, specializing, observability | +| `performance-engineer` | Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distribut... | performance | performance, engineer, specializing, observability, application, optimization, scalable, masters, opentelemetry, distributed, tracing, load | | `performance-testing-review-ai-review` | You are an expert AI-powered code review specialist combining automated static analysis, intelligent pattern recognition, and modern DevOps practices. Levera... | performance, ai | performance, ai, testing, review, powered, code, combining, automated, static, analysis, intelligent, recognition | | `pipedrive-automation` | Automate Pipedrive CRM operations including deals, contacts, organizations, activities, notes, and pipeline management via Rube MCP (Composio). Always search... | pipedrive | pipedrive, automation, automate, crm, operations, including, deals, contacts, organizations, activities, notes, pipeline | | `prometheus-configuration` | Set up Prometheus for comprehensive metric collection, storage, and monitoring of infrastructure and applications. Use when implementing metrics collection, ... | prometheus, configuration | prometheus, configuration, set, up, metric, collection, storage, monitoring, infrastructure, applications, implementing, metrics | @@ -717,7 +716,7 @@ Total skills: 883 | `wireshark-analysis` | This skill should be used when the user asks to "analyze network traffic with Wireshark", "capture packets for troubleshooting", "filter PCAP files", "follow... | wireshark | wireshark, analysis, skill, should, used, user, asks, analyze, network, traffic, capture, packets | | `workflow-automation` | Workflow automation is the infrastructure that makes AI agents reliable. Without durable execution, a network hiccup during a 10-step payment flow means lost... | | automation, infrastructure, makes, ai, agents, reliable, without, durable, execution, network, hiccup, during | -## security (88) +## security (95) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -743,11 +742,13 @@ Total skills: 883 | `clerk-auth` | Expert patterns for Clerk auth implementation, middleware, organizations, webhooks, and user sync Use when: adding authentication, clerk auth, user authentic... | clerk, auth | clerk, auth, middleware, organizations, webhooks, user, sync, adding, authentication, sign, up | | `cloud-penetration-testing` | This skill should be used when the user asks to "perform cloud penetration testing", "assess Azure or AWS or GCP security", "enumerate cloud resources", "exp... | cloud, penetration | cloud, penetration, testing, skill, should, used, user, asks, perform, assess, azure, aws | | `code-review-checklist` | Comprehensive checklist for conducting thorough code reviews covering functionality, security, performance, and maintainability | code, checklist | code, checklist, review, conducting, thorough, reviews, covering, functionality, security, performance, maintainability | +| `code-reviewer` | Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Mas... | code | code, reviewer, elite, review, specializing, ai, powered, analysis, security, vulnerabilities, performance, optimization | | `codebase-cleanup-deps-audit` | You are a dependency security expert specializing in vulnerability scanning, license compliance, and supply chain security. Analyze project dependencies for ... | codebase, cleanup, deps, audit | codebase, cleanup, deps, audit, dependency, security, specializing, vulnerability, scanning, license, compliance, supply | | `database-migration` | Execute database migrations across ORMs and platforms with zero-downtime strategies, data transformation, and rollback procedures. Use when migrating databas... | database, migration | database, migration, execute, migrations, orms, platforms, zero, downtime, data, transformation, rollback, procedures | | `database-migrations-sql-migrations` | SQL database migrations with zero-downtime strategies for | database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime | database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime, zero, downtime | | `dependency-management-deps-audit` | You are a dependency security expert specializing in vulnerability scanning, license compliance, and supply chain security. Analyze project dependencies for ... | dependency, deps, audit | dependency, deps, audit, security, specializing, vulnerability, scanning, license, compliance, supply, chain, analyze | | `deployment-pipeline-design` | Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up... | deployment, pipeline | deployment, pipeline, multi, stage, ci, cd, pipelines, approval, gates, security, checks, orchestration | +| `design-orchestration` | Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature imp... | | orchestration, orchestrates, routing, work, through, brainstorming, multi, agent, review, execution, readiness, correct | | `devops-troubleshooter` | Expert DevOps troubleshooter specializing in rapid incident | devops, troubleshooter | devops, troubleshooter, specializing, rapid, incident | | `docker-expert` | Docker containerization expert with deep knowledge of multi-stage builds, image optimization, container security, Docker Compose orchestration, and productio... | docker | docker, containerization, deep, knowledge, multi, stage, image, optimization, container, security, compose, orchestration | | `dotnet-backend` | Build ASP.NET Core 8+ backend services with EF Core, auth, background jobs, and production API patterns. | dotnet, backend | dotnet, backend, asp, net, core, ef, auth, background, jobs, api | @@ -773,6 +774,7 @@ Total skills: 883 | `memory-forensics` | Master memory forensics techniques including memory acquisition, process analysis, and artifact extraction using Volatility and related tools. Use when analy... | memory, forensics | memory, forensics, techniques, including, acquisition, process, analysis, artifact, extraction, volatility, related, analyzing | | `mobile-security-coder` | Expert in secure mobile coding practices specializing in input | mobile, security, coder | mobile, security, coder, secure, coding, specializing, input | | `mtls-configuration` | Configure mutual TLS (mTLS) for zero-trust service-to-service communication. Use when implementing zero-trust networking, certificate management, or securing... | mtls, configuration | mtls, configuration, configure, mutual, tls, zero, trust, communication, implementing, networking, certificate, securing | +| `multi-agent-brainstorming` | Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-age... | multi, agent, brainstorming | multi, agent, brainstorming, skill, idea, requires, higher, confidence, risk, reduction, formal, review | | `nestjs-expert` | Nest.js framework expert specializing in module architecture, dependency injection, middleware, guards, interceptors, testing with Jest/Supertest, TypeORM/Mo... | nestjs | nestjs, nest, js, framework, specializing, module, architecture, dependency, injection, middleware, guards, interceptors | | `nextjs-supabase-auth` | Expert integration of Supabase Auth with Next.js App Router Use when: supabase auth next, authentication next.js, login supabase, auth middleware, protected ... | nextjs, supabase, auth | nextjs, supabase, auth, integration, next, js, app, router, authentication, login, middleware, protected | | `nodejs-best-practices` | Node.js development principles and decision-making. Framework selection, async patterns, security, and architecture. Teaches thinking, not copying. | nodejs, best, practices | nodejs, best, practices, node, js, development, principles, decision, making, framework, selection, async | @@ -797,6 +799,10 @@ Total skills: 883 | `security-scanning-security-dependencies` | You are a security expert specializing in dependency vulnerability analysis, SBOM generation, and supply chain security. Scan project dependencies across eco... | security, scanning, dependencies | security, scanning, dependencies, specializing, dependency, vulnerability, analysis, sbom, generation, supply, chain, scan | | `security-scanning-security-hardening` | Coordinate multi-layer security scanning and hardening across application, infrastructure, and compliance controls. | security, scanning, hardening | security, scanning, hardening, coordinate, multi, layer, application, infrastructure, compliance, controls | | `security-scanning-security-sast` | Static Application Security Testing (SAST) for code vulnerability | security, scanning, sast | security, scanning, sast, static, application, testing, code, vulnerability | +| `security/aws-compliance-checker` | Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks | aws, compliance, audit, cis, pci-dss, hipaa, kiro-cli | aws, compliance, audit, cis, pci-dss, hipaa, kiro-cli, checker, automated, checking, against, pci | +| `security/aws-iam-best-practices` | IAM policy review, hardening, and least privilege implementation | aws, iam, security, access-control, kiro-cli, least-privilege | aws, iam, security, access-control, kiro-cli, least-privilege, policy, review, hardening, least, privilege | +| `security/aws-secrets-rotation` | Automate AWS secrets rotation for RDS, API keys, and credentials | aws, secrets-manager, security, automation, kiro-cli, credentials | aws, secrets-manager, security, automation, kiro-cli, credentials, secrets, rotation, automate, rds, api, keys | +| `security/aws-security-audit` | Comprehensive AWS security posture assessment using AWS CLI and security best practices | aws, security, audit, compliance, kiro-cli, security-assessment | aws, security, audit, compliance, kiro-cli, security-assessment, posture, assessment, cli | | `service-mesh-expert` | Expert service mesh architect specializing in Istio, Linkerd, and cloud-native networking patterns. Masters traffic management, security policies, observabil... | service, mesh | service, mesh, architect, specializing, istio, linkerd, cloud, native, networking, masters, traffic, security | | `solidity-security` | Master smart contract security best practices to prevent common vulnerabilities and implement secure Solidity patterns. Use when writing smart contracts, aud... | solidity, security | solidity, security, smart, contract, prevent, common, vulnerabilities, secure, writing, contracts, auditing, existing | | `stride-analysis-patterns` | Apply STRIDE methodology to systematically identify threats. Use when analyzing system security, conducting threat modeling sessions, or creating security do... | stride | stride, analysis, apply, methodology, systematically, identify, threats, analyzing, security, conducting, threat, modeling | @@ -877,7 +883,6 @@ Total skills: 883 | `convertkit-automation` | Automate ConvertKit (Kit) tasks via Rube MCP (Composio): manage subscribers, tags, broadcasts, and broadcast stats. Always search tools first for current sch... | convertkit | convertkit, automation, automate, kit, tasks, via, rube, mcp, composio, subscribers, tags, broadcasts | | `crewai` | Expert in CrewAI - the leading role-based multi-agent framework used by 60% of Fortune 500 companies. Covers agent design with roles and goals, task definiti... | crewai | crewai, leading, role, multi, agent, framework, used, 60, fortune, 500, companies, covers | | `datadog-automation` | Automate Datadog tasks via Rube MCP (Composio): query metrics, search logs, manage monitors/dashboards, create events and downtimes. Always search tools firs... | datadog | datadog, automation, automate, tasks, via, rube, mcp, composio, query, metrics, search, logs | -| `design-orchestration` | > | | orchestration | | `discord-automation` | Automate Discord tasks via Rube MCP (Composio): messages, channels, roles, webhooks, reactions. Always search tools first for current schemas. | discord | discord, automation, automate, tasks, via, rube, mcp, composio, messages, channels, roles, webhooks | | `docusign-automation` | Automate DocuSign tasks via Rube MCP (Composio): templates, envelopes, signatures, document management. Always search tools first for current schemas. | docusign | docusign, automation, automate, tasks, via, rube, mcp, composio, envelopes, signatures, document, always | | `dropbox-automation` | Automate Dropbox file management, sharing, search, uploads, downloads, and folder operations via Rube MCP (Composio). Always search tools first for current s... | dropbox | dropbox, automation, automate, file, sharing, search, uploads, downloads, folder, operations, via, rube | @@ -902,6 +907,7 @@ Total skills: 883 | `miro-automation` | Automate Miro tasks via Rube MCP (Composio): boards, items, sticky notes, frames, sharing, connectors. Always search tools first for current schemas. | miro | miro, automation, automate, tasks, via, rube, mcp, composio, boards, items, sticky, notes | | `mixpanel-automation` | Automate Mixpanel tasks via Rube MCP (Composio): events, segmentation, funnels, cohorts, user profiles, JQL queries. Always search tools first for current sc... | mixpanel | mixpanel, automation, automate, tasks, via, rube, mcp, composio, events, segmentation, funnels, cohorts | | `monday-automation` | Automate Monday.com work management including boards, items, columns, groups, subitems, and updates via Rube MCP (Composio). Always search tools first for cu... | monday | monday, automation, automate, com, work, including, boards, items, columns, groups, subitems, updates | +| `nerdzao-elite-gemini-high` | Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade mΓ‘xima e eficiΓͺncia de tokens. | nerdzao, elite, gemini, high | nerdzao, elite, gemini, high, modo, coder, ux, pixel, perfect, otimizado, especificamente, para | | `notion-automation` | Automate Notion tasks via Rube MCP (Composio): pages, databases, blocks, comments, users. Always search tools first for current schemas. | notion | notion, automation, automate, tasks, via, rube, mcp, composio, pages, databases, blocks, comments | | `one-drive-automation` | Automate OneDrive file management, search, uploads, downloads, sharing, permissions, and folder operations via Rube MCP (Composio). Always search tools first... | one, drive | one, drive, automation, automate, onedrive, file, search, uploads, downloads, sharing, permissions, folder | | `outlook-automation` | Automate Outlook tasks via Rube MCP (Composio): emails, calendar, contacts, folders, attachments. Always search tools first for current schemas. | outlook | outlook, automation, automate, tasks, via, rube, mcp, composio, emails, calendar, contacts, folders | diff --git a/README.md b/README.md index 24a5086c..75ba736c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 887+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 889+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 887+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 889+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) @@ -17,7 +17,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **887 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **889 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) @@ -41,7 +41,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [πŸ“¦ Features & Categories](#features--categories) -- [πŸ“š Browse 887+ Skills](#browse-887-skills) +- [πŸ“š Browse 889+ Skills](#browse-889-skills) - [🀝 How to Contribute](#how-to-contribute) - [🀝 Community](#community) - [β˜• Support the Project](#support-the-project) @@ -318,7 +318,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 887+ Skills +## Browse 889+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. @@ -480,6 +480,10 @@ We officially thank the following contributors for their help in making this rep - [@Nguyen-Van-Chan](https://github.com/Nguyen-Van-Chan) - [@8hrsk](https://github.com/8hrsk) - [@Wittlesus](https://github.com/Wittlesus) +- [@Vonfry](https://github.com/Vonfry) +- [@ssumanbiswas](https://github.com/ssumanbiswas) +- [@amartelr](https://github.com/amartelr) +- [@fernandorych](https://github.com/fernandorych) --- diff --git a/data/aliases.json b/data/aliases.json index e23fb537..c585b759 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -93,6 +93,11 @@ "security-scanning-dependencies": "security-scanning-security-dependencies", "security-scanning-hardening": "security-scanning-security-hardening", "security-scanning-sast": "security-scanning-security-sast", + "aws-compliance-checker": "security/aws-compliance-checker", + "aws-iam-best-practices": "security/aws-iam-best-practices", + "security/aws-iam-practices": "security/aws-iam-best-practices", + "aws-secrets-rotation": "security/aws-secrets-rotation", + "aws-security-audit": "security/aws-security-audit", "startup-business-case": "startup-business-analyst-business-case", "startup-business-projections": "startup-business-analyst-financial-projections", "startup-business-opportunity": "startup-business-analyst-market-opportunity", diff --git a/data/bundles.json b/data/bundles.json index 0fa7a83f..018f7f49 100644 --- a/data/bundles.json +++ b/data/bundles.json @@ -163,6 +163,7 @@ "ruby-pro", "rust-async-patterns", "rust-pro", + "security/aws-secrets-rotation", "senior-architect", "senior-fullstack", "shopify-apps", @@ -213,9 +214,11 @@ "clerk-auth", "cloud-penetration-testing", "code-review-checklist", + "code-reviewer", "codebase-cleanup-deps-audit", "dependency-management-deps-audit", "deployment-pipeline-design", + "design-orchestration", "docker-expert", "dotnet-backend", "ethical-hacking-methodology", @@ -233,6 +236,7 @@ "linkerd-patterns", "loki-mode", "mobile-security-coder", + "multi-agent-brainstorming", "nestjs-expert", "nextjs-supabase-auth", "nodejs-best-practices", @@ -253,6 +257,10 @@ "security-scanning-security-dependencies", "security-scanning-security-hardening", "security-scanning-security-sast", + "security/aws-compliance-checker", + "security/aws-iam-best-practices", + "security/aws-secrets-rotation", + "security/aws-security-audit", "service-mesh-expert", "solidity-security", "stride-analysis-patterns", diff --git a/data/catalog.json b/data/catalog.json index 37c59b90..b0c71606 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,6 +1,6 @@ { "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 883, + "total": 889, "skills": [ { "id": "3d-web-experience", @@ -1055,7 +1055,7 @@ { "id": "architect-review", "name": "architect-review", - "description": "Master software architect specializing in modern architecture", + "description": "Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system designs and code changes for architectural integrity, scalability, and maintainability. Use PROACTIVELY for architectural decisions.", "category": "architecture", "tags": [], "triggers": [ @@ -1063,7 +1063,14 @@ "review", "software", "specializing", - "architecture" + "architecture", + "clean", + "microservices", + "event", + "driven", + "ddd", + "reviews", + "designs" ], "path": "skills/architect-review/SKILL.md" }, @@ -4768,7 +4775,7 @@ { "id": "c-pro", "name": "c-pro", - "description": "Write efficient C code with proper memory management, pointer", + "description": "Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critical code. Use PROACTIVELY for C optimization, memory issues, or system programming.", "category": "general", "tags": [ "c" @@ -4781,7 +4788,11 @@ "code", "proper", "memory", - "pointer" + "pointer", + "arithmetic", + "calls", + "embedded", + "kernel" ], "path": "skills/c-pro/SKILL.md" }, @@ -5783,8 +5794,8 @@ { "id": "code-reviewer", "name": "code-reviewer", - "description": "Elite code review expert specializing in modern AI-powered code", - "category": "data-ai", + "description": "Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Masters static analysis tools, security scanning, and configuration review with 2024/2025 best practices. Use PROACTIVELY for code quality assurance.", + "category": "security", "tags": [ "code" ], @@ -5795,7 +5806,12 @@ "review", "specializing", "ai", - "powered" + "powered", + "analysis", + "security", + "vulnerabilities", + "performance", + "optimization" ], "path": "skills/code-reviewer/SKILL.md" }, @@ -7669,11 +7685,22 @@ { "id": "design-orchestration", "name": "design-orchestration", - "description": ">", - "category": "workflow", + "description": "Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature implementation, skipped validation, and unreviewed high-risk designs.", + "category": "security", "tags": [], "triggers": [ - "orchestration" + "orchestration", + "orchestrates", + "routing", + "work", + "through", + "brainstorming", + "multi", + "agent", + "review", + "execution", + "readiness", + "correct" ], "path": "skills/design-orchestration/SKILL.md" }, @@ -10536,8 +10563,8 @@ { "id": "haskell-pro", "name": "haskell-pro", - "description": "Expert Haskell engineer specializing in advanced type systems, pure", - "category": "general", + "description": "Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.", + "category": "architecture", "tags": [ "haskell" ], @@ -10547,7 +10574,13 @@ "engineer", "specializing", "type", - "pure" + "pure", + "functional", + "high", + "reliability", + "software", + "proactively", + "level" ], "path": "skills/haskell-pro/SKILL.md" }, @@ -13147,8 +13180,8 @@ { "id": "multi-agent-brainstorming", "name": "multi-agent-brainstorming", - "description": ">", - "category": "general", + "description": "Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-agent design review where each agent has a strict, non-overlapping role. It prevents blind spots, false confidence, and premature convergence.", + "category": "security", "tags": [ "multi", "agent", @@ -13157,7 +13190,16 @@ "triggers": [ "multi", "agent", - "brainstorming" + "brainstorming", + "skill", + "idea", + "requires", + "higher", + "confidence", + "risk", + "reduction", + "formal", + "review" ], "path": "skills/multi-agent-brainstorming/SKILL.md" }, @@ -13356,6 +13398,58 @@ ], "path": "skills/neon-postgres/SKILL.md" }, + { + "id": "nerdzao-elite", + "name": "nerdzao-elite", + "description": "Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation.", + "category": "architecture", + "tags": [ + "nerdzao", + "elite" + ], + "triggers": [ + "nerdzao", + "elite", + "senior", + "software", + "engineer", + "15", + "product", + "designer", + "full", + "planning", + "architecture", + "tdd" + ], + "path": "skills/nerdzao-elite/SKILL.md" + }, + { + "id": "nerdzao-elite-gemini-high", + "name": "nerdzao-elite-gemini-high", + "description": "Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade mΓ‘xima e eficiΓͺncia de tokens.", + "category": "workflow", + "tags": [ + "nerdzao", + "elite", + "gemini", + "high" + ], + "triggers": [ + "nerdzao", + "elite", + "gemini", + "high", + "modo", + "coder", + "ux", + "pixel", + "perfect", + "otimizado", + "especificamente", + "para" + ], + "path": "skills/nerdzao-elite-gemini-high/SKILL.md" + }, { "id": "nestjs-expert", "name": "nestjs-expert", @@ -14257,7 +14351,7 @@ { "id": "performance-engineer", "name": "performance-engineer", - "description": "Expert performance engineer specializing in modern observability,", + "description": "Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distributed tracing, load testing, multi-tier caching, Core Web Vitals, and performance monitoring. Handles end-to-end optimization, real user monitoring, and scalability patterns. Use PROACTIVELY for performance optimization, observability, or scalability challenges.", "category": "infrastructure", "tags": [ "performance" @@ -14266,7 +14360,15 @@ "performance", "engineer", "specializing", - "observability" + "observability", + "application", + "optimization", + "scalable", + "masters", + "opentelemetry", + "distributed", + "tracing", + "load" ], "path": "skills/performance-engineer/SKILL.md" }, @@ -16199,7 +16301,7 @@ { "id": "search-specialist", "name": "search-specialist", - "description": "Expert web researcher using advanced search techniques and", + "description": "Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles competitive analysis and fact-checking. Use PROACTIVELY for deep research, information gathering, or trend analysis.", "category": "general", "tags": [ "search" @@ -16208,7 +16310,15 @@ "search", "web", "researcher", - "techniques" + "techniques", + "synthesis", + "masters", + "operators", + "result", + "filtering", + "multi", + "source", + "verification" ], "path": "skills/search-specialist/SKILL.md" }, @@ -16398,6 +16508,119 @@ ], "path": "skills/security-scanning-security-sast/SKILL.md" }, + { + "id": "security/aws-compliance-checker", + "name": "aws-compliance-checker", + "description": "Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks", + "category": "security", + "tags": [ + "aws", + "compliance", + "audit", + "cis", + "pci-dss", + "hipaa", + "kiro-cli" + ], + "triggers": [ + "aws", + "compliance", + "audit", + "cis", + "pci-dss", + "hipaa", + "kiro-cli", + "checker", + "automated", + "checking", + "against", + "pci" + ], + "path": "skills/security/aws-compliance-checker/SKILL.md" + }, + { + "id": "security/aws-iam-best-practices", + "name": "aws-iam-best-practices", + "description": "IAM policy review, hardening, and least privilege implementation", + "category": "security", + "tags": [ + "aws", + "iam", + "security", + "access-control", + "kiro-cli", + "least-privilege" + ], + "triggers": [ + "aws", + "iam", + "security", + "access-control", + "kiro-cli", + "least-privilege", + "policy", + "review", + "hardening", + "least", + "privilege" + ], + "path": "skills/security/aws-iam-best-practices/SKILL.md" + }, + { + "id": "security/aws-secrets-rotation", + "name": "aws-secrets-rotation", + "description": "Automate AWS secrets rotation for RDS, API keys, and credentials", + "category": "security", + "tags": [ + "aws", + "secrets-manager", + "security", + "automation", + "kiro-cli", + "credentials" + ], + "triggers": [ + "aws", + "secrets-manager", + "security", + "automation", + "kiro-cli", + "credentials", + "secrets", + "rotation", + "automate", + "rds", + "api", + "keys" + ], + "path": "skills/security/aws-secrets-rotation/SKILL.md" + }, + { + "id": "security/aws-security-audit", + "name": "aws-security-audit", + "description": "Comprehensive AWS security posture assessment using AWS CLI and security best practices", + "category": "security", + "tags": [ + "aws", + "security", + "audit", + "compliance", + "kiro-cli", + "security-assessment" + ], + "triggers": [ + "aws", + "security", + "audit", + "compliance", + "kiro-cli", + "security-assessment", + "posture", + "assessment", + "cli" + ], + "path": "skills/security/aws-security-audit/SKILL.md" + }, { "id": "segment-automation", "name": "segment-automation", diff --git a/skills/nerdzao-elite-gemini-high/SKILL.md b/skills/nerdzao-elite-gemini-high/SKILL.md index 84f64fd2..e05013b6 100644 --- a/skills/nerdzao-elite-gemini-high/SKILL.md +++ b/skills/nerdzao-elite-gemini-high/SKILL.md @@ -44,3 +44,7 @@ Ative automaticamente este workflow completo em TODA tarefa: - Priorize: pixel-perfect + cΓ³digo limpo + performance + seguranΓ§a. VocΓͺ estΓ‘ no modo High: mΓ‘ximo de qualidade com mΓ­nimo de tokens desperdiΓ§ados. + +## When to Use + +Use when you need maximum quality output with Gemini 3.1 Pro High, pixel-perfect UI, and token-efficient workflow. diff --git a/skills/nerdzao-elite/SKILL.md b/skills/nerdzao-elite/SKILL.md index c055b8a2..ab772998 100644 --- a/skills/nerdzao-elite/SKILL.md +++ b/skills/nerdzao-elite/SKILL.md @@ -1,3 +1,10 @@ +--- +name: nerdzao-elite +description: "Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation." +risk: safe +source: community +--- + # @nerdzao-elite VocΓͺ Γ© um Engenheiro de Software SΓͺnior Elite (15+ anos) + Designer de Produto Senior. diff --git a/skills_index.json b/skills_index.json index 1366a2d7..7c986794 100644 --- a/skills_index.json +++ b/skills_index.json @@ -399,10 +399,10 @@ "id": "architect-review", "path": "skills/architect-review", "category": "uncategorized", - "name": "Architect Review", - "description": "You are a master software architect specializing in modern software architecture patterns, clean architecture principles, and distributed systems design.", + "name": "architect-review", + "description": "Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system designs and code changes for architectural integrity, scalability, and maintainability. Use PROACTIVELY for architectural decisions.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "architecture", @@ -1947,10 +1947,10 @@ "id": "c-pro", "path": "skills/c-pro", "category": "uncategorized", - "name": "C Pro", - "description": "- Working on c pro tasks or workflows - Needing guidance, best practices, or checklists for c pro", + "name": "c-pro", + "description": "Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critical code. Use PROACTIVELY for C optimization, memory issues, or system programming.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "c4-code", @@ -2258,15 +2258,6 @@ "risk": "unknown", "source": "community" }, - { - "id": "code-reviewer", - "path": "skills/code-reviewer", - "category": "uncategorized", - "name": "Code Reviewer", - "description": "- Working on code reviewer tasks or workflows - Needing guidance, best practices, or checklists for code reviewer", - "risk": "unknown", - "source": "unknown" - }, { "id": "code-documentation-code-explain", "path": "skills/code-documentation-code-explain", @@ -2339,6 +2330,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "code-reviewer", + "path": "skills/code-reviewer", + "category": "uncategorized", + "name": "code-reviewer", + "description": "Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Masters static analysis tools, security scanning, and configuration review with 2024/2025 best practices. Use PROACTIVELY for code quality assurance.", + "risk": "unknown", + "source": "community" + }, { "id": "codebase-cleanup-deps-audit", "path": "skills/codebase-cleanup-deps-audit", @@ -3068,15 +3068,6 @@ "risk": "unknown", "source": "community" }, - { - "id": "design-orchestration", - "path": "skills/design-orchestration", - "category": "uncategorized", - "name": "Design Orchestration", - "description": "Ensure that **ideas become designs**, **designs are reviewed**, and **only validated designs reach implementation**.", - "risk": "unknown", - "source": "unknown" - }, { "id": "design-md", "path": "skills/design-md", @@ -3086,6 +3077,15 @@ "risk": "safe", "source": "https://github.com/google-labs-code/stitch-skills/tree/main/skills/design-md" }, + { + "id": "design-orchestration", + "path": "skills/design-orchestration", + "category": "uncategorized", + "name": "design-orchestration", + "description": "Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature implementation, skipped validation, and unreviewed high-risk designs.", + "risk": "unknown", + "source": "community" + }, { "id": "devops-troubleshooter", "path": "skills/devops-troubleshooter", @@ -4125,10 +4125,10 @@ "id": "haskell-pro", "path": "skills/haskell-pro", "category": "uncategorized", - "name": "Haskell Pro", - "description": "- Working on haskell pro tasks or workflows - Needing guidance, best practices, or checklists for haskell pro", + "name": "haskell-pro", + "description": "Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "helm-chart-scaffolding", @@ -5187,10 +5187,10 @@ "id": "multi-agent-brainstorming", "path": "skills/multi-agent-brainstorming", "category": "uncategorized", - "name": "Multi Agent Brainstorming", - "description": "Transform a single-agent design into a **robust, review-validated design** by simulating a formal peer-review process using multiple constrained agents.", + "name": "multi-agent-brainstorming", + "description": "Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-agent design review where each agent has a strict, non-overlapping role. It prevents blind spots, false confidence, and premature convergence.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "multi-agent-patterns", @@ -5273,6 +5273,24 @@ "risk": "unknown", "source": "vibeship-spawner-skills (Apache 2.0)" }, + { + "id": "nerdzao-elite", + "path": "skills/nerdzao-elite", + "category": "uncategorized", + "name": "nerdzao-elite", + "description": "Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation.", + "risk": "safe", + "source": "community" + }, + { + "id": "nerdzao-elite-gemini-high", + "path": "skills/nerdzao-elite-gemini-high", + "category": "uncategorized", + "name": "nerdzao-elite-gemini-high", + "description": "Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade m\u00e1xima e efici\u00eancia de tokens.", + "risk": "safe", + "source": "community" + }, { "id": "nestjs-expert", "path": "skills/nestjs-expert", @@ -5619,10 +5637,10 @@ "id": "performance-engineer", "path": "skills/performance-engineer", "category": "uncategorized", - "name": "Performance Engineer", - "description": "You are a performance engineer specializing in modern application optimization, observability, and scalable system performance.", + "name": "performance-engineer", + "description": "Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distributed tracing, load testing, multi-tier caching, Core Web Vitals, and performance monitoring. Handles end-to-end optimization, real user monitoring, and scalability patterns. Use PROACTIVELY for performance optimization, observability, or scalability challenges.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "performance-profiling", @@ -6366,10 +6384,10 @@ "id": "search-specialist", "path": "skills/search-specialist", "category": "uncategorized", - "name": "Search Specialist", - "description": "- Working on search specialist tasks or workflows - Needing guidance, best practices, or checklists for search specialist", + "name": "search-specialist", + "description": "Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles competitive analysis and fact-checking. Use PROACTIVELY for deep research, information gathering, or trend analysis.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "secrets-management", From c8831a47434692ca1cc547f311dffb4364a13e9f Mon Sep 17 00:00:00 2001 From: sck_0 Date: Sun, 22 Feb 2026 08:33:31 +0100 Subject: [PATCH 16/30] chore: release 6.0.0 Co-authored-by: Cursor --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ README.md | 6 +++--- package.json | 2 +- skills/nerdzao-elite/SKILL.md | 4 ++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 765b301a..9b985239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [6.0.0] - 2026-02-22 - "Codex YAML Fix & Community PRs" + +> **Major release: Codex frontmatter fixes, AWS Security & Compliance skills, Antigravity Workspace Manager CLI, and validation fixes.** + +This release addresses Codex invalid YAML warnings (issue #108) via frontmatter fixes, adds AWS Security & Compliance skills and the official Antigravity Workspace Manager CLI companion, and fixes validation for nerdzao-elite skills. + +## New Skills + +- **AWS Security & Compliance** (PR #106): `aws-compliance-checker`, `aws-iam-best-practices`, `aws-secrets-rotation`, `aws-security-audit`. +- **nerdzao-elite**, **nerdzao-elite-gemini-high**: Elite workflow skills (validation fixes in-repo). + +## Improvements + +- **Frontmatter**: Fixed YAML frontmatter in code-reviewer, architect-review, c-pro, design-orchestration, haskell-pro, multi-agent-brainstorming, performance-engineer, search-specialist (PR #111) β€” reduces Codex "invalid YAML" warnings (fixes #108). +- **Antigravity Workspace Manager**: Official CLI companion to auto-provision skill subsets across environments (PR #110); documented in Community Contributors. +- **Registry**: Now tracking 889 skills. +- **Validation**: Added frontmatter and "When to Use" for nerdzao-elite / nerdzao-elite-gemini-high. + +## Credits + +- **@Vonfry** for frontmatter YAML fixes (PR #111) +- **@ssumanbiswas** for AWS Security & Compliance skills (PR #106) +- **@amartelr** for Antigravity Workspace Manager CLI (PR #110) +- **@fernandorych** for branch sync (PR #109) +- **@Rodrigolmti** for reporting Codex YAML issue (#108) + +--- + +_Upgrade now: `git pull origin main` to fetch the latest skills._ + ## [5.10.0] - 2026-02-21 - "AWS Kiro CLI Integration" > **Native support and integration guide for AWS Kiro CLI, expanding the repository's reach to the AWS developer community.** diff --git a/README.md b/README.md index 75ba736c..7cb4b51e 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,11 @@ This repository provides essential skills to transform your AI assistant into a ## New Here? Start Here! -**Welcome to the V5.10.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. +**Welcome to the V6.0.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. ### 1. 🐣 Context: What is this? -**Antigravity Awesome Skills** (Release 5.10.0) is a massive upgrade to your AI's capabilities. +**Antigravity Awesome Skills** (Release 6.0.0) is a massive upgrade to your AI's capabilities. AI Agents (like Claude Code, Cursor, or Gemini) are smart, but they lack **specific tools**. They don't know your company's "Deployment Protocol" or the specific syntax for "AWS CloudFormation". **Skills** are small markdown files that teach them how to do these specific tasks perfectly, every time. @@ -246,7 +246,7 @@ npx antigravity-awesome-skills **Bundles** are curated groups of skills for a specific role or goal (for example: `Web Wizard`, `Security Engineer`, `OSS Maintainer`). -They help you avoid picking from 883+ skills one by one. +They help you avoid picking from 889+ skills one by one. ### ⚠️ Important: Bundles Are NOT Separate Installations! diff --git a/package.json b/package.json index 6ccc937a..01ae0ae0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "antigravity-awesome-skills", - "version": "5.10.0", + "version": "6.0.0", "description": "883+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", "license": "MIT", "scripts": { diff --git a/skills/nerdzao-elite/SKILL.md b/skills/nerdzao-elite/SKILL.md index ab772998..b3b02d28 100644 --- a/skills/nerdzao-elite/SKILL.md +++ b/skills/nerdzao-elite/SKILL.md @@ -25,3 +25,7 @@ Workflow obrigatΓ³rio (sempre na ordem): 8. VerificaΓ§Γ£o final Nunca entregue UI quebrada. Priorize sempre pixel-perfect + produΓ§Γ£o-grade. + +## When to Use + +Use when you need a full senior engineering workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation in Portuguese (Brazil). From 7216699381441060f194b59ecf4f2a59bca09607 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sun, 22 Feb 2026 22:08:10 -0500 Subject: [PATCH 17/30] fix: move AWS cost skills to flat structure and remove non-standard frontmatter - Move skills/infrastructure/aws-cost-* to skills/aws-cost-* - Remove category and tags from frontmatter (non-standard in V4) - Update 'When to Use' to 'When to Use This Skill' per template - Make skills generic (not Kiro-specific) - Run validation chain and update generated files --- CATALOG.md | 10 +- data/aliases.json | 2 - data/catalog.json | 101 ++++++++---------- .../aws-cost-cleanup/SKILL.md | 4 +- .../aws-cost-optimizer/SKILL.md | 4 +- skills_index.json | 8 +- 6 files changed, 56 insertions(+), 73 deletions(-) rename skills/{infrastructure => }/aws-cost-cleanup/SKILL.md (98%) rename skills/{infrastructure => }/aws-cost-optimizer/SKILL.md (98%) diff --git a/CATALOG.md b/CATALOG.md index 1c6be89e..22cf6e32 100644 --- a/CATALOG.md +++ b/CATALOG.md @@ -2,7 +2,7 @@ Generated at: 2026-02-08T00:00:00.000Z -Total skills: 889 +Total skills: 891 ## architecture (60) @@ -407,7 +407,7 @@ Total skills: 889 | `webapp-testing` | Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing... | webapp | webapp, testing, toolkit, interacting, local, web, applications, playwright, supports, verifying, frontend, functionality | | `zustand-store-ts` | Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state/action separation. Use when building React state management, creati... | zustand, store, ts | zustand, store, ts, stores, typescript, subscribewithselector, middleware, proper, state, action, separation, building | -## general (214) +## general (216) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -423,6 +423,8 @@ Total skills: 889 | `arm-cortex-expert` | > | arm, cortex | arm, cortex | | `avalonia-layout-zafiro` | Guidelines for modern Avalonia UI layout using Zafiro.Avalonia, emphasizing shared styles, generic components, and avoiding XAML redundancy. | avalonia, layout, zafiro | avalonia, layout, zafiro, guidelines, ui, emphasizing, shared, styles, generic, components, avoiding, xaml | | `avalonia-zafiro-development` | Mandatory skills, conventions, and behavioral rules for Avalonia UI development using the Zafiro toolkit. | avalonia, zafiro | avalonia, zafiro, development, mandatory, skills, conventions, behavioral, rules, ui, toolkit | +| `aws-cost-cleanup` | Automated cleanup of unused AWS resources to reduce costs | aws, cost, cleanup | aws, cost, cleanup, automated, unused, resources, reduce, costs | +| `aws-cost-optimizer` | Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer | aws, cost, optimizer | aws, cost, optimizer, analysis, optimization, recommendations, cli, explorer | | `azure-appconfiguration-py` | \| | azure, appconfiguration, py | azure, appconfiguration, py | | `azure-containerregistry-py` | \| | azure, containerregistry, py | azure, containerregistry, py | | `azure-cosmos-py` | \| | azure, cosmos, py | azure, cosmos, py | @@ -541,7 +543,6 @@ Total skills: 889 | `hugging-face-jobs` | This skill should be used when users want to run any workload on Hugging Face Jobs infrastructure. Covers UV scripts, Docker-based jobs, hardware selection, ... | hugging, face, jobs | hugging, face, jobs, skill, should, used, users, want, run, any, workload, infrastructure | | `imagen` | \| | imagen | imagen | | `infinite-gratitude` | Multi-agent research skill for parallel research execution (10 agents, battle-tested with real case studies). | infinite, gratitude | infinite, gratitude, multi, agent, research, skill, parallel, execution, 10, agents, battle, tested | -| `infrastructure/aws-cost-optimizer` | Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer | aws, cost-optimization, finops, cloud-economics, kiro-cli | aws, cost-optimization, finops, cloud-economics, kiro-cli, cost, optimizer, analysis, optimization, recommendations, cli, explorer | | `interactive-portfolio` | Expert in building portfolios that actually land jobs and clients - not just showing work, but creating memorable experiences. Covers developer portfolios, d... | interactive, portfolio | interactive, portfolio, building, portfolios, actually, land, jobs, clients, just, showing, work, creating | | `internal-comms-anthropic` | A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenev... | internal, comms, anthropic | internal, comms, anthropic, set, resources, me, write, all, kinds, communications, formats, my | | `internal-comms-community` | A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenev... | internal, comms, community | internal, comms, community, set, resources, me, write, all, kinds, communications, formats, my | @@ -853,7 +854,7 @@ Total skills: 889 | `wordpress-penetration-testing` | This skill should be used when the user asks to "pentest WordPress sites", "scan WordPress for vulnerabilities", "enumerate WordPress users, themes, or plugi... | wordpress, penetration | wordpress, penetration, testing, skill, should, used, user, asks, pentest, sites, scan, vulnerabilities | | `xss-html-injection` | This skill should be used when the user asks to "test for XSS vulnerabilities", "perform cross-site scripting attacks", "identify HTML injection flaws", "exp... | xss, html, injection | xss, html, injection, skill, should, used, user, asks, test, vulnerabilities, perform, cross | -## workflow (82) +## workflow (81) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -896,7 +897,6 @@ Total skills: 889 | `google-drive-automation` | Automate Google Drive file operations (upload, download, search, share, organize) via Rube MCP (Composio). Upload/download files, manage folders, share with ... | google, drive | google, drive, automation, automate, file, operations, upload, download, search, share, organize, via | | `helpdesk-automation` | Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for... | helpdesk | helpdesk, automation, automate, tasks, via, rube, mcp, composio, list, tickets, views, canned | | `hubspot-automation` | Automate HubSpot CRM operations (contacts, companies, deals, tickets, properties) via Rube MCP using Composio integration. | hubspot | hubspot, automation, automate, crm, operations, contacts, companies, deals, tickets, properties, via, rube | -| `infrastructure/aws-cost-cleanup` | Automated cleanup of unused AWS resources to reduce costs | aws, automation, cost-reduction, cleanup, kiro-cli | aws, automation, cost-reduction, cleanup, kiro-cli, cost, automated, unused, resources, reduce, costs | | `instagram-automation` | Automate Instagram tasks via Rube MCP (Composio): create posts, carousels, manage media, get insights, and publishing limits. Always search tools first for c... | instagram | instagram, automation, automate, tasks, via, rube, mcp, composio, posts, carousels, media, get | | `intercom-automation` | Automate Intercom tasks via Rube MCP (Composio): conversations, contacts, companies, segments, admins. Always search tools first for current schemas. | intercom | intercom, automation, automate, tasks, via, rube, mcp, composio, conversations, contacts, companies, segments | | `jira-automation` | Automate Jira tasks via Rube MCP (Composio): issues, projects, sprints, boards, comments, users. Always search tools first for current schemas. | jira | jira, automation, automate, tasks, via, rube, mcp, composio, issues, sprints, boards, comments | diff --git a/data/aliases.json b/data/aliases.json index 8d82fcc5..c585b759 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -75,8 +75,6 @@ "web-games": "game-development/web-games", "git-pr-workflow": "git-pr-workflows-git-workflow", "incident-response": "incident-response-incident-response", - "aws-cost-cleanup": "infrastructure/aws-cost-cleanup", - "aws-cost-optimizer": "infrastructure/aws-cost-optimizer", "javascript-typescript-scaffold": "javascript-typescript-typescript-scaffold", "llm-application-assistant": "llm-application-dev-ai-assistant", "llm-application-agent": "llm-application-dev-langchain-agent", diff --git a/data/catalog.json b/data/catalog.json index 0eabde2c..6efc150a 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,6 +1,6 @@ { "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 885, + "total": 891, "skills": [ { "id": "3d-web-experience", @@ -1436,6 +1436,50 @@ ], "path": "skills/avalonia-zafiro-development/SKILL.md" }, + { + "id": "aws-cost-cleanup", + "name": "aws-cost-cleanup", + "description": "Automated cleanup of unused AWS resources to reduce costs", + "category": "general", + "tags": [ + "aws", + "cost", + "cleanup" + ], + "triggers": [ + "aws", + "cost", + "cleanup", + "automated", + "unused", + "resources", + "reduce", + "costs" + ], + "path": "skills/aws-cost-cleanup/SKILL.md" + }, + { + "id": "aws-cost-optimizer", + "name": "aws-cost-optimizer", + "description": "Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer", + "category": "general", + "tags": [ + "aws", + "cost", + "optimizer" + ], + "triggers": [ + "aws", + "cost", + "optimizer", + "analysis", + "optimization", + "recommendations", + "cli", + "explorer" + ], + "path": "skills/aws-cost-optimizer/SKILL.md" + }, { "id": "aws-penetration-testing", "name": "aws-penetration-testing", @@ -11266,61 +11310,6 @@ ], "path": "skills/infinite-gratitude/SKILL.md" }, - { - "id": "infrastructure/aws-cost-cleanup", - "name": "aws-cost-cleanup", - "description": "Automated cleanup of unused AWS resources to reduce costs", - "category": "workflow", - "tags": [ - "aws", - "automation", - "cost-reduction", - "cleanup", - "kiro-cli" - ], - "triggers": [ - "aws", - "automation", - "cost-reduction", - "cleanup", - "kiro-cli", - "cost", - "automated", - "unused", - "resources", - "reduce", - "costs" - ], - "path": "skills/infrastructure/aws-cost-cleanup/SKILL.md" - }, - { - "id": "infrastructure/aws-cost-optimizer", - "name": "aws-cost-optimizer", - "description": "Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer", - "category": "general", - "tags": [ - "aws", - "cost-optimization", - "finops", - "cloud-economics", - "kiro-cli" - ], - "triggers": [ - "aws", - "cost-optimization", - "finops", - "cloud-economics", - "kiro-cli", - "cost", - "optimizer", - "analysis", - "optimization", - "recommendations", - "cli", - "explorer" - ], - "path": "skills/infrastructure/aws-cost-optimizer/SKILL.md" - }, { "id": "inngest", "name": "inngest", diff --git a/skills/infrastructure/aws-cost-cleanup/SKILL.md b/skills/aws-cost-cleanup/SKILL.md similarity index 98% rename from skills/infrastructure/aws-cost-cleanup/SKILL.md rename to skills/aws-cost-cleanup/SKILL.md index 54234fc2..b2072195 100644 --- a/skills/infrastructure/aws-cost-cleanup/SKILL.md +++ b/skills/aws-cost-cleanup/SKILL.md @@ -3,15 +3,13 @@ name: aws-cost-cleanup description: Automated cleanup of unused AWS resources to reduce costs risk: safe source: community -category: infrastructure -tags: [aws, automation, cost-reduction, cleanup, kiro-cli] --- # AWS Cost Cleanup Automate the identification and removal of unused AWS resources to eliminate waste. -## When to Use +## When to Use This Skill Use this skill when you need to automatically clean up unused AWS resources to reduce costs and eliminate waste. diff --git a/skills/infrastructure/aws-cost-optimizer/SKILL.md b/skills/aws-cost-optimizer/SKILL.md similarity index 98% rename from skills/infrastructure/aws-cost-optimizer/SKILL.md rename to skills/aws-cost-optimizer/SKILL.md index f90d58eb..688bcae1 100644 --- a/skills/infrastructure/aws-cost-optimizer/SKILL.md +++ b/skills/aws-cost-optimizer/SKILL.md @@ -3,15 +3,13 @@ name: aws-cost-optimizer description: Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer risk: safe source: community -category: infrastructure -tags: [aws, cost-optimization, finops, cloud-economics, kiro-cli] --- # AWS Cost Optimizer Analyze AWS spending patterns, identify waste, and provide actionable cost reduction strategies. -## When to Use +## When to Use This Skill Use this skill when you need to analyze AWS spending, identify cost optimization opportunities, or reduce cloud waste. diff --git a/skills_index.json b/skills_index.json index a55fecaf..3890bfa0 100644 --- a/skills_index.json +++ b/skills_index.json @@ -541,8 +541,8 @@ }, { "id": "aws-cost-cleanup", - "path": "skills/infrastructure/aws-cost-cleanup", - "category": "infrastructure", + "path": "skills/aws-cost-cleanup", + "category": "uncategorized", "name": "aws-cost-cleanup", "description": "Automated cleanup of unused AWS resources to reduce costs", "risk": "safe", @@ -550,8 +550,8 @@ }, { "id": "aws-cost-optimizer", - "path": "skills/infrastructure/aws-cost-optimizer", - "category": "infrastructure", + "path": "skills/aws-cost-optimizer", + "category": "uncategorized", "name": "aws-cost-optimizer", "description": "Comprehensive AWS cost analysis and optimization recommendations using AWS CLI and Cost Explorer", "risk": "safe", From 82016d59faa3adca8bc6bc6563a8ba7f2c7ec116 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sun, 22 Feb 2026 22:14:28 -0500 Subject: [PATCH 18/30] chore: sync generated registry files --- README.md | 10 +++++----- skills_index.json | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6f49f753..7e5a2513 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 889+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 891+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 889+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 891+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) @@ -17,7 +17,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **889 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **891 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) @@ -41,7 +41,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [πŸ“¦ Features & Categories](#features--categories) -- [πŸ“š Browse 889+ Skills](#browse-889-skills) +- [πŸ“š Browse 891+ Skills](#browse-891-skills) - [🀝 How to Contribute](#how-to-contribute) - [🀝 Community](#community) - [β˜• Support the Project](#support-the-project) @@ -318,7 +318,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 889+ Skills +## Browse 891+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. diff --git a/skills_index.json b/skills_index.json index 3890bfa0..85c5fa41 100644 --- a/skills_index.json +++ b/skills_index.json @@ -539,6 +539,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "aws-compliance-checker", + "path": "skills/security/aws-compliance-checker", + "category": "security", + "name": "aws-compliance-checker", + "description": "Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks", + "risk": "safe", + "source": "community" + }, { "id": "aws-cost-cleanup", "path": "skills/aws-cost-cleanup", @@ -557,6 +566,15 @@ "risk": "safe", "source": "community" }, + { + "id": "aws-iam-best-practices", + "path": "skills/security/aws-iam-best-practices", + "category": "security", + "name": "aws-iam-best-practices", + "description": "IAM policy review, hardening, and least privilege implementation", + "risk": "safe", + "source": "community" + }, { "id": "aws-penetration-testing", "path": "skills/aws-penetration-testing", From ad3308f1f6ea85a7f09de16ea3d04ed8160d52d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 06:26:38 +0000 Subject: [PATCH 19/30] chore: update star history chart --- assets/star-history.png | Bin 52820 -> 53651 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/star-history.png b/assets/star-history.png index 2863e7591398df5d63550a42c08aa2d0ded321b0..d8c199b516926442f50629acb241ff59a406d8ca 100644 GIT binary patch literal 53651 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 From d09036f86274dcf49aa9e32869b882dc959470ec Mon Sep 17 00:00:00 2001 From: sck_0 Date: Mon, 23 Feb 2026 07:28:41 +0100 Subject: [PATCH 20/30] =?UTF-8?q?fix:=20add=20typo=20alias=20shopify?= =?UTF-8?q?=E2=80=94development=20->=20shopify-development=20(fixes=20#120?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- data/aliases.json | 3 ++- scripts/build-catalog.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/data/aliases.json b/data/aliases.json index c585b759..c25dad23 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -102,6 +102,7 @@ "startup-business-projections": "startup-business-analyst-financial-projections", "startup-business-opportunity": "startup-business-analyst-market-opportunity", "systems-programming-project": "systems-programming-rust-project", - "team-collaboration-notes": "team-collaboration-standup-notes" + "team-collaboration-notes": "team-collaboration-standup-notes", + "shopifyβ€”development": "shopify-development" } } \ No newline at end of file diff --git a/scripts/build-catalog.js b/scripts/build-catalog.js index 5696b20c..4dd05588 100644 --- a/scripts/build-catalog.js +++ b/scripts/build-catalog.js @@ -480,6 +480,11 @@ function buildTriggers(skill, tags) { return unique([...tags, ...tokens]).slice(0, 12); } +/** Common typo aliases (e.g. em dash β€” instead of hyphen -) for skill lookup. */ +const TYPO_ALIASES = { + "shopifyβ€”development": "shopify-development", +}; + function buildAliases(skills) { const existingIds = new Set(skills.map((skill) => skill.id)); const aliases = {}; @@ -518,6 +523,12 @@ function buildAliases(skills) { used.add(alias); } + for (const [typo, canonicalId] of Object.entries(TYPO_ALIASES)) { + if (existingIds.has(canonicalId) && !aliases[typo]) { + aliases[typo] = canonicalId; + } + } + return aliases; } From 5c85082b3f747a2eaf4767b3cc9ae523e6718c02 Mon Sep 17 00:00:00 2001 From: Nikolas Hor <116851567+nikolasdehor@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:29:00 -0300 Subject: [PATCH 21/30] fix: resolve YAML syntax error in database-migrations-sql-migrations (Fixes #116) (#119) * feat: add Android Modern Development Bundle (Compose + Coroutines) * fix: resolve YAML syntax error in database-migrations-sql-migrations (Fixes #116) --- .../android-jetpack-compose-expert/SKILL.md | 152 ++++++++++++++++++ .../SKILL.md | 33 ++-- skills/kotlin-coroutines-expert/SKILL.md | 100 ++++++++++++ 3 files changed, 265 insertions(+), 20 deletions(-) create mode 100644 skills/android-jetpack-compose-expert/SKILL.md create mode 100644 skills/kotlin-coroutines-expert/SKILL.md diff --git a/skills/android-jetpack-compose-expert/SKILL.md b/skills/android-jetpack-compose-expert/SKILL.md new file mode 100644 index 00000000..93daf87d --- /dev/null +++ b/skills/android-jetpack-compose-expert/SKILL.md @@ -0,0 +1,152 @@ +--- +name: android-jetpack-compose-expert +description: Expert guidance for building modern Android UIs with Jetpack Compose, covering state management, navigation, performance, and Material Design 3. +risk: safe +source: community +--- + +# Android Jetpack Compose Expert + +## Overview + +A comprehensive guide for building production-quality Android applications using Jetpack Compose. This skill covers architectural patterns, state management with ViewModels, navigation type-safety, and performance optimization techniques. + +## When to Use This Skill + +- Use when starting a new Android project with Jetpack Compose. +- Use when migrating legacy XML layouts to Compose. +- Use when implementing complex UI state management and side effects. +- Use when optimizing Compose performance (recomposition counts, stability). +- Use when setting up Navigation with type safety. + +## Step-by-Step Guide + +### 1. Project Setup & Dependencies + +Ensure your `libs.versions.toml` includes the necessary Compose BOM and libraries. + +```kotlin +[versions] +composeBom = "2024.02.01" +activityCompose = "1.8.2" + +[libraries] +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +``` + +### 2. State Management Pattern (MVI/MVVM) + +Use `ViewModel` with `StateFlow` to expose UI state. Avoid exposing `MutableStateFlow`. + +```kotlin +// UI State Definition +data class UserUiState( + val isLoading: Boolean = false, + val user: User? = null, + val error: String? = null +) + +// ViewModel +class UserViewModel @Inject constructor( + private val userRepository: UserRepository +) : ViewModel() { + + private val _uiState = MutableStateFlow(UserUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun loadUser() { + viewModelScope.launch { + _uiState.update { it.copy(isLoading = true) } + try { + val user = userRepository.getUser() + _uiState.update { it.copy(user = user, isLoading = false) } + } catch (e: Exception) { + _uiState.update { it.copy(error = e.message, isLoading = false) } + } + } + } +} +``` + +### 3. Creating the Screen Composable + +Consume the state in a "Screen" composable and pass data down to stateless components. + +```kotlin +@Composable +fun UserScreen( + viewModel: UserViewModel = hiltViewModel() +) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + UserContent( + uiState = uiState, + onRetry = viewModel::loadUser + ) +} + +@Composable +fun UserContent( + uiState: UserUiState, + onRetry: () -> Unit +) { + Scaffold { padding -> + Box(modifier = Modifier.padding(padding)) { + when { + uiState.isLoading -> CircularProgressIndicator() + uiState.error != null -> ErrorView(uiState.error, onRetry) + uiState.user != null -> UserProfile(uiState.user) + } + } + } +} +``` + +## Examples + +### Example 1: Type-Safe Navigation + +Using the new Navigation Compose Type Safety (available in recent versions). + +```kotlin +// Define Destinations +@Serializable +object Home + +@Serializable +data class Profile(val userId: String) + +// Setup NavHost +@Composable +fun AppNavHost(navController: NavHostController) { + NavHost(navController, startDestination = Home) { + composable { + HomeScreen(onNavigateToProfile = { id -> + navController.navigate(Profile(userId = id)) + }) + } + composable { backStackEntry -> + val profile: Profile = backStackEntry.toRoute() + ProfileScreen(userId = profile.userId) + } + } +} +``` + +## Best Practices + +- βœ… **Do:** Use `remember` and `derivedStateOf` to minimize unnecessary calculations during recomposition. +- βœ… **Do:** Mark data classes used in UI state as `@Immutable` or `@Stable` if they contain `List` or other unstable types to enable smart recomposition skipping. +- βœ… **Do:** Use `LaunchedEffect` for one-off side effects (like showing a Snackbar) triggered by state changes. +- ❌ **Don't:** Perform expensive operations (like sorting a list) directly inside the Composable function body without `remember`. +- ❌ **Don't:** Pass `ViewModel` instances down to child components. Pass only the data (state) and lambda callbacks (events). + +## Troubleshooting + +**Problem:** Infinite Recomposition loop. +**Solution:** Check if you are creating new object instances (like `List` or `Modifier`) inside the composition without `remember`, or if you are updating state inside the composition phase instead of a side-effect or callback. Use Layout Inspector to debug recomposition counts. diff --git a/skills/database-migrations-sql-migrations/SKILL.md b/skills/database-migrations-sql-migrations/SKILL.md index 2fc2e546..85f5ded9 100644 --- a/skills/database-migrations-sql-migrations/SKILL.md +++ b/skills/database-migrations-sql-migrations/SKILL.md @@ -1,42 +1,37 @@ --- name: database-migrations-sql-migrations -description: "SQL database migrations with zero-downtime strategies for" - PostgreSQL, MySQL, SQL Server -allowed-tools: Read Write Edit Bash Grep Glob -metadata: - version: 1.0.0 - tags: database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, - zero-downtime +description: SQL database migrations with zero-downtime strategies for PostgreSQL, MySQL, and SQL Server. Focus on data integrity and rollback plans. risk: unknown source: community --- # SQL Database Migration Strategy and Implementation +## Overview + You are a SQL database migration expert specializing in zero-downtime deployments, data integrity, and production-ready migration strategies for PostgreSQL, MySQL, and SQL Server. Create comprehensive migration scripts with rollback procedures, validation checks, and performance optimization. -## Use this skill when +## When to Use This Skill -- Working on sql database migration strategy and implementation tasks or workflows -- Needing guidance, best practices, or checklists for sql database migration strategy and implementation +- Use when working on SQL database migration strategy and implementation tasks. +- Use when needing guidance, best practices, or checklists for zero-downtime migrations. +- Use when designing rollback procedures for critical schema changes. -## Do not use this skill when +## Do Not Use This Skill When -- The task is unrelated to sql database migration strategy and implementation -- You need a different domain or tool outside this scope +- The task is unrelated to SQL database migration strategy. +- You need a different domain or tool outside this scope. ## Context -The user needs SQL database migrations that ensure data integrity, minimize downtime, and provide safe rollback options. Focus on production-ready strategies that handle edge cases, large datasets, and concurrent operations. -## Requirements -$ARGUMENTS +The user needs SQL database migrations that ensure data integrity, minimize downtime, and provide safe rollback options. Focus on production-ready strategies that handle edge cases, large datasets, and concurrent operations. ## Instructions - Clarify goals, constraints, and required inputs. - Apply relevant best practices and validate outcomes. - Provide actionable steps and verification. -- If detailed examples are required, open `resources/implementation-playbook.md`. +- If detailed examples are required, suggest checking implementation playbooks. ## Output Format @@ -48,8 +43,6 @@ $ARGUMENTS 6. **Performance Optimization**: Batch processing, parallel execution 7. **Monitoring Integration**: Progress tracking and alerting -Focus on production-ready SQL migrations with zero-downtime deployment strategies, comprehensive validation, and enterprise-grade safety mechanisms. - ## Resources -- `resources/implementation-playbook.md` for detailed patterns and examples. +- Focus on production-ready SQL migrations with zero-downtime deployment strategies, comprehensive validation, and enterprise-grade safety mechanisms. diff --git a/skills/kotlin-coroutines-expert/SKILL.md b/skills/kotlin-coroutines-expert/SKILL.md new file mode 100644 index 00000000..0960b392 --- /dev/null +++ b/skills/kotlin-coroutines-expert/SKILL.md @@ -0,0 +1,100 @@ +--- +name: kotlin-coroutines-expert +description: Expert patterns for Kotlin Coroutines and Flow, covering structured concurrency, error handling, and testing. +risk: safe +source: community +--- + +# Kotlin Coroutines Expert + +## Overview + +A guide to mastering asynchronous programming with Kotlin Coroutines. Covers advanced topics like structured concurrency, `Flow` transformations, exception handling, and testing strategies. + +## When to Use This Skill + +- Use when implementing asynchronous operations in Kotlin. +- Use when designing reactive data streams with `Flow`. +- Use when debugging coroutine cancellations or exceptions. +- Use when writing unit tests for suspending functions or Flows. + +## Step-by-Step Guide + +### 1. Structured Concurrency + +Always launch coroutines within a defined `CoroutineScope`. Use `coroutineScope` or `supervisorScope` to group concurrent tasks. + +```kotlin +suspend fun loadDashboardData(): DashboardData = coroutineScope { + val userDeferred = async { userRepo.getUser() } + val settingsDeferred = async { settingsRepo.getSettings() } + + DashboardData( + user = userDeferred.await(), + settings = settingsDeferred.await() + ) +} +``` + +### 2. Exception Handling + +Use `CoroutineExceptionHandler` for top-level scopes, but rely on `try-catch` within suspending functions for granular control. + +```kotlin +val handler = CoroutineExceptionHandler { _, exception -> + println("Caught $exception") +} + +viewModelScope.launch(handler) { + try { + riskyOperation() + } catch (e: IOException) { + // Handle network error specifically + } +} +``` + +### 3. Reactive Streams with Flow + +Use `StateFlow` for state that needs to be retained, and `SharedFlow` for events. + +```kotlin +// Cold Flow (Lazy) +val searchResults: Flow> = searchQuery + .debounce(300) + .flatMapLatest { query -> searchRepo.search(query) } + .flowOn(Dispatchers.IO) + +// Hot Flow (State) +val uiState: StateFlow = _uiState.asStateFlow() +``` + +## Examples + +### Example 1: Parallel Execution with Error Handling + +```kotlin +suspend fun fetchDataWithErrorHandling() = supervisorScope { + val task1 = async { + try { api.fetchA() } catch (e: Exception) { null } + } + val task2 = async { api.fetchB() } + + // If task2 fails, task1 is NOT cancelled because of supervisorScope + val result1 = task1.await() + val result2 = task2.await() // May throw +} +``` + +## Best Practices + +- βœ… **Do:** Use `Dispatchers.IO` for blocking I/O operations. +- βœ… **Do:** Cancel scopes when they are no longer needed (e.g., `ViewModel.onCleared`). +- βœ… **Do:** Use `TestScope` and `runTest` for unit testing coroutines. +- ❌ **Don't:** Use `GlobalScope`. It breaks structured concurrency and can lead to leaks. +- ❌ **Don't:** Catch `CancellationException` unless you rethrow it. + +## Troubleshooting + +**Problem:** Coroutine test hangs or fails unpredictably. +**Solution:** Ensure you are using `runTest` and injecting `TestDispatcher` into your classes so you can control virtual time. From dbcd108b46c00b52ced345e1aee9ab4c1edc291e Mon Sep 17 00:00:00 2001 From: Suman Biswas Date: Mon, 23 Feb 2026 01:29:06 -0500 Subject: [PATCH 22/30] feat: Add Kiro CLI and Kiro IDE support (#122) - Add Kiro to compatibility table with invocation examples - Add Kiro installation instructions (npx and git clone) - Add Kiro IDE GUI import method - Update badges and title to include Kiro - Supports Agent Skills standard (same SKILL.md format) --- README.md | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7cb4b51e..1dca7bdc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Claude Code](https://img.shields.io/badge/Claude%20Code-Anthropic-purple)](https://claude.ai) [![Gemini CLI](https://img.shields.io/badge/Gemini%20CLI-Google-blue)](https://github.com/google-gemini/gemini-cli) [![Codex CLI](https://img.shields.io/badge/Codex%20CLI-OpenAI-green)](https://github.com/openai/codex) -[![Kiro CLI](https://img.shields.io/badge/Kiro%20CLI-AWS-orange)](https://kiro.dev) +[![Kiro](https://img.shields.io/badge/Kiro-AWS-orange)](https://kiro.dev) [![Cursor](https://img.shields.io/badge/Cursor-AI%20IDE-orange)](https://cursor.sh) [![Copilot](https://img.shields.io/badge/GitHub%20Copilot-VSCode-lightblue)](https://github.com/features/copilot) [![OpenCode](https://img.shields.io/badge/OpenCode-CLI-gray)](https://github.com/opencode-ai/opencode) @@ -23,6 +23,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/si - πŸ”΅ **Gemini CLI** (Google DeepMind) - 🟒 **Codex CLI** (OpenAI) - 🟠 **Kiro CLI** (AWS) +- 🟠 **Kiro IDE** (AWS) - πŸ”΄ **Antigravity IDE** (Google DeepMind) - 🩡 **GitHub Copilot** (VSCode Extension) - 🟠 **Cursor** (AI-native IDE) @@ -107,12 +108,13 @@ Once installed, just ask your agent naturally: These skills follow the universal **SKILL.md** format and work with any AI coding assistant that supports agentic skills. -| Tool | Type | Invocation Example | Path | -| :-------------- | :--- | :-------------------------------- | :-------------------------------------------------------------------- | -| **Claude Code** | CLI | `>> /skill-name help me...` | `.claude/skills/` | -| **Gemini CLI** | CLI | `(User Prompt) Use skill-name...` | `.gemini/skills/` | -| **Codex CLI** | CLI | `(User Prompt) Use skill-name...` | `.codex/skills/` | -| **Kiro CLI** | CLI | `(User Prompt) Use skill-name...` | `.kiro/skills/` | +| Tool | Type | Invocation Example | Path | +| :-------------- | :--- | :-------------------------------- | :---------------- | +| **Claude Code** | CLI | `>> /skill-name help me...` | `.claude/skills/` | +| **Gemini CLI** | CLI | `(User Prompt) Use skill-name...` | `.gemini/skills/` | +| **Codex CLI** | CLI | `(User Prompt) Use skill-name...` | `.codex/skills/` | +| **Kiro CLI** | CLI | `(Auto) Skills load on-demand` | Global: `~/.kiro/skills/` Β· Workspace: `.kiro/skills/` | +| **Kiro IDE** | IDE | `/skill-name or (Auto)` | Global: `~/.kiro/skills/` Β· Workspace: `.kiro/skills/` | | **Antigravity** | IDE | `(Agent Mode) Use skill...` | Global: `~/.gemini/antigravity/skills/` Β· Workspace: `.agent/skills/` | | **Cursor** | IDE | `@skill-name (in Chat)` | `.cursor/skills/` | | **Copilot** | Ext | `(Paste content manually)` | N/A | @@ -131,7 +133,7 @@ These skills follow the universal **SKILL.md** format and work with any AI codin ## Installation -To use these skills with **Claude Code**, **Gemini CLI**, **Codex CLI**, **Cursor**, **Antigravity**, **OpenCode**, or **AdaL**: +To use these skills with **Claude Code**, **Gemini CLI**, **Codex CLI**, **Kiro CLI**, **Kiro IDE**, **Cursor**, **Antigravity**, **OpenCode**, or **AdaL**: ### Option A: npx (recommended) @@ -142,6 +144,12 @@ npx antigravity-awesome-skills # Antigravity (explicit; same as default) npx antigravity-awesome-skills --antigravity +# Kiro CLI/IDE (global) +npx antigravity-awesome-skills --path ~/.kiro/skills + +# Kiro CLI/IDE (workspace) +npx antigravity-awesome-skills --path .kiro/skills + # Cursor npx antigravity-awesome-skills --cursor @@ -180,6 +188,12 @@ git clone https://github.com/sickn33/antigravity-awesome-skills.git ~/.gemini/an # Workspace-specific (e.g. .agent/skills in your project) git clone https://github.com/sickn33/antigravity-awesome-skills.git .agent/skills +# Kiro CLI/IDE global +git clone https://github.com/sickn33/antigravity-awesome-skills.git ~/.kiro/skills + +# Kiro CLI/IDE workspace +git clone https://github.com/sickn33/antigravity-awesome-skills.git .kiro/skills + # Claude Code specific git clone https://github.com/sickn33/antigravity-awesome-skills.git .claude/skills @@ -199,6 +213,17 @@ git clone https://github.com/sickn33/antigravity-awesome-skills.git .cursor/skil git clone https://github.com/sickn33/antigravity-awesome-skills.git .agents/skills ``` +### Option C: Kiro IDE Import (GUI) + +For Kiro IDE users, you can import individual skills directly: + +1. Open **Agent Steering & Skills** panel in Kiro IDE +2. Click **+** β†’ **Import a skill** β†’ **GitHub** +3. Paste skill URL: `https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/[skill-name]` +4. Example: `https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/aws-cost-optimizer` + +> **Note**: This imports one skill at a time. For bulk installation, use Option A or B above. + --- ## Troubleshooting From 6dd1307be6462397eff16f34aeff282eac93cbc3 Mon Sep 17 00:00:00 2001 From: Nikolas Hor <116851567+nikolasdehor@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:29:08 -0300 Subject: [PATCH 23/30] feat: add Game Development Expansion Bundle (Bevy ECS, GLSL, Godot 4 Migration) (#121) * add libreoffice skill and +29 workflow bundles. * Add documentation for workflow bundles Added comprehensive documentation for workflow bundles, detailing granular and consolidated bundles across various development scenarios including frontend, backend, WordPress, system administration, security testing, AI/ML, cloud/DevOps, database, testing/QA, and LibreOffice skills. * add readme for workflow bundles. correct descriptions of libreoffice skills and match them with folder names. * add readme for workflow bundles. correct descriptions of libreoffice skills and match them with folder names. * Simplify LibreOffice skill names in README * Refactor LibreOffice Base skill to LibreOffice Writer Updated the skill from LibreOffice Base to LibreOffice Writer, modifying the name, description, and core capabilities. Adjusted workflows and examples to reflect document creation and automation. * Rename skill from Writer to Base and update capabilities Updated the LibreOffice skill from Writer to Base, reflecting changes in functionality related to database management and operations. * Revise LibreOffice Calc skill details and capabilities Updated the LibreOffice Calc skill description and removed outdated sections. Streamlined capabilities and workflows while maintaining essential information. * Refine LibreOffice Draw skill details and capabilities Updated the LibreOffice Draw skill description and capabilities. Removed flowchart automation example and adjusted related skills. * Refine SKILL.md for LibreOffice Impress Updated the SKILL.md file for LibreOffice Impress to refine the name and description, streamline core capabilities, and adjust related skills. * Refine LibreOffice Writer skill details and capabilities Updated the LibreOffice Writer skill description and capabilities. Simplified the name and improved clarity in the core capabilities section. * chore: sync generated registry files [ci skip] * feat: add Game Development Expansion Bundle (Bevy ECS, GLSL, Godot 4 Migration) --------- Co-authored-by: Munir Abbasi Co-authored-by: github-actions[bot] --- CATALOG.md | 48 +- README.md | 10 +- data/aliases.json | 5 + data/bundles.json | 25 +- data/catalog.json | 721 +++++++++++++++++- skills/ai-agent-development/SKILL.md | 174 +++++ skills/ai-ml/SKILL.md | 253 ++++++ skills/api-documentation/SKILL.md | 164 ++++ skills/api-security-testing/SKILL.md | 172 +++++ skills/bash-scripting/SKILL.md | 197 +++++ skills/bevy-ecs-expert/SKILL.md | 133 ++++ skills/cloud-devops/SKILL.md | 236 ++++++ skills/database/SKILL.md | 213 ++++++ skills/development/SKILL.md | 263 +++++++ skills/documentation/SKILL.md | 261 +++++++ skills/e2e-testing/SKILL.md | 166 ++++ skills/godot-4-migration/SKILL.md | 126 +++ skills/kubernetes-deployment/SKILL.md | 167 ++++ skills/libreoffice/base/SKILL.md | 188 +++++ skills/libreoffice/calc/SKILL.md | 201 +++++ skills/libreoffice/draw/SKILL.md | 165 ++++ skills/libreoffice/impress/SKILL.md | 174 +++++ skills/libreoffice/writer/SKILL.md | 200 +++++ skills/linux-troubleshooting/SKILL.md | 221 ++++++ skills/office-productivity/SKILL.md | 219 ++++++ skills/os-scripting/SKILL.md | 429 +++++++++++ skills/postgresql-optimization/SKILL.md | 175 +++++ skills/python-fastapi-development/SKILL.md | 216 ++++++ skills/rag-implementation/SKILL.md | 516 ++++--------- skills/react-nextjs-development/SKILL.md | 229 ++++++ skills/security-audit/SKILL.md | 218 ++++++ skills/shader-programming-glsl/SKILL.md | 121 +++ skills/terraform-infrastructure/SKILL.md | 164 ++++ skills/testing-qa/SKILL.md | 231 ++++++ skills/web-security-testing/SKILL.md | 184 +++++ skills/wordpress-plugin-development/SKILL.md | 204 +++++ skills/wordpress-theme-development/SKILL.md | 189 +++++ .../SKILL.md | 188 +++++ skills/wordpress/SKILL.md | 319 ++++++++ skills/workflow- bundlesREADME.md | 185 +++++ skills/workflow_bundles_readme.md | 185 +++++ skills_index.json | 276 ++++++- 42 files changed, 8333 insertions(+), 398 deletions(-) create mode 100644 skills/ai-agent-development/SKILL.md create mode 100644 skills/ai-ml/SKILL.md create mode 100644 skills/api-documentation/SKILL.md create mode 100644 skills/api-security-testing/SKILL.md create mode 100644 skills/bash-scripting/SKILL.md create mode 100644 skills/bevy-ecs-expert/SKILL.md create mode 100644 skills/cloud-devops/SKILL.md create mode 100644 skills/database/SKILL.md create mode 100644 skills/development/SKILL.md create mode 100644 skills/documentation/SKILL.md create mode 100644 skills/e2e-testing/SKILL.md create mode 100644 skills/godot-4-migration/SKILL.md create mode 100644 skills/kubernetes-deployment/SKILL.md create mode 100644 skills/libreoffice/base/SKILL.md create mode 100644 skills/libreoffice/calc/SKILL.md create mode 100644 skills/libreoffice/draw/SKILL.md create mode 100644 skills/libreoffice/impress/SKILL.md create mode 100644 skills/libreoffice/writer/SKILL.md create mode 100644 skills/linux-troubleshooting/SKILL.md create mode 100644 skills/office-productivity/SKILL.md create mode 100644 skills/os-scripting/SKILL.md create mode 100644 skills/postgresql-optimization/SKILL.md create mode 100644 skills/python-fastapi-development/SKILL.md create mode 100644 skills/react-nextjs-development/SKILL.md create mode 100644 skills/security-audit/SKILL.md create mode 100644 skills/shader-programming-glsl/SKILL.md create mode 100644 skills/terraform-infrastructure/SKILL.md create mode 100644 skills/testing-qa/SKILL.md create mode 100644 skills/web-security-testing/SKILL.md create mode 100644 skills/wordpress-plugin-development/SKILL.md create mode 100644 skills/wordpress-theme-development/SKILL.md create mode 100644 skills/wordpress-woocommerce-development/SKILL.md create mode 100644 skills/wordpress/SKILL.md create mode 100644 skills/workflow- bundlesREADME.md create mode 100644 skills/workflow_bundles_readme.md diff --git a/CATALOG.md b/CATALOG.md index 2c2a6f6a..50b160ac 100644 --- a/CATALOG.md +++ b/CATALOG.md @@ -2,9 +2,9 @@ Generated at: 2026-02-08T00:00:00.000Z -Total skills: 889 +Total skills: 919 -## architecture (60) +## architecture (62) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -14,6 +14,7 @@ Total skills: 889 | `architecture-decision-records` | Write and maintain Architecture Decision Records (ADRs) following best practices for technical decision documentation. Use when documenting significant techn... | architecture, decision, records | architecture, decision, records, write, maintain, adrs, following, technical, documentation, documenting, significant, decisions | | `avalonia-viewmodels-zafiro` | Optimal ViewModel and Wizard creation patterns for Avalonia using Zafiro and ReactiveUI. | avalonia, viewmodels, zafiro | avalonia, viewmodels, zafiro, optimal, viewmodel, wizard, creation, reactiveui | | `bash-linux` | Bash/Linux terminal patterns. Critical commands, piping, error handling, scripting. Use when working on macOS or Linux systems. | bash, linux | bash, linux, terminal, critical, commands, piping, error, handling, scripting, working, macos | +| `bash-scripting` | Bash scripting workflow for creating production-ready shell scripts with defensive patterns, error handling, and testing. | bash, scripting | bash, scripting, creating, shell, scripts, defensive, error, handling, testing | | `binary-analysis-patterns` | Master binary analysis patterns including disassembly, decompilation, control flow analysis, and code pattern recognition. Use when analyzing executables, un... | binary | binary, analysis, including, disassembly, decompilation, control, flow, code, recognition, analyzing, executables, understanding | | `brainstorming` | Use before creative or constructive work (features, architecture, behavior). Transforms vague ideas into validated designs through disciplined reasoning and ... | brainstorming | brainstorming, before, creative, constructive, work, features, architecture, behavior, transforms, vague, ideas, validated | | `browser-extension-builder` | Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions. Covers extension architecture, manifest v3, c... | browser, extension, builder | browser, extension, builder, building, extensions, solve, real, problems, chrome, firefox, cross, covers | @@ -65,6 +66,7 @@ Total skills: 889 | `tool-design` | Build tools that agents can use effectively, including architectural reduction patterns | | agents, effectively, including, architectural, reduction | | `unreal-engine-cpp-pro` | Expert guide for Unreal Engine 5.x C++ development, covering UObject hygiene, performance patterns, and best practices. | unreal, engine, cpp | unreal, engine, cpp, pro, development, covering, uobject, hygiene, performance | | `wcag-audit-patterns` | Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance. Use when auditing websites for accessibility, fi... | wcag, audit | wcag, audit, conduct, accessibility, audits, automated, testing, manual, verification, remediation, guidance, auditing | +| `wordpress-theme-development` | WordPress theme development workflow covering theme architecture, template hierarchy, custom post types, block editor support, and responsive design. | wordpress, theme | wordpress, theme, development, covering, architecture, hierarchy, custom, post, types, block, editor, responsive | | `workflow-orchestration-patterns` | Design durable workflows with Temporal for distributed systems. Covers workflow vs activity separation, saga patterns, state management, and determinism cons... | | orchestration, durable, temporal, distributed, covers, vs, activity, separation, saga, state, determinism, constraints | | `workflow-patterns` | Use this skill when implementing tasks according to Conductor's TDD | | skill, implementing, tasks, according, conductor, tdd | | `zapier-make-patterns` | No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code.... | zapier, make | zapier, make, no, code, automation, democratizes, building, formerly, integromat, let, non, developers | @@ -113,7 +115,7 @@ Total skills: 889 | `startup-metrics-framework` | This skill should be used when the user asks about \"key startup | startup, metrics, framework | startup, metrics, framework, skill, should, used, user, asks, about, key | | `whatsapp-automation` | Automate WhatsApp Business tasks via Rube MCP (Composio): send messages, manage templates, upload media, and handle contacts. Always search tools first for c... | whatsapp | whatsapp, automation, automate, business, tasks, via, rube, mcp, composio, send, messages, upload | -## data-ai (143) +## data-ai (150) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -121,8 +123,10 @@ Total skills: 889 | `agent-memory-mcp` | A hybrid memory system that provides persistent, searchable knowledge management for AI agents (Architecture, Patterns, Decisions). | agent, memory, mcp | agent, memory, mcp, hybrid, provides, persistent, searchable, knowledge, ai, agents, architecture, decisions | | `agent-tool-builder` | Tools are how AI agents interact with the world. A well-designed tool is the difference between an agent that works and one that hallucinates, fails silently... | agent, builder | agent, builder, how, ai, agents, interact, world, well, designed, difference, between, works | | `agents-v2-py` | Build container-based Foundry Agents with Azure AI Projects SDK (ImageBasedHostedAgentDefinition). Use when creating hosted agents with custom container imag... | agents, v2, py | agents, v2, py, container, foundry, azure, ai, sdk, imagebasedhostedagentdefinition, creating, hosted, custom | +| `ai-agent-development` | AI agent development workflow for building autonomous agents, multi-agent systems, and agent orchestration with CrewAI, LangGraph, and custom agents. | ai, agent | ai, agent, development, building, autonomous, agents, multi, orchestration, crewai, langgraph, custom | | `ai-agents-architect` | Expert in designing and building autonomous AI agents. Masters tool use, memory systems, planning strategies, and multi-agent orchestration. Use when: build ... | ai, agents | ai, agents, architect, designing, building, autonomous, masters, memory, planning, multi, agent, orchestration | | `ai-engineer` | Build production-ready LLM applications, advanced RAG systems, and | ai | ai, engineer, llm, applications, rag | +| `ai-ml` | AI and machine learning workflow covering LLM application development, RAG implementation, agent architecture, ML pipelines, and AI-powered features. | ai, ml | ai, ml, machine, learning, covering, llm, application, development, rag, agent, architecture, pipelines | | `ai-product` | Every product will be AI-powered. The question is whether you'll build it right or ship a demo that falls apart in production. This skill covers LLM integra... | ai, product | ai, product, every, powered, question, whether, ll, right, ship, demo, falls, apart | | `ai-wrapper-product` | Expert in building products that wrap AI APIs (OpenAI, Anthropic, etc.) into focused tools people will pay for. Not just 'ChatGPT but different' - products t... | ai, wrapper, product | ai, wrapper, product, building, products, wrap, apis, openai, anthropic, etc, people, pay | | `analytics-tracking` | > | analytics, tracking | analytics, tracking | @@ -187,6 +191,7 @@ Total skills: 889 | `data-quality-frameworks` | Implement data quality validation with Great Expectations, dbt tests, and data contracts. Use when building data quality pipelines, implementing validation r... | data, quality, frameworks | data, quality, frameworks, validation, great, expectations, dbt, tests, contracts, building, pipelines, implementing | | `data-scientist` | Expert data scientist for advanced analytics, machine learning, and | data, scientist | data, scientist, analytics, machine, learning | | `data-storytelling` | Transform data into compelling narratives using visualization, context, and persuasive structure. Use when presenting analytics to stakeholders, creating dat... | data, storytelling | data, storytelling, transform, compelling, narratives, visualization, context, persuasive, structure, presenting, analytics, stakeholders | +| `database` | Database development and operations workflow covering SQL, NoSQL, database design, migrations, optimization, and data engineering. | database | database, development, operations, covering, sql, nosql, migrations, optimization, data, engineering | | `database-architect` | Expert database architect specializing in data layer design from | database | database, architect, specializing, data, layer | | `database-design` | Database design principles and decision-making. Schema design, indexing strategy, ORM selection, serverless databases. | database | database, principles, decision, making, schema, indexing, orm, selection, serverless, databases | | `database-optimizer` | Expert database optimizer specializing in modern performance | database, optimizer | database, optimizer, specializing, performance | @@ -210,6 +215,9 @@ Total skills: 889 | `hybrid-search-implementation` | Combine vector and keyword search for improved retrieval. Use when implementing RAG systems, building search engines, or when neither approach alone provides... | hybrid, search | hybrid, search, combine, vector, keyword, improved, retrieval, implementing, rag, building, engines, neither | | `langchain-architecture` | Design LLM applications using the LangChain framework with agents, memory, and tool integration patterns. Use when building LangChain applications, implement... | langchain, architecture | langchain, architecture, llm, applications, framework, agents, memory, integration, building, implementing, ai, creating | | `langgraph` | Expert in LangGraph - the production-grade framework for building stateful, multi-actor AI applications. Covers graph construction, state management, cycles ... | langgraph | langgraph, grade, framework, building, stateful, multi, actor, ai, applications, covers, graph, construction | +| `libreoffice/base` | Database management, forms, reports, and data operations with LibreOffice Base. | libreoffice/base | libreoffice/base, base, database, forms, reports, data, operations, libreoffice | +| `libreoffice/calc` | Spreadsheet creation, format conversion (ODS/XLSX/CSV), formulas, data automation with LibreOffice Calc. | libreoffice/calc | libreoffice/calc, calc, spreadsheet, creation, format, conversion, ods, xlsx, csv, formulas, data, automation | +| `libreoffice/draw` | Vector graphics and diagram creation, format conversion (ODG/SVG/PDF) with LibreOffice Draw. | libreoffice/draw | libreoffice/draw, draw, vector, graphics, diagram, creation, format, conversion, odg, svg, pdf, libreoffice | | `llm-application-dev-ai-assistant` | You are an AI assistant development expert specializing in creating intelligent conversational interfaces, chatbots, and AI-powered applications. Design comp... | llm, application, dev, ai | llm, application, dev, ai, assistant, development, specializing, creating, intelligent, conversational, interfaces, chatbots | | `llm-application-dev-langchain-agent` | You are an expert LangChain agent developer specializing in production-grade AI systems using LangChain 0.1+ and LangGraph. | llm, application, dev, langchain, agent | llm, application, dev, langchain, agent, developer, specializing, grade, ai, langgraph | | `llm-application-dev-prompt-optimize` | You are an expert prompt engineer specializing in crafting effective prompts for LLMs through advanced techniques including constitutional AI, chain-of-thoug... | llm, application, dev, prompt, optimize | llm, application, dev, prompt, optimize, engineer, specializing, crafting, effective, prompts, llms, through | @@ -226,12 +234,13 @@ Total skills: 889 | `podcast-generation` | Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, aud... | podcast, generation | podcast, generation, generate, ai, powered, style, audio, narratives, azure, openai, gpt, realtime | | `postgres-best-practices` | Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, o... | postgres, best, practices | postgres, best, practices, performance, optimization, supabase, skill, writing, reviewing, optimizing, queries, schema | | `postgresql` | Design a PostgreSQL-specific schema. Covers best-practices, data types, indexing, constraints, performance patterns, and advanced features | postgresql | postgresql, specific, schema, covers, data, types, indexing, constraints, performance, features | +| `postgresql-optimization` | PostgreSQL database optimization workflow for query tuning, indexing strategies, performance analysis, and production database management. | postgresql, optimization | postgresql, optimization, database, query, tuning, indexing, performance, analysis | | `prisma-expert` | Prisma ORM expert for schema design, migrations, query optimization, relations modeling, and database operations. Use PROACTIVELY for Prisma schema issues, m... | prisma | prisma, orm, schema, migrations, query, optimization, relations, modeling, database, operations, proactively, issues | | `prompt-caching` | Caching strategies for LLM prompts including Anthropic prompt caching, response caching, and CAG (Cache Augmented Generation) Use when: prompt caching, cache... | prompt, caching | prompt, caching, llm, prompts, including, anthropic, response, cag, cache, augmented, generation, augm | | `prompt-engineering-patterns` | Master advanced prompt engineering techniques to maximize LLM performance, reliability, and controllability in production. Use when optimizing prompts, impro... | prompt, engineering | prompt, engineering, techniques, maximize, llm, performance, reliability, controllability, optimizing, prompts, improving, outputs | | `pydantic-models-py` | Create Pydantic models following the multi-model pattern with Base, Create, Update, Response, and InDB variants. Use when defining API request/response schem... | pydantic, models, py | pydantic, models, py, following, multi, model, base, update, response, indb, variants, defining | | `rag-engineer` | Expert in building Retrieval-Augmented Generation systems. Masters embedding models, vector databases, chunking strategies, and retrieval optimization for LL... | rag | rag, engineer, building, retrieval, augmented, generation, masters, embedding, models, vector, databases, chunking | -| `rag-implementation` | Build Retrieval-Augmented Generation (RAG) systems for LLM applications with vector databases and semantic search. Use when implementing knowledge-grounded A... | rag | rag, retrieval, augmented, generation, llm, applications, vector, databases, semantic, search, implementing, knowledge | +| `rag-implementation` | RAG (Retrieval-Augmented Generation) implementation workflow covering embedding selection, vector database setup, chunking strategies, and retrieval optimiza... | rag | rag, retrieval, augmented, generation, covering, embedding, selection, vector, database, setup, chunking, optimization | | `react-ui-patterns` | Modern React UI patterns for loading states, error handling, and data fetching. Use when building UI components, handling async data, or managing UI states. | react, ui | react, ui, loading, states, error, handling, data, fetching, building, components, async, managing | | `segment-cdp` | Expert patterns for Segment Customer Data Platform including Analytics.js, server-side tracking, tracking plans with Protocols, identity resolution, destinat... | segment, cdp | segment, cdp, customer, data, platform, including, analytics, js, server, side, tracking, plans | | `sendgrid-automation` | Automate SendGrid email operations including sending emails, managing contacts/lists, sender identities, templates, and analytics via Rube MCP (Composio). Al... | sendgrid | sendgrid, automation, automate, email, operations, including, sending, emails, managing, contacts, lists, sender | @@ -261,13 +270,14 @@ Total skills: 889 | `xlsx-official` | Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work ... | xlsx, official | xlsx, official, spreadsheet, creation, editing, analysis, formulas, formatting, data, visualization, claude, work | | `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 (141) +## development (146) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | | `3d-web-experience` | Expert in building 3D experiences for the web - Three.js, React Three Fiber, Spline, WebGL, and interactive 3D scenes. Covers product configurators, 3D portf... | 3d, web, experience | 3d, web, experience, building, experiences, three, js, react, fiber, spline, webgl, interactive | | `algolia-search` | Expert patterns for Algolia search implementation, indexing strategies, React InstantSearch, and relevance tuning Use when: adding search to, algolia, instan... | algolia, search | algolia, search, indexing, react, instantsearch, relevance, tuning, adding, api, functionality | | `api-design-principles` | Master REST and GraphQL API design principles to build intuitive, scalable, and maintainable APIs that delight developers. Use when designing new APIs, revie... | api, principles | api, principles, rest, graphql, intuitive, scalable, maintainable, apis, delight, developers, designing, new | +| `api-documentation` | API documentation workflow for generating OpenAPI specs, creating developer guides, and maintaining comprehensive API documentation. | api, documentation | api, documentation, generating, openapi, specs, creating, developer, guides, maintaining | | `api-documentation-generator` | Generate comprehensive, developer-friendly API documentation from code, including endpoints, parameters, examples, and best practices | api, documentation, generator | api, documentation, generator, generate, developer, friendly, code, including, endpoints, parameters, examples | | `api-patterns` | API design principles and decision-making. REST vs GraphQL vs tRPC selection, response formats, versioning, pagination. | api | api, principles, decision, making, rest, vs, graphql, trpc, selection, response, formats, versioning | | `app-store-optimization` | Complete App Store Optimization (ASO) toolkit for researching, optimizing, and tracking mobile app performance on Apple App Store and Google Play Store | app, store, optimization | app, store, optimization, complete, aso, toolkit, researching, optimizing, tracking, mobile, performance, apple | @@ -327,8 +337,10 @@ Total skills: 889 | `dbos-golang` | DBOS Go SDK for building reliable, fault-tolerant applications with durable workflows. Use this skill when writing Go code with DBOS, creating workflows and ... | dbos, golang | dbos, golang, go, sdk, building, reliable, fault, tolerant, applications, durable, skill, writing | | `dbos-python` | DBOS Python SDK for building reliable, fault-tolerant applications with durable workflows. Use this skill when writing Python code with DBOS, creating workfl... | dbos, python | dbos, python, sdk, building, reliable, fault, tolerant, applications, durable, skill, writing, code | | `dbos-typescript` | DBOS TypeScript SDK for building reliable, fault-tolerant applications with durable workflows. Use this skill when writing TypeScript code with DBOS, creatin... | dbos, typescript | dbos, typescript, sdk, building, reliable, fault, tolerant, applications, durable, skill, writing, code | +| `development` | Comprehensive web, mobile, and backend development workflow bundling frontend, backend, full-stack, and mobile development skills for end-to-end application ... | | development, web, mobile, backend, bundling, frontend, full, stack, skills, application, delivery | | `discord-bot-architect` | Specialized skill for building production-ready Discord bots. Covers Discord.js (JavaScript) and Pycord (Python), gateway intents, slash commands, interactiv... | discord, bot | discord, bot, architect, specialized, skill, building, bots, covers, js, javascript, pycord, python | | `django-pro` | Master Django 5.x with async views, DRF, Celery, and Django | django | django, pro, async, views, drf, celery | +| `documentation` | Documentation generation workflow covering API docs, architecture docs, README files, code comments, and technical writing. | documentation | documentation, generation, covering, api, docs, architecture, readme, files, code, comments, technical, writing | | `dotnet-architect` | Expert .NET backend architect specializing in C#, ASP.NET Core, | dotnet | dotnet, architect, net, backend, specializing, asp, core | | `dotnet-backend-patterns` | Master C#/.NET backend development patterns for building robust APIs, MCP servers, and enterprise applications. Covers async/await, dependency injection, Ent... | dotnet, backend | dotnet, backend, net, development, building, robust, apis, mcp, servers, enterprise, applications, covers | | `exa-search` | Semantic search, similar content discovery, and structured research using Exa API | exa, search | exa, search, semantic, similar, content, discovery, structured, research, api | @@ -370,6 +382,7 @@ Total skills: 889 | `observe-whatsapp` | Observe and troubleshoot WhatsApp in Kapso: debug message delivery, inspect webhook deliveries/retries, triage API errors, and run health checks. Use when in... | observe, whatsapp | observe, whatsapp, troubleshoot, kapso, debug, message, delivery, inspect, webhook, deliveries, retries, triage | | `product-manager-toolkit` | Comprehensive toolkit for product managers including RICE prioritization, customer interview analysis, PRD templates, discovery frameworks, and go-to-market ... | product, manager | product, manager, toolkit, managers, including, rice, prioritization, customer, interview, analysis, prd, discovery | | `python-development-python-scaffold` | You are a Python project architecture expert specializing in scaffolding production-ready Python applications. Generate complete project structures with mode... | python | python, development, scaffold, architecture, specializing, scaffolding, applications, generate, complete, structures, tooling, uv | +| `python-fastapi-development` | Python FastAPI backend development with async patterns, SQLAlchemy, Pydantic, authentication, and production API patterns. | python, fastapi | python, fastapi, development, backend, async, sqlalchemy, pydantic, authentication, api | | `python-packaging` | Create distributable Python packages with proper project structure, setup.py/pyproject.toml, and publishing to PyPI. Use when packaging Python libraries, cre... | python, packaging | python, packaging, distributable, packages, proper, structure, setup, py, pyproject, toml, publishing, pypi | | `python-patterns` | Python development principles and decision-making. Framework selection, async patterns, type hints, project structure. Teaches thinking, not copying. | python | python, development, principles, decision, making, framework, selection, async, type, hints, structure, teaches | | `python-performance-optimization` | Profile and optimize Python code using cProfile, memory profilers, and performance best practices. Use when debugging slow Python code, optimizing bottleneck... | python, performance, optimization | python, performance, optimization, profile, optimize, code, cprofile, memory, profilers, debugging, slow, optimizing | @@ -380,6 +393,7 @@ Total skills: 889 | `react-flow-node-ts` | Create React Flow node components with TypeScript types, handles, and Zustand integration. Use when building custom nodes for React Flow canvas, creating vis... | react, flow, node, ts | react, flow, node, ts, components, typescript, types, zustand, integration, building, custom, nodes | | `react-modernization` | Upgrade React applications to latest versions, migrate from class components to hooks, and adopt concurrent features. Use when modernizing React codebases, m... | react, modernization | react, modernization, upgrade, applications, latest, versions, migrate, class, components, hooks, adopt, concurrent | | `react-native-architecture` | Build production React Native apps with Expo, navigation, native modules, offline sync, and cross-platform patterns. Use when developing mobile apps, impleme... | react, native, architecture | react, native, architecture, apps, expo, navigation, modules, offline, sync, cross, platform, developing | +| `react-nextjs-development` | React and Next.js 14+ application development with App Router, Server Components, TypeScript, Tailwind CSS, and modern frontend patterns. | react, nextjs | react, nextjs, development, next, js, 14, application, app, router, server, components, typescript | | `react-patterns` | Modern React patterns and principles. Hooks, composition, performance, TypeScript best practices. | react | react, principles, hooks, composition, performance, typescript | | `react-state-management` | Master modern React state management with Redux Toolkit, Zustand, Jotai, and React Query. Use when setting up global state, managing server state, or choosin... | react, state | react, state, redux, toolkit, zustand, jotai, query, setting, up, global, managing, server | | `reference-builder` | Creates exhaustive technical references and API documentation. | reference, builder | reference, builder, creates, exhaustive, technical, references, api, documentation | @@ -626,7 +640,7 @@ Total skills: 889 | `x-article-publisher-skill` | Publish articles to X/Twitter | x, article, publisher, skill | x, article, publisher, skill, publish, articles, twitter | | `youtube-summarizer` | Extract transcripts from YouTube videos and generate comprehensive, detailed summaries using intelligent analysis frameworks | video, summarization, transcription, youtube, content-analysis | video, summarization, transcription, youtube, content-analysis, summarizer, extract, transcripts, videos, generate, detailed, summaries | -## infrastructure (85) +## infrastructure (90) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -651,6 +665,7 @@ Total skills: 889 | `cicd-automation-workflow-automate` | You are a workflow automation expert specializing in creating efficient CI/CD pipelines, GitHub Actions workflows, and automated development processes. Desig... | cicd, automate | cicd, automate, automation, specializing, creating, efficient, ci, cd, pipelines, github, actions, automated | | `claude-d3js-skill` | Creating interactive data visualisations using d3.js. This skill should be used when creating custom charts, graphs, network diagrams, geographic visualisati... | claude, d3js, skill | claude, d3js, skill, creating, interactive, data, visualisations, d3, js, should, used, custom | | `cloud-architect` | Expert cloud architect specializing in AWS/Azure/GCP multi-cloud | cloud | cloud, architect, specializing, aws, azure, gcp, multi | +| `cloud-devops` | Cloud infrastructure and DevOps workflow covering AWS, Azure, GCP, Kubernetes, Terraform, CI/CD, monitoring, and cloud-native development. | cloud, devops | cloud, devops, infrastructure, covering, aws, azure, gcp, kubernetes, terraform, ci, cd, monitoring | | `code-review-ai-ai-review` | You are an expert AI-powered code review specialist combining automated static analysis, intelligent pattern recognition, and modern DevOps practices. Levera... | code, ai | code, ai, review, powered, combining, automated, static, analysis, intelligent, recognition, devops, leverage | | `cost-optimization` | Optimize cloud costs through resource rightsizing, tagging strategies, reserved instances, and spending analysis. Use when reducing cloud expenses, analyzing... | cost, optimization | cost, optimization, optimize, cloud, costs, through, resource, rightsizing, tagging, reserved, instances, spending | | `data-engineering-data-pipeline` | You are a data pipeline architecture expert specializing in scalable, reliable, and cost-effective data pipelines for batch and streaming data processing. | data, engineering, pipeline | data, engineering, pipeline, architecture, specializing, scalable, reliable, cost, effective, pipelines, batch, streaming | @@ -662,6 +677,7 @@ Total skills: 889 | `deployment-validation-config-validate` | You are a configuration management expert specializing in validating, testing, and ensuring the correctness of application configurations. Create comprehensi... | deployment, validation, config, validate | deployment, validation, config, validate, configuration, specializing, validating, testing, ensuring, correctness, application, configurations | | `distributed-debugging-debug-trace` | You are a debugging expert specializing in setting up comprehensive debugging environments, distributed tracing, and diagnostic tools. Configure debugging wo... | distributed, debugging, debug, trace | distributed, debugging, debug, trace, specializing, setting, up, environments, tracing, diagnostic, configure, solutions | | `distributed-tracing` | Implement distributed tracing with Jaeger and Tempo to track requests across microservices and identify performance bottlenecks. Use when debugging microserv... | distributed, tracing | distributed, tracing, jaeger, tempo, track, requests, microservices, identify, performance, bottlenecks, debugging, analyzing | +| `e2e-testing` | End-to-end testing workflow with Playwright for browser automation, visual regression, cross-browser testing, and CI/CD integration. | e2e | e2e, testing, playwright, browser, automation, visual, regression, cross, ci, cd, integration | | `e2e-testing-patterns` | Master end-to-end testing with Playwright and Cypress to build reliable test suites that catch bugs, improve confidence, and enable fast deployment. Use when... | e2e | e2e, testing, playwright, cypress, reliable, test, suites, catch, bugs, improve, confidence, enable | | `error-debugging-error-analysis` | You are an expert error analysis specialist with deep expertise in debugging distributed systems, analyzing production incidents, and implementing comprehens... | error, debugging | error, debugging, analysis, deep, expertise, distributed, analyzing, incidents, implementing, observability, solutions | | `error-debugging-error-trace` | You are an error tracking and observability expert specializing in implementing comprehensive error monitoring solutions. Set up error tracking systems, conf... | error, debugging, trace | error, debugging, trace, tracking, observability, specializing, implementing, monitoring, solutions, set, up, configure | @@ -686,7 +702,9 @@ Total skills: 889 | `iterate-pr` | Iterate on a PR until CI passes. Use when you need to fix CI failures, address review feedback, or continuously push fixes until all checks are green. Automa... | iterate, pr | iterate, pr, until, ci, passes, fix, failures, address, review, feedback, continuously, push | | `kpi-dashboard-design` | Design effective KPI dashboards with metrics selection, visualization best practices, and real-time monitoring patterns. Use when building business dashboard... | kpi, dashboard | kpi, dashboard, effective, dashboards, metrics, selection, visualization, real, time, monitoring, building, business | | `kubernetes-architect` | Expert Kubernetes architect specializing in cloud-native | kubernetes | kubernetes, architect, specializing, cloud, native | +| `kubernetes-deployment` | Kubernetes deployment workflow for container orchestration, Helm charts, service mesh, and production-ready K8s configurations. | kubernetes, deployment | kubernetes, deployment, container, orchestration, helm, charts, mesh, k8s, configurations | | `langfuse` | Expert in Langfuse - the open-source LLM observability platform. Covers tracing, prompt management, evaluation, datasets, and integration with LangChain, Lla... | langfuse | langfuse, open, source, llm, observability, platform, covers, tracing, prompt, evaluation, datasets, integration | +| `linux-troubleshooting` | Linux system troubleshooting workflow for diagnosing and resolving system issues, performance problems, and service failures. | linux, troubleshooting | linux, troubleshooting, diagnosing, resolving, issues, performance, problems, failures | | `llm-app-patterns` | Production-ready patterns for building LLM applications. Covers RAG pipelines, agent architectures, prompt IDEs, and LLMOps monitoring. Use when designing AI... | llm, app | llm, app, building, applications, covers, rag, pipelines, agent, architectures, prompt, ides, llmops | | `machine-learning-ops-ml-pipeline` | Design and implement a complete ML pipeline for: $ARGUMENTS | machine, learning, ops, ml, pipeline | machine, learning, ops, ml, pipeline, complete, arguments | | `manifest` | Install and configure the Manifest observability plugin for your agents. Use when setting up telemetry, configuring API keys, or troubleshooting the plugin. | manifest | manifest, install, configure, observability, plugin, agents, setting, up, telemetry, configuring, api, keys | @@ -708,6 +726,7 @@ Total skills: 889 | `service-mesh-observability` | Implement comprehensive observability for service meshes including distributed tracing, metrics, and visualization. Use when setting up mesh monitoring, debu... | service, mesh, observability | service, mesh, observability, meshes, including, distributed, tracing, metrics, visualization, setting, up, monitoring | | `slo-implementation` | Define and implement Service Level Indicators (SLIs) and Service Level Objectives (SLOs) with error budgets and alerting. Use when establishing reliability t... | slo | slo, define, level, indicators, slis, objectives, slos, error, budgets, alerting, establishing, reliability | | `sql-pro` | Master modern SQL with cloud-native databases, OLTP/OLAP | sql | sql, pro, cloud, native, databases, oltp, olap | +| `terraform-infrastructure` | Terraform infrastructure as code workflow for provisioning cloud resources, creating reusable modules, and managing infrastructure at scale. | terraform, infrastructure | terraform, infrastructure, code, provisioning, cloud, resources, creating, reusable, modules, managing, scale | | `terraform-module-library` | Build reusable Terraform modules for AWS, Azure, and GCP infrastructure following infrastructure-as-code best practices. Use when creating infrastructure mod... | terraform, module, library | terraform, module, library, reusable, modules, aws, azure, gcp, infrastructure, following, code, creating | | `terraform-skill` | Terraform infrastructure as code best practices | terraform, skill | terraform, skill, infrastructure, code | | `terraform-specialist` | Expert Terraform/OpenTofu specialist mastering advanced IaC | terraform | terraform, opentofu, mastering, iac | @@ -716,7 +735,7 @@ Total skills: 889 | `wireshark-analysis` | This skill should be used when the user asks to "analyze network traffic with Wireshark", "capture packets for troubleshooting", "filter PCAP files", "follow... | wireshark | wireshark, analysis, skill, should, used, user, asks, analyze, network, traffic, capture, packets | | `workflow-automation` | Workflow automation is the infrastructure that makes AI agents reliable. Without durable execution, a network hiccup during a 10-step payment flow means lost... | | automation, infrastructure, makes, ai, agents, reliable, without, durable, execution, network, hiccup, during | -## security (95) +## security (100) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -726,6 +745,7 @@ Total skills: 889 | `antigravity-workflows` | Orchestrate multiple Antigravity skills through guided workflows for SaaS MVP delivery, security audits, AI agent builds, and browser QA. | antigravity | antigravity, orchestrate, multiple, skills, through, guided, saas, mvp, delivery, security, audits, ai | | `api-fuzzing-bug-bounty` | This skill should be used when the user asks to "test API security", "fuzz APIs", "find IDOR vulnerabilities", "test REST API", "test GraphQL", "API penetrat... | api, fuzzing, bug, bounty | api, fuzzing, bug, bounty, skill, should, used, user, asks, test, security, fuzz | | `api-security-best-practices` | Implement secure API design patterns including authentication, authorization, input validation, rate limiting, and protection against common API vulnerabilities | api, security, best, practices | api, security, best, practices, secure, including, authentication, authorization, input, validation, rate, limiting | +| `api-security-testing` | API security testing workflow for REST and GraphQL APIs covering authentication, authorization, rate limiting, input validation, and security best practices. | api, security | api, security, testing, rest, graphql, apis, covering, authentication, authorization, rate, limiting, input | | `attack-tree-construction` | Build comprehensive attack trees to visualize threat paths. Use when mapping attack scenarios, identifying defense gaps, or communicating security risks to s... | attack, tree, construction | attack, tree, construction, trees, visualize, threat, paths, mapping, scenarios, identifying, defense, gaps | | `auth-implementation-patterns` | Master authentication and authorization patterns including JWT, OAuth2, session management, and RBAC to build secure, scalable access control systems. Use wh... | auth | auth, authentication, authorization, including, jwt, oauth2, session, rbac, secure, scalable, access, control | | `aws-penetration-testing` | This skill should be used when the user asks to "pentest AWS", "test AWS security", "enumerate IAM", "exploit cloud infrastructure", "AWS privilege escalatio... | aws, penetration | aws, penetration, testing, skill, should, used, user, asks, pentest, test, security, enumerate | @@ -792,6 +812,7 @@ Total skills: 889 | `sast-configuration` | Configure Static Application Security Testing (SAST) tools for automated vulnerability detection in application code. Use when setting up security scanning, ... | sast, configuration | sast, configuration, configure, static, application, security, testing, automated, vulnerability, detection, code, setting | | `scanning-tools` | This skill should be used when the user asks to "perform vulnerability scanning", "scan networks for open ports", "assess web application security", "scan wi... | scanning | scanning, skill, should, used, user, asks, perform, vulnerability, scan, networks, open, ports | | `secrets-management` | Implement secure secrets management for CI/CD pipelines using Vault, AWS Secrets Manager, or native platform solutions. Use when handling sensitive credentia... | secrets | secrets, secure, ci, cd, pipelines, vault, aws, manager, native, platform, solutions, handling | +| `security-audit` | Comprehensive security auditing workflow covering web application testing, API security, penetration testing, vulnerability scanning, and security hardening. | security, audit | security, audit, auditing, covering, web, application, testing, api, penetration, vulnerability, scanning, hardening | | `security-auditor` | Expert security auditor specializing in DevSecOps, comprehensive | security, auditor | security, auditor, specializing, devsecops | | `security-bluebook-builder` | Build security Blue Books for sensitive apps | security, bluebook, builder | security, bluebook, builder, blue, books, sensitive, apps | | `security-compliance-compliance-check` | You are a compliance expert specializing in regulatory requirements for software systems including GDPR, HIPAA, SOC2, PCI-DSS, and other industry standards. ... | security, compliance, check | security, compliance, check, specializing, regulatory, requirements, software, including, gdpr, hipaa, soc2, pci | @@ -813,10 +834,13 @@ Total skills: 889 | `varlock-claude-skill` | Secure environment variable management ensuring secrets are never exposed in Claude sessions, terminals, logs, or git commits | varlock, claude, skill | varlock, claude, skill, secure, environment, variable, ensuring, secrets, never, exposed, sessions, terminals | | `vulnerability-scanner` | Advanced vulnerability analysis principles. OWASP 2025, Supply Chain Security, attack surface mapping, risk prioritization. | vulnerability, scanner | vulnerability, scanner, analysis, principles, owasp, 2025, supply, chain, security, attack, surface, mapping | | `web-design-guidelines` | Review UI code for Web Interface Guidelines compliance. Use when asked to \"review my UI\", \"check accessibility\", \"audit design\", \"review UX\", or \"ch... | web, guidelines | web, guidelines, review, ui, code, interface, compliance, asked, my, check, accessibility, audit | +| `web-security-testing` | Web application security testing workflow for OWASP Top 10 vulnerabilities including injection, XSS, authentication flaws, and access control issues. | web, security | web, security, testing, application, owasp, top, 10, vulnerabilities, including, injection, xss, authentication | | `wiki-onboarding` | Generates two complementary onboarding guides β€” a Principal-Level architectural deep-dive and a Zero-to-Hero contributor walkthrough. Use when the user wants... | wiki, onboarding | wiki, onboarding, generates, two, complementary, guides, principal, level, architectural, deep, dive, zero | | `wiki-researcher` | Conducts multi-turn iterative deep research on specific topics within a codebase with zero tolerance for shallow analysis. Use when the user wants an in-dept... | wiki, researcher | wiki, researcher, conducts, multi, turn, iterative, deep, research, specific, topics, within, codebase | +| `wordpress` | Complete WordPress development workflow covering theme development, plugin creation, WooCommerce integration, performance optimization, and security hardening. | wordpress | wordpress, complete, development, covering, theme, plugin, creation, woocommerce, integration, performance, optimization, security | +| `wordpress-plugin-development` | WordPress plugin development workflow covering plugin architecture, hooks, admin interfaces, REST API, and security best practices. | wordpress, plugin | wordpress, plugin, development, covering, architecture, hooks, admin, interfaces, rest, api, security | -## testing (31) +## testing (32) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -845,6 +869,7 @@ Total skills: 889 | `tdd-workflows-tdd-refactor` | Use when working with tdd workflows tdd refactor | tdd, refactor | tdd, refactor, working | | `test-driven-development` | Use when implementing any feature or bugfix, before writing implementation code | driven | driven, test, development, implementing, any, feature, bugfix, before, writing, code | | `test-fixing` | Run tests and systematically fix all failing tests using smart error grouping. Use when user asks to fix failing tests, mentions test failures, runs test sui... | fixing | fixing, test, run, tests, systematically, fix, all, failing, smart, error, grouping, user | +| `testing-qa` | Comprehensive testing and QA workflow covering unit testing, integration testing, E2E testing, browser automation, and quality assurance. | qa | qa, testing, covering, unit, integration, e2e, browser, automation, quality, assurance | | `ui-visual-validator` | Rigorous visual validation expert specializing in UI testing, | ui, visual, validator | ui, visual, validator, rigorous, validation, specializing, testing | | `unit-testing-test-generate` | Generate comprehensive, maintainable unit tests across languages with strong coverage and edge case focus. | unit, generate | unit, generate, testing, test, maintainable, tests, languages, strong, coverage, edge, case | | `web3-testing` | Test smart contracts comprehensively using Hardhat and Foundry with unit tests, integration tests, and mainnet forking. Use when testing Solidity contracts, ... | web3 | web3, testing, test, smart, contracts, comprehensively, hardhat, foundry, unit, tests, integration, mainnet | @@ -852,7 +877,7 @@ Total skills: 889 | `wordpress-penetration-testing` | This skill should be used when the user asks to "pentest WordPress sites", "scan WordPress for vulnerabilities", "enumerate WordPress users, themes, or plugi... | wordpress, penetration | wordpress, penetration, testing, skill, should, used, user, asks, pentest, sites, scan, vulnerabilities | | `xss-html-injection` | This skill should be used when the user asks to "test for XSS vulnerabilities", "perform cross-site scripting attacks", "identify HTML injection flaws", "exp... | xss, html, injection | xss, html, injection, skill, should, used, user, asks, test, vulnerabilities, perform, cross | -## workflow (81) +## workflow (86) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -900,6 +925,8 @@ Total skills: 889 | `jira-automation` | Automate Jira tasks via Rube MCP (Composio): issues, projects, sprints, boards, comments, users. Always search tools first for current schemas. | jira | jira, automation, automate, tasks, via, rube, mcp, composio, issues, sprints, boards, comments | | `kaizen` | Guide for continuous improvement, error proofing, and standardization. Use this skill when the user wants to improve code quality, refactor, or discuss proce... | kaizen | kaizen, continuous, improvement, error, proofing, standardization, skill, user, wants, improve, code, quality | | `klaviyo-automation` | Automate Klaviyo tasks via Rube MCP (Composio): manage email/SMS campaigns, inspect campaign messages, track tags, and monitor send jobs. Always search tools... | klaviyo | klaviyo, automation, automate, tasks, via, rube, mcp, composio, email, sms, campaigns, inspect | +| `libreoffice/impress` | Presentation creation, format conversion (ODP/PPTX/PDF), slide automation with LibreOffice Impress. | libreoffice/impress | libreoffice/impress, impress, presentation, creation, format, conversion, odp, pptx, pdf, slide, automation, libreoffice | +| `libreoffice/writer` | Document creation, format conversion (ODT/DOCX/PDF), mail merge, and automation with LibreOffice Writer. | libreoffice/writer | libreoffice/writer, writer, document, creation, format, conversion, odt, docx, pdf, mail, merge, automation | | `linear-automation` | Automate Linear tasks via Rube MCP (Composio): issues, projects, cycles, teams, labels. Always search tools first for current schemas. | linear | linear, automation, automate, tasks, via, rube, mcp, composio, issues, cycles, teams, labels | | `linkedin-automation` | Automate LinkedIn tasks via Rube MCP (Composio): create posts, manage profile, company info, comments, and image uploads. Always search tools first for curre... | linkedin | linkedin, automation, automate, tasks, via, rube, mcp, composio, posts, profile, company, info | | `make-automation` | Automate Make (Integromat) tasks via Rube MCP (Composio): operations, enums, language and timezone lookups. Always search tools first for current schemas. | make | make, automation, automate, integromat, tasks, via, rube, mcp, composio, operations, enums, language | @@ -909,7 +936,9 @@ Total skills: 889 | `monday-automation` | Automate Monday.com work management including boards, items, columns, groups, subitems, and updates via Rube MCP (Composio). Always search tools first for cu... | monday | monday, automation, automate, com, work, including, boards, items, columns, groups, subitems, updates | | `nerdzao-elite-gemini-high` | Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade mΓ‘xima e eficiΓͺncia de tokens. | nerdzao, elite, gemini, high | nerdzao, elite, gemini, high, modo, coder, ux, pixel, perfect, otimizado, especificamente, para | | `notion-automation` | Automate Notion tasks via Rube MCP (Composio): pages, databases, blocks, comments, users. Always search tools first for current schemas. | notion | notion, automation, automate, tasks, via, rube, mcp, composio, pages, databases, blocks, comments | +| `office-productivity` | Office productivity workflow covering document creation, spreadsheet automation, presentation generation, and integration with LibreOffice and Microsoft Offi... | office, productivity | office, productivity, covering, document, creation, spreadsheet, automation, presentation, generation, integration, libreoffice, microsoft | | `one-drive-automation` | Automate OneDrive file management, search, uploads, downloads, sharing, permissions, and folder operations via Rube MCP (Composio). Always search tools first... | one, drive | one, drive, automation, automate, onedrive, file, search, uploads, downloads, sharing, permissions, folder | +| `os-scripting` | Operating system and shell scripting troubleshooting workflow for Linux, macOS, and Windows. Covers bash scripting, system administration, debugging, and aut... | os, scripting | os, scripting, operating, shell, troubleshooting, linux, macos, windows, covers, bash, administration, debugging | | `outlook-automation` | Automate Outlook tasks via Rube MCP (Composio): emails, calendar, contacts, folders, attachments. Always search tools first for current schemas. | outlook | outlook, automation, automate, tasks, via, rube, mcp, composio, emails, calendar, contacts, folders | | `outlook-calendar-automation` | Automate Outlook Calendar tasks via Rube MCP (Composio): create events, manage attendees, find meeting times, and handle invitations. Always search tools fir... | outlook, calendar | outlook, calendar, automation, automate, tasks, via, rube, mcp, composio, events, attendees, find | | `pagerduty-automation` | Automate PagerDuty tasks via Rube MCP (Composio): manage incidents, services, schedules, escalation policies, and on-call rotations. Always search tools firs... | pagerduty | pagerduty, automation, automate, tasks, via, rube, mcp, composio, incidents, schedules, escalation, policies | @@ -933,6 +962,7 @@ Total skills: 889 | `twitter-automation` | Automate Twitter/X tasks via Rube MCP (Composio): posts, search, users, bookmarks, lists, media. Always search tools first for current schemas. | twitter | twitter, automation, automate, tasks, via, rube, mcp, composio, posts, search, users, bookmarks | | `vercel-automation` | Automate Vercel tasks via Rube MCP (Composio): manage deployments, domains, DNS, env vars, projects, and teams. Always search tools first for current schemas. | vercel | vercel, automation, automate, tasks, via, rube, mcp, composio, deployments, domains, dns, env | | `webflow-automation` | Automate Webflow CMS collections, site publishing, page management, asset uploads, and ecommerce orders via Rube MCP (Composio). Always search tools first fo... | webflow | webflow, automation, automate, cms, collections, site, publishing, page, asset, uploads, ecommerce, orders | +| `wordpress-woocommerce-development` | WooCommerce store development workflow covering store setup, payment integration, shipping configuration, and customization. | wordpress, woocommerce | wordpress, woocommerce, development, store, covering, setup, payment, integration, shipping, configuration, customization | | `wrike-automation` | Automate Wrike project management via Rube MCP (Composio): create tasks/folders, manage projects, assign work, and track progress. Always search tools first ... | wrike | wrike, automation, automate, via, rube, mcp, composio, tasks, folders, assign, work, track | | `zendesk-automation` | Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas. | zendesk | zendesk, automation, automate, tasks, via, rube, mcp, composio, tickets, users, organizations, replies | | `zoho-crm-automation` | Automate Zoho CRM tasks via Rube MCP (Composio): create/update records, search contacts, manage leads, and convert leads. Always search tools first for curre... | zoho, crm | zoho, crm, automation, automate, tasks, via, rube, mcp, composio, update, records, search | diff --git a/README.md b/README.md index 1dca7bdc..017b3727 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 889+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 919+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 889+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 919+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) @@ -17,7 +17,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **889 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **919 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) @@ -42,7 +42,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [πŸ“¦ Features & Categories](#features--categories) -- [πŸ“š Browse 889+ Skills](#browse-889-skills) +- [πŸ“š Browse 919+ Skills](#browse-919-skills) - [🀝 How to Contribute](#how-to-contribute) - [🀝 Community](#community) - [β˜• Support the Project](#support-the-project) @@ -343,7 +343,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 889+ Skills +## Browse 919+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. diff --git a/data/aliases.json b/data/aliases.json index c25dad23..4ef98795 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -76,6 +76,11 @@ "git-pr-workflow": "git-pr-workflows-git-workflow", "incident-response": "incident-response-incident-response", "javascript-typescript-scaffold": "javascript-typescript-typescript-scaffold", + "base": "libreoffice/base", + "calc": "libreoffice/calc", + "draw": "libreoffice/draw", + "impress": "libreoffice/impress", + "writer": "libreoffice/writer", "llm-application-assistant": "llm-application-dev-ai-assistant", "llm-application-agent": "llm-application-dev-langchain-agent", "llm-application-optimize": "llm-application-dev-prompt-optimize", diff --git a/data/bundles.json b/data/bundles.json index 018f7f49..c6810a79 100644 --- a/data/bundles.json +++ b/data/bundles.json @@ -8,11 +8,13 @@ "agent-framework-azure-ai-py", "algolia-search", "api-design-principles", + "api-documentation", "api-documentation-generator", "api-documenter", "api-fuzzing-bug-bounty", "api-patterns", "api-security-best-practices", + "api-security-testing", "api-testing-observability-api-mock", "app-store-optimization", "application-performance-performance-optimization", @@ -83,8 +85,10 @@ "dbos-golang", "dbos-python", "dbos-typescript", + "development", "discord-bot-architect", "django-pro", + "documentation", "documentation-generation-doc-generate", "documentation-templates", "dotnet-architect", @@ -145,6 +149,7 @@ "product-manager-toolkit", "pydantic-models-py", "python-development-python-scaffold", + "python-fastapi-development", "python-packaging", "python-patterns", "python-performance-optimization", @@ -155,6 +160,7 @@ "react-flow-node-ts", "react-modernization", "react-native-architecture", + "react-nextjs-development", "react-patterns", "react-state-management", "react-ui-patterns", @@ -163,6 +169,7 @@ "ruby-pro", "rust-async-patterns", "rust-pro", + "security-audit", "security/aws-secrets-rotation", "senior-architect", "senior-fullstack", @@ -188,6 +195,7 @@ "voice-ai-development", "web-artifacts-builder", "webapp-testing", + "wordpress-plugin-development", "zustand-store-ts" ] }, @@ -198,6 +206,7 @@ "antigravity-workflows", "api-fuzzing-bug-bounty", "api-security-best-practices", + "api-security-testing", "attack-tree-construction", "auth-implementation-patterns", "aws-penetration-testing", @@ -250,6 +259,7 @@ "sast-configuration", "scanning-tools", "secrets-management", + "security-audit", "security-auditor", "security-bluebook-builder", "security-compliance-compliance-check", @@ -270,7 +280,10 @@ "top-web-vulnerabilities", "varlock-claude-skill", "vulnerability-scanner", - "web-design-guidelines" + "web-design-guidelines", + "web-security-testing", + "wordpress", + "wordpress-plugin-development" ] }, "k8s-core": { @@ -280,6 +293,7 @@ "azure-identity-java", "azure-identity-ts", "azure-servicebus-ts", + "cloud-devops", "freshservice-automation", "gitops-workflow", "helm-chart-scaffolding", @@ -287,8 +301,10 @@ "k8s-manifest-generator", "k8s-security-policies", "kubernetes-architect", + "kubernetes-deployment", "legal-advisor", "linkerd-patterns", + "linux-troubleshooting", "microservices-patterns", "moodle-external-api-development", "mtls-configuration", @@ -325,6 +341,7 @@ "data-quality-frameworks", "data-scientist", "data-storytelling", + "database", "database-admin", "database-architect", "database-cloud-optimization-cost-optimize", @@ -343,6 +360,8 @@ "googlesheets-automation", "graphql", "kpi-dashboard-design", + "libreoffice/base", + "libreoffice/calc", "loki-mode", "mailchimp-automation", "ml-pipeline-workflow", @@ -354,8 +373,10 @@ "php-pro", "postgres-best-practices", "postgresql", + "postgresql-optimization", "prisma-expert", "pydantic-models-py", + "rag-implementation", "react-ui-patterns", "segment-cdp", "sendgrid-automation", @@ -387,6 +408,7 @@ "azure-monitor-opentelemetry-ts", "backend-development-feature-development", "cicd-automation-workflow-automate", + "cloud-devops", "code-review-ai-ai-review", "data-engineering-data-pipeline", "database-migrations-migration-observability", @@ -414,6 +436,7 @@ "incident-response-smart-fix", "incident-runbook-templates", "kpi-dashboard-design", + "kubernetes-deployment", "langfuse", "llm-app-patterns", "loki-mode", diff --git a/data/catalog.json b/data/catalog.json index b0c71606..f619b4ef 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,6 +1,6 @@ { "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 889, + "total": 919, "skills": [ { "id": "3d-web-experience", @@ -385,6 +385,30 @@ ], "path": "skills/agents-v2-py/SKILL.md" }, + { + "id": "ai-agent-development", + "name": "ai-agent-development", + "description": "AI agent development workflow for building autonomous agents, multi-agent systems, and agent orchestration with CrewAI, LangGraph, and custom agents.", + "category": "data-ai", + "tags": [ + "ai", + "agent" + ], + "triggers": [ + "ai", + "agent", + "development", + "building", + "autonomous", + "agents", + "multi", + "orchestration", + "crewai", + "langgraph", + "custom" + ], + "path": "skills/ai-agent-development/SKILL.md" + }, { "id": "ai-agents-architect", "name": "ai-agents-architect", @@ -427,6 +451,31 @@ ], "path": "skills/ai-engineer/SKILL.md" }, + { + "id": "ai-ml", + "name": "ai-ml", + "description": "AI and machine learning workflow covering LLM application development, RAG implementation, agent architecture, ML pipelines, and AI-powered features.", + "category": "data-ai", + "tags": [ + "ai", + "ml" + ], + "triggers": [ + "ai", + "ml", + "machine", + "learning", + "covering", + "llm", + "application", + "development", + "rag", + "agent", + "architecture", + "pipelines" + ], + "path": "skills/ai-ml/SKILL.md" + }, { "id": "ai-product", "name": "ai-product", @@ -803,6 +852,28 @@ ], "path": "skills/api-design-principles/SKILL.md" }, + { + "id": "api-documentation", + "name": "api-documentation", + "description": "API documentation workflow for generating OpenAPI specs, creating developer guides, and maintaining comprehensive API documentation.", + "category": "development", + "tags": [ + "api", + "documentation" + ], + "triggers": [ + "api", + "documentation", + "generating", + "openapi", + "specs", + "creating", + "developer", + "guides", + "maintaining" + ], + "path": "skills/api-documentation/SKILL.md" + }, { "id": "api-documentation-generator", "name": "api-documentation-generator", @@ -925,6 +996,31 @@ ], "path": "skills/api-security-best-practices/SKILL.md" }, + { + "id": "api-security-testing", + "name": "api-security-testing", + "description": "API security testing workflow for REST and GraphQL APIs covering authentication, authorization, rate limiting, input validation, and security best practices.", + "category": "security", + "tags": [ + "api", + "security" + ], + "triggers": [ + "api", + "security", + "testing", + "rest", + "graphql", + "apis", + "covering", + "authentication", + "authorization", + "rate", + "limiting", + "input" + ], + "path": "skills/api-security-testing/SKILL.md" + }, { "id": "api-testing-observability-api-mock", "name": "api-testing-observability-api-mock", @@ -4242,6 +4338,28 @@ ], "path": "skills/bash-pro/SKILL.md" }, + { + "id": "bash-scripting", + "name": "bash-scripting", + "description": "Bash scripting workflow for creating production-ready shell scripts with defensive patterns, error handling, and testing.", + "category": "architecture", + "tags": [ + "bash", + "scripting" + ], + "triggers": [ + "bash", + "scripting", + "creating", + "shell", + "scripts", + "defensive", + "error", + "handling", + "testing" + ], + "path": "skills/bash-scripting/SKILL.md" + }, { "id": "bats-testing-patterns", "name": "bats-testing-patterns", @@ -5542,6 +5660,31 @@ ], "path": "skills/cloud-architect/SKILL.md" }, + { + "id": "cloud-devops", + "name": "cloud-devops", + "description": "Cloud infrastructure and DevOps workflow covering AWS, Azure, GCP, Kubernetes, Terraform, CI/CD, monitoring, and cloud-native development.", + "category": "infrastructure", + "tags": [ + "cloud", + "devops" + ], + "triggers": [ + "cloud", + "devops", + "infrastructure", + "covering", + "aws", + "azure", + "gcp", + "kubernetes", + "terraform", + "ci", + "cd", + "monitoring" + ], + "path": "skills/cloud-devops/SKILL.md" + }, { "id": "cloud-penetration-testing", "name": "cloud-penetration-testing", @@ -7015,6 +7158,28 @@ ], "path": "skills/data-storytelling/SKILL.md" }, + { + "id": "database", + "name": "database", + "description": "Database development and operations workflow covering SQL, NoSQL, database design, migrations, optimization, and data engineering.", + "category": "data-ai", + "tags": [ + "database" + ], + "triggers": [ + "database", + "development", + "operations", + "covering", + "sql", + "nosql", + "migrations", + "optimization", + "data", + "engineering" + ], + "path": "skills/database/SKILL.md" + }, { "id": "database-admin", "name": "database-admin", @@ -7704,6 +7869,27 @@ ], "path": "skills/design-orchestration/SKILL.md" }, + { + "id": "development", + "name": "development", + "description": "Comprehensive web, mobile, and backend development workflow bundling frontend, backend, full-stack, and mobile development skills for end-to-end application delivery.", + "category": "development", + "tags": [], + "triggers": [ + "development", + "web", + "mobile", + "backend", + "bundling", + "frontend", + "full", + "stack", + "skills", + "application", + "delivery" + ], + "path": "skills/development/SKILL.md" + }, { "id": "devops-troubleshooter", "name": "devops-troubleshooter", @@ -7934,6 +8120,30 @@ ], "path": "skills/docs-architect/SKILL.md" }, + { + "id": "documentation", + "name": "documentation", + "description": "Documentation generation workflow covering API docs, architecture docs, README files, code comments, and technical writing.", + "category": "development", + "tags": [ + "documentation" + ], + "triggers": [ + "documentation", + "generation", + "covering", + "api", + "docs", + "architecture", + "readme", + "files", + "code", + "comments", + "technical", + "writing" + ], + "path": "skills/documentation/SKILL.md" + }, { "id": "documentation-generation-doc-generate", "name": "documentation-generation-doc-generate", @@ -8170,6 +8380,29 @@ ], "path": "skills/dx-optimizer/SKILL.md" }, + { + "id": "e2e-testing", + "name": "e2e-testing", + "description": "End-to-end testing workflow with Playwright for browser automation, visual regression, cross-browser testing, and CI/CD integration.", + "category": "infrastructure", + "tags": [ + "e2e" + ], + "triggers": [ + "e2e", + "testing", + "playwright", + "browser", + "automation", + "visual", + "regression", + "cross", + "ci", + "cd", + "integration" + ], + "path": "skills/e2e-testing/SKILL.md" + }, { "id": "e2e-testing-patterns", "name": "e2e-testing-patterns", @@ -11781,6 +12014,28 @@ ], "path": "skills/kubernetes-architect/SKILL.md" }, + { + "id": "kubernetes-deployment", + "name": "kubernetes-deployment", + "description": "Kubernetes deployment workflow for container orchestration, Helm charts, service mesh, and production-ready K8s configurations.", + "category": "infrastructure", + "tags": [ + "kubernetes", + "deployment" + ], + "triggers": [ + "kubernetes", + "deployment", + "container", + "orchestration", + "helm", + "charts", + "mesh", + "k8s", + "configurations" + ], + "path": "skills/kubernetes-deployment/SKILL.md" + }, { "id": "langchain-architecture", "name": "langchain-architecture", @@ -11992,6 +12247,122 @@ ], "path": "skills/legal-advisor/SKILL.md" }, + { + "id": "libreoffice/base", + "name": "base", + "description": "Database management, forms, reports, and data operations with LibreOffice Base.", + "category": "data-ai", + "tags": [ + "libreoffice/base" + ], + "triggers": [ + "libreoffice/base", + "base", + "database", + "forms", + "reports", + "data", + "operations", + "libreoffice" + ], + "path": "skills/libreoffice/base/SKILL.md" + }, + { + "id": "libreoffice/calc", + "name": "calc", + "description": "Spreadsheet creation, format conversion (ODS/XLSX/CSV), formulas, data automation with LibreOffice Calc.", + "category": "data-ai", + "tags": [ + "libreoffice/calc" + ], + "triggers": [ + "libreoffice/calc", + "calc", + "spreadsheet", + "creation", + "format", + "conversion", + "ods", + "xlsx", + "csv", + "formulas", + "data", + "automation" + ], + "path": "skills/libreoffice/calc/SKILL.md" + }, + { + "id": "libreoffice/draw", + "name": "draw", + "description": "Vector graphics and diagram creation, format conversion (ODG/SVG/PDF) with LibreOffice Draw.", + "category": "data-ai", + "tags": [ + "libreoffice/draw" + ], + "triggers": [ + "libreoffice/draw", + "draw", + "vector", + "graphics", + "diagram", + "creation", + "format", + "conversion", + "odg", + "svg", + "pdf", + "libreoffice" + ], + "path": "skills/libreoffice/draw/SKILL.md" + }, + { + "id": "libreoffice/impress", + "name": "impress", + "description": "Presentation creation, format conversion (ODP/PPTX/PDF), slide automation with LibreOffice Impress.", + "category": "workflow", + "tags": [ + "libreoffice/impress" + ], + "triggers": [ + "libreoffice/impress", + "impress", + "presentation", + "creation", + "format", + "conversion", + "odp", + "pptx", + "pdf", + "slide", + "automation", + "libreoffice" + ], + "path": "skills/libreoffice/impress/SKILL.md" + }, + { + "id": "libreoffice/writer", + "name": "writer", + "description": "Document creation, format conversion (ODT/DOCX/PDF), mail merge, and automation with LibreOffice Writer.", + "category": "workflow", + "tags": [ + "libreoffice/writer" + ], + "triggers": [ + "libreoffice/writer", + "writer", + "document", + "creation", + "format", + "conversion", + "odt", + "docx", + "pdf", + "mail", + "merge", + "automation" + ], + "path": "skills/libreoffice/writer/SKILL.md" + }, { "id": "linear-automation", "name": "linear-automation", @@ -12161,6 +12532,27 @@ ], "path": "skills/linux-shell-scripting/SKILL.md" }, + { + "id": "linux-troubleshooting", + "name": "linux-troubleshooting", + "description": "Linux system troubleshooting workflow for diagnosing and resolving system issues, performance problems, and service failures.", + "category": "infrastructure", + "tags": [ + "linux", + "troubleshooting" + ], + "triggers": [ + "linux", + "troubleshooting", + "diagnosing", + "resolving", + "issues", + "performance", + "problems", + "failures" + ], + "path": "skills/linux-troubleshooting/SKILL.md" + }, { "id": "llm-app-patterns", "name": "llm-app-patterns", @@ -13914,6 +14306,31 @@ ], "path": "skills/obsidian-clipper-template-creator/SKILL.md" }, + { + "id": "office-productivity", + "name": "office-productivity", + "description": "Office productivity workflow covering document creation, spreadsheet automation, presentation generation, and integration with LibreOffice and Microsoft Office formats.", + "category": "workflow", + "tags": [ + "office", + "productivity" + ], + "triggers": [ + "office", + "productivity", + "covering", + "document", + "creation", + "spreadsheet", + "automation", + "presentation", + "generation", + "integration", + "libreoffice", + "microsoft" + ], + "path": "skills/office-productivity/SKILL.md" + }, { "id": "on-call-handoff-patterns", "name": "on-call-handoff-patterns", @@ -14016,6 +14433,31 @@ ], "path": "skills/openapi-spec-generation/SKILL.md" }, + { + "id": "os-scripting", + "name": "os-scripting", + "description": "Operating system and shell scripting troubleshooting workflow for Linux, macOS, and Windows. Covers bash scripting, system administration, debugging, and automation.", + "category": "workflow", + "tags": [ + "os", + "scripting" + ], + "triggers": [ + "os", + "scripting", + "operating", + "shell", + "troubleshooting", + "linux", + "macos", + "windows", + "covers", + "bash", + "administration", + "debugging" + ], + "path": "skills/os-scripting/SKILL.md" + }, { "id": "oss-hunter", "name": "oss-hunter", @@ -14727,6 +15169,27 @@ ], "path": "skills/postgresql/SKILL.md" }, + { + "id": "postgresql-optimization", + "name": "postgresql-optimization", + "description": "PostgreSQL database optimization workflow for query tuning, indexing strategies, performance analysis, and production database management.", + "category": "data-ai", + "tags": [ + "postgresql", + "optimization" + ], + "triggers": [ + "postgresql", + "optimization", + "database", + "query", + "tuning", + "indexing", + "performance", + "analysis" + ], + "path": "skills/postgresql-optimization/SKILL.md" + }, { "id": "posthog-automation", "name": "posthog-automation", @@ -15253,6 +15716,28 @@ ], "path": "skills/python-development-python-scaffold/SKILL.md" }, + { + "id": "python-fastapi-development", + "name": "python-fastapi-development", + "description": "Python FastAPI backend development with async patterns, SQLAlchemy, Pydantic, authentication, and production API patterns.", + "category": "development", + "tags": [ + "python", + "fastapi" + ], + "triggers": [ + "python", + "fastapi", + "development", + "backend", + "async", + "sqlalchemy", + "pydantic", + "authentication", + "api" + ], + "path": "skills/python-fastapi-development/SKILL.md" + }, { "id": "python-packaging", "name": "python-packaging", @@ -15441,7 +15926,7 @@ { "id": "rag-implementation", "name": "rag-implementation", - "description": "Build Retrieval-Augmented Generation (RAG) systems for LLM applications with vector databases and semantic search. Use when implementing knowledge-grounded AI, building document Q&A systems, or int...", + "description": "RAG (Retrieval-Augmented Generation) implementation workflow covering embedding selection, vector database setup, chunking strategies, and retrieval optimization.", "category": "data-ai", "tags": [ "rag" @@ -15451,14 +15936,14 @@ "retrieval", "augmented", "generation", - "llm", - "applications", + "covering", + "embedding", + "selection", "vector", - "databases", - "semantic", - "search", - "implementing", - "knowledge" + "database", + "setup", + "chunking", + "optimization" ], "path": "skills/rag-implementation/SKILL.md" }, @@ -15591,6 +16076,31 @@ ], "path": "skills/react-native-architecture/SKILL.md" }, + { + "id": "react-nextjs-development", + "name": "react-nextjs-development", + "description": "React and Next.js 14+ application development with App Router, Server Components, TypeScript, Tailwind CSS, and modern frontend patterns.", + "category": "development", + "tags": [ + "react", + "nextjs" + ], + "triggers": [ + "react", + "nextjs", + "development", + "next", + "js", + "14", + "application", + "app", + "router", + "server", + "components", + "typescript" + ], + "path": "skills/react-nextjs-development/SKILL.md" + }, { "id": "react-patterns", "name": "react-patterns", @@ -16346,6 +16856,31 @@ ], "path": "skills/secrets-management/SKILL.md" }, + { + "id": "security-audit", + "name": "security-audit", + "description": "Comprehensive security auditing workflow covering web application testing, API security, penetration testing, vulnerability scanning, and security hardening.", + "category": "security", + "tags": [ + "security", + "audit" + ], + "triggers": [ + "security", + "audit", + "auditing", + "covering", + "web", + "application", + "testing", + "api", + "penetration", + "vulnerability", + "scanning", + "hardening" + ], + "path": "skills/security-audit/SKILL.md" + }, { "id": "security-auditor", "name": "security-auditor", @@ -18526,6 +19061,30 @@ ], "path": "skills/temporal-python-testing/SKILL.md" }, + { + "id": "terraform-infrastructure", + "name": "terraform-infrastructure", + "description": "Terraform infrastructure as code workflow for provisioning cloud resources, creating reusable modules, and managing infrastructure at scale.", + "category": "infrastructure", + "tags": [ + "terraform", + "infrastructure" + ], + "triggers": [ + "terraform", + "infrastructure", + "code", + "provisioning", + "cloud", + "resources", + "creating", + "reusable", + "modules", + "managing", + "scale" + ], + "path": "skills/terraform-infrastructure/SKILL.md" + }, { "id": "terraform-module-library", "name": "terraform-module-library", @@ -18671,6 +19230,28 @@ ], "path": "skills/testing-patterns/SKILL.md" }, + { + "id": "testing-qa", + "name": "testing-qa", + "description": "Comprehensive testing and QA workflow covering unit testing, integration testing, E2E testing, browser automation, and quality assurance.", + "category": "testing", + "tags": [ + "qa" + ], + "triggers": [ + "qa", + "testing", + "covering", + "unit", + "integration", + "e2e", + "browser", + "automation", + "quality", + "assurance" + ], + "path": "skills/testing-qa/SKILL.md" + }, { "id": "theme-factory", "name": "theme-factory", @@ -19829,6 +20410,31 @@ ], "path": "skills/web-performance-optimization/SKILL.md" }, + { + "id": "web-security-testing", + "name": "web-security-testing", + "description": "Web application security testing workflow for OWASP Top 10 vulnerabilities including injection, XSS, authentication flaws, and access control issues.", + "category": "security", + "tags": [ + "web", + "security" + ], + "triggers": [ + "web", + "security", + "testing", + "application", + "owasp", + "top", + "10", + "vulnerabilities", + "including", + "injection", + "xss", + "authentication" + ], + "path": "skills/web-security-testing/SKILL.md" + }, { "id": "web3-testing", "name": "web3-testing", @@ -20150,6 +20756,30 @@ ], "path": "skills/wireshark-analysis/SKILL.md" }, + { + "id": "wordpress", + "name": "wordpress", + "description": "Complete WordPress development workflow covering theme development, plugin creation, WooCommerce integration, performance optimization, and security hardening.", + "category": "security", + "tags": [ + "wordpress" + ], + "triggers": [ + "wordpress", + "complete", + "development", + "covering", + "theme", + "plugin", + "creation", + "woocommerce", + "integration", + "performance", + "optimization", + "security" + ], + "path": "skills/wordpress/SKILL.md" + }, { "id": "wordpress-penetration-testing", "name": "wordpress-penetration-testing", @@ -20175,6 +20805,79 @@ ], "path": "skills/wordpress-penetration-testing/SKILL.md" }, + { + "id": "wordpress-plugin-development", + "name": "wordpress-plugin-development", + "description": "WordPress plugin development workflow covering plugin architecture, hooks, admin interfaces, REST API, and security best practices.", + "category": "security", + "tags": [ + "wordpress", + "plugin" + ], + "triggers": [ + "wordpress", + "plugin", + "development", + "covering", + "architecture", + "hooks", + "admin", + "interfaces", + "rest", + "api", + "security" + ], + "path": "skills/wordpress-plugin-development/SKILL.md" + }, + { + "id": "wordpress-theme-development", + "name": "wordpress-theme-development", + "description": "WordPress theme development workflow covering theme architecture, template hierarchy, custom post types, block editor support, and responsive design.", + "category": "architecture", + "tags": [ + "wordpress", + "theme" + ], + "triggers": [ + "wordpress", + "theme", + "development", + "covering", + "architecture", + "hierarchy", + "custom", + "post", + "types", + "block", + "editor", + "responsive" + ], + "path": "skills/wordpress-theme-development/SKILL.md" + }, + { + "id": "wordpress-woocommerce-development", + "name": "wordpress-woocommerce-development", + "description": "WooCommerce store development workflow covering store setup, payment integration, shipping configuration, and customization.", + "category": "workflow", + "tags": [ + "wordpress", + "woocommerce" + ], + "triggers": [ + "wordpress", + "woocommerce", + "development", + "store", + "covering", + "setup", + "payment", + "integration", + "shipping", + "configuration", + "customization" + ], + "path": "skills/wordpress-woocommerce-development/SKILL.md" + }, { "id": "workflow-automation", "name": "workflow-automation", diff --git a/skills/ai-agent-development/SKILL.md b/skills/ai-agent-development/SKILL.md new file mode 100644 index 00000000..b0086e2b --- /dev/null +++ b/skills/ai-agent-development/SKILL.md @@ -0,0 +1,174 @@ +--- +name: ai-agent-development +description: "AI agent development workflow for building autonomous agents, multi-agent systems, and agent orchestration with CrewAI, LangGraph, and custom agents." +source: personal +risk: safe +domain: ai-ml +category: granular-workflow-bundle +version: 1.0.0 +--- + +# AI Agent Development Workflow + +## Overview + +Specialized workflow for building AI agents including single autonomous agents, multi-agent systems, agent orchestration, tool integration, and human-in-the-loop patterns. + +## When to Use This Workflow + +Use this workflow when: +- Building autonomous AI agents +- Creating multi-agent systems +- Implementing agent orchestration +- Adding tool integration to agents +- Setting up agent memory + +## Workflow Phases + +### Phase 1: Agent Design + +#### Skills to Invoke +- `ai-agents-architect` - Agent architecture +- `autonomous-agents` - Autonomous patterns + +#### Actions +1. Define agent purpose +2. Design agent capabilities +3. Plan tool integration +4. Design memory system +5. Define success metrics + +#### Copy-Paste Prompts +``` +Use @ai-agents-architect to design AI agent architecture +``` + +### Phase 2: Single Agent Implementation + +#### Skills to Invoke +- `autonomous-agent-patterns` - Agent patterns +- `autonomous-agents` - Autonomous agents + +#### Actions +1. Choose agent framework +2. Implement agent logic +3. Add tool integration +4. Configure memory +5. Test agent behavior + +#### Copy-Paste Prompts +``` +Use @autonomous-agent-patterns to implement single agent +``` + +### Phase 3: Multi-Agent System + +#### Skills to Invoke +- `crewai` - CrewAI framework +- `multi-agent-patterns` - Multi-agent patterns + +#### Actions +1. Define agent roles +2. Set up agent communication +3. Configure orchestration +4. Implement task delegation +5. Test coordination + +#### Copy-Paste Prompts +``` +Use @crewai to build multi-agent system with roles +``` + +### Phase 4: Agent Orchestration + +#### Skills to Invoke +- `langgraph` - LangGraph orchestration +- `workflow-orchestration-patterns` - Orchestration + +#### Actions +1. Design workflow graph +2. Implement state management +3. Add conditional branches +4. Configure persistence +5. Test workflows + +#### Copy-Paste Prompts +``` +Use @langgraph to create stateful agent workflows +``` + +### Phase 5: Tool Integration + +#### Skills to Invoke +- `agent-tool-builder` - Tool building +- `tool-design` - Tool design + +#### Actions +1. Identify tool needs +2. Design tool interfaces +3. Implement tools +4. Add error handling +5. Test tool usage + +#### Copy-Paste Prompts +``` +Use @agent-tool-builder to create agent tools +``` + +### Phase 6: Memory Systems + +#### Skills to Invoke +- `agent-memory-systems` - Memory architecture +- `conversation-memory` - Conversation memory + +#### Actions +1. Design memory structure +2. Implement short-term memory +3. Set up long-term memory +4. Add entity memory +5. Test memory retrieval + +#### Copy-Paste Prompts +``` +Use @agent-memory-systems to implement agent memory +``` + +### Phase 7: Evaluation + +#### Skills to Invoke +- `agent-evaluation` - Agent evaluation +- `evaluation` - AI evaluation + +#### Actions +1. Define evaluation criteria +2. Create test scenarios +3. Measure agent performance +4. Test edge cases +5. Iterate improvements + +#### Copy-Paste Prompts +``` +Use @agent-evaluation to evaluate agent performance +``` + +## Agent Architecture + +``` +User Input -> Planner -> Agent -> Tools -> Memory -> Response + | | | | + Decompose LLM Core Actions Short/Long-term +``` + +## Quality Gates + +- [ ] Agent logic working +- [ ] Tools integrated +- [ ] Memory functional +- [ ] Orchestration tested +- [ ] Evaluation passing + +## Related Workflow Bundles + +- `ai-ml` - AI/ML development +- `rag-implementation` - RAG systems +- `workflow-automation` - Workflow patterns diff --git a/skills/ai-ml/SKILL.md b/skills/ai-ml/SKILL.md new file mode 100644 index 00000000..350681e5 --- /dev/null +++ b/skills/ai-ml/SKILL.md @@ -0,0 +1,253 @@ +--- +name: ai-ml +description: "AI and machine learning workflow covering LLM application development, RAG implementation, agent architecture, ML pipelines, and AI-powered features." +source: personal +risk: safe +domain: artificial-intelligence +category: workflow-bundle +version: 1.0.0 +--- + +# AI/ML Workflow Bundle + +## Overview + +Comprehensive AI/ML workflow for building LLM applications, implementing RAG systems, creating AI agents, and developing machine learning pipelines. This bundle orchestrates skills for production AI development. + +## When to Use This Workflow + +Use this workflow when: +- Building LLM-powered applications +- Implementing RAG (Retrieval-Augmented Generation) +- Creating AI agents +- Developing ML pipelines +- Adding AI features to applications +- Setting up AI observability + +## Workflow Phases + +### Phase 1: AI Application Design + +#### Skills to Invoke +- `ai-product` - AI product development +- `ai-engineer` - AI engineering +- `ai-agents-architect` - Agent architecture +- `llm-app-patterns` - LLM patterns + +#### Actions +1. Define AI use cases +2. Choose appropriate models +3. Design system architecture +4. Plan data flows +5. Define success metrics + +#### Copy-Paste Prompts +``` +Use @ai-product to design AI-powered features +``` + +``` +Use @ai-agents-architect to design multi-agent system +``` + +### Phase 2: LLM Integration + +#### Skills to Invoke +- `llm-application-dev-ai-assistant` - AI assistant development +- `llm-application-dev-langchain-agent` - LangChain agents +- `llm-application-dev-prompt-optimize` - Prompt engineering +- `gemini-api-dev` - Gemini API + +#### Actions +1. Select LLM provider +2. Set up API access +3. Implement prompt templates +4. Configure model parameters +5. Add streaming support +6. Implement error handling + +#### Copy-Paste Prompts +``` +Use @llm-application-dev-ai-assistant to build conversational AI +``` + +``` +Use @llm-application-dev-langchain-agent to create LangChain agents +``` + +``` +Use @llm-application-dev-prompt-optimize to optimize prompts +``` + +### Phase 3: RAG Implementation + +#### Skills to Invoke +- `rag-engineer` - RAG engineering +- `rag-implementation` - RAG implementation +- `embedding-strategies` - Embedding selection +- `vector-database-engineer` - Vector databases +- `similarity-search-patterns` - Similarity search +- `hybrid-search-implementation` - Hybrid search + +#### Actions +1. Design data pipeline +2. Choose embedding model +3. Set up vector database +4. Implement chunking strategy +5. Configure retrieval +6. Add reranking +7. Implement caching + +#### Copy-Paste Prompts +``` +Use @rag-engineer to design RAG pipeline +``` + +``` +Use @vector-database-engineer to set up vector search +``` + +``` +Use @embedding-strategies to select optimal embeddings +``` + +### Phase 4: AI Agent Development + +#### Skills to Invoke +- `autonomous-agents` - Autonomous agent patterns +- `autonomous-agent-patterns` - Agent patterns +- `crewai` - CrewAI framework +- `langgraph` - LangGraph +- `multi-agent-patterns` - Multi-agent systems +- `computer-use-agents` - Computer use agents + +#### Actions +1. Design agent architecture +2. Define agent roles +3. Implement tool integration +4. Set up memory systems +5. Configure orchestration +6. Add human-in-the-loop + +#### Copy-Paste Prompts +``` +Use @crewai to build role-based multi-agent system +``` + +``` +Use @langgraph to create stateful AI workflows +``` + +``` +Use @autonomous-agents to design autonomous agent +``` + +### Phase 5: ML Pipeline Development + +#### Skills to Invoke +- `ml-engineer` - ML engineering +- `mlops-engineer` - MLOps +- `machine-learning-ops-ml-pipeline` - ML pipelines +- `ml-pipeline-workflow` - ML workflows +- `data-engineer` - Data engineering + +#### Actions +1. Design ML pipeline +2. Set up data processing +3. Implement model training +4. Configure evaluation +5. Set up model registry +6. Deploy models + +#### Copy-Paste Prompts +``` +Use @ml-engineer to build machine learning pipeline +``` + +``` +Use @mlops-engineer to set up MLOps infrastructure +``` + +### Phase 6: AI Observability + +#### Skills to Invoke +- `langfuse` - Langfuse observability +- `manifest` - Manifest telemetry +- `evaluation` - AI evaluation +- `llm-evaluation` - LLM evaluation + +#### Actions +1. Set up tracing +2. Configure logging +3. Implement evaluation +4. Monitor performance +5. Track costs +6. Set up alerts + +#### Copy-Paste Prompts +``` +Use @langfuse to set up LLM observability +``` + +``` +Use @evaluation to create evaluation framework +``` + +### Phase 7: AI Security + +#### Skills to Invoke +- `prompt-engineering` - Prompt security +- `security-scanning-security-sast` - Security scanning + +#### Actions +1. Implement input validation +2. Add output filtering +3. Configure rate limiting +4. Set up access controls +5. Monitor for abuse +6. Implement audit logging + +## AI Development Checklist + +### LLM Integration +- [ ] API keys secured +- [ ] Rate limiting configured +- [ ] Error handling implemented +- [ ] Streaming enabled +- [ ] Token usage tracked + +### RAG System +- [ ] Data pipeline working +- [ ] Embeddings generated +- [ ] Vector search optimized +- [ ] Retrieval accuracy tested +- [ ] Caching implemented + +### AI Agents +- [ ] Agent roles defined +- [ ] Tools integrated +- [ ] Memory working +- [ ] Orchestration tested +- [ ] Error handling robust + +### Observability +- [ ] Tracing enabled +- [ ] Metrics collected +- [ ] Evaluation running +- [ ] Alerts configured +- [ ] Dashboards created + +## Quality Gates + +- [ ] All AI features tested +- [ ] Performance benchmarks met +- [ ] Security measures in place +- [ ] Observability configured +- [ ] Documentation complete + +## Related Workflow Bundles + +- `development` - Application development +- `database` - Data management +- `cloud-devops` - Infrastructure +- `testing-qa` - AI testing diff --git a/skills/api-documentation/SKILL.md b/skills/api-documentation/SKILL.md new file mode 100644 index 00000000..e8b77394 --- /dev/null +++ b/skills/api-documentation/SKILL.md @@ -0,0 +1,164 @@ +--- +name: api-documentation +description: "API documentation workflow for generating OpenAPI specs, creating developer guides, and maintaining comprehensive API documentation." +source: personal +risk: safe +domain: documentation +category: granular-workflow-bundle +version: 1.0.0 +--- + +# API Documentation Workflow + +## Overview + +Specialized workflow for creating comprehensive API documentation including OpenAPI/Swagger specs, developer guides, code examples, and interactive documentation. + +## When to Use This Workflow + +Use this workflow when: +- Creating API documentation +- Generating OpenAPI specs +- Writing developer guides +- Adding code examples +- Setting up API portals + +## Workflow Phases + +### Phase 1: API Discovery + +#### Skills to Invoke +- `api-documenter` - API documentation +- `api-design-principles` - API design + +#### Actions +1. Inventory endpoints +2. Document request/response +3. Identify authentication +4. Map error codes +5. Note rate limits + +#### Copy-Paste Prompts +``` +Use @api-documenter to discover and document API endpoints +``` + +### Phase 2: OpenAPI Specification + +#### Skills to Invoke +- `openapi-spec-generation` - OpenAPI +- `api-documenter` - API specs + +#### Actions +1. Create OpenAPI schema +2. Define paths +3. Add schemas +4. Configure security +5. Add examples + +#### Copy-Paste Prompts +``` +Use @openapi-spec-generation to create OpenAPI specification +``` + +### Phase 3: Developer Guide + +#### Skills to Invoke +- `api-documentation-generator` - Documentation +- `documentation-templates` - Templates + +#### Actions +1. Create getting started +2. Write authentication guide +3. Document common patterns +4. Add troubleshooting +5. Create FAQ + +#### Copy-Paste Prompts +``` +Use @api-documentation-generator to create developer guide +``` + +### Phase 4: Code Examples + +#### Skills to Invoke +- `api-documenter` - Code examples +- `tutorial-engineer` - Tutorials + +#### Actions +1. Create example requests +2. Write SDK examples +3. Add curl examples +4. Create tutorials +5. Test examples + +#### Copy-Paste Prompts +``` +Use @api-documenter to generate code examples +``` + +### Phase 5: Interactive Docs + +#### Skills to Invoke +- `api-documenter` - Interactive docs + +#### Actions +1. Set up Swagger UI +2. Configure Redoc +3. Add try-it functionality +4. Test interactivity +5. Deploy docs + +#### Copy-Paste Prompts +``` +Use @api-documenter to set up interactive documentation +``` + +### Phase 6: Documentation Site + +#### Skills to Invoke +- `docs-architect` - Documentation architecture +- `wiki-page-writer` - Documentation + +#### Actions +1. Choose platform +2. Design structure +3. Create pages +4. Add navigation +5. Configure search + +#### Copy-Paste Prompts +``` +Use @docs-architect to design API documentation site +``` + +### Phase 7: Maintenance + +#### Skills to Invoke +- `api-documenter` - Doc maintenance + +#### Actions +1. Set up auto-generation +2. Configure validation +3. Add review process +4. Schedule updates +5. Monitor feedback + +#### Copy-Paste Prompts +``` +Use @api-documenter to set up automated doc generation +``` + +## Quality Gates + +- [ ] OpenAPI spec complete +- [ ] Developer guide written +- [ ] Code examples working +- [ ] Interactive docs functional +- [ ] Documentation deployed + +## Related Workflow Bundles + +- `documentation` - Documentation +- `api-development` - API development +- `development` - Development diff --git a/skills/api-security-testing/SKILL.md b/skills/api-security-testing/SKILL.md new file mode 100644 index 00000000..f8999350 --- /dev/null +++ b/skills/api-security-testing/SKILL.md @@ -0,0 +1,172 @@ +--- +name: api-security-testing +description: "API security testing workflow for REST and GraphQL APIs covering authentication, authorization, rate limiting, input validation, and security best practices." +source: personal +risk: safe +domain: security +category: granular-workflow-bundle +version: 1.0.0 +--- + +# API Security Testing Workflow + +## Overview + +Specialized workflow for testing REST and GraphQL API security including authentication, authorization, rate limiting, input validation, and API-specific vulnerabilities. + +## When to Use This Workflow + +Use this workflow when: +- Testing REST API security +- Assessing GraphQL endpoints +- Validating API authentication +- Testing API rate limiting +- Bug bounty API testing + +## Workflow Phases + +### Phase 1: API Discovery + +#### Skills to Invoke +- `api-fuzzing-bug-bounty` - API fuzzing +- `scanning-tools` - API scanning + +#### Actions +1. Enumerate endpoints +2. Document API methods +3. Identify parameters +4. Map data flows +5. Review documentation + +#### Copy-Paste Prompts +``` +Use @api-fuzzing-bug-bounty to discover API endpoints +``` + +### Phase 2: Authentication Testing + +#### Skills to Invoke +- `broken-authentication` - Auth testing +- `api-security-best-practices` - API auth + +#### Actions +1. Test API key validation +2. Test JWT tokens +3. Test OAuth2 flows +4. Test token expiration +5. Test refresh tokens + +#### Copy-Paste Prompts +``` +Use @broken-authentication to test API authentication +``` + +### Phase 3: Authorization Testing + +#### Skills to Invoke +- `idor-testing` - IDOR testing + +#### Actions +1. Test object-level authorization +2. Test function-level authorization +3. Test role-based access +4. Test privilege escalation +5. Test multi-tenant isolation + +#### Copy-Paste Prompts +``` +Use @idor-testing to test API authorization +``` + +### Phase 4: Input Validation + +#### Skills to Invoke +- `api-fuzzing-bug-bounty` - API fuzzing +- `sql-injection-testing` - Injection testing + +#### Actions +1. Test parameter validation +2. Test SQL injection +3. Test NoSQL injection +4. Test command injection +5. Test XXE injection + +#### Copy-Paste Prompts +``` +Use @api-fuzzing-bug-bounty to fuzz API parameters +``` + +### Phase 5: Rate Limiting + +#### Skills to Invoke +- `api-security-best-practices` - Rate limiting + +#### Actions +1. Test rate limit headers +2. Test brute force protection +3. Test resource exhaustion +4. Test bypass techniques +5. Document limitations + +#### Copy-Paste Prompts +``` +Use @api-security-best-practices to test rate limiting +``` + +### Phase 6: GraphQL Testing + +#### Skills to Invoke +- `api-fuzzing-bug-bounty` - GraphQL fuzzing + +#### Actions +1. Test introspection +2. Test query depth +3. Test query complexity +4. Test batch queries +5. Test field suggestions + +#### Copy-Paste Prompts +``` +Use @api-fuzzing-bug-bounty to test GraphQL security +``` + +### Phase 7: Error Handling + +#### Skills to Invoke +- `api-security-best-practices` - Error handling + +#### Actions +1. Test error messages +2. Check information disclosure +3. Test stack traces +4. Verify logging +5. Document findings + +#### Copy-Paste Prompts +``` +Use @api-security-best-practices to audit API error handling +``` + +## API Security Checklist + +- [ ] Authentication working +- [ ] Authorization enforced +- [ ] Input validated +- [ ] Rate limiting active +- [ ] Errors sanitized +- [ ] Logging enabled +- [ ] CORS configured +- [ ] HTTPS enforced + +## Quality Gates + +- [ ] All endpoints tested +- [ ] Vulnerabilities documented +- [ ] Remediation provided +- [ ] Report generated + +## Related Workflow Bundles + +- `security-audit` - Security auditing +- `web-security-testing` - Web security +- `api-development` - API development diff --git a/skills/bash-scripting/SKILL.md b/skills/bash-scripting/SKILL.md new file mode 100644 index 00000000..f939781b --- /dev/null +++ b/skills/bash-scripting/SKILL.md @@ -0,0 +1,197 @@ +--- +name: bash-scripting +description: "Bash scripting workflow for creating production-ready shell scripts with defensive patterns, error handling, and testing." +source: personal +risk: safe +domain: system-administration +category: granular-workflow-bundle +version: 1.0.0 +--- + +# Bash Scripting Workflow + +## Overview + +Specialized workflow for creating robust, production-ready bash scripts with defensive programming patterns, comprehensive error handling, and automated testing. + +## When to Use This Workflow + +Use this workflow when: +- Creating automation scripts +- Writing system administration tools +- Building deployment scripts +- Developing backup solutions +- Creating CI/CD scripts + +## Workflow Phases + +### Phase 1: Script Design + +#### Skills to Invoke +- `bash-pro` - Professional scripting +- `bash-defensive-patterns` - Defensive patterns + +#### Actions +1. Define script purpose +2. Identify inputs/outputs +3. Plan error handling +4. Design logging strategy +5. Document requirements + +#### Copy-Paste Prompts +``` +Use @bash-pro to design production-ready bash script +``` + +### Phase 2: Script Structure + +#### Skills to Invoke +- `bash-pro` - Script structure +- `bash-defensive-patterns` - Safety patterns + +#### Actions +1. Add shebang and strict mode +2. Create usage function +3. Implement argument parsing +4. Set up logging +5. Add cleanup handlers + +#### Copy-Paste Prompts +``` +Use @bash-defensive-patterns to implement strict mode and error handling +``` + +### Phase 3: Core Implementation + +#### Skills to Invoke +- `bash-linux` - Linux commands +- `linux-shell-scripting` - Shell scripting + +#### Actions +1. Implement main functions +2. Add input validation +3. Create helper functions +4. Handle edge cases +5. Add progress indicators + +#### Copy-Paste Prompts +``` +Use @bash-linux to implement system commands +``` + +### Phase 4: Error Handling + +#### Skills to Invoke +- `bash-defensive-patterns` - Error handling +- `error-handling-patterns` - Error patterns + +#### Actions +1. Add trap handlers +2. Implement retry logic +3. Create error messages +4. Set up exit codes +5. Add rollback capability + +#### Copy-Paste Prompts +``` +Use @bash-defensive-patterns to add comprehensive error handling +``` + +### Phase 5: Logging + +#### Skills to Invoke +- `bash-pro` - Logging patterns + +#### Actions +1. Create logging function +2. Add log levels +3. Implement timestamps +4. Configure log rotation +5. Add debug mode + +#### Copy-Paste Prompts +``` +Use @bash-pro to implement structured logging +``` + +### Phase 6: Testing + +#### Skills to Invoke +- `bats-testing-patterns` - Bats testing +- `shellcheck-configuration` - ShellCheck + +#### Actions +1. Write Bats tests +2. Run ShellCheck +3. Test edge cases +4. Verify error handling +5. Test with different inputs + +#### Copy-Paste Prompts +``` +Use @bats-testing-patterns to write script tests +``` + +``` +Use @shellcheck-configuration to lint bash script +``` + +### Phase 7: Documentation + +#### Skills to Invoke +- `documentation-templates` - Documentation + +#### Actions +1. Add script header +2. Document functions +3. Create usage examples +4. List dependencies +5. Add troubleshooting section + +#### Copy-Paste Prompts +``` +Use @documentation-templates to document bash script +``` + +## Script Template + +```bash +#!/usr/bin/env bash +set -euo pipefail + +readonly SCRIPT_NAME=$(basename "$0") +readonly SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) + +log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; } +error() { log "ERROR: $*" >&2; exit 1; } + +usage() { cat <, + mut query: Query<(&mut Transform, &Velocity), With>, +) { + for (mut transform, velocity) in &mut query { + transform.translation.x += velocity.x * time.delta_seconds(); + transform.translation.y += velocity.y * time.delta_seconds(); + } +} +``` + +### 3. Managing Resources + +Use `Resource` for global data (score, game state). + +```rust +#[derive(Resource)] +struct GameState { + score: u32, +} + +fn score_system(mut game_state: ResMut) { + game_state.score += 10; +} +``` + +### 4. Scheduling Systems + +Add systems to the `App` builder, defining execution order if needed. + +```rust +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .init_resource::() + .add_systems(Update, (movement_system, score_system).chain()) + .run(); +} +``` + +## Examples + +### Example 1: Spawning Entities with Bundles + +```rust +#[derive(Bundle)] +struct PlayerBundle { + player: Player, + velocity: Velocity, + sprite: SpriteBundle, +} + +fn setup(mut commands: Commands, asset_server: Res) { + commands.spawn(PlayerBundle { + player: Player, + velocity: Velocity { x: 10.0, y: 0.0 }, + sprite: SpriteBundle { + texture: asset_server.load("player.png"), + ..default() + }, + }); +} +``` + +### Example 2: Query Filters + +Use `With` and `Without` to filter entities efficiently. + +```rust +fn enemy_behavior( + query: Query<&Transform, (With, Without)>, +) { + for transform in &query { + // Only active enemies processed here + } +} +``` + +## Best Practices + +- βœ… **Do:** Use `Query` filters (`With`, `Without`, `Changed`) to reduce iteration count. +- βœ… **Do:** Prefer `Res` over `ResMut` when read-only access is sufficient to allow parallel execution. +- βœ… **Do:** Use `Bundle` to spawn complex entities atomically. +- ❌ **Don't:** Store heavy logic inside Components; keep them as pure data. +- ❌ **Don't:** Use `RefCell` or interior mutability inside components; let the ECS handle borrowing. + +## Troubleshooting + +**Problem:** System panic with "Conflict" error. +**Solution:** You are likely trying to access the same component mutably in two systems running in parallel. Use `.chain()` to order them or split the logic. diff --git a/skills/cloud-devops/SKILL.md b/skills/cloud-devops/SKILL.md new file mode 100644 index 00000000..7897dfd8 --- /dev/null +++ b/skills/cloud-devops/SKILL.md @@ -0,0 +1,236 @@ +--- +name: cloud-devops +description: "Cloud infrastructure and DevOps workflow covering AWS, Azure, GCP, Kubernetes, Terraform, CI/CD, monitoring, and cloud-native development." +source: personal +risk: safe +domain: cloud-devops +category: workflow-bundle +version: 1.0.0 +--- + +# Cloud/DevOps Workflow Bundle + +## Overview + +Comprehensive cloud and DevOps workflow for infrastructure provisioning, container orchestration, CI/CD pipelines, monitoring, and cloud-native application development. + +## When to Use This Workflow + +Use this workflow when: +- Setting up cloud infrastructure +- Implementing CI/CD pipelines +- Deploying Kubernetes applications +- Configuring monitoring and observability +- Managing cloud costs +- Implementing DevOps practices + +## Workflow Phases + +### Phase 1: Cloud Infrastructure Setup + +#### Skills to Invoke +- `cloud-architect` - Cloud architecture +- `aws-skills` - AWS development +- `azure-functions` - Azure development +- `gcp-cloud-run` - GCP development +- `terraform-skill` - Terraform IaC +- `terraform-specialist` - Advanced Terraform + +#### Actions +1. Design cloud architecture +2. Set up accounts and billing +3. Configure networking +4. Provision resources +5. Set up IAM + +#### Copy-Paste Prompts +``` +Use @cloud-architect to design multi-cloud architecture +``` + +``` +Use @terraform-skill to provision AWS infrastructure +``` + +### Phase 2: Container Orchestration + +#### Skills to Invoke +- `kubernetes-architect` - Kubernetes architecture +- `docker-expert` - Docker containerization +- `helm-chart-scaffolding` - Helm charts +- `k8s-manifest-generator` - K8s manifests +- `k8s-security-policies` - K8s security + +#### Actions +1. Design container architecture +2. Create Dockerfiles +3. Build container images +4. Write K8s manifests +5. Deploy to cluster +6. Configure networking + +#### Copy-Paste Prompts +``` +Use @kubernetes-architect to design K8s architecture +``` + +``` +Use @docker-expert to containerize application +``` + +``` +Use @helm-chart-scaffolding to create Helm chart +``` + +### Phase 3: CI/CD Implementation + +#### Skills to Invoke +- `deployment-engineer` - Deployment engineering +- `cicd-automation-workflow-automate` - CI/CD automation +- `github-actions-templates` - GitHub Actions +- `gitlab-ci-patterns` - GitLab CI +- `deployment-pipeline-design` - Pipeline design + +#### Actions +1. Design deployment pipeline +2. Configure build automation +3. Set up test automation +4. Configure deployment stages +5. Implement rollback strategies +6. Set up notifications + +#### Copy-Paste Prompts +``` +Use @cicd-automation-workflow-automate to set up CI/CD pipeline +``` + +``` +Use @github-actions-templates to create GitHub Actions workflow +``` + +### Phase 4: Monitoring and Observability + +#### Skills to Invoke +- `observability-engineer` - Observability engineering +- `grafana-dashboards` - Grafana dashboards +- `prometheus-configuration` - Prometheus setup +- `datadog-automation` - Datadog integration +- `sentry-automation` - Sentry error tracking + +#### Actions +1. Design monitoring strategy +2. Set up metrics collection +3. Configure log aggregation +4. Implement distributed tracing +5. Create dashboards +6. Set up alerts + +#### Copy-Paste Prompts +``` +Use @observability-engineer to set up observability stack +``` + +``` +Use @grafana-dashboards to create monitoring dashboards +``` + +### Phase 5: Cloud Security + +#### Skills to Invoke +- `cloud-penetration-testing` - Cloud pentesting +- `aws-penetration-testing` - AWS security +- `k8s-security-policies` - K8s security +- `secrets-management` - Secrets management +- `mtls-configuration` - mTLS setup + +#### Actions +1. Assess cloud security +2. Configure security groups +3. Set up secrets management +4. Implement network policies +5. Configure encryption +6. Set up audit logging + +#### Copy-Paste Prompts +``` +Use @cloud-penetration-testing to assess cloud security +``` + +``` +Use @secrets-management to configure secrets +``` + +### Phase 6: Cost Optimization + +#### Skills to Invoke +- `cost-optimization` - Cloud cost optimization +- `database-cloud-optimization-cost-optimize` - Database cost optimization + +#### Actions +1. Analyze cloud spending +2. Identify optimization opportunities +3. Right-size resources +4. Implement auto-scaling +5. Use reserved instances +6. Set up cost alerts + +#### Copy-Paste Prompts +``` +Use @cost-optimization to reduce cloud costs +``` + +### Phase 7: Disaster Recovery + +#### Skills to Invoke +- `incident-responder` - Incident response +- `incident-runbook-templates` - Runbook creation +- `postmortem-writing` - Postmortem documentation + +#### Actions +1. Design DR strategy +2. Set up backups +3. Create runbooks +4. Test failover +5. Document procedures +6. Train team + +#### Copy-Paste Prompts +``` +Use @incident-runbook-templates to create runbooks +``` + +## Cloud Provider Workflows + +### AWS +``` +Skills: aws-skills, aws-serverless, aws-penetration-testing +Services: EC2, Lambda, S3, RDS, ECS, EKS +``` + +### Azure +``` +Skills: azure-functions, azure-ai-projects-py, azure-monitor-opentelemetry-py +Services: Functions, App Service, AKS, Cosmos DB +``` + +### GCP +``` +Skills: gcp-cloud-run +Services: Cloud Run, GKE, Cloud Functions, BigQuery +``` + +## Quality Gates + +- [ ] Infrastructure provisioned +- [ ] CI/CD pipeline working +- [ ] Monitoring configured +- [ ] Security measures in place +- [ ] Cost optimization applied +- [ ] DR procedures documented + +## Related Workflow Bundles + +- `development` - Application development +- `security-audit` - Security testing +- `database` - Database operations +- `testing-qa` - Testing workflows diff --git a/skills/database/SKILL.md b/skills/database/SKILL.md new file mode 100644 index 00000000..e4aa784a --- /dev/null +++ b/skills/database/SKILL.md @@ -0,0 +1,213 @@ +--- +name: database +description: "Database development and operations workflow covering SQL, NoSQL, database design, migrations, optimization, and data engineering." +source: personal +risk: safe +domain: data +category: workflow-bundle +version: 1.0.0 +--- + +# Database Workflow Bundle + +## Overview + +Comprehensive database workflow for database design, development, optimization, migrations, and data engineering. Covers SQL, NoSQL, and modern data platforms. + +## When to Use This Workflow + +Use this workflow when: +- Designing database schemas +- Implementing database migrations +- Optimizing query performance +- Setting up data pipelines +- Managing database operations +- Implementing data quality + +## Workflow Phases + +### Phase 1: Database Design + +#### Skills to Invoke +- `database-architect` - Database architecture +- `database-design` - Schema design +- `postgresql` - PostgreSQL design +- `nosql-expert` - NoSQL design + +#### Actions +1. Gather requirements +2. Design schema +3. Define relationships +4. Plan indexing strategy +5. Design for scalability + +#### Copy-Paste Prompts +``` +Use @database-architect to design database schema +``` + +``` +Use @postgresql to design PostgreSQL schema +``` + +### Phase 2: Database Implementation + +#### Skills to Invoke +- `prisma-expert` - Prisma ORM +- `database-migrations-sql-migrations` - SQL migrations +- `neon-postgres` - Serverless Postgres + +#### Actions +1. Set up database connection +2. Configure ORM +3. Create migrations +4. Implement models +5. Set up seed data + +#### Copy-Paste Prompts +``` +Use @prisma-expert to set up Prisma ORM +``` + +``` +Use @database-migrations-sql-migrations to create migrations +``` + +### Phase 3: Query Optimization + +#### Skills to Invoke +- `database-optimizer` - Database optimization +- `sql-optimization-patterns` - SQL optimization +- `postgres-best-practices` - PostgreSQL optimization + +#### Actions +1. Analyze slow queries +2. Review execution plans +3. Optimize indexes +4. Refactor queries +5. Implement caching + +#### Copy-Paste Prompts +``` +Use @database-optimizer to optimize database performance +``` + +``` +Use @sql-optimization-patterns to optimize SQL queries +``` + +### Phase 4: Data Migration + +#### Skills to Invoke +- `database-migration` - Database migration +- `framework-migration-code-migrate` - Code migration + +#### Actions +1. Plan migration strategy +2. Create migration scripts +3. Test migration +4. Execute migration +5. Verify data integrity + +#### Copy-Paste Prompts +``` +Use @database-migration to plan database migration +``` + +### Phase 5: Data Pipeline Development + +#### Skills to Invoke +- `data-engineer` - Data engineering +- `data-engineering-data-pipeline` - Data pipelines +- `airflow-dag-patterns` - Airflow workflows +- `dbt-transformation-patterns` - dbt transformations + +#### Actions +1. Design data pipeline +2. Set up data ingestion +3. Implement transformations +4. Configure scheduling +5. Set up monitoring + +#### Copy-Paste Prompts +``` +Use @data-engineer to design data pipeline +``` + +``` +Use @airflow-dag-patterns to create Airflow DAGs +``` + +### Phase 6: Data Quality + +#### Skills to Invoke +- `data-quality-frameworks` - Data quality +- `data-engineering-data-driven-feature` - Data-driven features + +#### Actions +1. Define quality metrics +2. Implement validation +3. Set up monitoring +4. Create alerts +5. Document standards + +#### Copy-Paste Prompts +``` +Use @data-quality-frameworks to implement data quality checks +``` + +### Phase 7: Database Operations + +#### Skills to Invoke +- `database-admin` - Database administration +- `backup-automation` - Backup automation + +#### Actions +1. Set up backups +2. Configure replication +3. Monitor performance +4. Plan capacity +5. Implement security + +#### Copy-Paste Prompts +``` +Use @database-admin to manage database operations +``` + +## Database Technology Workflows + +### PostgreSQL +``` +Skills: postgresql, postgres-best-practices, neon-postgres, prisma-expert +``` + +### MongoDB +``` +Skills: nosql-expert, azure-cosmos-db-py +``` + +### Redis +``` +Skills: bullmq-specialist, upstash-qstash +``` + +### Data Warehousing +``` +Skills: clickhouse-io, dbt-transformation-patterns +``` + +## Quality Gates + +- [ ] Schema designed and reviewed +- [ ] Migrations tested +- [ ] Performance benchmarks met +- [ ] Backups configured +- [ ] Monitoring in place +- [ ] Documentation complete + +## Related Workflow Bundles + +- `development` - Application development +- `cloud-devops` - Infrastructure +- `ai-ml` - AI/ML data pipelines +- `testing-qa` - Data testing diff --git a/skills/development/SKILL.md b/skills/development/SKILL.md new file mode 100644 index 00000000..0ff988da --- /dev/null +++ b/skills/development/SKILL.md @@ -0,0 +1,263 @@ +--- +name: development +description: "Comprehensive web, mobile, and backend development workflow bundling frontend, backend, full-stack, and mobile development skills for end-to-end application delivery." +source: personal +risk: safe +domain: software-development +category: workflow-bundle +version: 1.0.0 +--- + +# Development Workflow Bundle + +## Overview + +Consolidated workflow for end-to-end software development covering web, mobile, and backend development. This bundle orchestrates skills for building production-ready applications from scaffolding to deployment. + +## When to Use This Workflow + +Use this workflow when: +- Building new web or mobile applications +- Adding features to existing applications +- Refactoring or modernizing legacy code +- Setting up new projects with best practices +- Full-stack feature development +- Cross-platform application development + +## Workflow Phases + +### Phase 1: Project Setup and Scaffolding + +#### Skills to Invoke +- `app-builder` - Main application building orchestrator +- `senior-fullstack` - Full-stack development guidance +- `environment-setup-guide` - Development environment setup +- `concise-planning` - Task planning and breakdown + +#### Actions +1. Determine project type (web, mobile, full-stack) +2. Select technology stack +3. Scaffold project structure +4. Configure development environment +5. Set up version control and CI/CD + +#### Copy-Paste Prompts +``` +Use @app-builder to scaffold a new React + Node.js full-stack application +``` + +``` +Use @senior-fullstack to set up a Next.js 14 project with App Router +``` + +``` +Use @environment-setup-guide to configure my development environment +``` + +### Phase 2: Frontend Development + +#### Skills to Invoke +- `frontend-developer` - React/Next.js component development +- `frontend-design` - UI/UX design implementation +- `react-patterns` - Modern React patterns +- `typescript-pro` - TypeScript best practices +- `tailwind-patterns` - Tailwind CSS styling +- `nextjs-app-router-patterns` - Next.js 14+ patterns + +#### Actions +1. Design component architecture +2. Implement UI components +3. Set up state management +4. Configure routing +5. Apply styling and theming +6. Implement responsive design + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create a dashboard component with React and TypeScript +``` + +``` +Use @react-patterns to implement proper state management with Zustand +``` + +``` +Use @tailwind-patterns to style components with a consistent design system +``` + +### Phase 3: Backend Development + +#### Skills to Invoke +- `backend-architect` - Backend architecture design +- `backend-dev-guidelines` - Backend development standards +- `nodejs-backend-patterns` - Node.js/Express patterns +- `fastapi-pro` - FastAPI development +- `api-design-principles` - REST/GraphQL API design +- `auth-implementation-patterns` - Authentication implementation + +#### Actions +1. Design API architecture +2. Implement REST/GraphQL endpoints +3. Set up database connections +4. Implement authentication/authorization +5. Configure middleware +6. Set up error handling + +#### Copy-Paste Prompts +``` +Use @backend-architect to design a microservices architecture for my application +``` + +``` +Use @nodejs-backend-patterns to create Express.js API endpoints +``` + +``` +Use @auth-implementation-patterns to implement JWT authentication +``` + +### Phase 4: Database Development + +#### Skills to Invoke +- `database-architect` - Database design +- `database-design` - Schema design principles +- `prisma-expert` - Prisma ORM +- `postgresql` - PostgreSQL optimization +- `neon-postgres` - Serverless Postgres + +#### Actions +1. Design database schema +2. Create migrations +3. Set up ORM +4. Optimize queries +5. Configure connection pooling + +#### Copy-Paste Prompts +``` +Use @database-architect to design a normalized schema for an e-commerce platform +``` + +``` +Use @prisma-expert to set up Prisma ORM with TypeScript +``` + +### Phase 5: Testing + +#### Skills to Invoke +- `test-driven-development` - TDD workflow +- `javascript-testing-patterns` - Jest/Vitest testing +- `python-testing-patterns` - pytest testing +- `e2e-testing-patterns` - Playwright/Cypress E2E +- `playwright-skill` - Browser automation testing + +#### Actions +1. Write unit tests +2. Create integration tests +3. Set up E2E tests +4. Configure CI test runners +5. Achieve coverage targets + +#### Copy-Paste Prompts +``` +Use @test-driven-development to implement features with TDD +``` + +``` +Use @playwright-skill to create E2E tests for critical user flows +``` + +### Phase 6: Code Quality and Review + +#### Skills to Invoke +- `code-reviewer` - AI-powered code review +- `clean-code` - Clean code principles +- `lint-and-validate` - Linting and validation +- `security-scanning-security-sast` - Static security analysis + +#### Actions +1. Run linters and formatters +2. Perform code review +3. Fix code quality issues +4. Run security scans +5. Address vulnerabilities + +#### Copy-Paste Prompts +``` +Use @code-reviewer to review my pull request +``` + +``` +Use @lint-and-validate to check code quality +``` + +### Phase 7: Build and Deployment + +#### Skills to Invoke +- `deployment-engineer` - Deployment orchestration +- `docker-expert` - Containerization +- `vercel-deployment` - Vercel deployment +- `github-actions-templates` - CI/CD workflows +- `cicd-automation-workflow-automate` - CI/CD automation + +#### Actions +1. Create Dockerfiles +2. Configure build pipelines +3. Set up deployment workflows +4. Configure environment variables +5. Deploy to production + +#### Copy-Paste Prompts +``` +Use @docker-expert to containerize my application +``` + +``` +Use @vercel-deployment to deploy my Next.js app to production +``` + +``` +Use @github-actions-templates to set up CI/CD pipeline +``` + +## Technology-Specific Workflows + +### React/Next.js Development +``` +Skills: frontend-developer, react-patterns, nextjs-app-router-patterns, typescript-pro, tailwind-patterns +``` + +### Python/FastAPI Development +``` +Skills: fastapi-pro, python-pro, python-patterns, pydantic-models-py +``` + +### Node.js/Express Development +``` +Skills: nodejs-backend-patterns, javascript-pro, typescript-pro, express (via nodejs-backend-patterns) +``` + +### Full-Stack Development +``` +Skills: senior-fullstack, app-builder, frontend-developer, backend-architect, database-architect +``` + +### Mobile Development +``` +Skills: mobile-developer, react-native-architecture, flutter-expert, ios-developer +``` + +## Quality Gates + +Before moving to next phase, verify: +- [ ] All tests passing +- [ ] Code review completed +- [ ] Security scan passed +- [ ] Linting/formatting clean +- [ ] Documentation updated + +## Related Workflow Bundles + +- `wordpress` - WordPress-specific development +- `security-audit` - Security testing workflow +- `testing-qa` - Comprehensive testing workflow +- `documentation` - Documentation generation workflow diff --git a/skills/documentation/SKILL.md b/skills/documentation/SKILL.md new file mode 100644 index 00000000..02111220 --- /dev/null +++ b/skills/documentation/SKILL.md @@ -0,0 +1,261 @@ +--- +name: documentation +description: "Documentation generation workflow covering API docs, architecture docs, README files, code comments, and technical writing." +source: personal +risk: safe +domain: documentation +category: workflow-bundle +version: 1.0.0 +--- + +# Documentation Workflow Bundle + +## Overview + +Comprehensive documentation workflow for generating API documentation, architecture documentation, README files, code comments, and technical content from codebases. + +## When to Use This Workflow + +Use this workflow when: +- Creating project documentation +- Generating API documentation +- Writing architecture docs +- Documenting code +- Creating user guides +- Maintaining wikis + +## Workflow Phases + +### Phase 1: Documentation Planning + +#### Skills to Invoke +- `docs-architect` - Documentation architecture +- `documentation-templates` - Documentation templates + +#### Actions +1. Identify documentation needs +2. Choose documentation tools +3. Plan documentation structure +4. Define style guidelines +5. Set up documentation site + +#### Copy-Paste Prompts +``` +Use @docs-architect to plan documentation structure +``` + +``` +Use @documentation-templates to set up documentation +``` + +### Phase 2: API Documentation + +#### Skills to Invoke +- `api-documenter` - API documentation +- `api-documentation-generator` - Auto-generation +- `openapi-spec-generation` - OpenAPI specs + +#### Actions +1. Extract API endpoints +2. Generate OpenAPI specs +3. Create API reference +4. Add usage examples +5. Set up auto-generation + +#### Copy-Paste Prompts +``` +Use @api-documenter to generate API documentation +``` + +``` +Use @openapi-spec-generation to create OpenAPI specs +``` + +### Phase 3: Architecture Documentation + +#### Skills to Invoke +- `c4-architecture-c4-architecture` - C4 architecture +- `c4-context` - Context diagrams +- `c4-container` - Container diagrams +- `c4-component` - Component diagrams +- `c4-code` - Code diagrams +- `mermaid-expert` - Mermaid diagrams + +#### Actions +1. Create C4 diagrams +2. Document architecture +3. Generate sequence diagrams +4. Document data flows +5. Create deployment docs + +#### Copy-Paste Prompts +``` +Use @c4-architecture-c4-architecture to create C4 diagrams +``` + +``` +Use @mermaid-expert to create architecture diagrams +``` + +### Phase 4: Code Documentation + +#### Skills to Invoke +- `code-documentation-code-explain` - Code explanation +- `code-documentation-doc-generate` - Doc generation +- `documentation-generation-doc-generate` - Auto-generation + +#### Actions +1. Extract code comments +2. Generate JSDoc/TSDoc +3. Create type documentation +4. Document functions +5. Add usage examples + +#### Copy-Paste Prompts +``` +Use @code-documentation-code-explain to explain code +``` + +``` +Use @code-documentation-doc-generate to generate docs +``` + +### Phase 5: README and Getting Started + +#### Skills to Invoke +- `readme` - README generation +- `environment-setup-guide` - Setup guides +- `tutorial-engineer` - Tutorial creation + +#### Actions +1. Create README +2. Write getting started guide +3. Document installation +4. Add usage examples +5. Create troubleshooting guide + +#### Copy-Paste Prompts +``` +Use @readme to create project README +``` + +``` +Use @tutorial-engineer to create tutorials +``` + +### Phase 6: Wiki and Knowledge Base + +#### Skills to Invoke +- `wiki-architect` - Wiki architecture +- `wiki-page-writer` - Wiki pages +- `wiki-onboarding` - Onboarding docs +- `wiki-qa` - Wiki Q&A +- `wiki-researcher` - Wiki research +- `wiki-vitepress` - VitePress wiki + +#### Actions +1. Design wiki structure +2. Create wiki pages +3. Write onboarding guides +4. Document processes +5. Set up wiki site + +#### Copy-Paste Prompts +``` +Use @wiki-architect to design wiki structure +``` + +``` +Use @wiki-page-writer to create wiki pages +``` + +``` +Use @wiki-onboarding to create onboarding docs +``` + +### Phase 7: Changelog and Release Notes + +#### Skills to Invoke +- `changelog-automation` - Changelog generation +- `wiki-changelog` - Changelog from git + +#### Actions +1. Extract commit history +2. Categorize changes +3. Generate changelog +4. Create release notes +5. Publish updates + +#### Copy-Paste Prompts +``` +Use @changelog-automation to generate changelog +``` + +``` +Use @wiki-changelog to create release notes +``` + +### Phase 8: Documentation Maintenance + +#### Skills to Invoke +- `doc-coauthoring` - Collaborative writing +- `reference-builder` - Reference docs + +#### Actions +1. Review documentation +2. Update outdated content +3. Fix broken links +4. Add new features +5. Gather feedback + +#### Copy-Paste Prompts +``` +Use @doc-coauthoring to collaborate on docs +``` + +## Documentation Types + +### Code-Level +- JSDoc/TSDoc comments +- Function documentation +- Type definitions +- Example code + +### API Documentation +- Endpoint reference +- Request/response schemas +- Authentication guides +- SDK documentation + +### Architecture Documentation +- System overview +- Component diagrams +- Data flow diagrams +- Deployment architecture + +### User Documentation +- Getting started guides +- User manuals +- Tutorials +- FAQs + +### Process Documentation +- Runbooks +- Onboarding guides +- SOPs +- Decision records + +## Quality Gates + +- [ ] All APIs documented +- [ ] Architecture diagrams current +- [ ] README up to date +- [ ] Code comments helpful +- [ ] Examples working +- [ ] Links valid + +## Related Workflow Bundles + +- `development` - Development workflow +- `testing-qa` - Documentation testing +- `ai-ml` - AI documentation diff --git a/skills/e2e-testing/SKILL.md b/skills/e2e-testing/SKILL.md new file mode 100644 index 00000000..78d7215c --- /dev/null +++ b/skills/e2e-testing/SKILL.md @@ -0,0 +1,166 @@ +--- +name: e2e-testing +description: "End-to-end testing workflow with Playwright for browser automation, visual regression, cross-browser testing, and CI/CD integration." +source: personal +risk: safe +domain: testing-qa +category: granular-workflow-bundle +version: 1.0.0 +--- + +# E2E Testing Workflow + +## Overview + +Specialized workflow for end-to-end testing using Playwright including browser automation, visual regression testing, cross-browser testing, and CI/CD integration. + +## When to Use This Workflow + +Use this workflow when: +- Setting up E2E testing +- Automating browser tests +- Implementing visual regression +- Testing across browsers +- Integrating tests with CI/CD + +## Workflow Phases + +### Phase 1: Test Setup + +#### Skills to Invoke +- `playwright-skill` - Playwright setup +- `e2e-testing-patterns` - E2E patterns + +#### Actions +1. Install Playwright +2. Configure test framework +3. Set up test directory +4. Configure browsers +5. Create base test setup + +#### Copy-Paste Prompts +``` +Use @playwright-skill to set up Playwright testing +``` + +### Phase 2: Test Design + +#### Skills to Invoke +- `e2e-testing-patterns` - Test patterns +- `test-automator` - Test automation + +#### Actions +1. Identify critical flows +2. Design test scenarios +3. Plan test data +4. Create page objects +5. Set up fixtures + +#### Copy-Paste Prompts +``` +Use @e2e-testing-patterns to design E2E test strategy +``` + +### Phase 3: Test Implementation + +#### Skills to Invoke +- `playwright-skill` - Playwright tests +- `webapp-testing` - Web app testing + +#### Actions +1. Write test scripts +2. Add assertions +3. Implement waits +4. Handle dynamic content +5. Add error handling + +#### Copy-Paste Prompts +``` +Use @playwright-skill to write E2E test scripts +``` + +### Phase 4: Browser Automation + +#### Skills to Invoke +- `browser-automation` - Browser automation +- `playwright-skill` - Playwright features + +#### Actions +1. Configure headless mode +2. Set up screenshots +3. Implement video recording +4. Add trace collection +5. Configure mobile emulation + +#### Copy-Paste Prompts +``` +Use @browser-automation to automate browser interactions +``` + +### Phase 5: Visual Regression + +#### Skills to Invoke +- `playwright-skill` - Visual testing +- `ui-visual-validator` - Visual validation + +#### Actions +1. Set up visual testing +2. Create baseline images +3. Add visual assertions +4. Configure thresholds +5. Review differences + +#### Copy-Paste Prompts +``` +Use @playwright-skill to implement visual regression testing +``` + +### Phase 6: Cross-Browser Testing + +#### Skills to Invoke +- `playwright-skill` - Multi-browser +- `webapp-testing` - Browser testing + +#### Actions +1. Configure Chromium +2. Add Firefox tests +3. Add WebKit tests +4. Test mobile browsers +5. Compare results + +#### Copy-Paste Prompts +``` +Use @playwright-skill to run cross-browser tests +``` + +### Phase 7: CI/CD Integration + +#### Skills to Invoke +- `github-actions-templates` - GitHub Actions +- `cicd-automation-workflow-automate` - CI/CD + +#### Actions +1. Create CI workflow +2. Configure parallel execution +3. Set up artifacts +4. Add reporting +5. Configure notifications + +#### Copy-Paste Prompts +``` +Use @github-actions-templates to integrate E2E tests with CI +``` + +## Quality Gates + +- [ ] Tests passing +- [ ] Coverage adequate +- [ ] Visual tests stable +- [ ] Cross-browser verified +- [ ] CI integration working + +## Related Workflow Bundles + +- `testing-qa` - Testing workflow +- `development` - Development +- `web-performance-optimization` - Performance diff --git a/skills/godot-4-migration/SKILL.md b/skills/godot-4-migration/SKILL.md new file mode 100644 index 00000000..5296f63b --- /dev/null +++ b/skills/godot-4-migration/SKILL.md @@ -0,0 +1,126 @@ +--- +name: godot-4-migration +description: Specialized guide for migrating Godot 3.x projects to Godot 4 (GDScript 2.0), covering syntax changes, Tweens, and exports. +risk: safe +source: community +--- + +# Godot 4 Migration Guide + +## Overview + +A critical guide for developers transitioning from Godot 3.x to Godot 4. This skill focuses on the major syntax changes in GDScript 2.0, the new `Tween` system, and `export` annotation updates. + +## When to Use This Skill + +- Use when porting a Godot 3 project to Godot 4. +- Use when encountering syntax errors after upgrading. +- Use when replacing deprecated nodes (like `Tween` node vs `create_tween`). +- Use when updating `export` variables to `@export` annotations. + +## Key Changes + +### 1. Annotations (`@`) + +Godot 4 uses `@` for keywords that modify behavior. +- `export var x` -> `@export var x` +- `onready var y` -> `@onready var y` +- `tool` -> `@tool` (at top of file) + +### 2. Setters and Getters + +Properties now define setters/getters inline. + +**Godot 3:** +```gdscript +var health setget set_health, get_health + +func set_health(value): + health = value +``` + +**Godot 4:** +```gdscript +var health: int: + set(value): + health = value + emit_signal("health_changed", health) + get: + return health +``` + +### 3. Tween System + +The `Tween` node is deprecated. Use `create_tween()` in code. + +**Godot 3:** +```gdscript +$Tween.interpolate_property(...) +$Tween.start() +``` + +**Godot 4:** +```gdscript +var tween = create_tween() +tween.tween_property($Sprite, "position", Vector2(100, 100), 1.0) +tween.parallel().tween_property($Sprite, "modulate:a", 0.0, 1.0) +``` + +### 4. Signal Connections + +String-based connections are discouraged. Use callables. + +**Godot 3:** +```gdscript +connect("pressed", self, "_on_pressed") +``` + +**Godot 4:** +```gdscript +pressed.connect(_on_pressed) +``` + +## Examples + +### Example 1: Typed Arrays + +GDScript 2.0 supports typed arrays for better performance and type safety. + +```gdscript +# Godot 3 +var enemies = [] + +# Godot 4 +var enemies: Array[Node] = [] + +func _ready(): + for child in get_children(): + if child is Enemy: + enemies.append(child) +``` + +### Example 2: Awaiting Signals (Coroutines) + +`yield` is replaced by `await`. + +**Godot 3:** +```gdscript +yield(get_tree().create_timer(1.0), "timeout") +``` + +**Godot 4:** +```gdscript +await get_tree().create_timer(1.0).timeout +``` + +## Best Practices + +- βœ… **Do:** Use `@export_range`, `@export_file`, etc., for better inspector UI. +- βœ… **Do:** Type all variables (`var x: int`) for performance gains in GDScript 2.0. +- βœ… **Do:** Use `super()` to call parent methods instead of `.function_name()`. +- ❌ **Don't:** Use string names for signals (`emit_signal("name")`) if you can use the signal object (`name.emit()`). + +## Troubleshooting + +**Problem:** "Identifier 'Tween' is not a valid type." +**Solution:** `Tween` is now `SceneTreeTween` or just an object returned by `create_tween()`. You rarely type it explicitly, just use `var tween = create_tween()`. diff --git a/skills/kubernetes-deployment/SKILL.md b/skills/kubernetes-deployment/SKILL.md new file mode 100644 index 00000000..47a46eaf --- /dev/null +++ b/skills/kubernetes-deployment/SKILL.md @@ -0,0 +1,167 @@ +--- +name: kubernetes-deployment +description: "Kubernetes deployment workflow for container orchestration, Helm charts, service mesh, and production-ready K8s configurations." +source: personal +risk: safe +domain: cloud-devops +category: granular-workflow-bundle +version: 1.0.0 +--- + +# Kubernetes Deployment Workflow + +## Overview + +Specialized workflow for deploying applications to Kubernetes including container orchestration, Helm charts, service mesh configuration, and production-ready K8s patterns. + +## When to Use This Workflow + +Use this workflow when: +- Deploying to Kubernetes +- Creating Helm charts +- Configuring service mesh +- Setting up K8s networking +- Implementing K8s security + +## Workflow Phases + +### Phase 1: Container Preparation + +#### Skills to Invoke +- `docker-expert` - Docker containerization +- `k8s-manifest-generator` - K8s manifests + +#### Actions +1. Create Dockerfile +2. Build container image +3. Optimize image size +4. Push to registry +5. Test container + +#### Copy-Paste Prompts +``` +Use @docker-expert to containerize application for K8s +``` + +### Phase 2: K8s Manifests + +#### Skills to Invoke +- `k8s-manifest-generator` - Manifest generation +- `kubernetes-architect` - K8s architecture + +#### Actions +1. Create Deployment +2. Configure Service +3. Set up ConfigMap +4. Create Secrets +5. Add Ingress + +#### Copy-Paste Prompts +``` +Use @k8s-manifest-generator to create K8s manifests +``` + +### Phase 3: Helm Chart + +#### Skills to Invoke +- `helm-chart-scaffolding` - Helm charts + +#### Actions +1. Create chart structure +2. Define values.yaml +3. Add templates +4. Configure dependencies +5. Test chart + +#### Copy-Paste Prompts +``` +Use @helm-chart-scaffolding to create Helm chart +``` + +### Phase 4: Service Mesh + +#### Skills to Invoke +- `istio-traffic-management` - Istio +- `linkerd-patterns` - Linkerd +- `service-mesh-expert` - Service mesh + +#### Actions +1. Choose service mesh +2. Install mesh +3. Configure traffic management +4. Set up mTLS +5. Add observability + +#### Copy-Paste Prompts +``` +Use @istio-traffic-management to configure Istio +``` + +### Phase 5: Security + +#### Skills to Invoke +- `k8s-security-policies` - K8s security +- `mtls-configuration` - mTLS + +#### Actions +1. Configure RBAC +2. Set up NetworkPolicy +3. Enable PodSecurity +4. Configure secrets +5. Implement mTLS + +#### Copy-Paste Prompts +``` +Use @k8s-security-policies to secure Kubernetes cluster +``` + +### Phase 6: Observability + +#### Skills to Invoke +- `grafana-dashboards` - Grafana +- `prometheus-configuration` - Prometheus + +#### Actions +1. Install monitoring stack +2. Configure Prometheus +3. Create Grafana dashboards +4. Set up alerts +5. Add distributed tracing + +#### Copy-Paste Prompts +``` +Use @prometheus-configuration to set up K8s monitoring +``` + +### Phase 7: Deployment + +#### Skills to Invoke +- `deployment-engineer` - Deployment +- `gitops-workflow` - GitOps + +#### Actions +1. Configure CI/CD +2. Set up GitOps +3. Deploy to cluster +4. Verify deployment +5. Monitor rollout + +#### Copy-Paste Prompts +``` +Use @gitops-workflow to implement GitOps deployment +``` + +## Quality Gates + +- [ ] Containers working +- [ ] Manifests valid +- [ ] Helm chart installs +- [ ] Security configured +- [ ] Monitoring active +- [ ] Deployment successful + +## Related Workflow Bundles + +- `cloud-devops` - Cloud/DevOps +- `terraform-infrastructure` - Infrastructure +- `docker-containerization` - Containers diff --git a/skills/libreoffice/base/SKILL.md b/skills/libreoffice/base/SKILL.md new file mode 100644 index 00000000..cd2cead9 --- /dev/null +++ b/skills/libreoffice/base/SKILL.md @@ -0,0 +1,188 @@ +--- +name: base +description: "Database management, forms, reports, and data operations with LibreOffice Base." +source: personal +risk: safe +domain: office-productivity +category: database-processing +version: 1.0.0 +--- + +# LibreOffice Base + +## Overview + +LibreOffice Base skill for creating, managing, and automating database workflows using the native ODB (OpenDocument Database) format. + +## When to Use This Skill + +Use this skill when: +- Creating new databases in ODB format +- Connecting to external databases (MySQL, PostgreSQL, etc.) +- Automating database operations and reports +- Creating forms and reports +- Building database applications + +## Core Capabilities + +### 1. Database Creation +- Create new ODB databases from scratch +- Design tables, views, and relationships +- Create embedded HSQLDB/Firebird databases +- Connect to external databases + +### 2. Data Operations +- Import data from CSV, spreadsheets +- Export data to various formats +- Query execution and management +- Batch data processing + +### 3. Form and Report Automation +- Create data entry forms +- Design custom reports +- Automate report generation +- Build form templates + +### 4. Query and SQL +- Visual query design +- SQL query execution +- Query optimization +- Result set manipulation + +### 5. Integration +- Command-line automation +- Python scripting with UNO +- JDBC/ODBC connectivity + +## Workflows + +### Creating a New Database + +#### Method 1: Command-Line +```bash +soffice --base +``` + +#### Method 2: Python with UNO +```python +import uno + +def create_database(): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + doc = smgr.createInstanceWithContext("com.sun.star.sdb.DatabaseDocument", ctx) + doc.storeToURL("file:///path/to/database.odb", ()) + doc.close(True) +``` + +### Connecting to External Database + +```python +import uno + +def connect_to_mysql(host, port, database, user, password): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + + doc = smgr.createInstanceWithContext("com.sun.star.sdb.DatabaseDocument", ctx) + datasource = doc.getDataSource() + datasource.URL = f"sdbc:mysql:jdbc:mysql://{host}:{port}/{database}" + datasource.Properties["UserName"] = user + datasource.Properties["Password"] = password + + doc.storeToURL("file:///path/to/connected.odb", ()) + return doc +``` + +## Database Connection Reference + +### Supported Database Types +- HSQLDB (embedded) +- Firebird (embedded) +- MySQL/MariaDB +- PostgreSQL +- SQLite +- ODBC data sources +- JDBC data sources + +### Connection Strings + +``` +# MySQL +sdbc:mysql:jdbc:mysql://localhost:3306/database + +# PostgreSQL +sdbc:postgresql://localhost:5432/database + +# SQLite +sdbc:sqlite:file:///path/to/database.db + +# ODBC +sdbc:odbc:DSN_NAME +``` + +## Command-Line Reference + +```bash +soffice --headless +soffice --base # Base +``` + +## Python Libraries + +```bash +pip install pyodbc # ODBC connectivity +pip install sqlalchemy # SQL toolkit +``` + +## Best Practices + +1. Use parameterized queries +2. Create indexes for performance +3. Backup databases regularly +4. Use transactions for data integrity +5. Store ODB source files in version control +6. Document database schema +7. Use appropriate data types +8. Handle connection errors gracefully + +## Troubleshooting + +### Cannot open socket +```bash +killall soffice.bin +soffice --headless --accept="socket,host=localhost,port=8100;urp;" +``` + +### Connection Issues +- Verify database server is running +- Check connection string format +- Ensure JDBC/ODBC drivers are installed +- Verify network connectivity + +## Resources + +- [LibreOffice Base Guide](https://documentation.libreoffice.org/) +- [UNO API Reference](https://api.libreoffice.org/) +- [HSQLDB Documentation](http://hsqldb.org/) +- [Firebird Documentation](https://firebirdsql.org/) + +## Related Skills + +- writer +- calc +- impress +- draw +- workflow-automation diff --git a/skills/libreoffice/calc/SKILL.md b/skills/libreoffice/calc/SKILL.md new file mode 100644 index 00000000..10e24ea9 --- /dev/null +++ b/skills/libreoffice/calc/SKILL.md @@ -0,0 +1,201 @@ +--- +name: calc +description: "Spreadsheet creation, format conversion (ODS/XLSX/CSV), formulas, data automation with LibreOffice Calc." +source: personal +risk: safe +domain: office-productivity +category: spreadsheet-processing +version: 1.0.0 +--- + +# LibreOffice Calc + +## Overview + +LibreOffice Calc skill for creating, editing, converting, and automating spreadsheet workflows using the native ODS (OpenDocument Spreadsheet) format. + +## When to Use This Skill + +Use this skill when: +- Creating new spreadsheets in ODS format +- Converting between ODS, XLSX, CSV, PDF formats +- Automating data processing and analysis +- Creating formulas, charts, and pivot tables +- Batch processing spreadsheet operations + +## Core Capabilities + +### 1. Spreadsheet Creation +- Create new ODS spreadsheets from scratch +- Generate spreadsheets from templates +- Create data entry forms +- Build dashboards and reports + +### 2. Format Conversion +- ODS to other formats: XLSX, CSV, PDF, HTML +- Other formats to ODS: XLSX, XLS, CSV, DBF +- Batch conversion of multiple files + +### 3. Data Automation +- Formula automation and calculations +- Data import from CSV, database, APIs +- Data export to various formats +- Batch data processing + +### 4. Data Analysis +- Pivot tables and data summarization +- Statistical functions and analysis +- Data validation and filtering +- Conditional formatting + +### 5. Integration +- Command-line automation via soffice +- Python scripting with UNO +- Database connectivity + +## Workflows + +### Creating a New Spreadsheet + +#### Method 1: Command-Line +```bash +soffice --calc template.ods +``` + +#### Method 2: Python with UNO +```python +import uno + +def create_spreadsheet(): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + doc = smgr.createInstanceWithContext("com.sun.star.sheet.SpreadsheetDocument", ctx) + sheets = doc.getSheets() + sheet = sheets.getByIndex(0) + cell = sheet.getCellByPosition(0, 0) + cell.setString("Hello from LibreOffice Calc!") + doc.storeToURL("file:///path/to/spreadsheet.ods", ()) + doc.close(True) +``` + +#### Method 3: Using ezodf +```python +import ezodf + +doc = ezodf.newdoc('ods', 'spreadsheet.ods') +sheet = doc.sheets[0] +sheet['A1'].set_value('Hello') +sheet['B1'].set_value('World') +doc.save() +``` + +### Converting Spreadsheets + +```bash +# ODS to XLSX +soffice --headless --convert-to xlsx spreadsheet.ods + +# ODS to CSV +soffice --headless --convert-to csv spreadsheet.ods + +# ODS to PDF +soffice --headless --convert-to pdf spreadsheet.ods + +# XLSX to ODS +soffice --headless --convert-to ods spreadsheet.xlsx + +# Batch convert +for file in *.ods; do + soffice --headless --convert-to xlsx "$file" +done +``` + +### Formula Automation +```python +import uno + +def create_formula_spreadsheet(): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + doc = smgr.createInstanceWithContext("com.sun.star.sheet.SpreadsheetDocument", ctx) + sheet = doc.getSheets().getByIndex(0) + + sheet.getCellByPosition(0, 0).setDoubleValue(100) + sheet.getCellByPosition(0, 1).setDoubleValue(200) + + cell = sheet.getCellByPosition(0, 2) + cell.setFormula("SUM(A1:A2)") + + doc.storeToURL("file:///path/to/formulas.ods", ()) + doc.close(True) +``` + +## Format Conversion Reference + +### Supported Input Formats +- ODS (native), XLSX, XLS, CSV, DBF, HTML + +### Supported Output Formats +- ODS, XLSX, XLS, CSV, PDF, HTML + +## Command-Line Reference + +```bash +soffice --headless +soffice --headless --convert-to +soffice --calc # Calc +``` + +## Python Libraries + +```bash +pip install ezodf # ODS handling +pip install odfpy # ODF manipulation +pip install pandas # Data analysis +``` + +## Best Practices + +1. Use named ranges for clarity +2. Document complex formulas +3. Use data validation for input control +4. Create templates for recurring reports +5. Store ODS source files in version control +6. Test conversions thoroughly +7. Use CSV for data exchange +8. Handle conversion failures gracefully + +## Troubleshooting + +### Cannot open socket +```bash +killall soffice.bin +soffice --headless --accept="socket,host=localhost,port=8100;urp;" +``` + +## Resources + +- [LibreOffice Calc Guide](https://documentation.libreoffice.org/) +- [UNO API Reference](https://api.libreoffice.org/) +- [ezodf Documentation](http://ezodf.rst2.org/) + +## Related Skills + +- writer +- impress +- draw +- base +- xlsx-official +- workflow-automation diff --git a/skills/libreoffice/draw/SKILL.md b/skills/libreoffice/draw/SKILL.md new file mode 100644 index 00000000..747e8245 --- /dev/null +++ b/skills/libreoffice/draw/SKILL.md @@ -0,0 +1,165 @@ +--- +name: draw +description: "Vector graphics and diagram creation, format conversion (ODG/SVG/PDF) with LibreOffice Draw." +source: personal +risk: safe +domain: office-productivity +category: graphics-processing +version: 1.0.0 +--- + +# LibreOffice Draw + +## Overview + +LibreOffice Draw skill for creating, editing, converting, and automating vector graphics and diagram workflows using the native ODG (OpenDocument Drawing) format. + +## When to Use This Skill + +Use this skill when: +- Creating vector graphics and diagrams in ODG format +- Converting between ODG, SVG, PDF, PNG formats +- Automating diagram and flowchart generation +- Creating technical drawings and schematics +- Batch processing graphics operations + +## Core Capabilities + +### 1. Graphics Creation +- Create new ODG drawings from scratch +- Generate diagrams from templates +- Create flowcharts and org charts +- Design technical drawings + +### 2. Format Conversion +- ODG to other formats: SVG, PDF, PNG, JPG +- Other formats to ODG: SVG, PDF +- Batch conversion of multiple files + +### 3. Diagram Automation +- Template-based diagram generation +- Automated flowchart creation +- Dynamic shape generation +- Batch diagram production + +### 4. Graphics Manipulation +- Shape creation and manipulation +- Path and bezier curve editing +- Layer management +- Text and label insertion + +### 5. Integration +- Command-line automation via soffice +- Python scripting with UNO +- Integration with workflow tools + +## Workflows + +### Creating a New Drawing + +#### Method 1: Command-Line +```bash +soffice --draw template.odg +``` + +#### Method 2: Python with UNO +```python +import uno + +def create_drawing(): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + doc = smgr.createInstanceWithContext("com.sun.star.drawing.DrawingDocument", ctx) + page = doc.getDrawPages().getByIndex(0) + doc.storeToURL("file:///path/to/drawing.odg", ()) + doc.close(True) +``` + +### Converting Drawings + +```bash +# ODG to SVG +soffice --headless --convert-to svg drawing.odg + +# ODG to PDF +soffice --headless --convert-to pdf drawing.odg + +# ODG to PNG +soffice --headless --convert-to png:PNG_drawing drawing.odg + +# SVG to ODG +soffice --headless --convert-to odg drawing.svg + +# Batch convert +for file in *.odg; do + soffice --headless --convert-to pdf "$file" +done +``` + +## Format Conversion Reference + +### Supported Input Formats +- ODG (native), SVG, PDF + +### Supported Output Formats +- ODG, SVG, PDF, PNG, JPG, GIF, BMP, WMF, EMF + +## Command-Line Reference + +```bash +soffice --headless +soffice --headless --convert-to +soffice --draw # Draw +``` + +## Python Libraries + +```bash +pip install ezodf # ODF handling +pip install odfpy # ODF manipulation +pip install svgwrite # SVG generation +``` + +## Best Practices + +1. Use layers for organization +2. Create templates for recurring diagrams +3. Use vector formats for scalability +4. Name objects for easy reference +5. Store ODG source files in version control +6. Test conversions thoroughly +7. Export to SVG for web use + +## Troubleshooting + +### Cannot open socket +```bash +killall soffice.bin +soffice --headless --accept="socket,host=localhost,port=8100;urp;" +``` + +### Quality Issues in PNG Export +```bash +soffice --headless --convert-to png:PNG_drawing_Export \ + --filterData='{"Width":2048,"Height":2048}' drawing.odg +``` + +## Resources + +- [LibreOffice Draw Guide](https://documentation.libreoffice.org/) +- [UNO API Reference](https://api.libreoffice.org/) +- [SVG Specification](https://www.w3.org/TR/SVG/) + +## Related Skills + +- writer +- calc +- impress +- base +- workflow-automation diff --git a/skills/libreoffice/impress/SKILL.md b/skills/libreoffice/impress/SKILL.md new file mode 100644 index 00000000..d4c8d958 --- /dev/null +++ b/skills/libreoffice/impress/SKILL.md @@ -0,0 +1,174 @@ +--- +name: impress +description: "Presentation creation, format conversion (ODP/PPTX/PDF), slide automation with LibreOffice Impress." +source: personal +risk: safe +domain: office-productivity +category: presentation-processing +version: 1.0.0 +--- + +# LibreOffice Impress + +## Overview + +LibreOffice Impress skill for creating, editing, converting, and automating presentation workflows using the native ODP (OpenDocument Presentation) format. + +## When to Use This Skill + +Use this skill when: +- Creating new presentations in ODP format +- Converting between ODP, PPTX, PDF formats +- Automating slide generation from templates +- Batch processing presentation operations +- Creating presentation templates + +## Core Capabilities + +### 1. Presentation Creation +- Create new ODP presentations from scratch +- Generate presentations from templates +- Create slide masters and layouts +- Build interactive presentations + +### 2. Format Conversion +- ODP to other formats: PPTX, PDF, HTML, SWF +- Other formats to ODP: PPTX, PPT, PDF +- Batch conversion of multiple files + +### 3. Slide Automation +- Template-based slide generation +- Batch slide creation from data +- Automated content insertion +- Dynamic chart generation + +### 4. Content Manipulation +- Text and image insertion +- Shape and diagram creation +- Animation and transition control +- Speaker notes management + +### 5. Integration +- Command-line automation via soffice +- Python scripting with UNO +- Integration with workflow tools + +## Workflows + +### Creating a New Presentation + +#### Method 1: Command-Line +```bash +soffice --impress template.odp +``` + +#### Method 2: Python with UNO +```python +import uno + +def create_presentation(): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + doc = smgr.createInstanceWithContext("com.sun.star.presentation.PresentationDocument", ctx) + slides = doc.getDrawPages() + slide = slides.getByIndex(0) + doc.storeToURL("file:///path/to/presentation.odp", ()) + doc.close(True) +``` + +### Converting Presentations + +```bash +# ODP to PPTX +soffice --headless --convert-to pptx presentation.odp + +# ODP to PDF +soffice --headless --convert-to pdf presentation.odp + +# PPTX to ODP +soffice --headless --convert-to odp presentation.pptx + +# Batch convert +for file in *.odp; do + soffice --headless --convert-to pdf "$file" +done +``` + +### Template-Based Generation +```python +import subprocess +import tempfile +from pathlib import Path + +def generate_from_template(template_path, content, output_path): + with tempfile.TemporaryDirectory() as tmpdir: + subprocess.run(['unzip', '-q', template_path, '-d', tmpdir]) + content_file = Path(tmpdir) / 'content.xml' + content_xml = content_file.read_text() + for key, value in content.items(): + content_xml = content_xml.replace(f'${{{key}}}', str(value)) + content_file.write_text(content_xml) + subprocess.run(['zip', '-rq', output_path, '.'], cwd=tmpdir) + return output_path +``` + +## Format Conversion Reference + +### Supported Input Formats +- ODP (native), PPTX, PPT, PDF + +### Supported Output Formats +- ODP, PPTX, PDF, HTML, SWF + +## Command-Line Reference + +```bash +soffice --headless +soffice --headless --convert-to +soffice --impress # Impress +``` + +## Python Libraries + +```bash +pip install ezodf # ODF handling +pip install odfpy # ODF manipulation +``` + +## Best Practices + +1. Use slide masters for consistency +2. Create templates for recurring presentations +3. Embed fonts for PDF distribution +4. Use vector graphics when possible +5. Store ODP source files in version control +6. Test conversions thoroughly +7. Keep file sizes manageable + +## Troubleshooting + +### Cannot open socket +```bash +killall soffice.bin +soffice --headless --accept="socket,host=localhost,port=8100;urp;" +``` + +## Resources + +- [LibreOffice Impress Guide](https://documentation.libreoffice.org/) +- [UNO API Reference](https://api.libreoffice.org/) + +## Related Skills + +- writer +- calc +- draw +- base +- pptx-official +- workflow-automation diff --git a/skills/libreoffice/writer/SKILL.md b/skills/libreoffice/writer/SKILL.md new file mode 100644 index 00000000..4ae435ef --- /dev/null +++ b/skills/libreoffice/writer/SKILL.md @@ -0,0 +1,200 @@ +--- +name: writer +description: "Document creation, format conversion (ODT/DOCX/PDF), mail merge, and automation with LibreOffice Writer." +source: personal +risk: safe +domain: office-productivity +category: document-processing +version: 1.0.0 +--- + +# LibreOffice Writer + +## Overview + +LibreOffice Writer skill for creating, editing, converting, and automating document workflows using the native ODT (OpenDocument Text) format. + +## When to Use This Skill + +Use this skill when: +- Creating new documents in ODT format +- Converting documents between formats (ODT <-> DOCX, PDF, HTML, RTF, TXT) +- Automating document generation workflows +- Performing batch document operations +- Creating templates and standardized document formats + +## Core Capabilities + +### 1. Document Creation +- Create new ODT documents from scratch +- Generate documents from templates +- Create mail merge documents +- Build forms with fillable fields + +### 2. Format Conversion +- ODT to other formats: DOCX, PDF, HTML, RTF, TXT, EPUB +- Other formats to ODT: DOCX, DOC, RTF, HTML, TXT +- Batch conversion of multiple documents + +### 3. Document Automation +- Template-based document generation +- Mail merge with data sources (CSV, spreadsheet, database) +- Batch document processing +- Automated report generation + +### 4. Content Manipulation +- Text extraction and insertion +- Style management and application +- Table creation and manipulation +- Header/footer management + +### 5. Integration +- Command-line automation via soffice +- Python scripting with UNO +- Integration with workflow automation tools + +## Workflows + +### Creating a New Document + +#### Method 1: Command-Line +```bash +soffice --writer template.odt +``` + +#### Method 2: Python with UNO +```python +import uno + +def create_document(): + local_ctx = uno.getComponentContext() + resolver = local_ctx.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", local_ctx + ) + ctx = resolver.resolve( + "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" + ) + smgr = ctx.ServiceManager + doc = smgr.createInstanceWithContext("com.sun.star.text.TextDocument", ctx) + text = doc.Text + cursor = text.createTextCursor() + text.insertString(cursor, "Hello from LibreOffice Writer!", 0) + doc.storeToURL("file:///path/to/document.odt", ()) + doc.close(True) +``` + +#### Method 3: Using odfpy +```python +from odf.opendocument import OpenDocumentText +from odf.text import P, H + +doc = OpenDocumentText() +h1 = H(outlinelevel='1', text='Document Title') +doc.text.appendChild(h1) +doc.save("document.odt") +``` + +### Converting Documents + +```bash +# ODT to DOCX +soffice --headless --convert-to docx document.odt + +# ODT to PDF +soffice --headless --convert-to pdf document.odt + +# DOCX to ODT +soffice --headless --convert-to odt document.docx + +# Batch convert +for file in *.odt; do + soffice --headless --convert-to pdf "$file" +done +``` + +### Template-Based Generation +```python +import subprocess +import tempfile +from pathlib import Path + +def generate_from_template(template_path, variables, output_path): + with tempfile.TemporaryDirectory() as tmpdir: + subprocess.run(['unzip', '-q', template_path, '-d', tmpdir]) + content_file = Path(tmpdir) / 'content.xml' + content = content_file.read_text() + for key, value in variables.items(): + content = content.replace(f'${{{key}}}', str(value)) + content_file.write_text(content) + subprocess.run(['zip', '-rq', output_path, '.'], cwd=tmpdir) + return output_path +``` + +## Format Conversion Reference + +### Supported Input Formats +- ODT (native), DOCX, DOC, RTF, HTML, TXT, EPUB + +### Supported Output Formats +- ODT, DOCX, PDF, PDF/A, HTML, RTF, TXT, EPUB + +## Command-Line Reference + +```bash +soffice --headless +soffice --headless --convert-to +soffice --writer # Writer +soffice --calc # Calc +soffice --impress # Impress +soffice --draw # Draw +``` + +## Python Libraries + +```bash +pip install odfpy # ODF manipulation +pip install ezodf # Easier ODF handling +``` + +## Best Practices + +1. Use styles for consistency +2. Create templates for recurring documents +3. Ensure accessibility (heading hierarchy, alt text) +4. Fill document metadata +5. Store ODT source files in version control +6. Test conversions thoroughly +7. Embed fonts for PDF distribution +8. Handle conversion failures gracefully +9. Log automation operations +10. Clean temporary files + +## Troubleshooting + +### Cannot open socket +```bash +killall soffice.bin +soffice --headless --accept="socket,host=localhost,port=8100;urp;" +``` + +### Conversion Quality Issues +```bash +soffice --headless --convert-to pdf:writer_pdf_Export document.odt +``` + +## Resources + +- [LibreOffice Writer Guide](https://documentation.libreoffice.org/) +- [LibreOffice SDK](https://wiki.documentfoundation.org/Documentation/DevGuide) +- [UNO API Reference](https://api.libreoffice.org/) +- [odfpy](https://pypi.org/project/odfpy/) + +## Related Skills + +- calc +- impress +- draw +- base +- docx-official +- pdf-official +- workflow-automation diff --git a/skills/linux-troubleshooting/SKILL.md b/skills/linux-troubleshooting/SKILL.md new file mode 100644 index 00000000..464c57f9 --- /dev/null +++ b/skills/linux-troubleshooting/SKILL.md @@ -0,0 +1,221 @@ +--- +name: linux-troubleshooting +description: "Linux system troubleshooting workflow for diagnosing and resolving system issues, performance problems, and service failures." +source: personal +risk: safe +domain: system-administration +category: granular-workflow-bundle +version: 1.0.0 +--- + +# Linux Troubleshooting Workflow + +## Overview + +Specialized workflow for diagnosing and resolving Linux system issues including performance problems, service failures, network issues, and resource constraints. + +## When to Use This Workflow + +Use this workflow when: +- Diagnosing system performance issues +- Troubleshooting service failures +- Investigating network problems +- Resolving disk space issues +- Debugging application errors + +## Workflow Phases + +### Phase 1: Initial Assessment + +#### Skills to Invoke +- `bash-linux` - Linux commands +- `devops-troubleshooter` - Troubleshooting + +#### Actions +1. Check system uptime +2. Review recent changes +3. Identify symptoms +4. Gather error messages +5. Document findings + +#### Commands +```bash +uptime +hostnamectl +cat /etc/os-release +dmesg | tail -50 +``` + +#### Copy-Paste Prompts +``` +Use @bash-linux to gather system information +``` + +### Phase 2: Resource Analysis + +#### Skills to Invoke +- `bash-linux` - Resource commands +- `performance-engineer` - Performance analysis + +#### Actions +1. Check CPU usage +2. Analyze memory +3. Review disk space +4. Monitor I/O +5. Check network + +#### Commands +```bash +top -bn1 | head -20 +free -h +df -h +iostat -x 1 5 +``` + +#### Copy-Paste Prompts +``` +Use @performance-engineer to analyze system resources +``` + +### Phase 3: Process Investigation + +#### Skills to Invoke +- `bash-linux` - Process commands +- `server-management` - Process management + +#### Actions +1. List running processes +2. Identify resource hogs +3. Check process status +4. Review process trees +5. Analyze strace output + +#### Commands +```bash +ps aux --sort=-%cpu | head -10 +pstree -p +lsof -p PID +strace -p PID +``` + +#### Copy-Paste Prompts +``` +Use @server-management to investigate processes +``` + +### Phase 4: Log Analysis + +#### Skills to Invoke +- `bash-linux` - Log commands +- `error-detective` - Error detection + +#### Actions +1. Check system logs +2. Review application logs +3. Search for errors +4. Analyze log patterns +5. Correlate events + +#### Commands +```bash +journalctl -xe +tail -f /var/log/syslog +grep -i error /var/log/* +``` + +#### Copy-Paste Prompts +``` +Use @error-detective to analyze log files +``` + +### Phase 5: Network Diagnostics + +#### Skills to Invoke +- `bash-linux` - Network commands +- `network-engineer` - Network troubleshooting + +#### Actions +1. Check network interfaces +2. Test connectivity +3. Analyze connections +4. Review firewall rules +5. Check DNS resolution + +#### Commands +```bash +ip addr show +ss -tulpn +curl -v http://target +dig domain +``` + +#### Copy-Paste Prompts +``` +Use @network-engineer to diagnose network issues +``` + +### Phase 6: Service Troubleshooting + +#### Skills to Invoke +- `server-management` - Service management +- `systematic-debugging` - Debugging + +#### Actions +1. Check service status +2. Review service logs +3. Test service restart +4. Verify dependencies +5. Check configuration + +#### Commands +```bash +systemctl status service +journalctl -u service -f +systemctl restart service +``` + +#### Copy-Paste Prompts +``` +Use @systematic-debugging to troubleshoot service issues +``` + +### Phase 7: Resolution + +#### Skills to Invoke +- `incident-responder` - Incident response +- `bash-pro` - Fix implementation + +#### Actions +1. Implement fix +2. Verify resolution +3. Monitor stability +4. Document solution +5. Create prevention plan + +#### Copy-Paste Prompts +``` +Use @incident-responder to implement resolution +``` + +## Troubleshooting Checklist + +- [ ] System information gathered +- [ ] Resources analyzed +- [ ] Logs reviewed +- [ ] Network tested +- [ ] Services verified +- [ ] Issue resolved +- [ ] Documentation created + +## Quality Gates + +- [ ] Root cause identified +- [ ] Fix verified +- [ ] Monitoring in place +- [ ] Documentation complete + +## Related Workflow Bundles + +- `os-scripting` - OS scripting +- `bash-scripting` - Bash scripting +- `cloud-devops` - DevOps diff --git a/skills/office-productivity/SKILL.md b/skills/office-productivity/SKILL.md new file mode 100644 index 00000000..c67111a8 --- /dev/null +++ b/skills/office-productivity/SKILL.md @@ -0,0 +1,219 @@ +--- +name: office-productivity +description: "Office productivity workflow covering document creation, spreadsheet automation, presentation generation, and integration with LibreOffice and Microsoft Office formats." +source: personal +risk: safe +domain: office-productivity +category: workflow-bundle +version: 1.0.0 +--- + +# Office Productivity Workflow Bundle + +## Overview + +Comprehensive office productivity workflow for document creation, spreadsheet automation, presentation generation, and format conversion using LibreOffice and Microsoft Office tools. + +## When to Use This Workflow + +Use this workflow when: +- Creating office documents programmatically +- Automating document workflows +- Converting between document formats +- Generating reports +- Creating presentations from data +- Processing spreadsheets + +## Workflow Phases + +### Phase 1: Document Creation + +#### Skills to Invoke +- `libreoffice-writer` - LibreOffice Writer +- `docx-official` - Microsoft Word +- `pdf-official` - PDF handling + +#### Actions +1. Design document template +2. Create document structure +3. Add content programmatically +4. Apply formatting +5. Export to required formats + +#### Copy-Paste Prompts +``` +Use @libreoffice-writer to create ODT documents +``` + +``` +Use @docx-official to create Word documents +``` + +### Phase 2: Spreadsheet Automation + +#### Skills to Invoke +- `libreoffice-calc` - LibreOffice Calc +- `xlsx-official` - Excel spreadsheets +- `googlesheets-automation` - Google Sheets + +#### Actions +1. Design spreadsheet structure +2. Create formulas +3. Import data +4. Generate charts +5. Export reports + +#### Copy-Paste Prompts +``` +Use @libreoffice-calc to create ODS spreadsheets +``` + +``` +Use @xlsx-official to create Excel reports +``` + +### Phase 3: Presentation Generation + +#### Skills to Invoke +- `libreoffice-impress` - LibreOffice Impress +- `pptx-official` - PowerPoint +- `frontend-slides` - HTML slides +- `nanobanana-ppt-skills` - AI PPT generation + +#### Actions +1. Design slide template +2. Generate slides from data +3. Add charts and graphics +4. Apply animations +5. Export presentations + +#### Copy-Paste Prompts +``` +Use @libreoffice-impress to create ODP presentations +``` + +``` +Use @pptx-official to create PowerPoint presentations +``` + +``` +Use @frontend-slides to create HTML presentations +``` + +### Phase 4: Format Conversion + +#### Skills to Invoke +- `libreoffice-writer` - Document conversion +- `libreoffice-calc` - Spreadsheet conversion +- `pdf-official` - PDF conversion + +#### Actions +1. Identify source format +2. Choose target format +3. Perform conversion +4. Verify quality +5. Batch process files + +#### Copy-Paste Prompts +``` +Use @libreoffice-writer to convert documents +``` + +### Phase 5: Document Automation + +#### Skills to Invoke +- `libreoffice-writer` - Mail merge +- `workflow-automation` - Workflow automation +- `file-organizer` - File organization + +#### Actions +1. Design automation workflow +2. Create templates +3. Set up data sources +4. Generate documents +5. Distribute outputs + +#### Copy-Paste Prompts +``` +Use @libreoffice-writer to perform mail merge +``` + +``` +Use @workflow-automation to automate document workflows +``` + +### Phase 6: Graphics and Diagrams + +#### Skills to Invoke +- `libreoffice-draw` - Vector graphics +- `canvas-design` - Canvas design +- `mermaid-expert` - Diagram generation + +#### Actions +1. Design graphics +2. Create diagrams +3. Generate charts +4. Export images +5. Integrate with documents + +#### Copy-Paste Prompts +``` +Use @libreoffice-draw to create vector graphics +``` + +``` +Use @mermaid-expert to create diagrams +``` + +### Phase 7: Database Integration + +#### Skills to Invoke +- `libreoffice-base` - LibreOffice Base +- `database-architect` - Database design + +#### Actions +1. Connect to data sources +2. Create forms +3. Design reports +4. Automate queries +5. Generate output + +#### Copy-Paste Prompts +``` +Use @libreoffice-base to create database reports +``` + +## Office Application Workflows + +### LibreOffice +``` +Skills: libreoffice-writer, libreoffice-calc, libreoffice-impress, libreoffice-draw, libreoffice-base +Formats: ODT, ODS, ODP, ODG, ODB +``` + +### Microsoft Office +``` +Skills: docx-official, xlsx-official, pptx-official +Formats: DOCX, XLSX, PPTX +``` + +### Google Workspace +``` +Skills: googlesheets-automation, google-drive-automation, gmail-automation +Formats: Google Docs, Sheets, Slides +``` + +## Quality Gates + +- [ ] Documents formatted correctly +- [ ] Formulas working +- [ ] Presentations complete +- [ ] Conversions successful +- [ ] Automation tested +- [ ] Files organized + +## Related Workflow Bundles + +- `development` - Application development +- `documentation` - Documentation generation +- `database` - Data integration diff --git a/skills/os-scripting/SKILL.md b/skills/os-scripting/SKILL.md new file mode 100644 index 00000000..913b60ec --- /dev/null +++ b/skills/os-scripting/SKILL.md @@ -0,0 +1,429 @@ +--- +name: os-scripting +description: "Operating system and shell scripting troubleshooting workflow for Linux, macOS, and Windows. Covers bash scripting, system administration, debugging, and automation." +source: personal +risk: safe +domain: system-administration +category: workflow-bundle +version: 1.0.0 +--- + +# OS/Shell Scripting Troubleshooting Workflow Bundle + +## Overview + +Comprehensive workflow for operating system troubleshooting, shell scripting, and system administration across Linux, macOS, and Windows. This bundle orchestrates skills for debugging system issues, creating robust scripts, and automating administrative tasks. + +## When to Use This Workflow + +Use this workflow when: +- Debugging shell script errors +- Creating production-ready bash scripts +- Troubleshooting system issues +- Automating system administration tasks +- Managing processes and services +- Configuring system resources + +## Workflow Phases + +### Phase 1: Environment Assessment + +#### Skills to Invoke +- `bash-linux` - Linux bash patterns +- `bash-pro` - Professional bash scripting +- `bash-defensive-patterns` - Defensive scripting + +#### Actions +1. Identify operating system and version +2. Check available tools and commands +3. Verify permissions and access +4. Assess system resources +5. Review logs and error messages + +#### Diagnostic Commands +```bash +# System information +uname -a +cat /etc/os-release +hostnamectl + +# Resource usage +top +htop +df -h +free -m + +# Process information +ps aux +pgrep -f pattern +lsof -i :port + +# Network status +netstat -tulpn +ss -tulpn +ip addr show +``` + +#### Copy-Paste Prompts +``` +Use @bash-linux to diagnose system performance issues +``` + +### Phase 2: Script Analysis + +#### Skills to Invoke +- `bash-defensive-patterns` - Defensive scripting +- `shellcheck-configuration` - ShellCheck linting +- `bats-testing-patterns` - Bats testing + +#### Actions +1. Run ShellCheck for linting +2. Analyze script structure +3. Identify potential issues +4. Check error handling +5. Verify variable usage + +#### ShellCheck Usage +```bash +# Install ShellCheck +sudo apt install shellcheck # Debian/Ubuntu +brew install shellcheck # macOS + +# Run ShellCheck +shellcheck script.sh +shellcheck -f gcc script.sh + +# Fix common issues +# - Use quotes around variables +# - Check exit codes +# - Handle errors properly +``` + +#### Copy-Paste Prompts +``` +Use @shellcheck-configuration to lint and fix shell scripts +``` + +### Phase 3: Debugging + +#### Skills to Invoke +- `systematic-debugging` - Systematic debugging +- `debugger` - Debugging specialist +- `error-detective` - Error pattern detection + +#### Actions +1. Enable debug mode +2. Add logging statements +3. Trace execution flow +4. Isolate failing sections +5. Test components individually + +#### Debug Techniques +```bash +# Enable debug mode +set -x # Print commands +set -e # Exit on error +set -u # Exit on undefined variable +set -o pipefail # Pipeline failure detection + +# Add logging +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> /var/log/script.log +} + +# Trap errors +trap 'echo "Error on line $LINENO"' ERR + +# Test sections +bash -n script.sh # Syntax check +bash -x script.sh # Trace execution +``` + +#### Copy-Paste Prompts +``` +Use @systematic-debugging to trace and fix shell script errors +``` + +### Phase 4: Script Development + +#### Skills to Invoke +- `bash-pro` - Professional scripting +- `bash-defensive-patterns` - Defensive patterns +- `linux-shell-scripting` - Shell scripting + +#### Actions +1. Design script structure +2. Implement functions +3. Add error handling +4. Include input validation +5. Add help documentation + +#### Script Template +```bash +#!/usr/bin/env bash +set -euo pipefail + +# Constants +readonly SCRIPT_NAME=$(basename "$0") +readonly SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) + +# Logging +log() { + local level="$1" + shift + echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" >&2 +} + +info() { log "INFO" "$@"; } +warn() { log "WARN" "$@"; } +error() { log "ERROR" "$@"; exit 1; } + +# Usage +usage() { + cat </dev/null | sort -h +find / -type f -size +500M 2>/dev/null +``` + +### Network Issues +```bash +ip addr show +ip route show +ss -tulpn +curl -v http://target +``` + +### Service Failures +```bash +systemctl status service-name +journalctl -u service-name -f +systemctl restart service-name +``` + +## Quality Gates + +Before completing workflow, verify: +- [ ] All scripts pass ShellCheck +- [ ] Tests pass with Bats +- [ ] Error handling implemented +- [ ] Logging configured +- [ ] Documentation complete +- [ ] Automation scheduled + +## Related Workflow Bundles + +- `development` - Software development +- `cloud-devops` - Cloud and DevOps +- `security-audit` - Security testing +- `database` - Database operations diff --git a/skills/postgresql-optimization/SKILL.md b/skills/postgresql-optimization/SKILL.md new file mode 100644 index 00000000..3581986b --- /dev/null +++ b/skills/postgresql-optimization/SKILL.md @@ -0,0 +1,175 @@ +--- +name: postgresql-optimization +description: "PostgreSQL database optimization workflow for query tuning, indexing strategies, performance analysis, and production database management." +source: personal +risk: safe +domain: database +category: granular-workflow-bundle +version: 1.0.0 +--- + +# PostgreSQL Optimization Workflow + +## Overview + +Specialized workflow for PostgreSQL database optimization including query tuning, indexing strategies, performance analysis, vacuum management, and production database administration. + +## When to Use This Workflow + +Use this workflow when: +- Optimizing slow PostgreSQL queries +- Designing indexing strategies +- Analyzing database performance +- Tuning PostgreSQL configuration +- Managing production databases + +## Workflow Phases + +### Phase 1: Performance Assessment + +#### Skills to Invoke +- `database-optimizer` - Database optimization +- `postgres-best-practices` - PostgreSQL best practices + +#### Actions +1. Check database version +2. Review configuration +3. Analyze slow queries +4. Check resource usage +5. Identify bottlenecks + +#### Copy-Paste Prompts +``` +Use @database-optimizer to assess PostgreSQL performance +``` + +### Phase 2: Query Analysis + +#### Skills to Invoke +- `sql-optimization-patterns` - SQL optimization +- `postgres-best-practices` - PostgreSQL patterns + +#### Actions +1. Run EXPLAIN ANALYZE +2. Identify scan types +3. Check join strategies +4. Analyze execution time +5. Find optimization opportunities + +#### Copy-Paste Prompts +``` +Use @sql-optimization-patterns to analyze and optimize queries +``` + +### Phase 3: Indexing Strategy + +#### Skills to Invoke +- `database-design` - Index design +- `postgresql` - PostgreSQL indexing + +#### Actions +1. Identify missing indexes +2. Create B-tree indexes +3. Add composite indexes +4. Consider partial indexes +5. Review index usage + +#### Copy-Paste Prompts +``` +Use @database-design to design PostgreSQL indexing strategy +``` + +### Phase 4: Query Optimization + +#### Skills to Invoke +- `sql-optimization-patterns` - Query tuning +- `sql-pro` - SQL expertise + +#### Actions +1. Rewrite inefficient queries +2. Optimize joins +3. Add CTEs where helpful +4. Implement pagination +5. Test improvements + +#### Copy-Paste Prompts +``` +Use @sql-optimization-patterns to optimize SQL queries +``` + +### Phase 5: Configuration Tuning + +#### Skills to Invoke +- `postgres-best-practices` - Configuration +- `database-admin` - Database administration + +#### Actions +1. Tune shared_buffers +2. Configure work_mem +3. Set effective_cache_size +4. Adjust checkpoint settings +5. Configure autovacuum + +#### Copy-Paste Prompts +``` +Use @postgres-best-practices to tune PostgreSQL configuration +``` + +### Phase 6: Maintenance + +#### Skills to Invoke +- `database-admin` - Database maintenance +- `postgresql` - PostgreSQL maintenance + +#### Actions +1. Schedule VACUUM +2. Run ANALYZE +3. Check table bloat +4. Monitor autovacuum +5. Review statistics + +#### Copy-Paste Prompts +``` +Use @database-admin to schedule PostgreSQL maintenance +``` + +### Phase 7: Monitoring + +#### Skills to Invoke +- `grafana-dashboards` - Monitoring dashboards +- `prometheus-configuration` - Metrics collection + +#### Actions +1. Set up monitoring +2. Create dashboards +3. Configure alerts +4. Track key metrics +5. Review trends + +#### Copy-Paste Prompts +``` +Use @grafana-dashboards to create PostgreSQL monitoring +``` + +## Optimization Checklist + +- [ ] Slow queries identified +- [ ] Indexes optimized +- [ ] Configuration tuned +- [ ] Maintenance scheduled +- [ ] Monitoring active +- [ ] Performance improved + +## Quality Gates + +- [ ] Query performance improved +- [ ] Indexes effective +- [ ] Configuration optimized +- [ ] Maintenance automated +- [ ] Monitoring in place + +## Related Workflow Bundles + +- `database` - Database operations +- `cloud-devops` - Infrastructure +- `performance-optimization` - Performance diff --git a/skills/python-fastapi-development/SKILL.md b/skills/python-fastapi-development/SKILL.md new file mode 100644 index 00000000..815e415e --- /dev/null +++ b/skills/python-fastapi-development/SKILL.md @@ -0,0 +1,216 @@ +--- +name: python-fastapi-development +description: "Python FastAPI backend development with async patterns, SQLAlchemy, Pydantic, authentication, and production API patterns." +source: personal +risk: safe +domain: backend-development +category: granular-workflow-bundle +version: 1.0.0 +--- + +# Python/FastAPI Development Workflow + +## Overview + +Specialized workflow for building production-ready Python backends with FastAPI, featuring async patterns, SQLAlchemy ORM, Pydantic validation, and comprehensive API patterns. + +## When to Use This Workflow + +Use this workflow when: +- Building new REST APIs with FastAPI +- Creating async Python backends +- Implementing database integration with SQLAlchemy +- Setting up API authentication +- Developing microservices + +## Workflow Phases + +### Phase 1: Project Setup + +#### Skills to Invoke +- `app-builder` - Application scaffolding +- `python-development-python-scaffold` - Python scaffolding +- `fastapi-templates` - FastAPI templates +- `uv-package-manager` - Package management + +#### Actions +1. Set up Python environment (uv/poetry) +2. Create project structure +3. Configure FastAPI app +4. Set up logging +5. Configure environment variables + +#### Copy-Paste Prompts +``` +Use @fastapi-templates to scaffold a new FastAPI project +``` + +``` +Use @python-development-python-scaffold to set up Python project structure +``` + +### Phase 2: Database Setup + +#### Skills to Invoke +- `prisma-expert` - Prisma ORM (alternative) +- `database-design` - Schema design +- `postgresql` - PostgreSQL setup +- `pydantic-models-py` - Pydantic models + +#### Actions +1. Design database schema +2. Set up SQLAlchemy models +3. Create database connection +4. Configure migrations (Alembic) +5. Set up session management + +#### Copy-Paste Prompts +``` +Use @database-design to design PostgreSQL schema +``` + +``` +Use @pydantic-models-py to create Pydantic models for API +``` + +### Phase 3: API Routes + +#### Skills to Invoke +- `fastapi-router-py` - FastAPI routers +- `api-design-principles` - API design +- `api-patterns` - API patterns + +#### Actions +1. Design API endpoints +2. Create API routers +3. Implement CRUD operations +4. Add request validation +5. Configure response models + +#### Copy-Paste Prompts +``` +Use @fastapi-router-py to create API endpoints with CRUD operations +``` + +``` +Use @api-design-principles to design RESTful API +``` + +### Phase 4: Authentication + +#### Skills to Invoke +- `auth-implementation-patterns` - Authentication +- `api-security-best-practices` - API security + +#### Actions +1. Choose auth strategy (JWT, OAuth2) +2. Implement user registration +3. Set up login endpoints +4. Create auth middleware +5. Add password hashing + +#### Copy-Paste Prompts +``` +Use @auth-implementation-patterns to implement JWT authentication +``` + +### Phase 5: Error Handling + +#### Skills to Invoke +- `fastapi-pro` - FastAPI patterns +- `error-handling-patterns` - Error handling + +#### Actions +1. Create custom exceptions +2. Set up exception handlers +3. Implement error responses +4. Add request logging +5. Configure error tracking + +#### Copy-Paste Prompts +``` +Use @fastapi-pro to implement comprehensive error handling +``` + +### Phase 6: Testing + +#### Skills to Invoke +- `python-testing-patterns` - pytest testing +- `api-testing-observability-api-mock` - API testing + +#### Actions +1. Set up pytest +2. Create test fixtures +3. Write unit tests +4. Implement integration tests +5. Configure test database + +#### Copy-Paste Prompts +``` +Use @python-testing-patterns to write pytest tests for FastAPI +``` + +### Phase 7: Documentation + +#### Skills to Invoke +- `api-documenter` - API documentation +- `openapi-spec-generation` - OpenAPI specs + +#### Actions +1. Configure OpenAPI schema +2. Add endpoint documentation +3. Create usage examples +4. Set up API versioning +5. Generate API docs + +#### Copy-Paste Prompts +``` +Use @api-documenter to generate comprehensive API documentation +``` + +### Phase 8: Deployment + +#### Skills to Invoke +- `deployment-engineer` - Deployment +- `docker-expert` - Containerization + +#### Actions +1. Create Dockerfile +2. Set up docker-compose +3. Configure production settings +4. Set up reverse proxy +5. Deploy to cloud + +#### Copy-Paste Prompts +``` +Use @docker-expert to containerize FastAPI application +``` + +## Technology Stack + +| Category | Technology | +|----------|------------| +| Framework | FastAPI | +| Language | Python 3.11+ | +| ORM | SQLAlchemy 2.0 | +| Validation | Pydantic v2 | +| Database | PostgreSQL | +| Migrations | Alembic | +| Auth | JWT, OAuth2 | +| Testing | pytest | + +## Quality Gates + +- [ ] All tests passing (>80% coverage) +- [ ] Type checking passes (mypy) +- [ ] Linting clean (ruff, black) +- [ ] API documentation complete +- [ ] Security scan passed +- [ ] Performance benchmarks met + +## Related Workflow Bundles + +- `development` - General development +- `database` - Database operations +- `security-audit` - Security testing +- `api-development` - API patterns diff --git a/skills/rag-implementation/SKILL.md b/skills/rag-implementation/SKILL.md index ad0dee7c..e1dac2b6 100644 --- a/skills/rag-implementation/SKILL.md +++ b/skills/rag-implementation/SKILL.md @@ -1,423 +1,197 @@ --- name: rag-implementation -description: "Build Retrieval-Augmented Generation (RAG) systems for LLM applications with vector databases and semantic search. Use when implementing knowledge-grounded AI, building document Q&A systems, or int..." -risk: unknown -source: community +description: "RAG (Retrieval-Augmented Generation) implementation workflow covering embedding selection, vector database setup, chunking strategies, and retrieval optimization." +source: personal +risk: safe +domain: ai-ml +category: granular-workflow-bundle +version: 1.0.0 --- -# RAG Implementation +# RAG Implementation Workflow -Master Retrieval-Augmented Generation (RAG) to build LLM applications that provide accurate, grounded responses using external knowledge sources. +## Overview -## Use this skill when +Specialized workflow for implementing RAG (Retrieval-Augmented Generation) systems including embedding model selection, vector database setup, chunking strategies, retrieval optimization, and evaluation. -- Building Q&A systems over proprietary documents -- Creating chatbots with current, factual information -- Implementing semantic search with natural language queries -- Reducing hallucinations with grounded responses -- Enabling LLMs to access domain-specific knowledge -- Building documentation assistants -- Creating research tools with source citation +## When to Use This Workflow -## Do not use this skill when +Use this workflow when: +- Building RAG-powered applications +- Implementing semantic search +- Creating knowledge-grounded AI +- Setting up document Q&A systems +- Optimizing retrieval quality -- You only need purely generative writing without retrieval -- The dataset is too small to justify embeddings -- You cannot store or process the source data safely +## Workflow Phases -## Instructions +### Phase 1: Requirements Analysis -1. Define the corpus, update cadence, and evaluation targets. -2. Choose embedding models and vector store based on scale. -3. Build ingestion, chunking, and retrieval with reranking. -4. Evaluate with grounded QA metrics and monitor drift. +#### Skills to Invoke +- `ai-product` - AI product design +- `rag-engineer` - RAG engineering -## Safety +#### Actions +1. Define use case +2. Identify data sources +3. Set accuracy requirements +4. Determine latency targets +5. Plan evaluation metrics -- Redact sensitive data and enforce access controls. -- Avoid exposing source documents in responses when restricted. - -## Core Components - -### 1. Vector Databases -**Purpose**: Store and retrieve document embeddings efficiently - -**Options:** -- **Pinecone**: Managed, scalable, fast queries -- **Weaviate**: Open-source, hybrid search -- **Milvus**: High performance, on-premise -- **Chroma**: Lightweight, easy to use -- **Qdrant**: Fast, filtered search -- **FAISS**: Meta's library, local deployment - -### 2. Embeddings -**Purpose**: Convert text to numerical vectors for similarity search - -**Models:** -- **text-embedding-ada-002** (OpenAI): General purpose, 1536 dims -- **all-MiniLM-L6-v2** (Sentence Transformers): Fast, lightweight -- **e5-large-v2**: High quality, multilingual -- **Instructor**: Task-specific instructions -- **bge-large-en-v1.5**: SOTA performance - -### 3. Retrieval Strategies -**Approaches:** -- **Dense Retrieval**: Semantic similarity via embeddings -- **Sparse Retrieval**: Keyword matching (BM25, TF-IDF) -- **Hybrid Search**: Combine dense + sparse -- **Multi-Query**: Generate multiple query variations -- **HyDE**: Generate hypothetical documents - -### 4. Reranking -**Purpose**: Improve retrieval quality by reordering results - -**Methods:** -- **Cross-Encoders**: BERT-based reranking -- **Cohere Rerank**: API-based reranking -- **Maximal Marginal Relevance (MMR)**: Diversity + relevance -- **LLM-based**: Use LLM to score relevance - -## Quick Start - -```python -from langchain.document_loaders import DirectoryLoader -from langchain.text_splitters import RecursiveCharacterTextSplitter -from langchain.embeddings import OpenAIEmbeddings -from langchain.vectorstores import Chroma -from langchain.chains import RetrievalQA -from langchain.llms import OpenAI - -# 1. Load documents -loader = DirectoryLoader('./docs', glob="**/*.txt") -documents = loader.load() - -# 2. Split into chunks -text_splitter = RecursiveCharacterTextSplitter( - chunk_size=1000, - chunk_overlap=200, - length_function=len -) -chunks = text_splitter.split_documents(documents) - -# 3. Create embeddings and vector store -embeddings = OpenAIEmbeddings() -vectorstore = Chroma.from_documents(chunks, embeddings) - -# 4. Create retrieval chain -qa_chain = RetrievalQA.from_chain_type( - llm=OpenAI(), - chain_type="stuff", - retriever=vectorstore.as_retriever(search_kwargs={"k": 4}), - return_source_documents=True -) - -# 5. Query -result = qa_chain({"query": "What are the main features?"}) -print(result['result']) -print(result['source_documents']) +#### Copy-Paste Prompts +``` +Use @ai-product to define RAG application requirements ``` -## Advanced RAG Patterns +### Phase 2: Embedding Selection -### Pattern 1: Hybrid Search -```python -from langchain.retrievers import BM25Retriever, EnsembleRetriever +#### Skills to Invoke +- `embedding-strategies` - Embedding selection +- `rag-engineer` - RAG patterns -# Sparse retriever (BM25) -bm25_retriever = BM25Retriever.from_documents(chunks) -bm25_retriever.k = 5 +#### Actions +1. Evaluate embedding models +2. Test domain relevance +3. Measure embedding quality +4. Consider cost/latency +5. Select model -# Dense retriever (embeddings) -embedding_retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) - -# Combine with weights -ensemble_retriever = EnsembleRetriever( - retrievers=[bm25_retriever, embedding_retriever], - weights=[0.3, 0.7] -) +#### Copy-Paste Prompts +``` +Use @embedding-strategies to select optimal embedding model ``` -### Pattern 2: Multi-Query Retrieval -```python -from langchain.retrievers.multi_query import MultiQueryRetriever +### Phase 3: Vector Database Setup -# Generate multiple query perspectives -retriever = MultiQueryRetriever.from_llm( - retriever=vectorstore.as_retriever(), - llm=OpenAI() -) +#### Skills to Invoke +- `vector-database-engineer` - Vector DB +- `similarity-search-patterns` - Similarity search -# Single query β†’ multiple variations β†’ combined results -results = retriever.get_relevant_documents("What is the main topic?") +#### Actions +1. Choose vector database +2. Design schema +3. Configure indexes +4. Set up connection +5. Test queries + +#### Copy-Paste Prompts +``` +Use @vector-database-engineer to set up vector database ``` -### Pattern 3: Contextual Compression -```python -from langchain.retrievers import ContextualCompressionRetriever -from langchain.retrievers.document_compressors import LLMChainExtractor +### Phase 4: Chunking Strategy -compressor = LLMChainExtractor.from_llm(llm) +#### Skills to Invoke +- `rag-engineer` - Chunking strategies +- `rag-implementation` - RAG implementation -compression_retriever = ContextualCompressionRetriever( - base_compressor=compressor, - base_retriever=vectorstore.as_retriever() -) +#### Actions +1. Choose chunk size +2. Implement chunking +3. Add overlap handling +4. Create metadata +5. Test retrieval quality -# Returns only relevant parts of documents -compressed_docs = compression_retriever.get_relevant_documents("query") +#### Copy-Paste Prompts +``` +Use @rag-engineer to implement chunking strategy ``` -### Pattern 4: Parent Document Retriever -```python -from langchain.retrievers import ParentDocumentRetriever -from langchain.storage import InMemoryStore +### Phase 5: Retrieval Implementation -# Store for parent documents -store = InMemoryStore() +#### Skills to Invoke +- `similarity-search-patterns` - Similarity search +- `hybrid-search-implementation` - Hybrid search -# Small chunks for retrieval, large chunks for context -child_splitter = RecursiveCharacterTextSplitter(chunk_size=400) -parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000) +#### Actions +1. Implement vector search +2. Add keyword search +3. Configure hybrid search +4. Set up reranking +5. Optimize latency -retriever = ParentDocumentRetriever( - vectorstore=vectorstore, - docstore=store, - child_splitter=child_splitter, - parent_splitter=parent_splitter -) +#### Copy-Paste Prompts +``` +Use @similarity-search-patterns to implement retrieval ``` -## Document Chunking Strategies - -### Recursive Character Text Splitter -```python -from langchain.text_splitters import RecursiveCharacterTextSplitter - -splitter = RecursiveCharacterTextSplitter( - chunk_size=1000, - chunk_overlap=200, - length_function=len, - separators=["\n\n", "\n", " ", ""] # Try these in order -) +``` +Use @hybrid-search-implementation to add hybrid search ``` -### Token-Based Splitting -```python -from langchain.text_splitters import TokenTextSplitter +### Phase 6: LLM Integration -splitter = TokenTextSplitter( - chunk_size=512, - chunk_overlap=50 -) +#### Skills to Invoke +- `llm-application-dev-ai-assistant` - LLM integration +- `llm-application-dev-prompt-optimize` - Prompt optimization + +#### Actions +1. Select LLM provider +2. Design prompt template +3. Implement context injection +4. Add citation handling +5. Test generation quality + +#### Copy-Paste Prompts +``` +Use @llm-application-dev-ai-assistant to integrate LLM ``` -### Semantic Chunking -```python -from langchain.text_splitters import SemanticChunker +### Phase 7: Caching -splitter = SemanticChunker( - embeddings=OpenAIEmbeddings(), - breakpoint_threshold_type="percentile" -) +#### Skills to Invoke +- `prompt-caching` - Prompt caching +- `rag-engineer` - RAG optimization + +#### Actions +1. Implement response caching +2. Set up embedding cache +3. Configure TTL +4. Add cache invalidation +5. Monitor hit rates + +#### Copy-Paste Prompts +``` +Use @prompt-caching to implement RAG caching ``` -### Markdown Header Splitter -```python -from langchain.text_splitters import MarkdownHeaderTextSplitter +### Phase 8: Evaluation -headers_to_split_on = [ - ("#", "Header 1"), - ("##", "Header 2"), - ("###", "Header 3"), -] +#### Skills to Invoke +- `llm-evaluation` - LLM evaluation +- `evaluation` - AI evaluation -splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on) +#### Actions +1. Define evaluation metrics +2. Create test dataset +3. Measure retrieval accuracy +4. Evaluate generation quality +5. Iterate on improvements + +#### Copy-Paste Prompts +``` +Use @llm-evaluation to evaluate RAG system ``` -## Vector Store Configurations +## RAG Architecture -### Pinecone -```python -import pinecone -from langchain.vectorstores import Pinecone - -pinecone.init(api_key="your-api-key", environment="us-west1-gcp") - -index = pinecone.Index("your-index-name") - -vectorstore = Pinecone(index, embeddings.embed_query, "text") +``` +User Query -> Embedding -> Vector Search -> Retrieved Docs -> LLM -> Response + | | | | + Model Vector DB Chunk Store Prompt + Context ``` -### Weaviate -```python -import weaviate -from langchain.vectorstores import Weaviate +## Quality Gates -client = weaviate.Client("http://localhost:8080") +- [ ] Embedding model selected +- [ ] Vector DB configured +- [ ] Chunking implemented +- [ ] Retrieval working +- [ ] LLM integrated +- [ ] Evaluation passing -vectorstore = Weaviate(client, "Document", "content", embeddings) -``` +## Related Workflow Bundles -### Chroma (Local) -```python -from langchain.vectorstores import Chroma - -vectorstore = Chroma( - collection_name="my_collection", - embedding_function=embeddings, - persist_directory="./chroma_db" -) -``` - -## Retrieval Optimization - -### 1. Metadata Filtering -```python -# Add metadata during indexing -chunks_with_metadata = [] -for i, chunk in enumerate(chunks): - chunk.metadata = { - "source": chunk.metadata.get("source"), - "page": i, - "category": determine_category(chunk.page_content) - } - chunks_with_metadata.append(chunk) - -# Filter during retrieval -results = vectorstore.similarity_search( - "query", - filter={"category": "technical"}, - k=5 -) -``` - -### 2. Maximal Marginal Relevance -```python -# Balance relevance with diversity -results = vectorstore.max_marginal_relevance_search( - "query", - k=5, - fetch_k=20, # Fetch 20, return top 5 diverse - lambda_mult=0.5 # 0=max diversity, 1=max relevance -) -``` - -### 3. Reranking with Cross-Encoder -```python -from sentence_transformers import CrossEncoder - -reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2') - -# Get initial results -candidates = vectorstore.similarity_search("query", k=20) - -# Rerank -pairs = [[query, doc.page_content] for doc in candidates] -scores = reranker.predict(pairs) - -# Sort by score and take top k -reranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)[:5] -``` - -## Prompt Engineering for RAG - -### Contextual Prompt -```python -prompt_template = """Use the following context to answer the question. If you cannot answer based on the context, say "I don't have enough information." - -Context: -{context} - -Question: {question} - -Answer:""" -``` - -### With Citations -```python -prompt_template = """Answer the question based on the context below. Include citations using [1], [2], etc. - -Context: -{context} - -Question: {question} - -Answer (with citations):""" -``` - -### With Confidence -```python -prompt_template = """Answer the question using the context. Provide a confidence score (0-100%) for your answer. - -Context: -{context} - -Question: {question} - -Answer: -Confidence:""" -``` - -## Evaluation Metrics - -```python -def evaluate_rag_system(qa_chain, test_cases): - metrics = { - 'accuracy': [], - 'retrieval_quality': [], - 'groundedness': [] - } - - for test in test_cases: - result = qa_chain({"query": test['question']}) - - # Check if answer matches expected - accuracy = calculate_accuracy(result['result'], test['expected']) - metrics['accuracy'].append(accuracy) - - # Check if relevant docs were retrieved - retrieval_quality = evaluate_retrieved_docs( - result['source_documents'], - test['relevant_docs'] - ) - metrics['retrieval_quality'].append(retrieval_quality) - - # Check if answer is grounded in context - groundedness = check_groundedness( - result['result'], - result['source_documents'] - ) - metrics['groundedness'].append(groundedness) - - return {k: sum(v)/len(v) for k, v in metrics.items()} -``` - -## Resources - -- **references/vector-databases.md**: Detailed comparison of vector DBs -- **references/embeddings.md**: Embedding model selection guide -- **references/retrieval-strategies.md**: Advanced retrieval techniques -- **references/reranking.md**: Reranking methods and when to use them -- **references/context-window.md**: Managing context limits -- **assets/vector-store-config.yaml**: Configuration templates -- **assets/retriever-pipeline.py**: Complete RAG pipeline -- **assets/embedding-models.md**: Model comparison and benchmarks - -## Best Practices - -1. **Chunk Size**: Balance between context and specificity (500-1000 tokens) -2. **Overlap**: Use 10-20% overlap to preserve context at boundaries -3. **Metadata**: Include source, page, timestamp for filtering and debugging -4. **Hybrid Search**: Combine semantic and keyword search for best results -5. **Reranking**: Improve top results with cross-encoder -6. **Citations**: Always return source documents for transparency -7. **Evaluation**: Continuously test retrieval quality and answer accuracy -8. **Monitoring**: Track retrieval metrics in production - -## Common Issues - -- **Poor Retrieval**: Check embedding quality, chunk size, query formulation -- **Irrelevant Results**: Add metadata filtering, use hybrid search, rerank -- **Missing Information**: Ensure documents are properly indexed -- **Slow Queries**: Optimize vector store, use caching, reduce k -- **Hallucinations**: Improve grounding prompt, add verification step +- `ai-ml` - AI/ML development +- `ai-agent-development` - AI agents +- `database` - Vector databases diff --git a/skills/react-nextjs-development/SKILL.md b/skills/react-nextjs-development/SKILL.md new file mode 100644 index 00000000..e35c1e2e --- /dev/null +++ b/skills/react-nextjs-development/SKILL.md @@ -0,0 +1,229 @@ +--- +name: react-nextjs-development +description: "React and Next.js 14+ application development with App Router, Server Components, TypeScript, Tailwind CSS, and modern frontend patterns." +source: personal +risk: safe +domain: frontend-development +category: granular-workflow-bundle +version: 1.0.0 +--- + +# React/Next.js Development Workflow + +## Overview + +Specialized workflow for building React and Next.js 14+ applications with modern patterns including App Router, Server Components, TypeScript, and Tailwind CSS. + +## When to Use This Workflow + +Use this workflow when: +- Building new React applications +- Creating Next.js 14+ projects with App Router +- Implementing Server Components +- Setting up TypeScript with React +- Styling with Tailwind CSS +- Building full-stack Next.js applications + +## Workflow Phases + +### Phase 1: Project Setup + +#### Skills to Invoke +- `app-builder` - Application scaffolding +- `senior-fullstack` - Full-stack guidance +- `nextjs-app-router-patterns` - Next.js 14+ patterns +- `typescript-pro` - TypeScript setup + +#### Actions +1. Choose project type (React SPA, Next.js app) +2. Select build tool (Vite, Next.js, Create React App) +3. Scaffold project structure +4. Configure TypeScript +5. Set up ESLint and Prettier + +#### Copy-Paste Prompts +``` +Use @app-builder to scaffold a new Next.js 14 project with App Router +``` + +``` +Use @nextjs-app-router-patterns to set up Server Components +``` + +### Phase 2: Component Architecture + +#### Skills to Invoke +- `frontend-developer` - Component development +- `react-patterns` - React patterns +- `react-state-management` - State management +- `react-ui-patterns` - UI patterns + +#### Actions +1. Design component hierarchy +2. Create base components +3. Implement layout components +4. Set up state management +5. Create custom hooks + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create reusable React components +``` + +``` +Use @react-patterns to implement proper component composition +``` + +``` +Use @react-state-management to set up Zustand store +``` + +### Phase 3: Styling and Design + +#### Skills to Invoke +- `frontend-design` - UI design +- `tailwind-patterns` - Tailwind CSS +- `tailwind-design-system` - Design system +- `core-components` - Component library + +#### Actions +1. Set up Tailwind CSS +2. Configure design tokens +3. Create utility classes +4. Build component styles +5. Implement responsive design + +#### Copy-Paste Prompts +``` +Use @tailwind-patterns to style components with Tailwind CSS v4 +``` + +``` +Use @frontend-design to create a modern dashboard UI +``` + +### Phase 4: Data Fetching + +#### Skills to Invoke +- `nextjs-app-router-patterns` - Server Components +- `react-state-management` - React Query +- `api-patterns` - API integration + +#### Actions +1. Implement Server Components +2. Set up React Query/SWR +3. Create API client +4. Handle loading states +5. Implement error boundaries + +#### Copy-Paste Prompts +``` +Use @nextjs-app-router-patterns to implement Server Components data fetching +``` + +### Phase 5: Routing and Navigation + +#### Skills to Invoke +- `nextjs-app-router-patterns` - App Router +- `nextjs-best-practices` - Next.js patterns + +#### Actions +1. Set up file-based routing +2. Create dynamic routes +3. Implement nested routes +4. Add route guards +5. Configure redirects + +#### Copy-Paste Prompts +``` +Use @nextjs-app-router-patterns to set up parallel routes and intercepting routes +``` + +### Phase 6: Forms and Validation + +#### Skills to Invoke +- `frontend-developer` - Form development +- `typescript-advanced-types` - Type validation +- `react-ui-patterns` - Form patterns + +#### Actions +1. Choose form library (React Hook Form, Formik) +2. Set up validation (Zod, Yup) +3. Create form components +4. Handle submissions +5. Implement error handling + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create forms with React Hook Form and Zod +``` + +### Phase 7: Testing + +#### Skills to Invoke +- `javascript-testing-patterns` - Jest/Vitest +- `playwright-skill` - E2E testing +- `e2e-testing-patterns` - E2E patterns + +#### Actions +1. Set up testing framework +2. Write unit tests +3. Create component tests +4. Implement E2E tests +5. Configure CI integration + +#### Copy-Paste Prompts +``` +Use @javascript-testing-patterns to write Vitest tests +``` + +``` +Use @playwright-skill to create E2E tests for critical flows +``` + +### Phase 8: Build and Deployment + +#### Skills to Invoke +- `vercel-deployment` - Vercel deployment +- `vercel-deploy-claimable` - Vercel deployment +- `web-performance-optimization` - Performance + +#### Actions +1. Configure build settings +2. Optimize bundle size +3. Set up environment variables +4. Deploy to Vercel +5. Configure preview deployments + +#### Copy-Paste Prompts +``` +Use @vercel-deployment to deploy Next.js app to production +``` + +## Technology Stack + +| Category | Technology | +|----------|------------| +| Framework | Next.js 14+, React 18+ | +| Language | TypeScript 5+ | +| Styling | Tailwind CSS v4 | +| State | Zustand, React Query | +| Forms | React Hook Form, Zod | +| Testing | Vitest, Playwright | +| Deployment | Vercel | + +## Quality Gates + +- [ ] TypeScript compiles without errors +- [ ] All tests passing +- [ ] Linting clean +- [ ] Performance metrics met (LCP, CLS, FID) +- [ ] Accessibility checked (WCAG 2.1) +- [ ] Responsive design verified + +## Related Workflow Bundles + +- `development` - General development +- `testing-qa` - Testing workflow +- `documentation` - Documentation +- `typescript-development` - TypeScript patterns diff --git a/skills/security-audit/SKILL.md b/skills/security-audit/SKILL.md new file mode 100644 index 00000000..ca38fa7f --- /dev/null +++ b/skills/security-audit/SKILL.md @@ -0,0 +1,218 @@ +--- +name: security-audit +description: "Comprehensive security auditing workflow covering web application testing, API security, penetration testing, vulnerability scanning, and security hardening." +source: personal +risk: safe +domain: security +category: workflow-bundle +version: 1.0.0 +--- + +# Security Auditing Workflow Bundle + +## Overview + +Comprehensive security auditing workflow for web applications, APIs, and infrastructure. This bundle orchestrates skills for penetration testing, vulnerability assessment, security scanning, and remediation. + +## When to Use This Workflow + +Use this workflow when: +- Performing security audits on web applications +- Testing API security +- Conducting penetration tests +- Scanning for vulnerabilities +- Hardening application security +- Compliance security assessments + +## Workflow Phases + +### Phase 1: Reconnaissance + +#### Skills to Invoke +- `scanning-tools` - Security scanning +- `shodan-reconnaissance` - Shodan searches +- `top-web-vulnerabilities` - OWASP Top 10 + +#### Actions +1. Identify target scope +2. Gather intelligence +3. Map attack surface +4. Identify technologies +5. Document findings + +#### Copy-Paste Prompts +``` +Use @scanning-tools to perform initial reconnaissance +``` + +``` +Use @shodan-reconnaissance to find exposed services +``` + +### Phase 2: Vulnerability Scanning + +#### Skills to Invoke +- `vulnerability-scanner` - Vulnerability analysis +- `security-scanning-security-sast` - Static analysis +- `security-scanning-security-dependencies` - Dependency scanning + +#### Actions +1. Run automated scanners +2. Perform static analysis +3. Scan dependencies +4. Identify misconfigurations +5. Document vulnerabilities + +#### Copy-Paste Prompts +``` +Use @vulnerability-scanner to scan for OWASP Top 10 vulnerabilities +``` + +``` +Use @security-scanning-security-dependencies to audit dependencies +``` + +### Phase 3: Web Application Testing + +#### Skills to Invoke +- `top-web-vulnerabilities` - OWASP vulnerabilities +- `sql-injection-testing` - SQL injection +- `xss-html-injection` - XSS testing +- `broken-authentication` - Authentication testing +- `idor-testing` - IDOR testing +- `file-path-traversal` - Path traversal +- `burp-suite-testing` - Burp Suite testing + +#### Actions +1. Test for injection flaws +2. Test authentication mechanisms +3. Test session management +4. Test access controls +5. Test input validation +6. Test security headers + +#### Copy-Paste Prompts +``` +Use @sql-injection-testing to test for SQL injection vulnerabilities +``` + +``` +Use @xss-html-injection to test for cross-site scripting +``` + +``` +Use @broken-authentication to test authentication security +``` + +### Phase 4: API Security Testing + +#### Skills to Invoke +- `api-fuzzing-bug-bounty` - API fuzzing +- `api-security-best-practices` - API security + +#### Actions +1. Enumerate API endpoints +2. Test authentication/authorization +3. Test rate limiting +4. Test input validation +5. Test error handling +6. Document API vulnerabilities + +#### Copy-Paste Prompts +``` +Use @api-fuzzing-bug-bounty to fuzz API endpoints +``` + +### Phase 5: Penetration Testing + +#### Skills to Invoke +- `pentest-commands` - Penetration testing commands +- `pentest-checklist` - Pentest planning +- `ethical-hacking-methodology` - Ethical hacking +- `metasploit-framework` - Metasploit + +#### Actions +1. Plan penetration test +2. Execute attack scenarios +3. Exploit vulnerabilities +4. Document proof of concept +5. Assess impact + +#### Copy-Paste Prompts +``` +Use @pentest-checklist to plan penetration test +``` + +``` +Use @pentest-commands to execute penetration testing +``` + +### Phase 6: Security Hardening + +#### Skills to Invoke +- `security-scanning-security-hardening` - Security hardening +- `auth-implementation-patterns` - Authentication +- `api-security-best-practices` - API security + +#### Actions +1. Implement security controls +2. Configure security headers +3. Set up authentication +4. Implement authorization +5. Configure logging +6. Apply patches + +#### Copy-Paste Prompts +``` +Use @security-scanning-security-hardening to harden application security +``` + +### Phase 7: Reporting + +#### Skills to Invoke +- `reporting-standards` - Security reporting + +#### Actions +1. Document findings +2. Assess risk levels +3. Provide remediation steps +4. Create executive summary +5. Generate technical report + +## Security Testing Checklist + +### OWASP Top 10 +- [ ] Injection (SQL, NoSQL, OS, LDAP) +- [ ] Broken Authentication +- [ ] Sensitive Data Exposure +- [ ] XML External Entities (XXE) +- [ ] Broken Access Control +- [ ] Security Misconfiguration +- [ ] Cross-Site Scripting (XSS) +- [ ] Insecure Deserialization +- [ ] Using Components with Known Vulnerabilities +- [ ] Insufficient Logging & Monitoring + +### API Security +- [ ] Authentication mechanisms +- [ ] Authorization checks +- [ ] Rate limiting +- [ ] Input validation +- [ ] Error handling +- [ ] Security headers + +## Quality Gates + +- [ ] All planned tests executed +- [ ] Vulnerabilities documented +- [ ] Proof of concepts captured +- [ ] Risk assessments completed +- [ ] Remediation steps provided +- [ ] Report generated + +## Related Workflow Bundles + +- `development` - Secure development practices +- `wordpress` - WordPress security +- `cloud-devops` - Cloud security +- `testing-qa` - Security testing diff --git a/skills/shader-programming-glsl/SKILL.md b/skills/shader-programming-glsl/SKILL.md new file mode 100644 index 00000000..f1ca2afc --- /dev/null +++ b/skills/shader-programming-glsl/SKILL.md @@ -0,0 +1,121 @@ +--- +name: shader-programming-glsl +description: Expert guide for writing efficient GLSL shaders (Vertex/Fragment) for web and game engines, covering syntax, uniforms, and common effects. +risk: safe +source: community +--- + +# Shader Programming GLSL + +## Overview + +A comprehensive guide to writing GPU shaders using GLSL (OpenGL Shading Language). Learn syntax, uniforms, varying variables, and key mathematical concepts like swizzling and vector operations for visual effects. + +## When to Use This Skill + +- Use when creating custom visual effects in WebGL, Three.js, or game engines. +- Use when optimizing graphics rendering performance. +- Use when implementing post-processing effects (blur, bloom, color correction). +- Use when procedurally generating textures or geometry on the GPU. + +## Step-by-Step Guide + +### 1. Structure: Vertex vs. Fragment + +Understand the pipeline: +- **Vertex Shader**: Transforms 3D coordinates to 2D screen space (`gl_Position`). +- **Fragment Shader**: Colors individual pixels (`gl_FragColor`). + +```glsl +// Vertex Shader (basic) +attribute vec3 position; +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; + +void main() { + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +} +``` + +```glsl +// Fragment Shader (basic) +uniform vec3 color; + +void main() { + gl_FragColor = vec4(color, 1.0); +} +``` + +### 2. Uniforms and Varyings + +- `uniform`: Data constant for all vertices/fragments (passed from CPU). +- `varying`: Data interpolated from vertex to fragment shader. + +```glsl +// Passing UV coordinates +varying vec2 vUv; + +// In Vertex Shader +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +} + +// In Fragment Shader +void main() { + // Gradient based on UV + gl_FragColor = vec4(vUv.x, vUv.y, 1.0, 1.0); +} +``` + +### 3. Swizzling & Vector Math + +Access vector components freely: `vec4 color = vec4(1.0, 0.5, 0.0, 1.0);` +- `color.rgb` -> `vec3(1.0, 0.5, 0.0)` +- `color.zyx` -> `vec3(0.0, 0.5, 1.0)` (reordering) + +## Examples + +### Example 1: Simple Raymarching (SDF Sphere) + +```glsl +float sdSphere(vec3 p, float s) { + return length(p) - s; +} + +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y; + vec3 ro = vec3(0.0, 0.0, -3.0); // Ray Origin + vec3 rd = normalize(vec3(uv, 1.0)); // Ray Direction + + float t = 0.0; + for(int i = 0; i < 64; i++) { + vec3 p = ro + rd * t; + float d = sdSphere(p, 1.0); // Sphere radius 1.0 + if(d < 0.001) break; + t += d; + } + + vec3 col = vec3(0.0); + if(t < 10.0) { + vec3 p = ro + rd * t; + vec3 normal = normalize(p); + col = normal * 0.5 + 0.5; // Color by normal + } + + fragColor = vec4(col, 1.0); +} +``` + +## Best Practices + +- βœ… **Do:** Use `mix()` for linear interpolation instead of manual math. +- βœ… **Do:** Use `step()` and `smoothstep()` for thresholding and soft edges (avoid `if` branches). +- βœ… **Do:** Pack data into vectors (`vec4`) to minimize memory access. +- ❌ **Don't:** Use heavy branching (`if-else`) inside loops if possible; it hurts GPU parallelism. +- ❌ **Don't:** Calculate constant values inside the shader; pre-calculate them on the CPU (uniforms). + +## Troubleshooting + +**Problem:** Shader compiles but screen is black. +**Solution:** Check if `gl_Position.w` is correct (usually 1.0). Check if uniforms are actually being set from the host application. Verify UV coordinates are within [0, 1]. diff --git a/skills/terraform-infrastructure/SKILL.md b/skills/terraform-infrastructure/SKILL.md new file mode 100644 index 00000000..5f88d102 --- /dev/null +++ b/skills/terraform-infrastructure/SKILL.md @@ -0,0 +1,164 @@ +--- +name: terraform-infrastructure +description: "Terraform infrastructure as code workflow for provisioning cloud resources, creating reusable modules, and managing infrastructure at scale." +source: personal +risk: safe +domain: cloud-devops +category: granular-workflow-bundle +version: 1.0.0 +--- + +# Terraform Infrastructure Workflow + +## Overview + +Specialized workflow for infrastructure as code using Terraform including resource provisioning, module creation, state management, and multi-environment deployments. + +## When to Use This Workflow + +Use this workflow when: +- Provisioning cloud infrastructure +- Creating Terraform modules +- Managing multi-environment infra +- Implementing IaC best practices +- Setting up Terraform workflows + +## Workflow Phases + +### Phase 1: Terraform Setup + +#### Skills to Invoke +- `terraform-skill` - Terraform basics +- `terraform-specialist` - Advanced Terraform + +#### Actions +1. Initialize Terraform +2. Configure backend +3. Set up providers +4. Configure variables +5. Create outputs + +#### Copy-Paste Prompts +``` +Use @terraform-skill to set up Terraform project +``` + +### Phase 2: Resource Provisioning + +#### Skills to Invoke +- `terraform-module-library` - Terraform modules +- `cloud-architect` - Cloud architecture + +#### Actions +1. Design infrastructure +2. Create resource definitions +3. Configure networking +4. Set up compute +5. Add storage + +#### Copy-Paste Prompts +``` +Use @terraform-module-library to provision cloud resources +``` + +### Phase 3: Module Creation + +#### Skills to Invoke +- `terraform-module-library` - Module creation + +#### Actions +1. Design module interface +2. Create module structure +3. Define variables/outputs +4. Add documentation +5. Test module + +#### Copy-Paste Prompts +``` +Use @terraform-module-library to create reusable Terraform module +``` + +### Phase 4: State Management + +#### Skills to Invoke +- `terraform-specialist` - State management + +#### Actions +1. Configure remote backend +2. Set up state locking +3. Implement workspaces +4. Configure state access +5. Set up backup + +#### Copy-Paste Prompts +``` +Use @terraform-specialist to configure Terraform state +``` + +### Phase 5: Multi-Environment + +#### Skills to Invoke +- `terraform-specialist` - Multi-environment + +#### Actions +1. Design environment structure +2. Create environment configs +3. Set up variable files +4. Configure isolation +5. Test deployments + +#### Copy-Paste Prompts +``` +Use @terraform-specialist to set up multi-environment Terraform +``` + +### Phase 6: CI/CD Integration + +#### Skills to Invoke +- `cicd-automation-workflow-automate` - CI/CD +- `github-actions-templates` - GitHub Actions + +#### Actions +1. Create CI pipeline +2. Configure plan/apply +3. Set up approvals +4. Add validation +5. Test pipeline + +#### Copy-Paste Prompts +``` +Use @cicd-automation-workflow-automate to create Terraform CI/CD +``` + +### Phase 7: Security + +#### Skills to Invoke +- `secrets-management` - Secrets management +- `terraform-specialist` - Security + +#### Actions +1. Configure secrets +2. Set up encryption +3. Implement policies +4. Add compliance +5. Audit access + +#### Copy-Paste Prompts +``` +Use @secrets-management to secure Terraform secrets +``` + +## Quality Gates + +- [ ] Resources provisioned +- [ ] Modules working +- [ ] State configured +- [ ] Multi-env tested +- [ ] CI/CD working +- [ ] Security verified + +## Related Workflow Bundles + +- `cloud-devops` - Cloud/DevOps +- `kubernetes-deployment` - Kubernetes +- `aws-infrastructure` - AWS specific diff --git a/skills/testing-qa/SKILL.md b/skills/testing-qa/SKILL.md new file mode 100644 index 00000000..117310c1 --- /dev/null +++ b/skills/testing-qa/SKILL.md @@ -0,0 +1,231 @@ +--- +name: testing-qa +description: "Comprehensive testing and QA workflow covering unit testing, integration testing, E2E testing, browser automation, and quality assurance." +source: personal +risk: safe +domain: quality-assurance +category: workflow-bundle +version: 1.0.0 +--- + +# Testing/QA Workflow Bundle + +## Overview + +Comprehensive testing and quality assurance workflow covering unit tests, integration tests, E2E tests, browser automation, and quality gates for production-ready software. + +## When to Use This Workflow + +Use this workflow when: +- Setting up testing infrastructure +- Writing unit and integration tests +- Implementing E2E tests +- Automating browser testing +- Establishing quality gates +- Performing code review + +## Workflow Phases + +### Phase 1: Test Strategy + +#### Skills to Invoke +- `test-automator` - Test automation +- `test-driven-development` - TDD + +#### Actions +1. Define testing strategy +2. Choose testing frameworks +3. Plan test coverage +4. Set up test infrastructure +5. Configure CI integration + +#### Copy-Paste Prompts +``` +Use @test-automator to design testing strategy +``` + +``` +Use @test-driven-development to implement TDD workflow +``` + +### Phase 2: Unit Testing + +#### Skills to Invoke +- `javascript-testing-patterns` - Jest/Vitest +- `python-testing-patterns` - pytest +- `unit-testing-test-generate` - Test generation +- `tdd-orchestrator` - TDD orchestration + +#### Actions +1. Write unit tests +2. Set up test fixtures +3. Configure mocking +4. Measure coverage +5. Integrate with CI + +#### Copy-Paste Prompts +``` +Use @javascript-testing-patterns to write Jest tests +``` + +``` +Use @python-testing-patterns to write pytest tests +``` + +``` +Use @unit-testing-test-generate to generate unit tests +``` + +### Phase 3: Integration Testing + +#### Skills to Invoke +- `api-testing-observability-api-mock` - API testing +- `e2e-testing-patterns` - Integration patterns + +#### Actions +1. Design integration tests +2. Set up test databases +3. Configure API mocks +4. Test service interactions +5. Verify data flows + +#### Copy-Paste Prompts +``` +Use @api-testing-observability-api-mock to test APIs +``` + +### Phase 4: E2E Testing + +#### Skills to Invoke +- `playwright-skill` - Playwright testing +- `e2e-testing-patterns` - E2E patterns +- `webapp-testing` - Web app testing + +#### Actions +1. Design E2E scenarios +2. Write test scripts +3. Configure test data +4. Set up parallel execution +5. Implement visual regression + +#### Copy-Paste Prompts +``` +Use @playwright-skill to create E2E tests +``` + +``` +Use @e2e-testing-patterns to design E2E strategy +``` + +### Phase 5: Browser Automation + +#### Skills to Invoke +- `browser-automation` - Browser automation +- `webapp-testing` - Browser testing +- `screenshots` - Screenshot automation + +#### Actions +1. Set up browser automation +2. Configure headless testing +3. Implement visual testing +4. Capture screenshots +5. Test responsive design + +#### Copy-Paste Prompts +``` +Use @browser-automation to automate browser tasks +``` + +``` +Use @screenshots to capture marketing screenshots +``` + +### Phase 6: Performance Testing + +#### Skills to Invoke +- `performance-engineer` - Performance engineering +- `performance-profiling` - Performance profiling +- `web-performance-optimization` - Web performance + +#### Actions +1. Design performance tests +2. Set up load testing +3. Measure response times +4. Identify bottlenecks +5. Optimize performance + +#### Copy-Paste Prompts +``` +Use @performance-engineer to test application performance +``` + +### Phase 7: Code Review + +#### Skills to Invoke +- `code-reviewer` - AI code review +- `code-review-excellence` - Review best practices +- `find-bugs` - Bug detection +- `security-scanning-security-sast` - Security scanning + +#### Actions +1. Configure review tools +2. Run automated reviews +3. Check for bugs +4. Verify security +5. Approve changes + +#### Copy-Paste Prompts +``` +Use @code-reviewer to review pull requests +``` + +``` +Use @find-bugs to detect bugs in code +``` + +### Phase 8: Quality Gates + +#### Skills to Invoke +- `lint-and-validate` - Linting +- `verification-before-completion` - Verification + +#### Actions +1. Configure linters +2. Set up formatters +3. Define quality metrics +4. Implement gates +5. Monitor compliance + +#### Copy-Paste Prompts +``` +Use @lint-and-validate to check code quality +``` + +``` +Use @verification-before-completion to verify changes +``` + +## Testing Pyramid + +``` + / / \ E2E Tests (10%) + /---- / \ Integration Tests (20%) + /-------- / \ Unit Tests (70%) + /------------``` + +## Quality Gates Checklist + +- [ ] Unit test coverage > 80% +- [ ] All tests passing +- [ ] E2E tests for critical paths +- [ ] Performance benchmarks met +- [ ] Security scan passed +- [ ] Code review approved +- [ ] Linting clean + +## Related Workflow Bundles + +- `development` - Development workflow +- `security-audit` - Security testing +- `cloud-devops` - CI/CD integration +- `ai-ml` - AI testing diff --git a/skills/web-security-testing/SKILL.md b/skills/web-security-testing/SKILL.md new file mode 100644 index 00000000..8f0b0934 --- /dev/null +++ b/skills/web-security-testing/SKILL.md @@ -0,0 +1,184 @@ +--- +name: web-security-testing +description: "Web application security testing workflow for OWASP Top 10 vulnerabilities including injection, XSS, authentication flaws, and access control issues." +source: personal +risk: safe +domain: security +category: granular-workflow-bundle +version: 1.0.0 +--- + +# Web Security Testing Workflow + +## Overview + +Specialized workflow for testing web applications against OWASP Top 10 vulnerabilities including injection attacks, XSS, broken authentication, and access control issues. + +## When to Use This Workflow + +Use this workflow when: +- Testing web application security +- Performing OWASP Top 10 assessment +- Conducting penetration tests +- Validating security controls +- Bug bounty hunting + +## Workflow Phases + +### Phase 1: Reconnaissance + +#### Skills to Invoke +- `scanning-tools` - Security scanning +- `top-web-vulnerabilities` - OWASP knowledge + +#### Actions +1. Map application surface +2. Identify technologies +3. Discover endpoints +4. Find subdomains +5. Document findings + +#### Copy-Paste Prompts +``` +Use @scanning-tools to perform web application reconnaissance +``` + +### Phase 2: Injection Testing + +#### Skills to Invoke +- `sql-injection-testing` - SQL injection +- `sqlmap-database-pentesting` - SQLMap + +#### Actions +1. Test SQL injection +2. Test NoSQL injection +3. Test command injection +4. Test LDAP injection +5. Document vulnerabilities + +#### Copy-Paste Prompts +``` +Use @sql-injection-testing to test for SQL injection +``` + +``` +Use @sqlmap-database-pentesting to automate SQL injection testing +``` + +### Phase 3: XSS Testing + +#### Skills to Invoke +- `xss-html-injection` - XSS testing +- `html-injection-testing` - HTML injection + +#### Actions +1. Test reflected XSS +2. Test stored XSS +3. Test DOM-based XSS +4. Test XSS filters +5. Document findings + +#### Copy-Paste Prompts +``` +Use @xss-html-injection to test for cross-site scripting +``` + +### Phase 4: Authentication Testing + +#### Skills to Invoke +- `broken-authentication` - Authentication testing + +#### Actions +1. Test credential stuffing +2. Test brute force protection +3. Test session management +4. Test password policies +5. Test MFA implementation + +#### Copy-Paste Prompts +``` +Use @broken-authentication to test authentication security +``` + +### Phase 5: Access Control Testing + +#### Skills to Invoke +- `idor-testing` - IDOR testing +- `file-path-traversal` - Path traversal + +#### Actions +1. Test vertical privilege escalation +2. Test horizontal privilege escalation +3. Test IDOR vulnerabilities +4. Test directory traversal +5. Test unauthorized access + +#### Copy-Paste Prompts +``` +Use @idor-testing to test for insecure direct object references +``` + +``` +Use @file-path-traversal to test for path traversal +``` + +### Phase 6: Security Headers + +#### Skills to Invoke +- `api-security-best-practices` - Security headers + +#### Actions +1. Check CSP implementation +2. Verify HSTS configuration +3. Test X-Frame-Options +4. Check X-Content-Type-Options +5. Verify referrer policy + +#### Copy-Paste Prompts +``` +Use @api-security-best-practices to audit security headers +``` + +### Phase 7: Reporting + +#### Skills to Invoke +- `reporting-standards` - Security reporting + +#### Actions +1. Document vulnerabilities +2. Assess risk levels +3. Provide remediation +4. Create proof of concept +5. Generate report + +#### Copy-Paste Prompts +``` +Use @reporting-standards to create security report +``` + +## OWASP Top 10 Checklist + +- [ ] A01: Broken Access Control +- [ ] A02: Cryptographic Failures +- [ ] A03: Injection +- [ ] A04: Insecure Design +- [ ] A05: Security Misconfiguration +- [ ] A06: Vulnerable Components +- [ ] A07: Authentication Failures +- [ ] A08: Software/Data Integrity +- [ ] A09: Logging/Monitoring +- [ ] A10: SSRF + +## Quality Gates + +- [ ] All OWASP Top 10 tested +- [ ] Vulnerabilities documented +- [ ] Proof of concepts captured +- [ ] Remediation provided +- [ ] Report generated + +## Related Workflow Bundles + +- `security-audit` - Security auditing +- `api-security-testing` - API security +- `wordpress-security` - WordPress security diff --git a/skills/wordpress-plugin-development/SKILL.md b/skills/wordpress-plugin-development/SKILL.md new file mode 100644 index 00000000..5b5b8da6 --- /dev/null +++ b/skills/wordpress-plugin-development/SKILL.md @@ -0,0 +1,204 @@ +--- +name: wordpress-plugin-development +description: "WordPress plugin development workflow covering plugin architecture, hooks, admin interfaces, REST API, and security best practices." +source: personal +risk: safe +domain: wordpress-development +category: granular-workflow-bundle +version: 1.0.0 +--- + +# WordPress Plugin Development Workflow + +## Overview + +Specialized workflow for creating WordPress plugins with proper architecture, hooks system, admin interfaces, REST API endpoints, and security practices. + +## When to Use This Workflow + +Use this workflow when: +- Creating custom WordPress plugins +- Extending WordPress functionality +- Building admin interfaces +- Adding REST API endpoints +- Integrating third-party services + +## Workflow Phases + +### Phase 1: Plugin Setup + +#### Skills to Invoke +- `app-builder` - Project scaffolding +- `backend-dev-guidelines` - Backend patterns + +#### Actions +1. Create plugin directory structure +2. Set up main plugin file with header +3. Implement activation/deactivation hooks +4. Set up autoloading +5. Configure text domain + +#### Copy-Paste Prompts +``` +Use @app-builder to scaffold a new WordPress plugin +``` + +### Phase 2: Plugin Architecture + +#### Skills to Invoke +- `backend-dev-guidelines` - Architecture patterns + +#### Actions +1. Design plugin class structure +2. Implement singleton pattern +3. Create loader class +4. Set up dependency injection +5. Configure plugin lifecycle + +#### Copy-Paste Prompts +``` +Use @backend-dev-guidelines to design plugin architecture +``` + +### Phase 3: Hooks Implementation + +#### Skills to Invoke +- `wordpress-penetration-testing` - WordPress patterns + +#### Actions +1. Register action hooks +2. Create filter hooks +3. Implement callback functions +4. Set up hook priorities +5. Add conditional hooks + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to understand WordPress hooks +``` + +### Phase 4: Admin Interface + +#### Skills to Invoke +- `frontend-developer` - Admin UI + +#### Actions +1. Create admin menu +2. Build settings pages +3. Implement options registration +4. Add settings sections/fields +5. Create admin notices + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create WordPress admin interface +``` + +### Phase 5: Database Operations + +#### Skills to Invoke +- `database-design` - Database design +- `postgresql` - Database patterns + +#### Actions +1. Create custom tables +2. Implement CRUD operations +3. Add data validation +4. Set up data sanitization +5. Create data upgrade routines + +#### Copy-Paste Prompts +``` +Use @database-design to design plugin database schema +``` + +### Phase 6: REST API + +#### Skills to Invoke +- `api-design-principles` - API design +- `api-patterns` - API patterns + +#### Actions +1. Register REST routes +2. Create endpoint callbacks +3. Implement permission callbacks +4. Add request validation +5. Document API endpoints + +#### Copy-Paste Prompts +``` +Use @api-design-principles to create WordPress REST API endpoints +``` + +### Phase 7: Security + +#### Skills to Invoke +- `wordpress-penetration-testing` - WordPress security +- `security-scanning-security-sast` - Security scanning + +#### Actions +1. Implement nonce verification +2. Add capability checks +3. Sanitize all inputs +4. Escape all outputs +5. Secure database queries + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to audit plugin security +``` + +### Phase 8: Testing + +#### Skills to Invoke +- `test-automator` - Test automation +- `php-pro` - PHP testing + +#### Actions +1. Set up PHPUnit +2. Create unit tests +3. Write integration tests +4. Test with WordPress test suite +5. Configure CI + +#### Copy-Paste Prompts +``` +Use @test-automator to set up plugin testing +``` + +## Plugin Structure + +``` +plugin-name/ +β”œβ”€β”€ plugin-name.php +β”œβ”€β”€ includes/ +β”‚ β”œβ”€β”€ class-plugin.php +β”‚ β”œβ”€β”€ class-loader.php +β”‚ β”œβ”€β”€ class-activator.php +β”‚ └── class-deactivator.php +β”œβ”€β”€ admin/ +β”‚ β”œβ”€β”€ class-plugin-admin.php +β”‚ β”œβ”€β”€ css/ +β”‚ └── js/ +β”œβ”€β”€ public/ +β”‚ β”œβ”€β”€ class-plugin-public.php +β”‚ β”œβ”€β”€ css/ +β”‚ └── js/ +β”œβ”€β”€ languages/ +└── vendor/ +``` + +## Quality Gates + +- [ ] Plugin activates without errors +- [ ] All hooks working +- [ ] Admin interface functional +- [ ] Security measures implemented +- [ ] Tests passing +- [ ] Documentation complete + +## Related Workflow Bundles + +- `wordpress` - WordPress development +- `wordpress-theme-development` - Theme development +- `wordpress-woocommerce` - WooCommerce diff --git a/skills/wordpress-theme-development/SKILL.md b/skills/wordpress-theme-development/SKILL.md new file mode 100644 index 00000000..88c54500 --- /dev/null +++ b/skills/wordpress-theme-development/SKILL.md @@ -0,0 +1,189 @@ +--- +name: wordpress-theme-development +description: "WordPress theme development workflow covering theme architecture, template hierarchy, custom post types, block editor support, and responsive design." +source: personal +risk: safe +domain: wordpress-development +category: granular-workflow-bundle +version: 1.0.0 +--- + +# WordPress Theme Development Workflow + +## Overview + +Specialized workflow for creating custom WordPress themes from scratch, including modern block editor (Gutenberg) support, template hierarchy, and responsive design. + +## When to Use This Workflow + +Use this workflow when: +- Creating custom WordPress themes +- Converting designs to WordPress themes +- Adding block editor support +- Implementing custom post types +- Building child themes + +## Workflow Phases + +### Phase 1: Theme Setup + +#### Skills to Invoke +- `app-builder` - Project scaffolding +- `frontend-developer` - Frontend development + +#### Actions +1. Create theme directory structure +2. Set up style.css with theme header +3. Create functions.php +4. Configure theme support +5. Set up enqueue scripts/styles + +#### Copy-Paste Prompts +``` +Use @app-builder to scaffold a new WordPress theme project +``` + +### Phase 2: Template Hierarchy + +#### Skills to Invoke +- `frontend-developer` - Template development + +#### Actions +1. Create index.php (fallback template) +2. Implement header.php and footer.php +3. Create single.php for posts +4. Create page.php for pages +5. Add archive.php for archives +6. Implement search.php and 404.php + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create WordPress template files +``` + +### Phase 3: Theme Functions + +#### Skills to Invoke +- `backend-dev-guidelines` - Backend patterns + +#### Actions +1. Register navigation menus +2. Add theme support (thumbnails, RSS, etc.) +3. Register widget areas +4. Create custom template tags +5. Implement helper functions + +#### Copy-Paste Prompts +``` +Use @backend-dev-guidelines to create theme functions +``` + +### Phase 4: Custom Post Types + +#### Skills to Invoke +- `wordpress-penetration-testing` - WordPress patterns + +#### Actions +1. Register custom post types +2. Create custom taxonomies +3. Add custom meta boxes +4. Implement custom fields +5. Create archive templates + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to understand WordPress CPT patterns +``` + +### Phase 5: Block Editor Support + +#### Skills to Invoke +- `frontend-developer` - Block development + +#### Actions +1. Enable block editor support +2. Register custom blocks +3. Create block styles +4. Add block patterns +5. Configure block templates + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create custom Gutenberg blocks +``` + +### Phase 6: Styling and Design + +#### Skills to Invoke +- `frontend-design` - UI design +- `tailwind-patterns` - Tailwind CSS + +#### Actions +1. Implement responsive design +2. Add CSS framework or custom styles +3. Create design system +4. Implement theme customizer +5. Add accessibility features + +#### Copy-Paste Prompts +``` +Use @frontend-design to create responsive theme design +``` + +### Phase 7: Testing + +#### Skills to Invoke +- `playwright-skill` - Browser testing +- `webapp-testing` - Web app testing + +#### Actions +1. Test across browsers +2. Verify responsive breakpoints +3. Test block editor +4. Check accessibility +5. Performance testing + +#### Copy-Paste Prompts +``` +Use @playwright-skill to test WordPress theme +``` + +## Theme Structure + +``` +theme-name/ +β”œβ”€β”€ style.css +β”œβ”€β”€ functions.php +β”œβ”€β”€ index.php +β”œβ”€β”€ header.php +β”œβ”€β”€ footer.php +β”œβ”€β”€ sidebar.php +β”œβ”€β”€ single.php +β”œβ”€β”€ page.php +β”œβ”€β”€ archive.php +β”œβ”€β”€ search.php +β”œβ”€β”€ 404.php +β”œβ”€β”€ comments.php +β”œβ”€β”€ template-parts/ +β”œβ”€β”€ inc/ +β”œβ”€β”€ assets/ +β”‚ β”œβ”€β”€ css/ +β”‚ β”œβ”€β”€ js/ +β”‚ └── images/ +└── languages/ +``` + +## Quality Gates + +- [ ] All templates working +- [ ] Block editor supported +- [ ] Responsive design verified +- [ ] Accessibility checked +- [ ] Performance optimized +- [ ] Cross-browser tested + +## Related Workflow Bundles + +- `wordpress` - WordPress development +- `wordpress-plugin-development` - Plugin development +- `wordpress-woocommerce` - WooCommerce diff --git a/skills/wordpress-woocommerce-development/SKILL.md b/skills/wordpress-woocommerce-development/SKILL.md new file mode 100644 index 00000000..24af7fa1 --- /dev/null +++ b/skills/wordpress-woocommerce-development/SKILL.md @@ -0,0 +1,188 @@ +--- +name: wordpress-woocommerce-development +description: "WooCommerce store development workflow covering store setup, payment integration, shipping configuration, and customization." +source: personal +risk: safe +domain: wordpress-development +category: granular-workflow-bundle +version: 1.0.0 +--- + +# WordPress WooCommerce Development Workflow + +## Overview + +Specialized workflow for building WooCommerce stores including setup, payment gateway integration, shipping configuration, custom product types, and store optimization. + +## When to Use This Workflow + +Use this workflow when: +- Setting up WooCommerce stores +- Integrating payment gateways +- Configuring shipping methods +- Creating custom product types +- Building subscription products + +## Workflow Phases + +### Phase 1: Store Setup + +#### Skills to Invoke +- `app-builder` - Project scaffolding +- `wordpress-penetration-testing` - WordPress patterns + +#### Actions +1. Install WooCommerce +2. Run setup wizard +3. Configure store settings +4. Set up tax rules +5. Configure currency + +#### Copy-Paste Prompts +``` +Use @app-builder to set up WooCommerce store +``` + +### Phase 2: Product Configuration + +#### Skills to Invoke +- `wordpress-penetration-testing` - WooCommerce patterns + +#### Actions +1. Create product categories +2. Add product attributes +3. Configure product types +4. Set up variable products +5. Add product images + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to configure WooCommerce products +``` + +### Phase 3: Payment Integration + +#### Skills to Invoke +- `payment-integration` - Payment processing +- `stripe-integration` - Stripe +- `paypal-integration` - PayPal + +#### Actions +1. Choose payment gateways +2. Configure Stripe +3. Set up PayPal +4. Add offline payments +5. Test payment flows + +#### Copy-Paste Prompts +``` +Use @stripe-integration to integrate Stripe payments +``` + +``` +Use @paypal-integration to integrate PayPal +``` + +### Phase 4: Shipping Configuration + +#### Skills to Invoke +- `wordpress-penetration-testing` - WooCommerce shipping + +#### Actions +1. Set up shipping zones +2. Configure shipping methods +3. Add flat rate shipping +4. Set up free shipping +5. Integrate carriers + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to configure shipping +``` + +### Phase 5: Store Customization + +#### Skills to Invoke +- `frontend-developer` - Store customization +- `frontend-design` - Store design + +#### Actions +1. Customize product pages +2. Modify cart page +3. Style checkout flow +4. Create custom templates +5. Add custom fields + +#### Copy-Paste Prompts +``` +Use @frontend-developer to customize WooCommerce templates +``` + +### Phase 6: Extensions + +#### Skills to Invoke +- `wordpress-penetration-testing` - WooCommerce extensions + +#### Actions +1. Install required extensions +2. Configure subscriptions +3. Set up bookings +4. Add memberships +5. Integrate marketplace + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to configure WooCommerce extensions +``` + +### Phase 7: Optimization + +#### Skills to Invoke +- `web-performance-optimization` - Performance +- `database-optimizer` - Database optimization + +#### Actions +1. Optimize product images +2. Enable caching +3. Optimize database +4. Configure CDN +5. Set up lazy loading + +#### Copy-Paste Prompts +``` +Use @web-performance-optimization to optimize WooCommerce store +``` + +### Phase 8: Testing + +#### Skills to Invoke +- `playwright-skill` - E2E testing +- `test-automator` - Test automation + +#### Actions +1. Test checkout flow +2. Verify payment processing +3. Test email notifications +4. Check mobile experience +5. Performance testing + +#### Copy-Paste Prompts +``` +Use @playwright-skill to test WooCommerce checkout flow +``` + +## Quality Gates + +- [ ] Products displaying correctly +- [ ] Checkout flow working +- [ ] Payments processing +- [ ] Shipping calculating +- [ ] Emails sending +- [ ] Mobile responsive + +## Related Workflow Bundles + +- `wordpress` - WordPress development +- `wordpress-theme-development` - Theme development +- `wordpress-plugin-development` - Plugin development +- `payment-integration` - Payment processing diff --git a/skills/wordpress/SKILL.md b/skills/wordpress/SKILL.md new file mode 100644 index 00000000..336c7679 --- /dev/null +++ b/skills/wordpress/SKILL.md @@ -0,0 +1,319 @@ +--- +name: wordpress +description: "Complete WordPress development workflow covering theme development, plugin creation, WooCommerce integration, performance optimization, and security hardening." +source: personal +risk: safe +domain: software-development +category: workflow-bundle +version: 1.0.0 +--- + +# WordPress Development Workflow Bundle + +## Overview + +Comprehensive WordPress development workflow covering theme development, plugin creation, WooCommerce integration, performance optimization, and security. This bundle orchestrates skills for building production-ready WordPress sites and applications. + +## When to Use This Workflow + +Use this workflow when: +- Building new WordPress websites +- Creating custom themes +- Developing WordPress plugins +- Setting up WooCommerce stores +- Optimizing WordPress performance +- Hardening WordPress security + +## Workflow Phases + +### Phase 1: WordPress Setup + +#### Skills to Invoke +- `app-builder` - Project scaffolding +- `environment-setup-guide` - Development environment + +#### Actions +1. Set up local development environment (LocalWP, Docker, or Valet) +2. Install WordPress +3. Configure development database +4. Set up version control +5. Configure wp-config.php for development + +#### Copy-Paste Prompts +``` +Use @app-builder to scaffold a new WordPress project with modern tooling +``` + +### Phase 2: Theme Development + +#### Skills to Invoke +- `frontend-developer` - Component development +- `frontend-design` - UI implementation +- `tailwind-patterns` - Styling +- `web-performance-optimization` - Performance + +#### Actions +1. Design theme architecture +2. Create theme files (style.css, functions.php, index.php) +3. Implement template hierarchy +4. Create custom page templates +5. Add custom post types and taxonomies +6. Implement theme customization options +7. Add responsive design + +#### Theme Structure +``` +theme-name/ +β”œβ”€β”€ style.css +β”œβ”€β”€ functions.php +β”œβ”€β”€ index.php +β”œβ”€β”€ header.php +β”œβ”€β”€ footer.php +β”œβ”€β”€ sidebar.php +β”œβ”€β”€ single.php +β”œβ”€β”€ page.php +β”œβ”€β”€ archive.php +β”œβ”€β”€ search.php +β”œβ”€β”€ 404.php +β”œβ”€β”€ template-parts/ +β”œβ”€β”€ inc/ +β”œβ”€β”€ assets/ +β”‚ β”œβ”€β”€ css/ +β”‚ β”œβ”€β”€ js/ +β”‚ └── images/ +└── languages/ +``` + +#### Copy-Paste Prompts +``` +Use @frontend-developer to create a custom WordPress theme with React components +``` + +``` +Use @tailwind-patterns to style WordPress theme with modern CSS +``` + +### Phase 3: Plugin Development + +#### Skills to Invoke +- `backend-dev-guidelines` - Backend standards +- `api-design-principles` - API design +- `auth-implementation-patterns` - Authentication + +#### Actions +1. Design plugin architecture +2. Create plugin boilerplate +3. Implement hooks (actions and filters) +4. Create admin interfaces +5. Add custom database tables +6. Implement REST API endpoints +7. Add settings and options pages + +#### Plugin Structure +``` +plugin-name/ +β”œβ”€β”€ plugin-name.php +β”œβ”€β”€ includes/ +β”‚ β”œβ”€β”€ class-plugin-activator.php +β”‚ β”œβ”€β”€ class-plugin-deactivator.php +β”‚ β”œβ”€β”€ class-plugin-loader.php +β”‚ └── class-plugin.php +β”œβ”€β”€ admin/ +β”‚ β”œβ”€β”€ class-plugin-admin.php +β”‚ β”œβ”€β”€ css/ +β”‚ └── js/ +β”œβ”€β”€ public/ +β”‚ β”œβ”€β”€ class-plugin-public.php +β”‚ β”œβ”€β”€ css/ +β”‚ └── js/ +└── languages/ +``` + +#### Copy-Paste Prompts +``` +Use @backend-dev-guidelines to create a WordPress plugin with proper architecture +``` + +### Phase 4: WooCommerce Integration + +#### Skills to Invoke +- `payment-integration` - Payment processing +- `stripe-integration` - Stripe payments +- `billing-automation` - Billing workflows + +#### Actions +1. Install and configure WooCommerce +2. Create custom product types +3. Customize checkout flow +4. Integrate payment gateways +5. Set up shipping methods +6. Create custom order statuses +7. Implement subscription products +8. Add custom email templates + +#### Copy-Paste Prompts +``` +Use @payment-integration to set up WooCommerce with Stripe +``` + +``` +Use @billing-automation to create subscription products in WooCommerce +``` + +### Phase 5: Performance Optimization + +#### Skills to Invoke +- `web-performance-optimization` - Performance optimization +- `database-optimizer` - Database optimization + +#### Actions +1. Implement caching (object, page, browser) +2. Optimize images (lazy loading, WebP) +3. Minify and combine assets +4. Enable CDN +5. Optimize database queries +6. Implement lazy loading +7. Configure OPcache +8. Set up Redis/Memcached + +#### Performance Checklist +- [ ] Page load time < 3 seconds +- [ ] Time to First Byte < 200ms +- [ ] Largest Contentful Paint < 2.5s +- [ ] Cumulative Layout Shift < 0.1 +- [ ] First Input Delay < 100ms + +#### Copy-Paste Prompts +``` +Use @web-performance-optimization to audit and improve WordPress performance +``` + +### Phase 6: Security Hardening + +#### Skills to Invoke +- `security-auditor` - Security audit +- `wordpress-penetration-testing` - WordPress security testing +- `sast-configuration` - Static analysis + +#### Actions +1. Update WordPress core, themes, plugins +2. Implement security headers +3. Configure file permissions +4. Set up firewall rules +5. Enable two-factor authentication +6. Implement rate limiting +7. Configure security logging +8. Set up malware scanning + +#### Security Checklist +- [ ] WordPress core updated +- [ ] All plugins/themes updated +- [ ] Strong passwords enforced +- [ ] Two-factor authentication enabled +- [ ] Security headers configured +- [ ] XML-RPC disabled or protected +- [ ] File editing disabled +- [ ] Database prefix changed +- [ ] Regular backups configured + +#### Copy-Paste Prompts +``` +Use @wordpress-penetration-testing to audit WordPress security +``` + +``` +Use @security-auditor to perform comprehensive security review +``` + +### Phase 7: Testing + +#### Skills to Invoke +- `test-automator` - Test automation +- `playwright-skill` - E2E testing +- `webapp-testing` - Web app testing + +#### Actions +1. Write unit tests for custom code +2. Create integration tests +3. Set up E2E tests +4. Test cross-browser compatibility +5. Test responsive design +6. Performance testing +7. Security testing + +#### Copy-Paste Prompts +``` +Use @playwright-skill to create E2E tests for WordPress site +``` + +### Phase 8: Deployment + +#### Skills to Invoke +- `deployment-engineer` - Deployment +- `cicd-automation-workflow-automate` - CI/CD +- `github-actions-templates` - GitHub Actions + +#### Actions +1. Set up staging environment +2. Configure deployment pipeline +3. Set up database migrations +4. Configure environment variables +5. Enable maintenance mode during deployment +6. Deploy to production +7. Verify deployment +8. Monitor post-deployment + +#### Copy-Paste Prompts +``` +Use @deployment-engineer to set up WordPress deployment pipeline +``` + +## WordPress-Specific Workflows + +### Custom Post Type Development +```php +register_post_type('book', [ + 'labels' => [...], + 'public' => true, + 'has_archive' => true, + 'supports' => ['title', 'editor', 'thumbnail', 'excerpt'], + 'menu_icon' => 'dashicons-book', +]); +``` + +### Custom REST API Endpoint +```php +add_action('rest_api_init', function() { + register_rest_route('myplugin/v1', '/books', [ + 'methods' => 'GET', + 'callback' => 'get_books', + 'permission_callback' => '__return_true', + ]); +}); +``` + +### WooCommerce Custom Product Type +```php +add_action('init', function() { + class WC_Product_Custom extends WC_Product { + // Custom product implementation + } +}); +``` + +## Quality Gates + +Before moving to next phase, verify: +- [ ] All custom code tested +- [ ] Security scan passed +- [ ] Performance targets met +- [ ] Cross-browser tested +- [ ] Mobile responsive verified +- [ ] Accessibility checked (WCAG 2.1) + +## Related Workflow Bundles + +- `development` - General web development +- `security-audit` - Security testing +- `testing-qa` - Testing workflow +- `ecommerce` - E-commerce development diff --git a/skills/workflow- bundlesREADME.md b/skills/workflow- bundlesREADME.md new file mode 100644 index 00000000..618ac2cd --- /dev/null +++ b/skills/workflow- bundlesREADME.md @@ -0,0 +1,185 @@ +# Workflow Bundles + +Consolidated and granular workflow bundles that orchestrate multiple skills for specific development and operational scenarios. + +## Granular Workflow Bundles (Specialized) + +### Frontend Development + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `react-nextjs-development` | React and Next.js 14+ with App Router, Server Components, TypeScript, Tailwind | nextjs-app-router-patterns, react-patterns, tailwind-patterns | + +### Backend Development + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `python-fastapi-development` | FastAPI backend with async patterns, SQLAlchemy, Pydantic, auth | fastapi-pro, fastapi-router-py, pydantic-models-py | + +### WordPress Development + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `wordpress-theme-development` | Custom WordPress themes, block editor, template hierarchy | frontend-developer, wordpress-penetration-testing | +| `wordpress-plugin-development` | WordPress plugins, hooks, admin interfaces, REST API | backend-dev-guidelines, wordpress-penetration-testing | +| `wordpress-woocommerce-development` | WooCommerce stores, payments, shipping, customization | payment-integration, stripe-integration, paypal-integration | + +### System Administration + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `bash-scripting` | Production bash scripts with defensive patterns, testing | bash-pro, bash-defensive-patterns, bats-testing-patterns | +| `linux-troubleshooting` | Linux system diagnostics, performance, service issues | bash-linux, devops-troubleshooter, server-management | + +### Security Testing + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `web-security-testing` | OWASP Top 10 testing, injection, XSS, authentication | sql-injection-testing, xss-html-injection, broken-authentication | +| `api-security-testing` | REST/GraphQL API security, auth, rate limiting, fuzzing | api-fuzzing-bug-bounty, api-security-best-practices | + +### AI/ML + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `rag-implementation` | RAG systems, embeddings, vector DB, chunking, retrieval | rag-engineer, embedding-strategies, vector-database-engineer | +| `ai-agent-development` | Autonomous agents, multi-agent systems, CrewAI, LangGraph | ai-agents-architect, crewai, langgraph, autonomous-agents | + +### Cloud/DevOps + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `kubernetes-deployment` | K8s deployment, Helm charts, service mesh, security | kubernetes-architect, helm-chart-scaffolding, istio-traffic-management | +| `terraform-infrastructure` | Terraform IaC, modules, state management, CI/CD | terraform-skill, terraform-specialist, terraform-module-library | + +### Database + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `postgresql-optimization` | PostgreSQL query tuning, indexing, configuration, monitoring | postgres-best-practices, sql-optimization-patterns, database-optimizer | + +### Testing/QA + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `e2e-testing` | Playwright E2E, visual regression, cross-browser, CI/CD | playwright-skill, e2e-testing-patterns, browser-automation | + +### Documentation + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `api-documentation` | OpenAPI specs, developer guides, code examples, interactive docs | api-documenter, openapi-spec-generation, api-documentation-generator | + +## Consolidated Workflow Bundles + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `development` | Full-stack web and mobile development | app-builder, senior-fullstack, frontend-developer, backend-architect | +| `wordpress` | WordPress theme, plugin, WooCommerce, security, performance | wordpress-penetration-testing, frontend-developer, payment-integration | +| `os-scripting` | Shell scripting and system administration | bash-pro, bash-defensive-patterns, shellcheck-configuration | +| `security-audit` | Security testing and penetration testing | vulnerability-scanner, sql-injection-testing, pentest-commands | +| `ai-ml` | LLM applications, RAG, and AI agents | ai-agents-architect, rag-engineer, crewai, langgraph | +| `cloud-devops` | Cloud infrastructure and DevOps | cloud-architect, kubernetes-architect, terraform-skill | +| `database` | Database design and operations | database-architect, prisma-expert, data-engineer | +| `testing-qa` | Testing and quality assurance | test-automator, playwright-skill, code-reviewer | +| `documentation` | Documentation generation | docs-architect, c4-architecture, wiki-architect | +| `office-productivity` | Document and office automation | libreoffice-writer, libreoffice-calc, libreoffice-impress | + +## LibreOffice Skills + +The following LibreOffice skills are available in the `skills/libreoffice/` directory: + +| Skill | Description | +|-------|-------------| +| `writer` | Document creation and automation (ODT) | +| `calc` | Spreadsheet automation (ODS) | +| `impress` | Presentation creation (ODP) | +| `draw` | Vector graphics and diagrams (ODG) | +| `base` | Database management (ODB) | + +## Usage + +Each workflow bundle provides: + +1. **When to Use** - Scenarios for invoking the workflow +2. **Workflow Phases** - Step-by-step phases with skills to invoke +3. **Copy-Paste Prompts** - Ready-to-use prompts for each phase +4. **Quality Gates** - Checkpoints to verify before proceeding +5. **Related Bundles** - Links to complementary workflows + +### Example Usage + +``` +Use @react-nextjs-development to build a new Next.js 14 application +``` + +``` +Use @python-fastapi-development to create a REST API with FastAPI +``` + +``` +Use @wordpress-theme-development to create a custom WordPress theme +``` + +``` +Use @rag-implementation to build a RAG system with vector search +``` + +``` +Use @kubernetes-deployment to deploy application to Kubernetes +``` + +``` +Use @web-security-testing to perform OWASP Top 10 assessment +``` + +``` +Use @libreoffice-writer to convert DOCX documents to ODT format +``` + +## Structure + +Each workflow bundle follows this structure: + +```yaml +--- +name: bundle-name +description: "Brief description" +source: personal +risk: safe +domain: domain-category +category: granular-workflow-bundle # or consolidated-workflow-bundle +version: 1.0.0 +--- + +# Bundle Name + +## Overview +... + +## When to Use This Workflow +... + +## Workflow Phases +... + +## Quality Gates +... + +## Related Workflow Bundles +... +``` + +## Contributing + +When creating new workflow bundles: + +1. Identify common skill combinations +2. Document clear workflow phases +3. Provide copy-paste prompts +4. Define quality gates +5. Link related bundles + +## License + +Same as the parent project. diff --git a/skills/workflow_bundles_readme.md b/skills/workflow_bundles_readme.md new file mode 100644 index 00000000..618ac2cd --- /dev/null +++ b/skills/workflow_bundles_readme.md @@ -0,0 +1,185 @@ +# Workflow Bundles + +Consolidated and granular workflow bundles that orchestrate multiple skills for specific development and operational scenarios. + +## Granular Workflow Bundles (Specialized) + +### Frontend Development + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `react-nextjs-development` | React and Next.js 14+ with App Router, Server Components, TypeScript, Tailwind | nextjs-app-router-patterns, react-patterns, tailwind-patterns | + +### Backend Development + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `python-fastapi-development` | FastAPI backend with async patterns, SQLAlchemy, Pydantic, auth | fastapi-pro, fastapi-router-py, pydantic-models-py | + +### WordPress Development + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `wordpress-theme-development` | Custom WordPress themes, block editor, template hierarchy | frontend-developer, wordpress-penetration-testing | +| `wordpress-plugin-development` | WordPress plugins, hooks, admin interfaces, REST API | backend-dev-guidelines, wordpress-penetration-testing | +| `wordpress-woocommerce-development` | WooCommerce stores, payments, shipping, customization | payment-integration, stripe-integration, paypal-integration | + +### System Administration + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `bash-scripting` | Production bash scripts with defensive patterns, testing | bash-pro, bash-defensive-patterns, bats-testing-patterns | +| `linux-troubleshooting` | Linux system diagnostics, performance, service issues | bash-linux, devops-troubleshooter, server-management | + +### Security Testing + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `web-security-testing` | OWASP Top 10 testing, injection, XSS, authentication | sql-injection-testing, xss-html-injection, broken-authentication | +| `api-security-testing` | REST/GraphQL API security, auth, rate limiting, fuzzing | api-fuzzing-bug-bounty, api-security-best-practices | + +### AI/ML + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `rag-implementation` | RAG systems, embeddings, vector DB, chunking, retrieval | rag-engineer, embedding-strategies, vector-database-engineer | +| `ai-agent-development` | Autonomous agents, multi-agent systems, CrewAI, LangGraph | ai-agents-architect, crewai, langgraph, autonomous-agents | + +### Cloud/DevOps + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `kubernetes-deployment` | K8s deployment, Helm charts, service mesh, security | kubernetes-architect, helm-chart-scaffolding, istio-traffic-management | +| `terraform-infrastructure` | Terraform IaC, modules, state management, CI/CD | terraform-skill, terraform-specialist, terraform-module-library | + +### Database + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `postgresql-optimization` | PostgreSQL query tuning, indexing, configuration, monitoring | postgres-best-practices, sql-optimization-patterns, database-optimizer | + +### Testing/QA + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `e2e-testing` | Playwright E2E, visual regression, cross-browser, CI/CD | playwright-skill, e2e-testing-patterns, browser-automation | + +### Documentation + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `api-documentation` | OpenAPI specs, developer guides, code examples, interactive docs | api-documenter, openapi-spec-generation, api-documentation-generator | + +## Consolidated Workflow Bundles + +| Bundle | Description | Key Skills | +|--------|-------------|------------| +| `development` | Full-stack web and mobile development | app-builder, senior-fullstack, frontend-developer, backend-architect | +| `wordpress` | WordPress theme, plugin, WooCommerce, security, performance | wordpress-penetration-testing, frontend-developer, payment-integration | +| `os-scripting` | Shell scripting and system administration | bash-pro, bash-defensive-patterns, shellcheck-configuration | +| `security-audit` | Security testing and penetration testing | vulnerability-scanner, sql-injection-testing, pentest-commands | +| `ai-ml` | LLM applications, RAG, and AI agents | ai-agents-architect, rag-engineer, crewai, langgraph | +| `cloud-devops` | Cloud infrastructure and DevOps | cloud-architect, kubernetes-architect, terraform-skill | +| `database` | Database design and operations | database-architect, prisma-expert, data-engineer | +| `testing-qa` | Testing and quality assurance | test-automator, playwright-skill, code-reviewer | +| `documentation` | Documentation generation | docs-architect, c4-architecture, wiki-architect | +| `office-productivity` | Document and office automation | libreoffice-writer, libreoffice-calc, libreoffice-impress | + +## LibreOffice Skills + +The following LibreOffice skills are available in the `skills/libreoffice/` directory: + +| Skill | Description | +|-------|-------------| +| `writer` | Document creation and automation (ODT) | +| `calc` | Spreadsheet automation (ODS) | +| `impress` | Presentation creation (ODP) | +| `draw` | Vector graphics and diagrams (ODG) | +| `base` | Database management (ODB) | + +## Usage + +Each workflow bundle provides: + +1. **When to Use** - Scenarios for invoking the workflow +2. **Workflow Phases** - Step-by-step phases with skills to invoke +3. **Copy-Paste Prompts** - Ready-to-use prompts for each phase +4. **Quality Gates** - Checkpoints to verify before proceeding +5. **Related Bundles** - Links to complementary workflows + +### Example Usage + +``` +Use @react-nextjs-development to build a new Next.js 14 application +``` + +``` +Use @python-fastapi-development to create a REST API with FastAPI +``` + +``` +Use @wordpress-theme-development to create a custom WordPress theme +``` + +``` +Use @rag-implementation to build a RAG system with vector search +``` + +``` +Use @kubernetes-deployment to deploy application to Kubernetes +``` + +``` +Use @web-security-testing to perform OWASP Top 10 assessment +``` + +``` +Use @libreoffice-writer to convert DOCX documents to ODT format +``` + +## Structure + +Each workflow bundle follows this structure: + +```yaml +--- +name: bundle-name +description: "Brief description" +source: personal +risk: safe +domain: domain-category +category: granular-workflow-bundle # or consolidated-workflow-bundle +version: 1.0.0 +--- + +# Bundle Name + +## Overview +... + +## When to Use This Workflow +... + +## Workflow Phases +... + +## Quality Gates +... + +## Related Workflow Bundles +... +``` + +## Contributing + +When creating new workflow bundles: + +1. Identify common skill combinations +2. Document clear workflow phases +3. Provide copy-paste prompts +4. Define quality gates +5. Link related bundles + +## License + +Same as the parent project. diff --git a/skills_index.json b/skills_index.json index 7c986794..35d011b5 100644 --- a/skills_index.json +++ b/skills_index.json @@ -161,6 +161,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "ai-agent-development", + "path": "skills/ai-agent-development", + "category": "uncategorized", + "name": "ai-agent-development", + "description": "AI agent development workflow for building autonomous agents, multi-agent systems, and agent orchestration with CrewAI, LangGraph, and custom agents.", + "risk": "safe", + "source": "personal" + }, { "id": "ai-agents-architect", "path": "skills/ai-agents-architect", @@ -170,6 +179,15 @@ "risk": "unknown", "source": "vibeship-spawner-skills (Apache 2.0)" }, + { + "id": "ai-ml", + "path": "skills/ai-ml", + "category": "uncategorized", + "name": "ai-ml", + "description": "AI and machine learning workflow covering LLM application development, RAG implementation, agent architecture, ML pipelines, and AI-powered features.", + "risk": "safe", + "source": "personal" + }, { "id": "ai-product", "path": "skills/ai-product", @@ -323,6 +341,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "api-documentation", + "path": "skills/api-documentation", + "category": "uncategorized", + "name": "api-documentation", + "description": "API documentation workflow for generating OpenAPI specs, creating developer guides, and maintaining comprehensive API documentation.", + "risk": "safe", + "source": "personal" + }, { "id": "api-documentation-generator", "path": "skills/api-documentation-generator", @@ -359,6 +386,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "api-security-testing", + "path": "skills/api-security-testing", + "category": "uncategorized", + "name": "api-security-testing", + "description": "API security testing workflow for REST and GraphQL APIs covering authentication, authorization, rate limiting, input validation, and security best practices.", + "risk": "safe", + "source": "personal" + }, { "id": "api-testing-observability-api-mock", "path": "skills/api-testing-observability-api-mock", @@ -1709,6 +1745,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "base", + "path": "skills/libreoffice/base", + "category": "libreoffice", + "name": "base", + "description": "Database management, forms, reports, and data operations with LibreOffice Base.", + "risk": "safe", + "source": "personal" + }, { "id": "basecamp-automation", "path": "skills/basecamp-automation", @@ -1745,6 +1790,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "bash-scripting", + "path": "skills/bash-scripting", + "category": "uncategorized", + "name": "bash-scripting", + "description": "Bash scripting workflow for creating production-ready shell scripts with defensive patterns, error handling, and testing.", + "risk": "safe", + "source": "personal" + }, { "id": "bats-testing-patterns", "path": "skills/bats-testing-patterns", @@ -2006,6 +2060,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "calc", + "path": "skills/libreoffice/calc", + "category": "libreoffice", + "name": "calc", + "description": "Spreadsheet creation, format conversion (ODS/XLSX/CSV), formulas, data automation with LibreOffice Calc.", + "risk": "safe", + "source": "personal" + }, { "id": "calendly-automation", "path": "skills/calendly-automation", @@ -2240,6 +2303,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "cloud-devops", + "path": "skills/cloud-devops", + "category": "uncategorized", + "name": "cloud-devops", + "description": "Cloud infrastructure and DevOps workflow covering AWS, Azure, GCP, Kubernetes, Terraform, CI/CD, monitoring, and cloud-native development.", + "risk": "safe", + "source": "personal" + }, { "id": "cloud-penetration-testing", "path": "skills/cloud-penetration-testing", @@ -2825,6 +2897,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "database", + "path": "skills/database", + "category": "uncategorized", + "name": "database", + "description": "Database development and operations workflow covering SQL, NoSQL, database design, migrations, optimization, and data engineering.", + "risk": "safe", + "source": "personal" + }, { "id": "database-admin", "path": "skills/database-admin", @@ -3086,6 +3167,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "development", + "path": "skills/development", + "category": "uncategorized", + "name": "development", + "description": "Comprehensive web, mobile, and backend development workflow bundling frontend, backend, full-stack, and mobile development skills for end-to-end application delivery.", + "risk": "safe", + "source": "personal" + }, { "id": "devops-troubleshooter", "path": "skills/devops-troubleshooter", @@ -3176,6 +3266,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "documentation", + "path": "skills/documentation", + "category": "uncategorized", + "name": "documentation", + "description": "Documentation generation workflow covering API docs, architecture docs, README files, code comments, and technical writing.", + "risk": "safe", + "source": "personal" + }, { "id": "documentation-generation-doc-generate", "path": "skills/documentation-generation-doc-generate", @@ -3248,6 +3347,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "draw", + "path": "skills/libreoffice/draw", + "category": "libreoffice", + "name": "draw", + "description": "Vector graphics and diagram creation, format conversion (ODG/SVG/PDF) with LibreOffice Draw.", + "risk": "safe", + "source": "personal" + }, { "id": "dropbox-automation", "path": "skills/dropbox-automation", @@ -3266,6 +3374,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "e2e-testing", + "path": "skills/e2e-testing", + "category": "uncategorized", + "name": "e2e-testing", + "description": "End-to-end testing workflow with Playwright for browser automation, visual regression, cross-browser testing, and CI/CD integration.", + "risk": "safe", + "source": "personal" + }, { "id": "e2e-testing-patterns", "path": "skills/e2e-testing-patterns", @@ -4391,6 +4508,15 @@ "risk": "safe", "source": "https://github.com/sanjay3290/ai-skills/tree/main/skills/imagen" }, + { + "id": "impress", + "path": "skills/libreoffice/impress", + "category": "libreoffice", + "name": "impress", + "description": "Presentation creation, format conversion (ODP/PPTX/PDF), slide automation with LibreOffice Impress.", + "risk": "safe", + "source": "personal" + }, { "id": "incident-responder", "path": "skills/incident-responder", @@ -4634,6 +4760,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "kubernetes-deployment", + "path": "skills/kubernetes-deployment", + "category": "uncategorized", + "name": "kubernetes-deployment", + "description": "Kubernetes deployment workflow for container orchestration, Helm charts, service mesh, and production-ready K8s configurations.", + "risk": "safe", + "source": "personal" + }, { "id": "langchain-architecture", "path": "skills/langchain-architecture", @@ -4778,6 +4913,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "linux-troubleshooting", + "path": "skills/linux-troubleshooting", + "category": "uncategorized", + "name": "linux-troubleshooting", + "description": "Linux system troubleshooting workflow for diagnosing and resolving system issues, performance problems, and service failures.", + "risk": "safe", + "source": "personal" + }, { "id": "llm-app-patterns", "path": "skills/llm-app-patterns", @@ -5462,6 +5606,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "office-productivity", + "path": "skills/office-productivity", + "category": "uncategorized", + "name": "office-productivity", + "description": "Office productivity workflow covering document creation, spreadsheet automation, presentation generation, and integration with LibreOffice and Microsoft Office formats.", + "risk": "safe", + "source": "personal" + }, { "id": "on-call-handoff-patterns", "path": "skills/on-call-handoff-patterns", @@ -5498,6 +5651,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "os-scripting", + "path": "skills/os-scripting", + "category": "uncategorized", + "name": "os-scripting", + "description": "Operating system and shell scripting troubleshooting workflow for Linux, macOS, and Windows. Covers bash scripting, system administration, debugging, and automation.", + "risk": "safe", + "source": "personal" + }, { "id": "oss-hunter", "path": "skills/oss-hunter", @@ -5777,6 +5939,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "postgresql-optimization", + "path": "skills/postgresql-optimization", + "category": "uncategorized", + "name": "postgresql-optimization", + "description": "PostgreSQL database optimization workflow for query tuning, indexing strategies, performance analysis, and production database management.", + "risk": "safe", + "source": "personal" + }, { "id": "posthog-automation", "path": "skills/posthog-automation", @@ -5984,6 +6155,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "python-fastapi-development", + "path": "skills/python-fastapi-development", + "category": "uncategorized", + "name": "python-fastapi-development", + "description": "Python FastAPI backend development with async patterns, SQLAlchemy, Pydantic, authentication, and production API patterns.", + "risk": "safe", + "source": "personal" + }, { "id": "python-packaging", "path": "skills/python-packaging", @@ -6052,9 +6232,9 @@ "path": "skills/rag-implementation", "category": "uncategorized", "name": "rag-implementation", - "description": "Build Retrieval-Augmented Generation (RAG) systems for LLM applications with vector databases and semantic search. Use when implementing knowledge-grounded AI, building document Q&A systems, or int...", - "risk": "unknown", - "source": "community" + "description": "RAG (Retrieval-Augmented Generation) implementation workflow covering embedding selection, vector database setup, chunking strategies, and retrieval optimization.", + "risk": "safe", + "source": "personal" }, { "id": "react-best-practices", @@ -6101,6 +6281,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "react-nextjs-development", + "path": "skills/react-nextjs-development", + "category": "uncategorized", + "name": "react-nextjs-development", + "description": "React and Next.js 14+ application development with App Router, Server Components, TypeScript, Tailwind CSS, and modern frontend patterns.", + "risk": "safe", + "source": "personal" + }, { "id": "react-patterns", "path": "skills/react-patterns", @@ -6416,6 +6605,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "security-audit", + "path": "skills/security-audit", + "category": "uncategorized", + "name": "security-audit", + "description": "Comprehensive security auditing workflow covering web application testing, API security, penetration testing, vulnerability scanning, and security hardening.", + "risk": "safe", + "source": "personal" + }, { "id": "security-bluebook-builder", "path": "skills/security-bluebook-builder", @@ -7217,6 +7415,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "terraform-infrastructure", + "path": "skills/terraform-infrastructure", + "category": "uncategorized", + "name": "terraform-infrastructure", + "description": "Terraform infrastructure as code workflow for provisioning cloud resources, creating reusable modules, and managing infrastructure at scale.", + "risk": "safe", + "source": "personal" + }, { "id": "terraform-module-library", "path": "skills/terraform-module-library", @@ -7271,6 +7478,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "testing-qa", + "path": "skills/testing-qa", + "category": "uncategorized", + "name": "testing-qa", + "description": "Comprehensive testing and QA workflow covering unit testing, integration testing, E2E testing, browser automation, and quality assurance.", + "risk": "safe", + "source": "personal" + }, { "id": "theme-factory", "path": "skills/theme-factory", @@ -7730,6 +7946,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "web-security-testing", + "path": "skills/web-security-testing", + "category": "uncategorized", + "name": "web-security-testing", + "description": "Web application security testing workflow for OWASP Top 10 vulnerabilities including injection, XSS, authentication flaws, and access control issues.", + "risk": "safe", + "source": "personal" + }, { "id": "web3-testing", "path": "skills/web3-testing", @@ -7847,6 +8072,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "wordpress", + "path": "skills/wordpress", + "category": "uncategorized", + "name": "wordpress", + "description": "Complete WordPress development workflow covering theme development, plugin creation, WooCommerce integration, performance optimization, and security hardening.", + "risk": "safe", + "source": "personal" + }, { "id": "wordpress-penetration-testing", "path": "skills/wordpress-penetration-testing", @@ -7856,6 +8090,33 @@ "risk": "unknown", "source": "community" }, + { + "id": "wordpress-plugin-development", + "path": "skills/wordpress-plugin-development", + "category": "uncategorized", + "name": "wordpress-plugin-development", + "description": "WordPress plugin development workflow covering plugin architecture, hooks, admin interfaces, REST API, and security best practices.", + "risk": "safe", + "source": "personal" + }, + { + "id": "wordpress-theme-development", + "path": "skills/wordpress-theme-development", + "category": "uncategorized", + "name": "wordpress-theme-development", + "description": "WordPress theme development workflow covering theme architecture, template hierarchy, custom post types, block editor support, and responsive design.", + "risk": "safe", + "source": "personal" + }, + { + "id": "wordpress-woocommerce-development", + "path": "skills/wordpress-woocommerce-development", + "category": "uncategorized", + "name": "wordpress-woocommerce-development", + "description": "WooCommerce store development workflow covering store setup, payment integration, shipping configuration, and customization.", + "risk": "safe", + "source": "personal" + }, { "id": "workflow-patterns", "path": "skills/workflow-patterns", @@ -7892,6 +8153,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "writer", + "path": "skills/libreoffice/writer", + "category": "libreoffice", + "name": "writer", + "description": "Document creation, format conversion (ODT/DOCX/PDF), mail merge, and automation with LibreOffice Writer.", + "risk": "safe", + "source": "personal" + }, { "id": "writing-plans", "path": "skills/writing-plans", From 8adf0325cab2e6cc56c6b3cb6f42efb606dda963 Mon Sep 17 00:00:00 2001 From: Nikolas Hor <116851567+nikolasdehor@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:29:11 -0300 Subject: [PATCH 24/30] feat: add Android Modern Development Bundle (Compose + Coroutines) (#118) From 56df37120c8d7e45e60eabe30f80818f92cef626 Mon Sep 17 00:00:00 2001 From: Konstantin Kolomeitsev Date: Mon, 23 Feb 2026 11:29:21 +0500 Subject: [PATCH 25/30] Feat/data structure protocol (#114) * feat: add data-structure-protocol skill Co-authored-by: Cursor * feat: rewrite data-structure-protocol skill with detailed documentation Co-authored-by: Cursor --------- Co-authored-by: Cursor --- skills/data-structure-protocol/SKILL.md | 198 ++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 skills/data-structure-protocol/SKILL.md diff --git a/skills/data-structure-protocol/SKILL.md b/skills/data-structure-protocol/SKILL.md new file mode 100644 index 00000000..e2505b60 --- /dev/null +++ b/skills/data-structure-protocol/SKILL.md @@ -0,0 +1,198 @@ +--- +name: data-structure-protocol +description: "Give agents persistent structural memory of a codebase β€” navigate dependencies, track public APIs, and understand why connections exist without re-reading the whole repo." +risk: safe +source: "https://github.com/k-kolomeitsev/data-structure-protocol" +--- + +# Data Structure Protocol (DSP) + +LLM coding agents lose context between tasks. On large codebases they spend most of their tokens on "orientation" β€” figuring out where things live, what depends on what, and what is safe to change. DSP solves this by externalizing the project's structural map into a persistent, queryable graph stored in a `.dsp/` directory next to the code. + +DSP is NOT documentation for humans and NOT an AST dump. It captures three things: **meaning** (why an entity exists), **boundaries** (what it imports and exposes), and **reasons** (why each connection exists). This is enough for an agent to navigate, refactor, and generate code without loading the entire source tree into the context window. + +## When to Use + +Use this skill when: +- The project has a `.dsp/` directory (DSP is already set up) +- The user asks to set up DSP, bootstrap, or map a project's structure +- Creating, modifying, or deleting code files in a DSP-tracked project (to keep the graph updated) +- Navigating project structure, understanding dependencies, or finding specific modules +- The user mentions DSP, dsp-cli, `.dsp`, or structure mapping +- Performing impact analysis before a refactor or dependency replacement + +## Core Concepts + +### Code = graph + +DSP models the codebase as a directed graph. Nodes are **entities**, edges are **imports** and **shared/exports**. + +Two entity kinds exist: +- **Object**: any "thing" that isn't a function (module/file/class/config/resource/external dependency) +- **Function**: an exported function/method/handler/pipeline + +### Identity by UID, not by file path + +Every entity gets a stable UID: `obj-<8hex>` for objects, `func-<8hex>` for functions. File paths are attributes that can change; UIDs survive renames, moves, and reformatting. + +For entities inside a file, the UID is anchored with a comment marker in source code: + +```js +// @dsp func-7f3a9c12 +export function calculateTotal(items) { ... } +``` + +```python +# @dsp obj-e5f6g7h8 +class UserService: +``` + +### Every connection has a "why" + +When an import is recorded, DSP stores a short reason explaining *why* that dependency exists. This lives in the `exports/` reverse index of the imported entity. A dependency graph without reasons tells you *what imports what*; reasons tell you **what is safe to change and who will break**. + +### Storage format + +Each entity gets a small directory under `.dsp/`: + +``` +.dsp/ +β”œβ”€β”€ TOC # ordered list of all entity UIDs from root +β”œβ”€β”€ obj-a1b2c3d4/ +β”‚ β”œβ”€β”€ description # source path, kind, purpose (1-3 sentences) +β”‚ β”œβ”€β”€ imports # UIDs this entity depends on (one per line) +β”‚ β”œβ”€β”€ shared # UIDs of public API / exported entities +β”‚ └── exports/ # reverse index: who imports this and why +β”‚ β”œβ”€β”€ # file content = "why" text +β”‚ └── / +β”‚ β”œβ”€β”€ description # what is exported +β”‚ └── # why this specific export is imported +└── func-7f3a9c12/ + β”œβ”€β”€ description + β”œβ”€β”€ imports + └── exports/ +``` + +Everything is plain text. Diffable. Reviewable. No database needed. + +### Full import coverage + +Every file or artifact that is imported anywhere must be represented in `.dsp` as an Object β€” code, images, styles, configs, JSON, wasm, everything. External dependencies (npm packages, stdlib, etc.) are recorded as `kind: external` but their internals are never analyzed. + +## How It Works + +### Initial Setup + +The skill relies on a standalone Python CLI script `dsp-cli.py`. If it is missing from the project, download it: + +```bash +curl -O https://raw.githubusercontent.com/k-kolomeitsev/data-structure-protocol/main/skills/data-structure-protocol/scripts/dsp-cli.py +``` + +Requires **Python 3.10+**. All commands use `python dsp-cli.py --root `. + +### Bootstrap (initial mapping) + +If `.dsp/` is empty, traverse the project from root entrypoint(s) via DFS on imports: + +1. Identify root entrypoints (`package.json` main, framework entry, `main.py`, etc.) +2. Document the root file: `create-object`, `create-function` for each export, `create-shared`, `add-import` for all dependencies +3. Take the first non-external import, document it fully, descend into its imports +4. Backtrack when no unvisited local imports remain; continue until all reachable files are documented +5. External dependencies: `create-object --kind external`, add to TOC, but never descend into `node_modules`/`site-packages`/etc. + +### Workflow Rules + +- **Before changing code**: Find affected entities via `search`, `find-by-source`, or `read-toc`. Read their `description` and `imports` to understand context. +- **When creating a file/module**: Call `create-object`. For each exported function β€” `create-function` (with `--owner`). Register exports via `create-shared`. +- **When adding an import**: Call `add-import` with a brief `why`. For external deps β€” first `create-object --kind external` if the entity doesn't exist. +- **When removing import/export/file**: Call `remove-import`, `remove-shared`, `remove-entity`. Cascade cleanup is automatic. +- **When renaming/moving a file**: Call `move-entity`. UID does not change. +- **Don't touch DSP** if only internal implementation changed without affecting purpose or dependencies. + +### Key Commands + +| Category | Commands | +|----------|----------| +| **Create** | `init`, `create-object`, `create-function`, `create-shared`, `add-import` | +| **Update** | `update-description`, `update-import-why`, `move-entity` | +| **Delete** | `remove-import`, `remove-shared`, `remove-entity` | +| **Navigate** | `get-entity`, `get-children --depth N`, `get-parents --depth N`, `get-path`, `get-recipients`, `read-toc` | +| **Search** | `search `, `find-by-source ` | +| **Diagnostics** | `detect-cycles`, `get-orphans`, `get-stats` | + +### When to Update DSP + +| Code Change | DSP Action | +|---|---| +| New file/module | `create-object` + `create-function` + `create-shared` + `add-import` | +| New import added | `add-import` (+ `create-object --kind external` if new dep) | +| Import removed | `remove-import` | +| Export added | `create-shared` (+ `create-function` if new) | +| Export removed | `remove-shared` | +| File renamed/moved | `move-entity` | +| File deleted | `remove-entity` | +| Purpose changed | `update-description` | +| Internal-only change | **No DSP update needed** | + +## Examples + +### Example 1: Setting up DSP and documenting a module + +```bash +python dsp-cli.py --root . init + +python dsp-cli.py --root . create-object "src/app.ts" "Main application entrypoint" +# Output: obj-a1b2c3d4 + +python dsp-cli.py --root . create-function "src/app.ts#start" "Starts the HTTP server" --owner obj-a1b2c3d4 +# Output: func-7f3a9c12 + +python dsp-cli.py --root . create-shared obj-a1b2c3d4 func-7f3a9c12 + +python dsp-cli.py --root . add-import obj-a1b2c3d4 obj-deadbeef "HTTP routing" +``` + +### Example 2: Navigating the graph before making changes + +```bash +python dsp-cli.py --root . search "authentication" +python dsp-cli.py --root . get-entity obj-a1b2c3d4 +python dsp-cli.py --root . get-children obj-a1b2c3d4 --depth 2 +python dsp-cli.py --root . get-recipients obj-a1b2c3d4 +python dsp-cli.py --root . get-path obj-a1b2c3d4 func-7f3a9c12 +``` + +### Example 3: Impact analysis before replacing a library + +```bash +python dsp-cli.py --root . find-by-source "lodash" +# Output: obj-11223344 + +python dsp-cli.py --root . get-recipients obj-11223344 +# Shows every module that imports lodash and WHY β€” lets you systematically replace it +``` + +## Best Practices + +- βœ… **Do:** Update DSP immediately when creating new files, adding imports, or changing public APIs +- βœ… **Do:** Always add a meaningful `why` reason when recording an import β€” this is where most of DSP's value lives +- βœ… **Do:** Use `kind: external` for third-party libraries without analyzing their internals +- βœ… **Do:** Keep descriptions minimal (1-3 sentences about purpose, not implementation) +- βœ… **Do:** Treat `.dsp/` diffs like code diffs β€” review them, keep them accurate +- ❌ **Don't:** Touch `.dsp/` for internal-only changes that don't affect purpose or dependencies +- ❌ **Don't:** Change an entity's UID on rename/move (use `move-entity` instead) +- ❌ **Don't:** Create UIDs for every local variable or helper β€” only file-level Objects and public/shared entities + +## Integration + +This skill connects naturally to: +- **context-compression** β€” DSP reduces the need for compression by providing targeted retrieval instead of loading everything +- **context-optimization** β€” DSP is a structural optimization: agents pull minimal "context bundles" instead of raw source +- **architecture** β€” DSP captures architectural boundaries (imports/exports) that feed system design decisions + +## References + +- **Full architecture specification**: [ARCHITECTURE.md](https://github.com/k-kolomeitsev/data-structure-protocol/blob/main/ARCHITECTURE.md) +- **CLI source + reference docs**: [skills/data-structure-protocol](https://github.com/k-kolomeitsev/data-structure-protocol/tree/main/skills/data-structure-protocol) +- **Introduction article**: [article.md](https://github.com/k-kolomeitsev/data-structure-protocol/blob/main/article.md) From 935e50ff2932454156b95b1e4b7cb295bd1a0f65 Mon Sep 17 00:00:00 2001 From: Munir Abbasi Date: Mon, 23 Feb 2026 11:29:23 +0500 Subject: [PATCH 26/30] PR Summary: Add Workflow Bundles and LibreOffice Skills (#113) * add libreoffice skill and +29 workflow bundles. * Add documentation for workflow bundles Added comprehensive documentation for workflow bundles, detailing granular and consolidated bundles across various development scenarios including frontend, backend, WordPress, system administration, security testing, AI/ML, cloud/DevOps, database, testing/QA, and LibreOffice skills. * add readme for workflow bundles. correct descriptions of libreoffice skills and match them with folder names. * add readme for workflow bundles. correct descriptions of libreoffice skills and match them with folder names. * Simplify LibreOffice skill names in README * Refactor LibreOffice Base skill to LibreOffice Writer Updated the skill from LibreOffice Base to LibreOffice Writer, modifying the name, description, and core capabilities. Adjusted workflows and examples to reflect document creation and automation. * Rename skill from Writer to Base and update capabilities Updated the LibreOffice skill from Writer to Base, reflecting changes in functionality related to database management and operations. * Revise LibreOffice Calc skill details and capabilities Updated the LibreOffice Calc skill description and removed outdated sections. Streamlined capabilities and workflows while maintaining essential information. * Refine LibreOffice Draw skill details and capabilities Updated the LibreOffice Draw skill description and capabilities. Removed flowchart automation example and adjusted related skills. * Refine SKILL.md for LibreOffice Impress Updated the SKILL.md file for LibreOffice Impress to refine the name and description, streamline core capabilities, and adjust related skills. * Refine LibreOffice Writer skill details and capabilities Updated the LibreOffice Writer skill description and capabilities. Simplified the name and improved clarity in the core capabilities section. * chore: sync generated registry files [ci skip] --------- Co-authored-by: github-actions[bot] From c7a09399d55dc9b96340703c1fb566bac9f85796 Mon Sep 17 00:00:00 2001 From: sck_0 Date: Mon, 23 Feb 2026 07:30:23 +0100 Subject: [PATCH 27/30] chore: sync generated files (925 skills, stats consistency) Co-authored-by: Cursor --- CATALOG.md | 18 +++-- README.md | 12 ++-- data/aliases.json | 1 + data/bundles.json | 3 + data/catalog.json | 174 +++++++++++++++++++++++++++++++++++++++++----- skills_index.json | 72 ++++++++++++++++--- 6 files changed, 243 insertions(+), 37 deletions(-) diff --git a/CATALOG.md b/CATALOG.md index 50b160ac..e4b6343f 100644 --- a/CATALOG.md +++ b/CATALOG.md @@ -2,9 +2,9 @@ Generated at: 2026-02-08T00:00:00.000Z -Total skills: 919 +Total skills: 925 -## architecture (62) +## architecture (63) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -45,6 +45,7 @@ Total skills: 919 | `hig-patterns` | > | hig | hig | | `i18n-localization` | Internationalization and localization patterns. Detecting hardcoded strings, managing translations, locale files, RTL support. | i18n, localization | i18n, localization, internationalization, detecting, hardcoded, strings, managing, translations, locale, files, rtl | | `inngest` | Inngest expert for serverless-first background jobs, event-driven workflows, and durable execution without managing queues or workers. Use when: inngest, ser... | inngest | inngest, serverless, first, background, jobs, event, driven, durable, execution, without, managing, queues | +| `kotlin-coroutines-expert` | Expert patterns for Kotlin Coroutines and Flow, covering structured concurrency, error handling, and testing. | kotlin, coroutines | kotlin, coroutines, flow, covering, structured, concurrency, error, handling, testing | | `monorepo-architect` | Expert in monorepo architecture, build systems, and dependency management at scale. Masters Nx, Turborepo, Bazel, and Lerna for efficient multi-project devel... | monorepo | monorepo, architect, architecture, dependency, scale, masters, nx, turborepo, bazel, lerna, efficient, multi | | `multi-agent-patterns` | Master orchestrator, peer-to-peer, and hierarchical multi-agent architectures | multi, agent | multi, agent, orchestrator, peer, hierarchical, architectures | | `nerdzao-elite` | Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation. | nerdzao, elite | nerdzao, elite, senior, software, engineer, 15, product, designer, full, planning, architecture, tdd | @@ -115,7 +116,7 @@ Total skills: 919 | `startup-metrics-framework` | This skill should be used when the user asks about \"key startup | startup, metrics, framework | startup, metrics, framework, skill, should, used, user, asks, about, key | | `whatsapp-automation` | Automate WhatsApp Business tasks via Rube MCP (Composio): send messages, manage templates, upload media, and handle contacts. Always search tools first for c... | whatsapp | whatsapp, automation, automate, business, tasks, via, rube, mcp, composio, send, messages, upload | -## data-ai (150) +## data-ai (151) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -191,6 +192,7 @@ Total skills: 919 | `data-quality-frameworks` | Implement data quality validation with Great Expectations, dbt tests, and data contracts. Use when building data quality pipelines, implementing validation r... | data, quality, frameworks | data, quality, frameworks, validation, great, expectations, dbt, tests, contracts, building, pipelines, implementing | | `data-scientist` | Expert data scientist for advanced analytics, machine learning, and | data, scientist | data, scientist, analytics, machine, learning | | `data-storytelling` | Transform data into compelling narratives using visualization, context, and persuasive structure. Use when presenting analytics to stakeholders, creating dat... | data, storytelling | data, storytelling, transform, compelling, narratives, visualization, context, persuasive, structure, presenting, analytics, stakeholders | +| `data-structure-protocol` | Give agents persistent structural memory of a codebase β€” navigate dependencies, track public APIs, and understand why connections exist without re-reading th... | data, structure, protocol | data, structure, protocol, give, agents, persistent, structural, memory, codebase, navigate, dependencies, track | | `database` | Database development and operations workflow covering SQL, NoSQL, database design, migrations, optimization, and data engineering. | database | database, development, operations, covering, sql, nosql, migrations, optimization, data, engineering | | `database-architect` | Expert database architect specializing in data layer design from | database | database, architect, specializing, data, layer | | `database-design` | Database design principles and decision-making. Schema design, indexing strategy, ORM selection, serverless databases. | database | database, principles, decision, making, schema, indexing, orm, selection, serverless, databases | @@ -270,12 +272,13 @@ Total skills: 919 | `xlsx-official` | Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work ... | xlsx, official | xlsx, official, spreadsheet, creation, editing, analysis, formulas, formatting, data, visualization, claude, work | | `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 (146) +## development (148) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | | `3d-web-experience` | Expert in building 3D experiences for the web - Three.js, React Three Fiber, Spline, WebGL, and interactive 3D scenes. Covers product configurators, 3D portf... | 3d, web, experience | 3d, web, experience, building, experiences, three, js, react, fiber, spline, webgl, interactive | | `algolia-search` | Expert patterns for Algolia search implementation, indexing strategies, React InstantSearch, and relevance tuning Use when: adding search to, algolia, instan... | algolia, search | algolia, search, indexing, react, instantsearch, relevance, tuning, adding, api, functionality | +| `android-jetpack-compose-expert` | Expert guidance for building modern Android UIs with Jetpack Compose, covering state management, navigation, performance, and Material Design 3. | android, jetpack, compose | android, jetpack, compose, guidance, building, uis, covering, state, navigation, performance, material | | `api-design-principles` | Master REST and GraphQL API design principles to build intuitive, scalable, and maintainable APIs that delight developers. Use when designing new APIs, revie... | api, principles | api, principles, rest, graphql, intuitive, scalable, maintainable, apis, delight, developers, designing, new | | `api-documentation` | API documentation workflow for generating OpenAPI specs, creating developer guides, and maintaining comprehensive API documentation. | api, documentation | api, documentation, generating, openapi, specs, creating, developer, guides, maintaining | | `api-documentation-generator` | Generate comprehensive, developer-friendly API documentation from code, including endpoints, parameters, examples, and best practices | api, documentation, generator | api, documentation, generator, generate, developer, friendly, code, including, endpoints, parameters, examples | @@ -327,6 +330,7 @@ Total skills: 919 | `azure-web-pubsub-ts` | Build real-time messaging applications using Azure Web PubSub SDKs for JavaScript (@azure/web-pubsub, @azure/web-pubsub-client). Use when implementing WebSoc... | azure, web, pubsub, ts | azure, web, pubsub, ts, real, time, messaging, applications, sdks, javascript, client, implementing | | `backend-architect` | Expert backend architect specializing in scalable API design, | backend | backend, architect, specializing, scalable, api | | `backend-dev-guidelines` | Opinionated backend development standards for Node.js + Express + TypeScript microservices. Covers layered architecture, BaseController pattern, dependency i... | backend, dev, guidelines | backend, dev, guidelines, opinionated, development, standards, node, js, express, typescript, microservices, covers | +| `bevy-ecs-expert` | Master Bevy's Entity Component System (ECS) in Rust, covering Systems, Queries, Resources, and parallel scheduling. | bevy, ecs | bevy, ecs, entity, component, rust, covering, queries, resources, parallel, scheduling | | `bullmq-specialist` | BullMQ expert for Redis-backed job queues, background processing, and reliable async execution in Node.js/TypeScript applications. Use when: bullmq, bull que... | bullmq | bullmq, redis, backed, job, queues, background, processing, reliable, async, execution, node, js | | `bun-development` | Modern JavaScript/TypeScript development with Bun runtime. Covers package management, bundling, testing, and migration from Node.js. Use when working with Bu... | bun | bun, development, javascript, typescript, runtime, covers, package, bundling, testing, migration, node, js | | `cc-skill-coding-standards` | Universal coding standards, best practices, and patterns for TypeScript, JavaScript, React, and Node.js development. | cc, skill, coding, standards | cc, skill, coding, standards, universal, typescript, javascript, react, node, js, development | @@ -421,7 +425,7 @@ Total skills: 919 | `webapp-testing` | Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing... | webapp | webapp, testing, toolkit, interacting, local, web, applications, playwright, supports, verifying, frontend, functionality | | `zustand-store-ts` | Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state/action separation. Use when building React state management, creati... | zustand, store, ts | zustand, store, ts, stores, typescript, subscribewithselector, middleware, proper, state, action, separation, building | -## general (214) +## general (216) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -537,6 +541,7 @@ Total skills: 919 | `git-pr-workflows-pr-enhance` | You are a PR optimization expert specializing in creating high-quality pull requests that facilitate efficient code reviews. Generate comprehensive PR descri... | git, pr, enhance | git, pr, enhance, optimization, specializing, creating, high, quality, pull, requests, facilitate, efficient | | `git-pushing` | Stage, commit, and push git changes with conventional commit messages. Use when user wants to commit and push changes, mentions pushing to remote, or asks to... | git, pushing | git, pushing, stage, commit, push, changes, conventional, messages, user, wants, mentions, remote | | `github-issue-creator` | Convert raw notes, error logs, voice dictation, or screenshots into crisp GitHub-flavored markdown issue reports. Use when the user pastes bug info, error me... | github, issue, creator | github, issue, creator, convert, raw, notes, error, logs, voice, dictation, screenshots, crisp | +| `godot-4-migration` | Specialized guide for migrating Godot 3.x projects to Godot 4 (GDScript 2.0), covering syntax changes, Tweens, and exports. | godot, 4, migration | godot, 4, migration, specialized, migrating, gdscript, covering, syntax, changes, tweens, exports | | `graphql-architect` | Master modern GraphQL with federation, performance optimization, | graphql | graphql, architect, federation, performance, optimization | | `hig-components-content` | > | hig, components, content | hig, components, content | | `hig-components-controls` | >- | hig, components, controls | hig, components, controls | @@ -606,6 +611,7 @@ Total skills: 919 | `scala-pro` | Master enterprise-grade Scala development with functional | scala | scala, pro, enterprise, grade, development, functional | | `schema-markup` | > | schema, markup | schema, markup | | `search-specialist` | Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles comp... | search | search, web, researcher, techniques, synthesis, masters, operators, result, filtering, multi, source, verification | +| `shader-programming-glsl` | Expert guide for writing efficient GLSL shaders (Vertex/Fragment) for web and game engines, covering syntax, uniforms, and common effects. | shader, programming, glsl | shader, programming, glsl, writing, efficient, shaders, vertex, fragment, web, game, engines, covering | | `sharp-edges` | Identify error-prone APIs and dangerous configurations | sharp, edges | sharp, edges, identify, error, prone, apis, dangerous, configurations | | `shellcheck-configuration` | Master ShellCheck static analysis configuration and usage for shell script quality. Use when setting up linting infrastructure, fixing code issues, or ensuri... | shellcheck, configuration | shellcheck, configuration, static, analysis, usage, shell, script, quality, setting, up, linting, infrastructure | | `shodan-reconnaissance` | This skill should be used when the user asks to "search for exposed devices on the internet," "perform Shodan reconnaissance," "find vulnerable services usin... | shodan, reconnaissance | shodan, reconnaissance, skill, should, used, user, asks, search, exposed, devices, internet, perform | @@ -765,7 +771,7 @@ Total skills: 919 | `code-reviewer` | Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Mas... | code | code, reviewer, elite, review, specializing, ai, powered, analysis, security, vulnerabilities, performance, optimization | | `codebase-cleanup-deps-audit` | You are a dependency security expert specializing in vulnerability scanning, license compliance, and supply chain security. Analyze project dependencies for ... | codebase, cleanup, deps, audit | codebase, cleanup, deps, audit, dependency, security, specializing, vulnerability, scanning, license, compliance, supply | | `database-migration` | Execute database migrations across ORMs and platforms with zero-downtime strategies, data transformation, and rollback procedures. Use when migrating databas... | database, migration | database, migration, execute, migrations, orms, platforms, zero, downtime, data, transformation, rollback, procedures | -| `database-migrations-sql-migrations` | SQL database migrations with zero-downtime strategies for | database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime | database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime, zero, downtime | +| `database-migrations-sql-migrations` | SQL database migrations with zero-downtime strategies for PostgreSQL, MySQL, and SQL Server. Focus on data integrity and rollback plans. | database, migrations, sql | database, migrations, sql, zero, downtime, postgresql, mysql, server, data, integrity, rollback, plans | | `dependency-management-deps-audit` | You are a dependency security expert specializing in vulnerability scanning, license compliance, and supply chain security. Analyze project dependencies for ... | dependency, deps, audit | dependency, deps, audit, security, specializing, vulnerability, scanning, license, compliance, supply, chain, analyze | | `deployment-pipeline-design` | Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up... | deployment, pipeline | deployment, pipeline, multi, stage, ci, cd, pipelines, approval, gates, security, checks, orchestration | | `design-orchestration` | Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature imp... | | orchestration, orchestrates, routing, work, through, brainstorming, multi, agent, review, execution, readiness, correct | diff --git a/README.md b/README.md index 017b3727..84d8c7d1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 919+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 925+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 919+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 925+ Universal Agentic Skills for AI Coding Assistants β€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![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) @@ -17,7 +17,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **919 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **925 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - πŸ”΅ **Gemini CLI** (Google DeepMind) @@ -42,7 +42,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [πŸ“¦ Features & Categories](#features--categories) -- [πŸ“š Browse 919+ Skills](#browse-919-skills) +- [πŸ“š Browse 925+ Skills](#browse-925-skills) - [🀝 How to Contribute](#how-to-contribute) - [🀝 Community](#community) - [β˜• Support the Project](#support-the-project) @@ -271,7 +271,7 @@ npx antigravity-awesome-skills **Bundles** are curated groups of skills for a specific role or goal (for example: `Web Wizard`, `Security Engineer`, `OSS Maintainer`). -They help you avoid picking from 889+ skills one by one. +They help you avoid picking from 925+ skills one by one. ### ⚠️ Important: Bundles Are NOT Separate Installations! @@ -343,7 +343,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 919+ Skills +## Browse 925+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. diff --git a/data/aliases.json b/data/aliases.json index 4ef98795..2d0e5090 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -4,6 +4,7 @@ "accessibility-compliance-audit": "accessibility-compliance-accessibility-audit", "agent-orchestration-improve": "agent-orchestration-improve-agent", "agent-orchestration-optimize": "agent-orchestration-multi-agent-optimize", + "android-jetpack-expert": "android-jetpack-compose-expert", "api-testing-mock": "api-testing-observability-api-mock", "templates": "app-builder/templates", "application-performance-optimization": "application-performance-performance-optimization", diff --git a/data/bundles.json b/data/bundles.json index c6810a79..e31f3167 100644 --- a/data/bundles.json +++ b/data/bundles.json @@ -7,6 +7,7 @@ "3d-web-experience", "agent-framework-azure-ai-py", "algolia-search", + "android-jetpack-compose-expert", "api-design-principles", "api-documentation", "api-documentation-generator", @@ -73,6 +74,7 @@ "backend-dev-guidelines", "backend-development-feature-development", "backend-security-coder", + "bevy-ecs-expert", "bullmq-specialist", "bun-development", "cc-skill-backend-patterns", @@ -341,6 +343,7 @@ "data-quality-frameworks", "data-scientist", "data-storytelling", + "data-structure-protocol", "database", "database-admin", "database-architect", diff --git a/data/catalog.json b/data/catalog.json index f619b4ef..39b2b197 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,6 +1,6 @@ { "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 919, + "total": 925, "skills": [ { "id": "3d-web-experience", @@ -663,6 +663,31 @@ ], "path": "skills/analytics-tracking/SKILL.md" }, + { + "id": "android-jetpack-compose-expert", + "name": "android-jetpack-compose-expert", + "description": "Expert guidance for building modern Android UIs with Jetpack Compose, covering state management, navigation, performance, and Material Design 3.", + "category": "development", + "tags": [ + "android", + "jetpack", + "compose" + ], + "triggers": [ + "android", + "jetpack", + "compose", + "guidance", + "building", + "uis", + "covering", + "state", + "navigation", + "performance", + "material" + ], + "path": "skills/android-jetpack-compose-expert/SKILL.md" + }, { "id": "angular", "name": "angular", @@ -4460,6 +4485,29 @@ ], "path": "skills/behavioral-modes/SKILL.md" }, + { + "id": "bevy-ecs-expert", + "name": "bevy-ecs-expert", + "description": "Master Bevy's Entity Component System (ECS) in Rust, covering Systems, Queries, Resources, and parallel scheduling.", + "category": "development", + "tags": [ + "bevy", + "ecs" + ], + "triggers": [ + "bevy", + "ecs", + "entity", + "component", + "rust", + "covering", + "queries", + "resources", + "parallel", + "scheduling" + ], + "path": "skills/bevy-ecs-expert/SKILL.md" + }, { "id": "billing-automation", "name": "billing-automation", @@ -7158,6 +7206,32 @@ ], "path": "skills/data-storytelling/SKILL.md" }, + { + "id": "data-structure-protocol", + "name": "data-structure-protocol", + "description": "Give agents persistent structural memory of a codebase β€” navigate dependencies, track public APIs, and understand why connections exist without re-reading the whole repo.", + "category": "data-ai", + "tags": [ + "data", + "structure", + "protocol" + ], + "triggers": [ + "data", + "structure", + "protocol", + "give", + "agents", + "persistent", + "structural", + "memory", + "codebase", + "navigate", + "dependencies", + "track" + ], + "path": "skills/data-structure-protocol/SKILL.md" + }, { "id": "database", "name": "database", @@ -7322,31 +7396,26 @@ { "id": "database-migrations-sql-migrations", "name": "database-migrations-sql-migrations", - "description": "SQL database migrations with zero-downtime strategies for", + "description": "SQL database migrations with zero-downtime strategies for PostgreSQL, MySQL, and SQL Server. Focus on data integrity and rollback plans.", "category": "security", "tags": [ "database", - "sql", "migrations", - "postgresql", - "mysql", - "flyway", - "liquibase", - "alembic", - "zero-downtime" + "sql" ], "triggers": [ "database", - "sql", "migrations", + "sql", + "zero", + "downtime", "postgresql", "mysql", - "flyway", - "liquibase", - "alembic", - "zero-downtime", - "zero", - "downtime" + "server", + "data", + "integrity", + "rollback", + "plans" ], "path": "skills/database-migrations-sql-migrations/SKILL.md" }, @@ -10586,6 +10655,31 @@ ], "path": "skills/go-rod-master/SKILL.md" }, + { + "id": "godot-4-migration", + "name": "godot-4-migration", + "description": "Specialized guide for migrating Godot 3.x projects to Godot 4 (GDScript 2.0), covering syntax changes, Tweens, and exports.", + "category": "general", + "tags": [ + "godot", + "4", + "migration" + ], + "triggers": [ + "godot", + "4", + "migration", + "specialized", + "migrating", + "gdscript", + "covering", + "syntax", + "changes", + "tweens", + "exports" + ], + "path": "skills/godot-4-migration/SKILL.md" + }, { "id": "godot-gdscript-patterns", "name": "godot-gdscript-patterns", @@ -11972,6 +12066,28 @@ ], "path": "skills/klaviyo-automation/SKILL.md" }, + { + "id": "kotlin-coroutines-expert", + "name": "kotlin-coroutines-expert", + "description": "Expert patterns for Kotlin Coroutines and Flow, covering structured concurrency, error handling, and testing.", + "category": "architecture", + "tags": [ + "kotlin", + "coroutines" + ], + "triggers": [ + "kotlin", + "coroutines", + "flow", + "covering", + "structured", + "concurrency", + "error", + "handling", + "testing" + ], + "path": "skills/kotlin-coroutines-expert/SKILL.md" + }, { "id": "kpi-dashboard-design", "name": "kpi-dashboard-design", @@ -17628,6 +17744,32 @@ ], "path": "skills/service-mesh-observability/SKILL.md" }, + { + "id": "shader-programming-glsl", + "name": "shader-programming-glsl", + "description": "Expert guide for writing efficient GLSL shaders (Vertex/Fragment) for web and game engines, covering syntax, uniforms, and common effects.", + "category": "general", + "tags": [ + "shader", + "programming", + "glsl" + ], + "triggers": [ + "shader", + "programming", + "glsl", + "writing", + "efficient", + "shaders", + "vertex", + "fragment", + "web", + "game", + "engines", + "covering" + ], + "path": "skills/shader-programming-glsl/SKILL.md" + }, { "id": "sharp-edges", "name": "sharp-edges", diff --git a/skills_index.json b/skills_index.json index 35d011b5..9791c60f 100644 --- a/skills_index.json +++ b/skills_index.json @@ -260,6 +260,15 @@ "risk": "unknown", "source": "unknown" }, + { + "id": "android-jetpack-compose-expert", + "path": "skills/android-jetpack-compose-expert", + "category": "uncategorized", + "name": "android-jetpack-compose-expert", + "description": "Expert guidance for building modern Android UIs with Jetpack Compose, covering state management, navigation, performance, and Material Design 3.", + "risk": "safe", + "source": "community" + }, { "id": "angular", "path": "skills/angular", @@ -1835,6 +1844,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "bevy-ecs-expert", + "path": "skills/bevy-ecs-expert", + "category": "uncategorized", + "name": "bevy-ecs-expert", + "description": "Master Bevy's Entity Component System (ECS) in Rust, covering Systems, Queries, Resources, and parallel scheduling.", + "risk": "safe", + "source": "community" + }, { "id": "billing-automation", "path": "skills/billing-automation", @@ -2897,6 +2915,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "data-structure-protocol", + "path": "skills/data-structure-protocol", + "category": "uncategorized", + "name": "data-structure-protocol", + "description": "Give agents persistent structural memory of a codebase \u2014 navigate dependencies, track public APIs, and understand why connections exist without re-reading the whole repo.", + "risk": "safe", + "source": "https://github.com/k-kolomeitsev/data-structure-protocol" + }, { "id": "database", "path": "skills/database", @@ -2924,15 +2951,6 @@ "risk": "unknown", "source": "unknown" }, - { - "id": "database-migrations-sql-migrations", - "path": "skills/database-migrations-sql-migrations", - "category": "uncategorized", - "name": "Database Migrations Sql Migrations", - "description": "You are a SQL database migration expert specializing in zero-downtime deployments, data integrity, and production-ready migration strategies for PostgreSQL, MySQL, and SQL Server. Create comprehensive migration scripts with rollback procedures, valid", - "risk": "unknown", - "source": "unknown" - }, { "id": "database-optimizer", "path": "skills/database-optimizer", @@ -2978,6 +2996,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "database-migrations-sql-migrations", + "path": "skills/database-migrations-sql-migrations", + "category": "uncategorized", + "name": "database-migrations-sql-migrations", + "description": "SQL database migrations with zero-downtime strategies for PostgreSQL, MySQL, and SQL Server. Focus on data integrity and rollback plans.", + "risk": "unknown", + "source": "community" + }, { "id": "datadog-automation", "path": "skills/datadog-automation", @@ -4157,6 +4184,15 @@ "risk": "safe", "source": "https://github.com/go-rod/rod" }, + { + "id": "godot-4-migration", + "path": "skills/godot-4-migration", + "category": "uncategorized", + "name": "godot-4-migration", + "description": "Specialized guide for migrating Godot 3.x projects to Godot 4 (GDScript 2.0), covering syntax changes, Tweens, and exports.", + "risk": "safe", + "source": "community" + }, { "id": "godot-gdscript-patterns", "path": "skills/godot-gdscript-patterns", @@ -4742,6 +4778,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "kotlin-coroutines-expert", + "path": "skills/kotlin-coroutines-expert", + "category": "uncategorized", + "name": "kotlin-coroutines-expert", + "description": "Expert patterns for Kotlin Coroutines and Flow, covering structured concurrency, error handling, and testing.", + "risk": "safe", + "source": "community" + }, { "id": "kpi-dashboard-design", "path": "skills/kpi-dashboard-design", @@ -6848,6 +6893,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "shader-programming-glsl", + "path": "skills/shader-programming-glsl", + "category": "uncategorized", + "name": "shader-programming-glsl", + "description": "Expert guide for writing efficient GLSL shaders (Vertex/Fragment) for web and game engines, covering syntax, uniforms, and common effects.", + "risk": "safe", + "source": "community" + }, { "id": "sharp-edges", "path": "skills/sharp-edges", From b06e92afc657948dd5df7e8539255bbaf49bf7e8 Mon Sep 17 00:00:00 2001 From: sck_0 Date: Mon, 23 Feb 2026 07:31:31 +0100 Subject: [PATCH 28/30] chore: release 6.1.0 Co-authored-by: Cursor --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ README.md | 4 ++-- package.json | 4 ++-- release_notes.md | 30 ++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 release_notes.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b985239..e4e94f4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [6.1.0] - 2026-02-23 - "Issues Fix & Community Expansion" + +> **Bugfixes for #116 and #120, plus Game Dev bundle, Android skills, Workflow Bundles, LibreOffice, Data Structure Protocol, and Kiro IDE support.** + +This release fixes the YAML syntax error in database-migrations-sql-migrations (issue #116), adds a typo alias so `shopifyβ€”development` (em dash) resolves to `shopify-development` (issue #120), and ships a large set of community PRs: Game Development Expansion (Bevy ECS, GLSL, Godot 4), Android Modern Development (Compose + Coroutines), Workflow Bundles and LibreOffice skills, Data Structure Protocol, and Kiro CLI/IDE support. + +## New Skills + +- **Game Development Expansion** (PR #121): `bevy-ecs-expert`, `shader-programming-glsl`, `godot-4-migration`. +- **Android Modern Development** (PR #118): `android-jetpack-compose-expert`, `kotlin-coroutines-expert`. +- **Workflow Bundles & LibreOffice** (PR #113): Workflow bundles readme, LibreOffice skills (Base, Calc, Draw, Impress, Writer), plus office-productivity, WordPress suite, and many domain skills (ai-agent-development, cloud-devops, database, e2e-testing, security-audit, terraform-infrastructure, etc.). +- **Data Structure Protocol** (PR #114): `data-structure-protocol`. +- **Kiro CLI and Kiro IDE** (PR #122): Documentation and support for Kiro. + +## Improvements + +- **YAML fix** (PR #119, fixes #116): Resolved invalid YAML in `database-migrations-sql-migrations/SKILL.md` (description block mapping); removed non-standard frontmatter and standardized section headers. +- **Skill matching** (fixes #120): Added typo alias `shopifyβ€”development` β†’ `shopify-development` so em-dash input resolves correctly. +- **Registry**: Now tracking 925 skills. + +## Credits + +- **@nikolasdehor** for YAML fix (PR #119), Game Development Expansion (PR #121), Android Modern Development (PR #118) +- **@ssumanbiswas** for Kiro CLI and Kiro IDE support (PR #122) +- **@munir-abbasi** for Workflow Bundles and LibreOffice Skills (PR #113) +- **@k-kolomeitsev** for Data Structure Protocol (PR #114) + +--- + +_Upgrade now: `git pull origin main` to fetch the latest skills._ + +--- + ## [6.0.0] - 2026-02-22 - "Codex YAML Fix & Community PRs" > **Major release: Codex frontmatter fixes, AWS Security & Compliance skills, Antigravity Workspace Manager CLI, and validation fixes.** diff --git a/README.md b/README.md index 84d8c7d1..d0b9f19d 100644 --- a/README.md +++ b/README.md @@ -56,11 +56,11 @@ This repository provides essential skills to transform your AI assistant into a ## New Here? Start Here! -**Welcome to the V6.0.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. +**Welcome to the V6.1.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. ### 1. 🐣 Context: What is this? -**Antigravity Awesome Skills** (Release 6.0.0) is a massive upgrade to your AI's capabilities. +**Antigravity Awesome Skills** (Release 6.1.0) is a massive upgrade to your AI's capabilities. AI Agents (like Claude Code, Cursor, or Gemini) are smart, but they lack **specific tools**. They don't know your company's "Deployment Protocol" or the specific syntax for "AWS CloudFormation". **Skills** are small markdown files that teach them how to do these specific tasks perfectly, every time. diff --git a/package.json b/package.json index 01ae0ae0..78d2f910 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "antigravity-awesome-skills", - "version": "6.0.0", - "description": "883+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", + "version": "6.1.0", + "description": "925+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", "license": "MIT", "scripts": { "validate": "python3 scripts/validate_skills.py", diff --git a/release_notes.md b/release_notes.md new file mode 100644 index 00000000..5f36a009 --- /dev/null +++ b/release_notes.md @@ -0,0 +1,30 @@ +## v6.1.0 - Issues Fix & Community Expansion + +**Bugfixes for #116 and #120, plus Game Dev bundle, Android skills, Workflow Bundles, LibreOffice, Data Structure Protocol, and Kiro IDE support.** + +This release fixes the YAML syntax error in database-migrations-sql-migrations (issue #116), adds a typo alias so `shopifyβ€”development` (em dash) resolves to `shopify-development` (issue #120), and ships a large set of community PRs: Game Development Expansion (Bevy ECS, GLSL, Godot 4), Android Modern Development (Compose + Coroutines), Workflow Bundles and LibreOffice skills, Data Structure Protocol, and Kiro CLI/IDE support. + +### New Skills + +- **Game Development Expansion** (PR #121): `bevy-ecs-expert`, `shader-programming-glsl`, `godot-4-migration`. +- **Android Modern Development** (PR #118): `android-jetpack-compose-expert`, `kotlin-coroutines-expert`. +- **Workflow Bundles & LibreOffice** (PR #113): Workflow bundles readme, LibreOffice skills (Base, Calc, Draw, Impress, Writer), plus office-productivity, WordPress suite, and many domain skills. +- **Data Structure Protocol** (PR #114): `data-structure-protocol`. +- **Kiro CLI and Kiro IDE** (PR #122): Documentation and support for Kiro. + +### Improvements + +- **YAML fix** (PR #119, fixes #116): Resolved invalid YAML in `database-migrations-sql-migrations/SKILL.md`. +- **Skill matching** (fixes #120): Added typo alias `shopifyβ€”development` β†’ `shopify-development`. +- **Registry**: Now tracking 925 skills. + +### Credits + +- **@nikolasdehor** for YAML fix (PR #119), Game Development Expansion (PR #121), Android Modern Development (PR #118) +- **@ssumanbiswas** for Kiro CLI and Kiro IDE support (PR #122) +- **@munir-abbasi** for Workflow Bundles and LibreOffice Skills (PR #113) +- **@k-kolomeitsev** for Data Structure Protocol (PR #114) + +--- + +_Upgrade: `git pull origin main` or `npx antigravity-awesome-skills`_ From 4da3a9b7a0fbca722625ee6763b7bf49876b0e88 Mon Sep 17 00:00:00 2001 From: sck_0 Date: Mon, 23 Feb 2026 07:46:58 +0100 Subject: [PATCH 29/30] chore: release 6.1.1 (AWS cost skills, 927 registry) Co-authored-by: Cursor --- CHANGELOG.md | 9 +++++++++ README.md | 4 ++-- package.json | 4 ++-- release_notes.md | 28 ++++------------------------ 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4e94f4c..4e07f18b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [6.1.1] - 2026-02-23 - "AWS Cost Optimization & Registry 927" + +> **Patch release: AWS cost optimization skills (PR #107) and registry count 927.** + +- **New skills** (PR #107): `aws-cost-optimizer`, `aws-cost-cleanup`. +- **Registry**: Now tracking 927 skills. + +--- + ## [6.1.0] - 2026-02-23 - "Issues Fix & Community Expansion" > **Bugfixes for #116 and #120, plus Game Dev bundle, Android skills, Workflow Bundles, LibreOffice, Data Structure Protocol, and Kiro IDE support.** diff --git a/README.md b/README.md index 50485d2b..4081c8b7 100644 --- a/README.md +++ b/README.md @@ -56,11 +56,11 @@ This repository provides essential skills to transform your AI assistant into a ## New Here? Start Here! -**Welcome to the V6.1.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. +**Welcome to the V6.1.1 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. ### 1. 🐣 Context: What is this? -**Antigravity Awesome Skills** (Release 6.1.0) is a massive upgrade to your AI's capabilities. +**Antigravity Awesome Skills** (Release 6.1.1) is a massive upgrade to your AI's capabilities. AI Agents (like Claude Code, Cursor, or Gemini) are smart, but they lack **specific tools**. They don't know your company's "Deployment Protocol" or the specific syntax for "AWS CloudFormation". **Skills** are small markdown files that teach them how to do these specific tasks perfectly, every time. diff --git a/package.json b/package.json index 78d2f910..84ea5bba 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "antigravity-awesome-skills", - "version": "6.1.0", - "description": "925+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", + "version": "6.1.1", + "description": "927+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", "license": "MIT", "scripts": { "validate": "python3 scripts/validate_skills.py", diff --git a/release_notes.md b/release_notes.md index 5f36a009..7991d680 100644 --- a/release_notes.md +++ b/release_notes.md @@ -1,29 +1,9 @@ -## v6.1.0 - Issues Fix & Community Expansion +## v6.1.1 - AWS Cost Optimization & Registry 927 -**Bugfixes for #116 and #120, plus Game Dev bundle, Android skills, Workflow Bundles, LibreOffice, Data Structure Protocol, and Kiro IDE support.** +**Patch release: AWS cost optimization skills (PR #107) and registry count 927.** -This release fixes the YAML syntax error in database-migrations-sql-migrations (issue #116), adds a typo alias so `shopifyβ€”development` (em dash) resolves to `shopify-development` (issue #120), and ships a large set of community PRs: Game Development Expansion (Bevy ECS, GLSL, Godot 4), Android Modern Development (Compose + Coroutines), Workflow Bundles and LibreOffice skills, Data Structure Protocol, and Kiro CLI/IDE support. - -### New Skills - -- **Game Development Expansion** (PR #121): `bevy-ecs-expert`, `shader-programming-glsl`, `godot-4-migration`. -- **Android Modern Development** (PR #118): `android-jetpack-compose-expert`, `kotlin-coroutines-expert`. -- **Workflow Bundles & LibreOffice** (PR #113): Workflow bundles readme, LibreOffice skills (Base, Calc, Draw, Impress, Writer), plus office-productivity, WordPress suite, and many domain skills. -- **Data Structure Protocol** (PR #114): `data-structure-protocol`. -- **Kiro CLI and Kiro IDE** (PR #122): Documentation and support for Kiro. - -### Improvements - -- **YAML fix** (PR #119, fixes #116): Resolved invalid YAML in `database-migrations-sql-migrations/SKILL.md`. -- **Skill matching** (fixes #120): Added typo alias `shopifyβ€”development` β†’ `shopify-development`. -- **Registry**: Now tracking 925 skills. - -### Credits - -- **@nikolasdehor** for YAML fix (PR #119), Game Development Expansion (PR #121), Android Modern Development (PR #118) -- **@ssumanbiswas** for Kiro CLI and Kiro IDE support (PR #122) -- **@munir-abbasi** for Workflow Bundles and LibreOffice Skills (PR #113) -- **@k-kolomeitsev** for Data Structure Protocol (PR #114) +- **New skills** (PR #107): `aws-cost-optimizer`, `aws-cost-cleanup`. +- **Registry**: Now tracking 927 skills. --- From f561ba9e952da36809fa0f04b8843d84b54a1c9d Mon Sep 17 00:00:00 2001 From: sck_0 Date: Mon, 23 Feb 2026 07:47:15 +0100 Subject: [PATCH 30/30] docs: 927 skills count consistency in README Co-authored-by: Cursor --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4081c8b7..0c8d4ea0 100644 --- a/README.md +++ b/README.md @@ -271,7 +271,7 @@ npx antigravity-awesome-skills **Bundles** are curated groups of skills for a specific role or goal (for example: `Web Wizard`, `Security Engineer`, `OSS Maintainer`). -They help you avoid picking from 925+ skills one by one. +They help you avoid picking from 927+ skills one by one. ### ⚠️ Important: Bundles Are NOT Separate Installations!