opencode-skills-collection 4.0.67 → 4.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +281 -1
- package/bundled-skills/access-review/SKILL.md +394 -0
- package/bundled-skills/access-review/references/details.md +121 -0
- package/bundled-skills/agent-evals/SKILL.md +420 -0
- package/bundled-skills/agent-observability/SKILL.md +346 -0
- package/bundled-skills/agent-observability/references/details.md +786 -0
- package/bundled-skills/ai-agent-security/SKILL.md +393 -0
- package/bundled-skills/ai-agent-security/references/details.md +912 -0
- package/bundled-skills/ai-coding-agent-guardrails/SKILL.md +442 -0
- package/bundled-skills/ai-coding-agent-guardrails/references/details.md +753 -0
- package/bundled-skills/ai-inference-service-mesh/SKILL.md +449 -0
- package/bundled-skills/ai-pipeline-orchestration/SKILL.md +287 -0
- package/bundled-skills/ai-red-teaming/SKILL.md +409 -0
- package/bundled-skills/ai-security-hardening/SKILL.md +343 -0
- package/bundled-skills/ai-sre-incident-response/SKILL.md +336 -0
- package/bundled-skills/alerting-oncall/SKILL.md +458 -0
- package/bundled-skills/alerting-oncall/references/details.md +84 -0
- package/bundled-skills/anti-slop-design/SKILL.md +393 -0
- package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +1 -0
- package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
- package/bundled-skills/argocd-gitops/SKILL.md +469 -0
- package/bundled-skills/arm-templates/SKILL.md +438 -0
- package/bundled-skills/arm-templates/references/details.md +64 -0
- package/bundled-skills/artifact-yylo/SKILL.md +122 -0
- package/bundled-skills/asset-inventory/SKILL.md +412 -0
- package/bundled-skills/asset-inventory/references/details.md +127 -0
- package/bundled-skills/audit-logging/SKILL.md +476 -0
- package/bundled-skills/aws-cloudtrail/SKILL.md +486 -0
- package/bundled-skills/aws-cost-optimization/SKILL.md +331 -0
- package/bundled-skills/aws-ec2/SKILL.md +426 -0
- package/bundled-skills/aws-ecs-fargate/SKILL.md +388 -0
- package/bundled-skills/aws-iam/SKILL.md +463 -0
- package/bundled-skills/aws-lambda/SKILL.md +428 -0
- package/bundled-skills/aws-rds/SKILL.md +380 -0
- package/bundled-skills/aws-s3/SKILL.md +434 -0
- package/bundled-skills/aws-secrets-manager/SKILL.md +486 -0
- package/bundled-skills/aws-vpc/SKILL.md +436 -0
- package/bundled-skills/azure-ai-document-intelligence-ts/SKILL.md +1 -1
- package/bundled-skills/azure-aks/SKILL.md +423 -0
- package/bundled-skills/azure-devops/SKILL.md +457 -0
- package/bundled-skills/azure-functions-devsec/SKILL.md +436 -0
- package/bundled-skills/azure-keyvault/SKILL.md +455 -0
- package/bundled-skills/azure-keyvault/references/details.md +83 -0
- package/bundled-skills/azure-monitor-audit/SKILL.md +379 -0
- package/bundled-skills/azure-networking/SKILL.md +448 -0
- package/bundled-skills/azure-networking/references/details.md +135 -0
- package/bundled-skills/azure-sql/SKILL.md +413 -0
- package/bundled-skills/azure-sql/references/details.md +113 -0
- package/bundled-skills/azure-vms/SKILL.md +402 -0
- package/bundled-skills/azure-vms/references/details.md +134 -0
- package/bundled-skills/backup-recovery/SKILL.md +388 -0
- package/bundled-skills/bb-methodology/SKILL.md +451 -0
- package/bundled-skills/bb-methodology/references/details.md +120 -0
- package/bundled-skills/block-storage/SKILL.md +371 -0
- package/bundled-skills/blue-green-deploy/SKILL.md +453 -0
- package/bundled-skills/blue-green-deploy/references/details.md +90 -0
- package/bundled-skills/bug-bounty/SKILL.md +447 -0
- package/bundled-skills/bug-bounty/references/details.md +1316 -0
- package/bundled-skills/bugcrowd-reporting/SKILL.md +351 -0
- package/bundled-skills/business-continuity/SKILL.md +463 -0
- package/bundled-skills/career-ops/SKILL.md +186 -0
- package/bundled-skills/cdn-setup/SKILL.md +374 -0
- package/bundled-skills/change-management/SKILL.md +438 -0
- package/bundled-skills/change-management/references/details.md +105 -0
- package/bundled-skills/circleci/SKILL.md +475 -0
- package/bundled-skills/cis-benchmarks/SKILL.md +150 -0
- package/bundled-skills/cloudflare-pages/SKILL.md +318 -0
- package/bundled-skills/cloudflare-r2/SKILL.md +353 -0
- package/bundled-skills/cloudflare-workers/SKILL.md +415 -0
- package/bundled-skills/cloudflare-zero-trust/SKILL.md +361 -0
- package/bundled-skills/cloudformation/SKILL.md +461 -0
- package/bundled-skills/constraint-driven-development/SKILL.md +335 -0
- package/bundled-skills/constraint-driven-development/references/floor-guard.md +99 -0
- package/bundled-skills/container-hardening/SKILL.md +126 -0
- package/bundled-skills/container-registries/SKILL.md +435 -0
- package/bundled-skills/container-scanning/SKILL.md +416 -0
- package/bundled-skills/convex-backend/SKILL.md +338 -0
- package/bundled-skills/dast-scanning/SKILL.md +437 -0
- package/bundled-skills/database-backups/SKILL.md +425 -0
- package/bundled-skills/datadog/SKILL.md +487 -0
- package/bundled-skills/dependency-scanning/SKILL.md +457 -0
- package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
- package/bundled-skills/disaster-recovery/SKILL.md +374 -0
- package/bundled-skills/disaster-recovery/references/details.md +219 -0
- package/bundled-skills/dns-management/SKILL.md +375 -0
- package/bundled-skills/docker-compose/SKILL.md +482 -0
- package/bundled-skills/docker-management/SKILL.md +426 -0
- package/bundled-skills/ebpf-observability/SKILL.md +436 -0
- package/bundled-skills/ebpf-observability/references/details.md +542 -0
- package/bundled-skills/elk-stack/SKILL.md +487 -0
- package/bundled-skills/enterprise-vpn-attack/SKILL.md +395 -0
- package/bundled-skills/evidence-hygiene/SKILL.md +404 -0
- package/bundled-skills/feature-flags/SKILL.md +426 -0
- package/bundled-skills/feature-flags/references/details.md +86 -0
- package/bundled-skills/fedramp-compliance/SKILL.md +453 -0
- package/bundled-skills/firebase-app-platform/SKILL.md +381 -0
- package/bundled-skills/firewall-config/SKILL.md +479 -0
- package/bundled-skills/gcp-audit-logs/SKILL.md +452 -0
- package/bundled-skills/gcp-audit-logs/references/details.md +56 -0
- package/bundled-skills/gcp-cloud-functions/SKILL.md +284 -0
- package/bundled-skills/gcp-cloud-sql/SKILL.md +277 -0
- package/bundled-skills/gcp-compute/SKILL.md +319 -0
- package/bundled-skills/gcp-gke/SKILL.md +307 -0
- package/bundled-skills/gcp-networking/SKILL.md +293 -0
- package/bundled-skills/gcp-secret-manager/SKILL.md +421 -0
- package/bundled-skills/gcp-secret-manager/references/details.md +131 -0
- package/bundled-skills/gdpr-compliance/SKILL.md +451 -0
- package/bundled-skills/gdpr-compliance/references/details.md +145 -0
- package/bundled-skills/geo-audit/SKILL.md +368 -0
- package/bundled-skills/geo-brand-mentions/SKILL.md +68 -0
- package/bundled-skills/geo-brand-mentions/references/details.md +471 -0
- package/bundled-skills/geo-citability/SKILL.md +350 -0
- package/bundled-skills/geo-compare/SKILL.md +340 -0
- package/bundled-skills/geo-content/SKILL.md +383 -0
- package/bundled-skills/geo-crawlers/SKILL.md +408 -0
- package/bundled-skills/geo-llmstxt/SKILL.md +464 -0
- package/bundled-skills/geo-platform-optimizer/SKILL.md +314 -0
- package/bundled-skills/geo-proposal/SKILL.md +378 -0
- package/bundled-skills/geo-prospect/SKILL.md +225 -0
- package/bundled-skills/geo-report/SKILL.md +436 -0
- package/bundled-skills/geo-report-pdf/SKILL.md +157 -0
- package/bundled-skills/geo-schema/SKILL.md +408 -0
- package/bundled-skills/geo-technical/SKILL.md +78 -0
- package/bundled-skills/geo-technical/references/details.md +543 -0
- package/bundled-skills/git-workflow/SKILL.md +460 -0
- package/bundled-skills/github-actions/SKILL.md +368 -0
- package/bundled-skills/gitlab-ci/SKILL.md +340 -0
- package/bundled-skills/google-no-code/SKILL.md +136 -0
- package/bundled-skills/gpu-kubernetes-operations/SKILL.md +468 -0
- package/bundled-skills/gpu-server-management/SKILL.md +236 -0
- package/bundled-skills/hashicorp-vault/SKILL.md +408 -0
- package/bundled-skills/helm-charts/SKILL.md +469 -0
- package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
- package/bundled-skills/hunt-aspnet/SKILL.md +321 -0
- package/bundled-skills/hunt-ato/SKILL.md +184 -0
- package/bundled-skills/hunt-auth-bypass/SKILL.md +426 -0
- package/bundled-skills/hunt-auth-bypass/references/details.md +80 -0
- package/bundled-skills/hunt-brute-force/SKILL.md +341 -0
- package/bundled-skills/hunt-business-logic/SKILL.md +281 -0
- package/bundled-skills/hunt-cache-poison/SKILL.md +382 -0
- package/bundled-skills/hunt-captcha-bypass/SKILL.md +136 -0
- package/bundled-skills/hunt-cicd/SKILL.md +311 -0
- package/bundled-skills/hunt-clickjacking/SKILL.md +110 -0
- package/bundled-skills/hunt-cors/SKILL.md +335 -0
- package/bundled-skills/hunt-dom/SKILL.md +323 -0
- package/bundled-skills/hunt-exceptional-conditions/SKILL.md +111 -0
- package/bundled-skills/hunt-file-upload/SKILL.md +202 -0
- package/bundled-skills/hunt-fintech-graphql/SKILL.md +289 -0
- package/bundled-skills/hunt-forgot-password/SKILL.md +114 -0
- package/bundled-skills/hunt-grpc/SKILL.md +317 -0
- package/bundled-skills/hunt-host-header/SKILL.md +309 -0
- package/bundled-skills/hunt-html-injection/SKILL.md +106 -0
- package/bundled-skills/hunt-http-smuggling/SKILL.md +129 -0
- package/bundled-skills/hunt-http-smuggling/references/phase2h-smuggling-cachepoison.md +177 -0
- package/bundled-skills/hunt-idor/SKILL.md +434 -0
- package/bundled-skills/hunt-jwt-crypto/SKILL.md +221 -0
- package/bundled-skills/hunt-k8s/SKILL.md +337 -0
- package/bundled-skills/hunt-laravel/SKILL.md +255 -0
- package/bundled-skills/hunt-ldap/SKILL.md +351 -0
- package/bundled-skills/hunt-lfi/SKILL.md +311 -0
- package/bundled-skills/hunt-llm-ai/SKILL.md +289 -0
- package/bundled-skills/hunt-mfa-bypass/SKILL.md +177 -0
- package/bundled-skills/hunt-misc/SKILL.md +378 -0
- package/bundled-skills/hunt-nextjs/SKILL.md +299 -0
- package/bundled-skills/hunt-nodejs/SKILL.md +263 -0
- package/bundled-skills/hunt-nosqli/SKILL.md +210 -0
- package/bundled-skills/hunt-ntlm-info/SKILL.md +314 -0
- package/bundled-skills/hunt-oauth/SKILL.md +459 -0
- package/bundled-skills/hunt-open-redirect/SKILL.md +223 -0
- package/bundled-skills/hunt-race-condition/SKILL.md +381 -0
- package/bundled-skills/hunt-race-condition/references/details.md +159 -0
- package/bundled-skills/hunt-rag-vector/SKILL.md +212 -0
- package/bundled-skills/hunt-rce/SKILL.md +444 -0
- package/bundled-skills/hunt-rce/references/details.md +110 -0
- package/bundled-skills/hunt-saml/SKILL.md +156 -0
- package/bundled-skills/hunt-session/SKILL.md +342 -0
- package/bundled-skills/hunt-shadow-api/SKILL.md +198 -0
- package/bundled-skills/hunt-source-leak/SKILL.md +345 -0
- package/bundled-skills/hunt-spa-api/SKILL.md +163 -0
- package/bundled-skills/hunt-springboot/SKILL.md +285 -0
- package/bundled-skills/hunt-sqli/SKILL.md +466 -0
- package/bundled-skills/hunt-ssrf/SKILL.md +396 -0
- package/bundled-skills/hunt-ssrf/references/details.md +179 -0
- package/bundled-skills/hunt-ssti/SKILL.md +163 -0
- package/bundled-skills/hunt-subdomain/SKILL.md +379 -0
- package/bundled-skills/hunt-tls-network/SKILL.md +399 -0
- package/bundled-skills/hunt-xxe/SKILL.md +466 -0
- package/bundled-skills/i-have-adhd/SKILL.md +170 -0
- package/bundled-skills/idea-evaluator/SKILL.md +75 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-con/SKILL.md +64 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-pro/SKILL.md +64 -0
- package/bundled-skills/identity-access-management/SKILL.md +382 -0
- package/bundled-skills/identity-access-management/references/details.md +524 -0
- package/bundled-skills/incident-management/SKILL.md +484 -0
- package/bundled-skills/incident-response/SKILL.md +448 -0
- package/bundled-skills/incident-response/references/details.md +113 -0
- package/bundled-skills/interview-me/SKILL.md +248 -0
- package/bundled-skills/iso27001-compliance/SKILL.md +460 -0
- package/bundled-skills/jenkins/SKILL.md +462 -0
- package/bundled-skills/jev-use/SKILL.md +158 -0
- package/bundled-skills/kubernetes-hardening/SKILL.md +154 -0
- package/bundled-skills/kubernetes-ops/SKILL.md +449 -0
- package/bundled-skills/kubernetes-ops/references/details.md +108 -0
- package/bundled-skills/kustomize/SKILL.md +478 -0
- package/bundled-skills/ledger-tasks-yylo/SKILL.md +219 -0
- package/bundled-skills/linux-administration/SKILL.md +367 -0
- package/bundled-skills/linux-hardening/SKILL.md +154 -0
- package/bundled-skills/llm-app-security/SKILL.md +389 -0
- package/bundled-skills/llm-app-security/references/details.md +674 -0
- package/bundled-skills/llm-caching/SKILL.md +334 -0
- package/bundled-skills/llm-cost-optimization/SKILL.md +311 -0
- package/bundled-skills/llm-fine-tuning/SKILL.md +329 -0
- package/bundled-skills/llm-gateway/SKILL.md +282 -0
- package/bundled-skills/llm-inference-scaling/SKILL.md +286 -0
- package/bundled-skills/llmops-platform-engineering/SKILL.md +472 -0
- package/bundled-skills/load-balancing/SKILL.md +403 -0
- package/bundled-skills/loki-logging/SKILL.md +479 -0
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +4 -4
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package.json +1 -1
- package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
- package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
- package/bundled-skills/mcp-server-security/SKILL.md +356 -0
- package/bundled-skills/mcp-server-security/references/details.md +745 -0
- package/bundled-skills/mdm-device-management/SKILL.md +404 -0
- package/bundled-skills/mdm-device-management/references/details.md +410 -0
- package/bundled-skills/meme-coin-audit/SKILL.md +402 -0
- package/bundled-skills/mid-engagement-ir-detection/SKILL.md +377 -0
- package/bundled-skills/model-registry-governance/SKILL.md +452 -0
- package/bundled-skills/model-serving-kubernetes/SKILL.md +339 -0
- package/bundled-skills/model-supply-chain-security/SKILL.md +427 -0
- package/bundled-skills/mongodb/SKILL.md +436 -0
- package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +435 -0
- package/bundled-skills/multi-tenant-llm-hosting/references/details.md +211 -0
- package/bundled-skills/mysql/SKILL.md +390 -0
- package/bundled-skills/new-relic/SKILL.md +472 -0
- package/bundled-skills/nfs-storage/SKILL.md +356 -0
- package/bundled-skills/object-storage/SKILL.md +378 -0
- package/bundled-skills/offensive-osint/SKILL.md +443 -0
- package/bundled-skills/okta-attack/SKILL.md +436 -0
- package/bundled-skills/ollama-stack/SKILL.md +379 -0
- package/bundled-skills/openclaw-deployment-hardening/SKILL.md +135 -0
- package/bundled-skills/openclaw-local-mac-mini/SKILL.md +426 -0
- package/bundled-skills/openclaw-local-mac-mini/references/details.md +221 -0
- package/bundled-skills/openclaw-security-hardening/SKILL.md +135 -0
- package/bundled-skills/openshift/SKILL.md +485 -0
- package/bundled-skills/opentelemetry/SKILL.md +438 -0
- package/bundled-skills/opentelemetry/references/details.md +78 -0
- package/bundled-skills/opentofu-migration/SKILL.md +349 -0
- package/bundled-skills/osint-methodology/SKILL.md +460 -0
- package/bundled-skills/osint-methodology/references/details.md +1350 -0
- package/bundled-skills/pci-dss-compliance/SKILL.md +446 -0
- package/bundled-skills/penetration-testing/SKILL.md +152 -0
- package/bundled-skills/performance-tuning/SKILL.md +381 -0
- package/bundled-skills/plan-ledger-tasks-yylo/SKILL.md +52 -0
- package/bundled-skills/planetscale/SKILL.md +297 -0
- package/bundled-skills/platform-engineering/SKILL.md +348 -0
- package/bundled-skills/platform-engineering/references/details.md +944 -0
- package/bundled-skills/podman/SKILL.md +405 -0
- package/bundled-skills/policy-as-code/SKILL.md +434 -0
- package/bundled-skills/policy-as-code/references/details.md +204 -0
- package/bundled-skills/postgresql-devsec/SKILL.md +378 -0
- package/bundled-skills/prometheus-grafana/SKILL.md +469 -0
- package/bundled-skills/prompt-injection-defense/SKILL.md +483 -0
- package/bundled-skills/rag-infrastructure/SKILL.md +269 -0
- package/bundled-skills/rag-observability-evals/SKILL.md +444 -0
- package/bundled-skills/rag-observability-evals/references/details.md +92 -0
- package/bundled-skills/ralph-loop-yylo/SKILL.md +55 -0
- package/bundled-skills/ralph-loop-yylo/references/first_check.md +18 -0
- package/bundled-skills/ralph-loop-yylo/references/implement.md +60 -0
- package/bundled-skills/recon-scope-triage/SKILL.md +128 -0
- package/bundled-skills/redis/SKILL.md +421 -0
- package/bundled-skills/redteam-report-template/SKILL.md +370 -0
- package/bundled-skills/report-writing/SKILL.md +426 -0
- package/bundled-skills/report-writing/references/details.md +187 -0
- package/bundled-skills/resumable-implementation-contracts/SKILL.md +254 -0
- package/bundled-skills/reverse-proxy/SKILL.md +420 -0
- package/bundled-skills/runbook-creation/SKILL.md +438 -0
- package/bundled-skills/runbook-creation/references/details.md +71 -0
- package/bundled-skills/saas-security-posture/SKILL.md +415 -0
- package/bundled-skills/sast-scanning/SKILL.md +444 -0
- package/bundled-skills/sbom-supply-chain/SKILL.md +433 -0
- package/bundled-skills/security-arsenal/SKILL.md +446 -0
- package/bundled-skills/security-arsenal/references/details.md +540 -0
- package/bundled-skills/security-automation/SKILL.md +146 -0
- package/bundled-skills/semantic-versioning/SKILL.md +434 -0
- package/bundled-skills/semantic-versioning/references/details.md +83 -0
- package/bundled-skills/service-mesh/SKILL.md +422 -0
- package/bundled-skills/soc2-compliance/SKILL.md +409 -0
- package/bundled-skills/sops-encryption/SKILL.md +124 -0
- package/bundled-skills/sre-dashboards/SKILL.md +143 -0
- package/bundled-skills/ssh-configuration/SKILL.md +324 -0
- package/bundled-skills/ssl-tls-management/SKILL.md +428 -0
- package/bundled-skills/ssl-tls-management/references/details.md +99 -0
- package/bundled-skills/startup-it-troubleshooting/SKILL.md +415 -0
- package/bundled-skills/supply-chain-attack-recon/SKILL.md +453 -0
- package/bundled-skills/supply-chain-attack-recon/references/details.md +258 -0
- package/bundled-skills/systemd-services/SKILL.md +379 -0
- package/bundled-skills/terraform-aws/SKILL.md +125 -0
- package/bundled-skills/terraform-azure/SKILL.md +415 -0
- package/bundled-skills/terraform-azure/references/details.md +231 -0
- package/bundled-skills/terraform-gcp/SKILL.md +369 -0
- package/bundled-skills/threat-modeling/SKILL.md +487 -0
- package/bundled-skills/understand-project-yylo/SKILL.md +62 -0
- package/bundled-skills/user-management/SKILL.md +383 -0
- package/bundled-skills/using-agent-skills/SKILL.md +220 -0
- package/bundled-skills/vector-database-ops/SKILL.md +300 -0
- package/bundled-skills/vendor-management/SKILL.md +439 -0
- package/bundled-skills/vendor-management/references/details.md +109 -0
- package/bundled-skills/vercel-deployments/SKILL.md +296 -0
- package/bundled-skills/vllm-server/SKILL.md +236 -0
- package/bundled-skills/vmware-vcenter-attack/SKILL.md +412 -0
- package/bundled-skills/vpn-setup/SKILL.md +452 -0
- package/bundled-skills/vulnerability-scanning/SKILL.md +448 -0
- package/bundled-skills/waf-setup/SKILL.md +354 -0
- package/bundled-skills/waf-setup/references/details.md +211 -0
- package/bundled-skills/weather-model-data-fetching/SKILL.md +277 -0
- package/bundled-skills/weather-observation-fetching/SKILL.md +246 -0
- package/bundled-skills/web2-recon/SKILL.md +440 -0
- package/bundled-skills/web2-recon/references/details.md +319 -0
- package/bundled-skills/web3-audit/SKILL.md +445 -0
- package/bundled-skills/web3-audit/references/details.md +224 -0
- package/bundled-skills/wiki-yylo/SKILL.md +114 -0
- package/bundled-skills/windows-hardening/SKILL.md +454 -0
- package/bundled-skills/windows-hardening/references/details.md +204 -0
- package/bundled-skills/windows-server/SKILL.md +318 -0
- package/bundled-skills/workflow-yylo/SKILL.md +107 -0
- package/bundled-skills/zero-trust/SKILL.md +461 -0
- package/package.json +1 -1
- package/skills_index.json +6924 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-flags
|
|
3
|
+
description: Implement feature flags for progressive feature rollout using LaunchDarkly,
|
|
4
|
+
Unleash, or custom solutions.
|
|
5
|
+
category: devops
|
|
6
|
+
risk: critical
|
|
7
|
+
source: https://github.com/BagelHole/DevOps-Security-Agent-Skills
|
|
8
|
+
source_repo: BagelHole/DevOps-Security-Agent-Skills
|
|
9
|
+
source_type: community
|
|
10
|
+
date_added: '2026-09-20'
|
|
11
|
+
license: MIT
|
|
12
|
+
license_source: https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/main/LICENSE
|
|
13
|
+
compatibility: Requires the relevant platform CLIs (kubectl, helm, terraform, git,
|
|
14
|
+
CI runners) and authorized access to the target environment. Docs-only; helper scripts
|
|
15
|
+
and templates not bundled.
|
|
16
|
+
metadata:
|
|
17
|
+
author: devops-skills
|
|
18
|
+
version: '1.0'
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Feature Flags
|
|
22
|
+
|
|
23
|
+
Control feature releases and enable progressive rollout with feature flag systems.
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
- Application code access
|
|
28
|
+
- Feature flag service or self-hosted solution
|
|
29
|
+
- Basic understanding of deployment patterns
|
|
30
|
+
|
|
31
|
+
## Feature Flag Types
|
|
32
|
+
|
|
33
|
+
| Type | Purpose | Example |
|
|
34
|
+
|------|---------|---------|
|
|
35
|
+
| Release | Control feature visibility | New checkout flow |
|
|
36
|
+
| Experiment | A/B testing | Button color test |
|
|
37
|
+
| Ops | Runtime configuration | Rate limiting |
|
|
38
|
+
| Permission | User access control | Premium features |
|
|
39
|
+
| Kill Switch | Emergency disable | Third-party integration |
|
|
40
|
+
|
|
41
|
+
## LaunchDarkly
|
|
42
|
+
|
|
43
|
+
### SDK Setup (Node.js)
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
const LaunchDarkly = require('launchdarkly-node-server-sdk');
|
|
47
|
+
|
|
48
|
+
const client = LaunchDarkly.init(process.env.LAUNCHDARKLY_SDK_KEY);
|
|
49
|
+
|
|
50
|
+
await client.waitForInitialization();
|
|
51
|
+
|
|
52
|
+
// Evaluate flag
|
|
53
|
+
const user = {
|
|
54
|
+
key: 'user-123',
|
|
55
|
+
email: 'user@example.com',
|
|
56
|
+
custom: {
|
|
57
|
+
plan: 'premium',
|
|
58
|
+
company: 'acme'
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const showNewFeature = await client.variation('new-checkout', user, false);
|
|
63
|
+
|
|
64
|
+
if (showNewFeature) {
|
|
65
|
+
// New feature code
|
|
66
|
+
} else {
|
|
67
|
+
// Existing code
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### React SDK
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
import { withLDProvider, useFlags, useLDClient } from 'launchdarkly-react-client-sdk';
|
|
75
|
+
|
|
76
|
+
// Provider setup
|
|
77
|
+
export default withLDProvider({
|
|
78
|
+
clientSideID: 'your-client-side-id',
|
|
79
|
+
user: {
|
|
80
|
+
key: 'user-123',
|
|
81
|
+
email: 'user@example.com'
|
|
82
|
+
}
|
|
83
|
+
})(App);
|
|
84
|
+
|
|
85
|
+
// Using flags in component
|
|
86
|
+
function FeatureComponent() {
|
|
87
|
+
const { newCheckout, experimentVariant } = useFlags();
|
|
88
|
+
const ldClient = useLDClient();
|
|
89
|
+
|
|
90
|
+
// Track events
|
|
91
|
+
const handleClick = () => {
|
|
92
|
+
ldClient.track('checkout-started');
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (newCheckout) {
|
|
96
|
+
return <NewCheckout onClick={handleClick} />;
|
|
97
|
+
}
|
|
98
|
+
return <OldCheckout onClick={handleClick} />;
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Targeting Rules
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
# LaunchDarkly targeting configuration
|
|
106
|
+
flag: new-checkout
|
|
107
|
+
targeting:
|
|
108
|
+
# Individual users
|
|
109
|
+
targets:
|
|
110
|
+
- variation: true
|
|
111
|
+
values: ['user-123', 'user-456']
|
|
112
|
+
|
|
113
|
+
# Rules
|
|
114
|
+
rules:
|
|
115
|
+
# Beta users
|
|
116
|
+
- variation: true
|
|
117
|
+
clauses:
|
|
118
|
+
- attribute: email
|
|
119
|
+
op: endsWith
|
|
120
|
+
values: ['@company.com']
|
|
121
|
+
|
|
122
|
+
# Premium plan
|
|
123
|
+
- variation: true
|
|
124
|
+
clauses:
|
|
125
|
+
- attribute: plan
|
|
126
|
+
op: in
|
|
127
|
+
values: ['premium', 'enterprise']
|
|
128
|
+
|
|
129
|
+
# Percentage rollout
|
|
130
|
+
- variation: true
|
|
131
|
+
rollout:
|
|
132
|
+
variations:
|
|
133
|
+
- variation: true
|
|
134
|
+
weight: 20000 # 20%
|
|
135
|
+
- variation: false
|
|
136
|
+
weight: 80000 # 80%
|
|
137
|
+
|
|
138
|
+
# Default
|
|
139
|
+
fallthrough:
|
|
140
|
+
variation: false
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Unleash
|
|
144
|
+
|
|
145
|
+
### Server Setup
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
# docker-compose.yml
|
|
149
|
+
version: '3.8'
|
|
150
|
+
|
|
151
|
+
services:
|
|
152
|
+
unleash:
|
|
153
|
+
image: unleashorg/unleash-server:latest
|
|
154
|
+
ports:
|
|
155
|
+
- "4242:4242"
|
|
156
|
+
environment:
|
|
157
|
+
- DATABASE_URL=postgres://postgres:password@db/unleash
|
|
158
|
+
- DATABASE_SSL=false
|
|
159
|
+
depends_on:
|
|
160
|
+
- db
|
|
161
|
+
|
|
162
|
+
db:
|
|
163
|
+
image: postgres:15
|
|
164
|
+
environment:
|
|
165
|
+
- POSTGRES_PASSWORD=password
|
|
166
|
+
- POSTGRES_DB=unleash
|
|
167
|
+
volumes:
|
|
168
|
+
- postgres-data:/var/lib/postgresql/data
|
|
169
|
+
|
|
170
|
+
volumes:
|
|
171
|
+
postgres-data:
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### SDK Setup (Node.js)
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
const { initialize } = require('unleash-client');
|
|
178
|
+
|
|
179
|
+
const unleash = initialize({
|
|
180
|
+
url: 'http://localhost:4242/api',
|
|
181
|
+
appName: 'my-app',
|
|
182
|
+
customHeaders: {
|
|
183
|
+
Authorization: 'your-api-token'
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
unleash.on('ready', () => {
|
|
188
|
+
// Check feature
|
|
189
|
+
const isEnabled = unleash.isEnabled('new-checkout');
|
|
190
|
+
|
|
191
|
+
// With context
|
|
192
|
+
const context = {
|
|
193
|
+
userId: 'user-123',
|
|
194
|
+
properties: {
|
|
195
|
+
plan: 'premium'
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const isEnabledForUser = unleash.isEnabled('new-checkout', context);
|
|
200
|
+
|
|
201
|
+
// Get variant
|
|
202
|
+
const variant = unleash.getVariant('experiment-flag', context);
|
|
203
|
+
console.log(variant.name); // 'control' or 'treatment'
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Activation Strategies
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
# Standard strategies
|
|
211
|
+
strategies:
|
|
212
|
+
- name: default
|
|
213
|
+
# On/off for everyone
|
|
214
|
+
|
|
215
|
+
- name: userWithId
|
|
216
|
+
parameters:
|
|
217
|
+
userIds: 'user-1,user-2,user-3'
|
|
218
|
+
|
|
219
|
+
- name: gradualRolloutUserId
|
|
220
|
+
parameters:
|
|
221
|
+
percentage: 25
|
|
222
|
+
groupId: 'new-feature'
|
|
223
|
+
|
|
224
|
+
- name: gradualRolloutRandom
|
|
225
|
+
parameters:
|
|
226
|
+
percentage: 50
|
|
227
|
+
|
|
228
|
+
- name: flexibleRollout
|
|
229
|
+
parameters:
|
|
230
|
+
rollout: 30
|
|
231
|
+
stickiness: userId
|
|
232
|
+
groupId: 'checkout-exp'
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Custom Implementation
|
|
236
|
+
|
|
237
|
+
### Database-Backed Flags
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
# models.py
|
|
241
|
+
from django.db import models
|
|
242
|
+
|
|
243
|
+
class FeatureFlag(models.Model):
|
|
244
|
+
name = models.CharField(max_length=100, unique=True)
|
|
245
|
+
enabled = models.BooleanField(default=False)
|
|
246
|
+
rollout_percentage = models.IntegerField(default=0)
|
|
247
|
+
allowed_users = models.JSONField(default=list)
|
|
248
|
+
rules = models.JSONField(default=dict)
|
|
249
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
|
250
|
+
updated_at = models.DateTimeField(auto_now=True)
|
|
251
|
+
|
|
252
|
+
# service.py
|
|
253
|
+
import hashlib
|
|
254
|
+
|
|
255
|
+
class FeatureFlagService:
|
|
256
|
+
def __init__(self):
|
|
257
|
+
self._cache = {}
|
|
258
|
+
|
|
259
|
+
def is_enabled(self, flag_name, user_id=None, context=None):
|
|
260
|
+
flag = self._get_flag(flag_name)
|
|
261
|
+
|
|
262
|
+
if not flag or not flag.enabled:
|
|
263
|
+
return False
|
|
264
|
+
|
|
265
|
+
# Check user allowlist
|
|
266
|
+
if user_id and user_id in flag.allowed_users:
|
|
267
|
+
return True
|
|
268
|
+
|
|
269
|
+
# Check rules
|
|
270
|
+
if context and self._evaluate_rules(flag.rules, context):
|
|
271
|
+
return True
|
|
272
|
+
|
|
273
|
+
# Check percentage rollout
|
|
274
|
+
if flag.rollout_percentage > 0 and user_id:
|
|
275
|
+
return self._is_in_rollout(flag_name, user_id, flag.rollout_percentage)
|
|
276
|
+
|
|
277
|
+
return flag.rollout_percentage == 100
|
|
278
|
+
|
|
279
|
+
def _is_in_rollout(self, flag_name, user_id, percentage):
|
|
280
|
+
hash_input = f"{flag_name}:{user_id}"
|
|
281
|
+
hash_value = int(hashlib.md5(hash_input.encode()).hexdigest(), 16)
|
|
282
|
+
return (hash_value % 100) < percentage
|
|
283
|
+
|
|
284
|
+
def _evaluate_rules(self, rules, context):
|
|
285
|
+
for rule in rules.get('rules', []):
|
|
286
|
+
if self._evaluate_rule(rule, context):
|
|
287
|
+
return True
|
|
288
|
+
return False
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Redis-Backed Flags
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
import redis
|
|
295
|
+
import json
|
|
296
|
+
|
|
297
|
+
class RedisFeatureFlags:
|
|
298
|
+
def __init__(self, redis_url):
|
|
299
|
+
self.redis = redis.from_url(redis_url)
|
|
300
|
+
self.prefix = 'feature_flag:'
|
|
301
|
+
|
|
302
|
+
def set_flag(self, name, config):
|
|
303
|
+
key = f"{self.prefix}{name}"
|
|
304
|
+
self.redis.set(key, json.dumps(config))
|
|
305
|
+
|
|
306
|
+
def is_enabled(self, name, user_id=None):
|
|
307
|
+
key = f"{self.prefix}{name}"
|
|
308
|
+
data = self.redis.get(key)
|
|
309
|
+
|
|
310
|
+
if not data:
|
|
311
|
+
return False
|
|
312
|
+
|
|
313
|
+
config = json.loads(data)
|
|
314
|
+
|
|
315
|
+
if not config.get('enabled', False):
|
|
316
|
+
return False
|
|
317
|
+
|
|
318
|
+
# User allowlist
|
|
319
|
+
if user_id in config.get('users', []):
|
|
320
|
+
return True
|
|
321
|
+
|
|
322
|
+
# Percentage rollout
|
|
323
|
+
percentage = config.get('percentage', 0)
|
|
324
|
+
if percentage == 100:
|
|
325
|
+
return True
|
|
326
|
+
|
|
327
|
+
if percentage > 0 and user_id:
|
|
328
|
+
return self._hash_user(name, user_id) < percentage
|
|
329
|
+
|
|
330
|
+
return False
|
|
331
|
+
|
|
332
|
+
def _hash_user(self, flag, user_id):
|
|
333
|
+
import hashlib
|
|
334
|
+
hash_input = f"{flag}:{user_id}"
|
|
335
|
+
return int(hashlib.sha256(hash_input.encode()).hexdigest(), 16) % 100
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Testing with Feature Flags
|
|
339
|
+
|
|
340
|
+
### Unit Testing
|
|
341
|
+
|
|
342
|
+
```javascript
|
|
343
|
+
// Jest mocking
|
|
344
|
+
jest.mock('launchdarkly-node-server-sdk', () => ({
|
|
345
|
+
init: jest.fn(() => ({
|
|
346
|
+
waitForInitialization: jest.fn().mockResolvedValue(undefined),
|
|
347
|
+
variation: jest.fn()
|
|
348
|
+
}))
|
|
349
|
+
}));
|
|
350
|
+
|
|
351
|
+
describe('Checkout', () => {
|
|
352
|
+
it('shows new checkout when flag enabled', async () => {
|
|
353
|
+
const ldClient = require('launchdarkly-node-server-sdk').init();
|
|
354
|
+
ldClient.variation.mockResolvedValue(true);
|
|
355
|
+
|
|
356
|
+
const result = await renderCheckout(user);
|
|
357
|
+
expect(result).toContain('NewCheckout');
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
it('shows old checkout when flag disabled', async () => {
|
|
361
|
+
const ldClient = require('launchdarkly-node-server-sdk').init();
|
|
362
|
+
ldClient.variation.mockResolvedValue(false);
|
|
363
|
+
|
|
364
|
+
const result = await renderCheckout(user);
|
|
365
|
+
expect(result).toContain('OldCheckout');
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Integration Testing
|
|
371
|
+
|
|
372
|
+
```python
|
|
373
|
+
# pytest fixtures
|
|
374
|
+
import pytest
|
|
375
|
+
|
|
376
|
+
@pytest.fixture
|
|
377
|
+
def feature_flags():
|
|
378
|
+
"""Provide controllable feature flags for testing."""
|
|
379
|
+
flags = {}
|
|
380
|
+
|
|
381
|
+
class TestFlags:
|
|
382
|
+
def set(self, name, value):
|
|
383
|
+
flags[name] = value
|
|
384
|
+
|
|
385
|
+
def is_enabled(self, name, **kwargs):
|
|
386
|
+
return flags.get(name, False)
|
|
387
|
+
|
|
388
|
+
return TestFlags()
|
|
389
|
+
|
|
390
|
+
def test_new_checkout(feature_flags):
|
|
391
|
+
feature_flags.set('new-checkout', True)
|
|
392
|
+
|
|
393
|
+
response = client.get('/checkout')
|
|
394
|
+
assert 'new-checkout-form' in response.content
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
## Contents
|
|
399
|
+
|
|
400
|
+
- [Monitoring and Analytics](references/details.md)
|
|
401
|
+
- [Common Issues](references/details.md)
|
|
402
|
+
- [Best Practices](references/details.md)
|
|
403
|
+
- [Related Skills](references/details.md)
|
|
404
|
+
|
|
405
|
+
## When to Use This Skill
|
|
406
|
+
|
|
407
|
+
Use this skill when:
|
|
408
|
+
- Implementing gradual feature rollouts
|
|
409
|
+
- Enabling trunk-based development
|
|
410
|
+
- Running A/B tests and experiments
|
|
411
|
+
- Managing feature lifecycles
|
|
412
|
+
- Implementing kill switches for production
|
|
413
|
+
|
|
414
|
+
## Limitations
|
|
415
|
+
|
|
416
|
+
- Guidance executes against real environments: confirm target, blast radius, and rollback plan before applying anything.
|
|
417
|
+
- Never deploy to production without explicit approval. Docs-only import: upstream scripts and templates not bundled.
|
|
418
|
+
|
|
419
|
+
### Example
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
git status && git diff --stat
|
|
423
|
+
kubectl diff -f manifest.yaml
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
> Adapted from [BagelHole/DevOps-Security-Agent-Skills](https://github.com/BagelHole/DevOps-Security-Agent-Skills) (MIT); frontmatter, When to Use/Limitations, and safety boundaries added for upstream compliance. Docs-only import: helper scripts and templates not bundled.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Details (moved from SKILL.md)
|
|
2
|
+
|
|
3
|
+
> Extended reference content for `feature-flags`, kept under `references/` so the entrypoint stays within the audit budget.
|
|
4
|
+
|
|
5
|
+
## Monitoring and Analytics
|
|
6
|
+
|
|
7
|
+
### Flag Usage Tracking
|
|
8
|
+
|
|
9
|
+
```javascript
|
|
10
|
+
// Track flag evaluations
|
|
11
|
+
const flagMetrics = {
|
|
12
|
+
evaluations: new Map(),
|
|
13
|
+
|
|
14
|
+
track(flagName, variation, user) {
|
|
15
|
+
const key = `${flagName}:${variation}`;
|
|
16
|
+
const count = this.evaluations.get(key) || 0;
|
|
17
|
+
this.evaluations.set(key, count + 1);
|
|
18
|
+
|
|
19
|
+
// Send to analytics
|
|
20
|
+
analytics.track('feature_flag_evaluated', {
|
|
21
|
+
flag: flagName,
|
|
22
|
+
variation: variation,
|
|
23
|
+
userId: user.key
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Stale Flag Detection
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from datetime import datetime, timedelta
|
|
33
|
+
|
|
34
|
+
def detect_stale_flags():
|
|
35
|
+
"""Find flags that haven't been evaluated recently."""
|
|
36
|
+
stale_threshold = timedelta(days=30)
|
|
37
|
+
now = datetime.utcnow()
|
|
38
|
+
|
|
39
|
+
stale_flags = []
|
|
40
|
+
for flag in FeatureFlag.objects.all():
|
|
41
|
+
if flag.last_evaluated:
|
|
42
|
+
age = now - flag.last_evaluated
|
|
43
|
+
if age > stale_threshold:
|
|
44
|
+
stale_flags.append({
|
|
45
|
+
'name': flag.name,
|
|
46
|
+
'last_evaluated': flag.last_evaluated,
|
|
47
|
+
'age_days': age.days
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
return stale_flags
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
## Common Issues
|
|
55
|
+
|
|
56
|
+
### Issue: Inconsistent Flag Evaluation
|
|
57
|
+
**Problem**: Same user sees different variations
|
|
58
|
+
**Solution**: Use consistent hashing, check caching strategy
|
|
59
|
+
|
|
60
|
+
### Issue: Flag Debt Accumulation
|
|
61
|
+
**Problem**: Too many old flags in codebase
|
|
62
|
+
**Solution**: Implement flag lifecycle, regular cleanup sprints
|
|
63
|
+
|
|
64
|
+
### Issue: Performance Impact
|
|
65
|
+
**Problem**: Flag evaluation slowing requests
|
|
66
|
+
**Solution**: Use local caching, batch evaluations
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
## Best Practices
|
|
70
|
+
|
|
71
|
+
- Use consistent naming conventions
|
|
72
|
+
- Document flag purpose and owner
|
|
73
|
+
- Set expiration dates for temporary flags
|
|
74
|
+
- Implement flag lifecycle management
|
|
75
|
+
- Use gradual rollouts (not 0→100)
|
|
76
|
+
- Monitor flag evaluation metrics
|
|
77
|
+
- Clean up old flags regularly
|
|
78
|
+
- Test both variations in CI
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
## Related Skills
|
|
82
|
+
|
|
83
|
+
- blue-green-deploy (`blue-green-deploy`) - Deployment strategies
|
|
84
|
+
- git-workflow (`git-workflow`) - Trunk-based development
|
|
85
|
+
- alerting-oncall (`alerting-oncall`) - Monitoring rollouts
|
|
86
|
+
|