opencode-skills-collection 4.0.68 → 4.0.70
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 +304 -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/api-integration-architect/SKILL.md +241 -0
- package/bundled-skills/apify-generate-output-schema/SKILL.md +438 -0
- package/bundled-skills/apify-integration-development/SKILL.md +168 -0
- package/bundled-skills/apify-integration-development/references/ai-framework-package.md +158 -0
- package/bundled-skills/apify-integration-development/references/ai-harness-plugin.md +192 -0
- package/bundled-skills/apify-integration-development/references/sdk-integration.md +236 -0
- package/bundled-skills/apify-integration-development/references/workflow-automation.md +163 -0
- package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
- package/bundled-skills/architecture-review/README.md +42 -0
- package/bundled-skills/architecture-review/SKILL.md +77 -0
- package/bundled-skills/architecture-review/examples.md +11 -0
- package/bundled-skills/architecture-review/reference/best-practices.md +7 -0
- package/bundled-skills/architecture-review/reference/capabilities.md +20 -0
- package/bundled-skills/architecture-review/reference/fallbacks.md +11 -0
- package/bundled-skills/architecture-review/reference/graph.md +15 -0
- package/bundled-skills/architecture-review/reference/mcp.md +14 -0
- package/bundled-skills/architecture-review/reference/workflow.md +15 -0
- package/bundled-skills/architecture-review/templates/architecture-review.md +21 -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/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/code-review-sensei/SKILL.md +177 -0
- package/bundled-skills/codebase-onboarding/README.md +42 -0
- package/bundled-skills/codebase-onboarding/SKILL.md +77 -0
- package/bundled-skills/codebase-onboarding/examples.md +11 -0
- package/bundled-skills/codebase-onboarding/reference/best-practices.md +7 -0
- package/bundled-skills/codebase-onboarding/reference/capabilities.md +20 -0
- package/bundled-skills/codebase-onboarding/reference/fallbacks.md +11 -0
- package/bundled-skills/codebase-onboarding/reference/graph.md +15 -0
- package/bundled-skills/codebase-onboarding/reference/mcp.md +14 -0
- package/bundled-skills/codebase-onboarding/reference/workflow.md +15 -0
- package/bundled-skills/codebase-onboarding/templates/repository-onboarding.md +21 -0
- package/bundled-skills/connection-auth-rules/SKILL.md +199 -0
- package/bundled-skills/connection-auth-rules/fetch_schema.py +320 -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-analysis/README.md +42 -0
- package/bundled-skills/dependency-analysis/SKILL.md +76 -0
- package/bundled-skills/dependency-analysis/examples.md +11 -0
- package/bundled-skills/dependency-analysis/reference/best-practices.md +7 -0
- package/bundled-skills/dependency-analysis/reference/capabilities.md +20 -0
- package/bundled-skills/dependency-analysis/reference/fallbacks.md +11 -0
- package/bundled-skills/dependency-analysis/reference/graph.md +15 -0
- package/bundled-skills/dependency-analysis/reference/mcp.md +14 -0
- package/bundled-skills/dependency-analysis/reference/workflow.md +15 -0
- package/bundled-skills/dependency-analysis/templates/dependency-review.md +21 -0
- package/bundled-skills/dependency-scanning/SKILL.md +457 -0
- package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
- package/bundled-skills/devops-pipeline-builder/SKILL.md +200 -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/eas-app-stores/SKILL.md +197 -0
- package/bundled-skills/eas-app-stores/agents/openai.yaml +4 -0
- package/bundled-skills/eas-app-stores/references/app-store-metadata.md +497 -0
- package/bundled-skills/eas-app-stores/references/ios-app-store.md +376 -0
- package/bundled-skills/eas-app-stores/references/native-ios.md +167 -0
- package/bundled-skills/eas-app-stores/references/play-store.md +244 -0
- package/bundled-skills/eas-app-stores/references/testflight.md +62 -0
- package/bundled-skills/eas-app-stores/references/workflows.md +120 -0
- package/bundled-skills/eas-hosting/SKILL.md +448 -0
- package/bundled-skills/eas-hosting/agents/openai.yaml +4 -0
- package/bundled-skills/eas-observe/SKILL.md +75 -0
- package/bundled-skills/eas-observe/agents/openai.yaml +4 -0
- package/bundled-skills/eas-observe/references/metrics.md +98 -0
- package/bundled-skills/eas-observe/references/queries.md +403 -0
- package/bundled-skills/eas-observe/references/setup.md +476 -0
- package/bundled-skills/eas-observe/references/third-party.md +136 -0
- package/bundled-skills/eas-simulator/SKILL.md +251 -0
- package/bundled-skills/eas-simulator/agents/openai.yaml +4 -0
- package/bundled-skills/eas-simulator/references/controllers.md +135 -0
- package/bundled-skills/eas-simulator/references/run-your-app.md +240 -0
- package/bundled-skills/eas-simulator/references/troubleshooting.md +47 -0
- package/bundled-skills/eas-workflows/SKILL.md +119 -0
- package/bundled-skills/eas-workflows/agents/openai.yaml +4 -0
- package/bundled-skills/eas-workflows/scripts/fetch.js +109 -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/expo-animation/LICENSE +21 -0
- package/bundled-skills/expo-animation/RECIPES.md +385 -0
- package/bundled-skills/expo-animation/SKILL.md +295 -0
- package/bundled-skills/expo-animation/agents/openai.yaml +4 -0
- package/bundled-skills/fact-check-x-unified/SKILL.md +178 -0
- package/bundled-skills/fact-check-x-unified/agents/openai.yaml +4 -0
- package/bundled-skills/fact-check-x-unified/references/acceptance-criteria.md +44 -0
- package/bundled-skills/fact-check-x-unified/references/contracts.md +39 -0
- package/bundled-skills/fact-check-x-unified/scripts/common.py +31 -0
- package/bundled-skills/fact-check-x-unified/scripts/fact_check_x.py +1832 -0
- package/bundled-skills/fact-check-x-unified/scripts/trusted_search_config.py +324 -0
- package/bundled-skills/fact-check-x-unified/tests/anchor_downgrade_test.py +90 -0
- package/bundled-skills/fact-check-x-unified/tests/multi_platform_test.py +369 -0
- package/bundled-skills/fact-check-x-unified/tests/smoke_test.py +740 -0
- package/bundled-skills/fact-check-x-unified/tests/stage_checkpoint_test.py +103 -0
- package/bundled-skills/fact-check-x-unified/tests/trusted_search_config_test.py +156 -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/gpt-taste/SKILL.md +8 -1
- 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/hf-cli/SKILL.md +263 -0
- package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
- package/bundled-skills/huggingface-community-evals/SKILL.md +228 -0
- package/bundled-skills/huggingface-community-evals/examples/.env.example +3 -0
- package/bundled-skills/huggingface-community-evals/examples/USAGE_EXAMPLES.md +101 -0
- package/bundled-skills/huggingface-community-evals/scripts/inspect_eval_uv.py +104 -0
- package/bundled-skills/huggingface-community-evals/scripts/inspect_vllm_uv.py +306 -0
- package/bundled-skills/huggingface-community-evals/scripts/lighteval_vllm_uv.py +297 -0
- package/bundled-skills/huggingface-datasets/SKILL.md +130 -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/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-social/SKILL.md +182 -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/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/longbridge-derivatives/SKILL.md +117 -0
- package/bundled-skills/longbridge-derivatives/references/option.md +36 -0
- package/bundled-skills/longbridge-derivatives/references/options-advanced.md +101 -0
- package/bundled-skills/longbridge-derivatives/references/options-pnl.md +74 -0
- package/bundled-skills/longbridge-derivatives/references/options-strategy.md +82 -0
- package/bundled-skills/longbridge-derivatives/references/options-volatility.md +70 -0
- package/bundled-skills/longbridge-derivatives/references/warrant.md +12 -0
- package/bundled-skills/longbridge-quant/SKILL.md +151 -0
- package/bundled-skills/longbridge-quant/references/correlation.md +51 -0
- package/bundled-skills/longbridge-quant/references/execution-model.md +68 -0
- package/bundled-skills/longbridge-quant/references/factor-research.md +95 -0
- package/bundled-skills/longbridge-quant/references/factor-screen.md +101 -0
- package/bundled-skills/longbridge-quant/references/hedging.md +136 -0
- package/bundled-skills/longbridge-quant/references/ml-strategy.md +77 -0
- package/bundled-skills/longbridge-quant/references/multifactor.md +68 -0
- package/bundled-skills/longbridge-quant/references/pairs-trading.md +61 -0
- package/bundled-skills/longbridge-quant/references/quant-cli.md +133 -0
- package/bundled-skills/longbridge-quant/references/quant-stats.md +150 -0
- package/bundled-skills/longbridge-quant/references/seasonality.md +50 -0
- package/bundled-skills/longbridge-quant/references/strategy-optimizer.md +68 -0
- package/bundled-skills/longbridge-quant/references/volatility-strategy.md +52 -0
- package/bundled-skills/longbridge-research/SKILL.md +187 -0
- package/bundled-skills/longbridge-research/references/company-profile.md +96 -0
- package/bundled-skills/longbridge-research/references/company-tearsheet.md +82 -0
- package/bundled-skills/longbridge-research/references/competitive-analysis.md +81 -0
- package/bundled-skills/longbridge-research/references/consensus.md +92 -0
- package/bundled-skills/longbridge-research/references/coverage-initiation.md +76 -0
- package/bundled-skills/longbridge-research/references/defi-yield.md +60 -0
- package/bundled-skills/longbridge-research/references/finance-calendar.md +165 -0
- package/bundled-skills/longbridge-research/references/financial-planning.md +77 -0
- package/bundled-skills/longbridge-research/references/forecast-eps.md +39 -0
- package/bundled-skills/longbridge-research/references/fund-holder.md +44 -0
- package/bundled-skills/longbridge-research/references/hkipo-analysis.md +101 -0
- package/bundled-skills/longbridge-research/references/industry-peers.md +46 -0
- package/bundled-skills/longbridge-research/references/industry-rank.md +62 -0
- package/bundled-skills/longbridge-research/references/insider-trades.md +48 -0
- package/bundled-skills/longbridge-research/references/institution-rating.md +62 -0
- package/bundled-skills/longbridge-research/references/investment-ideas.md +69 -0
- package/bundled-skills/longbridge-research/references/investment-proposal.md +95 -0
- package/bundled-skills/longbridge-research/references/investors.md +87 -0
- package/bundled-skills/longbridge-research/references/onchain.md +70 -0
- package/bundled-skills/longbridge-research/references/post-investment.md +76 -0
- package/bundled-skills/longbridge-research/references/shareholder.md +72 -0
- package/bundled-skills/longbridge-research/references/short-positions.md +50 -0
- package/bundled-skills/longbridge-research/references/short-trades.md +50 -0
- package/bundled-skills/longbridge-research/references/stock-research.md +61 -0
- package/bundled-skills/longbridge-research/references/thesis-tracker.md +64 -0
- package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
- package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
- package/bundled-skills/makepad-2-0-animation/SKILL.md +318 -0
- package/bundled-skills/makepad-2-0-animation/references/animator-reference.md +433 -0
- package/bundled-skills/makepad-2-0-dsl/SKILL.md +492 -0
- package/bundled-skills/makepad-2-0-dsl/references/dsl-syntax-reference.md +511 -0
- package/bundled-skills/makepad-2-0-dsl/references/extended-guide.md +56 -0
- package/bundled-skills/makepad-2-0-dsl/references/property-system.md +757 -0
- package/bundled-skills/makepad-2-0-events/SKILL.md +497 -0
- package/bundled-skills/makepad-2-0-events/references/event-patterns.md +802 -0
- package/bundled-skills/makepad-2-0-events/references/extended-guide.md +590 -0
- package/bundled-skills/makepad-2-0-layout/SKILL.md +499 -0
- package/bundled-skills/makepad-2-0-layout/references/extended-guide.md +243 -0
- package/bundled-skills/makepad-2-0-layout/references/layout-patterns.md +881 -0
- package/bundled-skills/makepad-2-0-widgets/SKILL.md +261 -0
- package/bundled-skills/makepad-2-0-widgets/references/widget-advanced.md +648 -0
- package/bundled-skills/makepad-2-0-widgets/references/widget-catalog.md +547 -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/meeting-distiller-pro/SKILL.md +120 -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/monte-carlo-analyze-root-cause/SKILL.md +12 -1
- package/bundled-skills/monte-carlo-asset-health/SKILL.md +12 -1
- package/bundled-skills/monte-carlo-context-detection/SKILL.md +170 -0
- package/bundled-skills/monte-carlo-context-detection/references/signal-definitions.md +46 -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/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/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/remotion-captions/SKILL.md +57 -0
- package/bundled-skills/remotion-captions/agents/openai.yaml +7 -0
- package/bundled-skills/remotion-captions/assets/remotion-icon.svg +4 -0
- package/bundled-skills/remotion-captions/display-captions.md +190 -0
- package/bundled-skills/remotion-captions/import-srt-captions.md +73 -0
- package/bundled-skills/remotion-captions/transcribe-captions.md +70 -0
- package/bundled-skills/remotion-create/SKILL.md +106 -0
- package/bundled-skills/remotion-create/agents/openai.yaml +7 -0
- package/bundled-skills/remotion-create/assets/remotion-icon.svg +4 -0
- package/bundled-skills/remotion-create/tailwind.md +11 -0
- package/bundled-skills/remotion-create/video-layout.md +9 -0
- package/bundled-skills/remotion-docs/SKILL.md +67 -0
- package/bundled-skills/remotion-docs/agents/openai.yaml +7 -0
- package/bundled-skills/remotion-docs/assets/remotion-icon.svg +4 -0
- package/bundled-skills/remotion-interactivity/SKILL.md +270 -0
- package/bundled-skills/remotion-interactivity/agents/openai.yaml +7 -0
- package/bundled-skills/remotion-interactivity/assets/remotion-icon.svg +4 -0
- package/bundled-skills/remotion-render/SKILL.md +48 -0
- package/bundled-skills/remotion-render/agents/openai.yaml +7 -0
- package/bundled-skills/remotion-render/assets/remotion-icon.svg +4 -0
- package/bundled-skills/remotion-render/transparent-videos.md +106 -0
- package/bundled-skills/report-writing/SKILL.md +426 -0
- package/bundled-skills/report-writing/references/details.md +187 -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-pricing-strategist/SKILL.md +169 -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/score-eval/SKILL.md +35 -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/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/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/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/writing-guidelines/SKILL.md +60 -0
- package/bundled-skills/zero-trust/SKILL.md +461 -0
- package/package.json +1 -1
- package/skills_index.json +7874 -277
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rag-infrastructure
|
|
3
|
+
description: Build and operate Retrieval-Augmented Generation (RAG) infrastructure
|
|
4
|
+
with vector stores, embedding pipelines, and hybrid search.
|
|
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 OS/platform tooling and privileged access where
|
|
14
|
+
noted. Docs-only; helper scripts and templates not bundled.
|
|
15
|
+
metadata:
|
|
16
|
+
author: devops-skills
|
|
17
|
+
version: '1.0'
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# RAG Infrastructure
|
|
21
|
+
|
|
22
|
+
Production infrastructure for Retrieval-Augmented Generation: ingest documents, generate embeddings, store in vector databases, and serve grounded LLM responses.
|
|
23
|
+
|
|
24
|
+
## When to Use This Skill
|
|
25
|
+
|
|
26
|
+
Use this skill when:
|
|
27
|
+
- Building a knowledge base Q&A system over internal documents
|
|
28
|
+
- Implementing semantic search over large document collections
|
|
29
|
+
- Reducing LLM hallucinations with retrieved context
|
|
30
|
+
- Setting up embedding pipelines and vector store infrastructure
|
|
31
|
+
- Deploying hybrid search (dense + sparse/BM25)
|
|
32
|
+
|
|
33
|
+
## Prerequisites
|
|
34
|
+
|
|
35
|
+
- Python 3.10+ with `pip`
|
|
36
|
+
- A vector database (Qdrant, Weaviate, Pinecone, or pgvector)
|
|
37
|
+
- An embedding model (OpenAI, Cohere, or local via `sentence-transformers`)
|
|
38
|
+
- An LLM endpoint (OpenAI API or self-hosted vLLM)
|
|
39
|
+
- Docker for local vector DB deployment
|
|
40
|
+
|
|
41
|
+
## Architecture Overview
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Documents → Chunker → Embedder → Vector Store
|
|
45
|
+
↓
|
|
46
|
+
User Query → Embedder → Vector Store (search) → Reranker → LLM → Answer
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Embedding Pipeline
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from sentence_transformers import SentenceTransformer
|
|
53
|
+
from qdrant_client import QdrantClient
|
|
54
|
+
from qdrant_client.models import Distance, VectorParams, PointStruct
|
|
55
|
+
import uuid
|
|
56
|
+
|
|
57
|
+
# Local embedding model (no API cost)
|
|
58
|
+
model = SentenceTransformer("BAAI/bge-large-en-v1.5")
|
|
59
|
+
|
|
60
|
+
# Connect to Qdrant
|
|
61
|
+
client = QdrantClient("http://localhost:6333")
|
|
62
|
+
|
|
63
|
+
# Create collection
|
|
64
|
+
client.create_collection(
|
|
65
|
+
collection_name="knowledge-base",
|
|
66
|
+
vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def ingest_documents(docs: list[dict]):
|
|
70
|
+
"""Chunk, embed, and upsert documents."""
|
|
71
|
+
points = []
|
|
72
|
+
for doc in docs:
|
|
73
|
+
chunks = chunk_text(doc["text"], chunk_size=512, overlap=50)
|
|
74
|
+
embeddings = model.encode(chunks, batch_size=32, show_progress_bar=True)
|
|
75
|
+
for chunk, embedding in zip(chunks, embeddings):
|
|
76
|
+
points.append(PointStruct(
|
|
77
|
+
id=str(uuid.uuid4()),
|
|
78
|
+
vector=embedding.tolist(),
|
|
79
|
+
payload={"text": chunk, "source": doc["source"], "title": doc["title"]},
|
|
80
|
+
))
|
|
81
|
+
client.upsert(collection_name="knowledge-base", points=points)
|
|
82
|
+
print(f"Ingested {len(points)} chunks")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Chunking Strategies
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
89
|
+
|
|
90
|
+
def chunk_text(text: str, chunk_size: int = 512, overlap: int = 50) -> list[str]:
|
|
91
|
+
"""Recursive character splitter — best general-purpose strategy."""
|
|
92
|
+
splitter = RecursiveCharacterTextSplitter(
|
|
93
|
+
chunk_size=chunk_size,
|
|
94
|
+
chunk_overlap=overlap,
|
|
95
|
+
separators=["\n\n", "\n", ". ", " ", ""],
|
|
96
|
+
)
|
|
97
|
+
return splitter.split_text(text)
|
|
98
|
+
|
|
99
|
+
# For code/markdown — use language-aware splitter
|
|
100
|
+
from langchain.text_splitter import MarkdownHeaderTextSplitter
|
|
101
|
+
|
|
102
|
+
headers = [("#", "H1"), ("##", "H2"), ("###", "H3")]
|
|
103
|
+
md_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Hybrid Search (Dense + Sparse)
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from qdrant_client.models import SparseVector, SparseVectorParams, NamedSparseVector
|
|
110
|
+
from fastembed import SparseTextEmbedding
|
|
111
|
+
|
|
112
|
+
# Qdrant hybrid collection (dense + BM25 sparse)
|
|
113
|
+
client.create_collection(
|
|
114
|
+
collection_name="hybrid-kb",
|
|
115
|
+
vectors_config={"dense": VectorParams(size=1024, distance=Distance.COSINE)},
|
|
116
|
+
sparse_vectors_config={"sparse": SparseVectorParams()},
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
sparse_model = SparseTextEmbedding("prithivida/Splade_PP_en_v1")
|
|
120
|
+
|
|
121
|
+
def hybrid_search(query: str, top_k: int = 10) -> list[dict]:
|
|
122
|
+
dense_vec = model.encode(query).tolist()
|
|
123
|
+
sparse_vec = list(sparse_model.embed(query))[0]
|
|
124
|
+
|
|
125
|
+
results = client.query_points(
|
|
126
|
+
collection_name="hybrid-kb",
|
|
127
|
+
prefetch=[
|
|
128
|
+
{"query": dense_vec, "using": "dense", "limit": 20},
|
|
129
|
+
{"query": SparseVector(indices=sparse_vec.indices.tolist(),
|
|
130
|
+
values=sparse_vec.values.tolist()),
|
|
131
|
+
"using": "sparse", "limit": 20},
|
|
132
|
+
],
|
|
133
|
+
query={"fusion": "rrf"}, # Reciprocal Rank Fusion
|
|
134
|
+
limit=top_k,
|
|
135
|
+
)
|
|
136
|
+
return [{"text": p.payload["text"], "score": p.score} for p in results.points]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Reranking
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
import cohere
|
|
143
|
+
|
|
144
|
+
co = cohere.Client("your-api-key")
|
|
145
|
+
|
|
146
|
+
def rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:
|
|
147
|
+
"""Rerank retrieved chunks for relevance (improves RAG quality ~20-30%)."""
|
|
148
|
+
response = co.rerank(
|
|
149
|
+
model="rerank-english-v3.0",
|
|
150
|
+
query=query,
|
|
151
|
+
documents=candidates,
|
|
152
|
+
top_n=top_n,
|
|
153
|
+
)
|
|
154
|
+
return [candidates[r.index] for r in response.results]
|
|
155
|
+
|
|
156
|
+
# Alternative: local reranker (no API cost)
|
|
157
|
+
from sentence_transformers import CrossEncoder
|
|
158
|
+
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
|
|
159
|
+
|
|
160
|
+
def local_rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:
|
|
161
|
+
pairs = [[query, c] for c in candidates]
|
|
162
|
+
scores = reranker.predict(pairs)
|
|
163
|
+
ranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
|
|
164
|
+
return [text for text, _ in ranked[:top_n]]
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## RAG Query Pipeline
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from openai import OpenAI
|
|
171
|
+
|
|
172
|
+
llm = OpenAI(base_url="http://localhost:8000/v1", api_key="..." # no real key needed for local endpoints)
|
|
173
|
+
|
|
174
|
+
def rag_query(user_question: str) -> str:
|
|
175
|
+
# 1. Retrieve
|
|
176
|
+
candidates = hybrid_search(user_question, top_k=20)
|
|
177
|
+
texts = [c["text"] for c in candidates]
|
|
178
|
+
|
|
179
|
+
# 2. Rerank
|
|
180
|
+
top_chunks = local_rerank(user_question, texts, top_n=5)
|
|
181
|
+
|
|
182
|
+
# 3. Generate
|
|
183
|
+
context = "\n\n---\n\n".join(top_chunks)
|
|
184
|
+
response = llm.chat.completions.create(
|
|
185
|
+
model="meta-llama/Llama-3.1-8B-Instruct",
|
|
186
|
+
messages=[
|
|
187
|
+
{"role": "system", "content": (
|
|
188
|
+
"Answer the question using only the provided context. "
|
|
189
|
+
"If the answer isn't in the context, say so.\n\nContext:\n" + context
|
|
190
|
+
)},
|
|
191
|
+
{"role": "user", "content": user_question},
|
|
192
|
+
],
|
|
193
|
+
temperature=0.1,
|
|
194
|
+
max_tokens=1024,
|
|
195
|
+
)
|
|
196
|
+
return response.choices[0].message.content
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Docker Compose: Full RAG Stack
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
services:
|
|
203
|
+
qdrant:
|
|
204
|
+
image: qdrant/qdrant:latest
|
|
205
|
+
volumes:
|
|
206
|
+
- qdrant-data:/qdrant/storage
|
|
207
|
+
ports:
|
|
208
|
+
- "6333:6333"
|
|
209
|
+
restart: unless-stopped
|
|
210
|
+
|
|
211
|
+
redis:
|
|
212
|
+
image: redis:7-alpine
|
|
213
|
+
volumes:
|
|
214
|
+
- redis-data:/data
|
|
215
|
+
restart: unless-stopped
|
|
216
|
+
|
|
217
|
+
ingestion-worker:
|
|
218
|
+
build: ./ingestion
|
|
219
|
+
environment:
|
|
220
|
+
- QDRANT_URL=http://qdrant:6333
|
|
221
|
+
- REDIS_URL=redis://redis:6379
|
|
222
|
+
depends_on: [qdrant, redis]
|
|
223
|
+
restart: unless-stopped
|
|
224
|
+
|
|
225
|
+
rag-api:
|
|
226
|
+
build: ./api
|
|
227
|
+
ports:
|
|
228
|
+
- "8080:8080"
|
|
229
|
+
environment:
|
|
230
|
+
- QDRANT_URL=http://qdrant:6333
|
|
231
|
+
- LLM_BASE_URL=http://vllm:8000/v1
|
|
232
|
+
depends_on: [qdrant]
|
|
233
|
+
restart: unless-stopped
|
|
234
|
+
|
|
235
|
+
volumes:
|
|
236
|
+
qdrant-data:
|
|
237
|
+
redis-data:
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Common Issues
|
|
241
|
+
|
|
242
|
+
| Issue | Cause | Fix |
|
|
243
|
+
|-------|-------|-----|
|
|
244
|
+
| Poor retrieval quality | Chunk size too large | Try 256–512 tokens; overlap 10–15% |
|
|
245
|
+
| LLM ignores retrieved context | Context too long | Rerank and keep top 3–5 chunks |
|
|
246
|
+
| Slow ingestion | Sequential embedding | Use `batch_size=64` and async upserts |
|
|
247
|
+
| Stale documents | No re-ingestion pipeline | Track `doc_hash`; re-embed on change |
|
|
248
|
+
| High embedding costs | All chunks re-embedded | Cache embeddings with hash-based dedup |
|
|
249
|
+
|
|
250
|
+
## Best Practices
|
|
251
|
+
|
|
252
|
+
- Use `BAAI/bge-large-en-v1.5` or `nomic-embed-text` for strong free embeddings.
|
|
253
|
+
- Always rerank before passing to LLM — 5 precise chunks beat 20 noisy ones.
|
|
254
|
+
- Store source metadata (URL, page, section) in vector payloads for citations.
|
|
255
|
+
- Use namespace/tenant isolation in the vector store for multi-tenant RAG.
|
|
256
|
+
- Evaluate with RAGAS metrics: faithfulness, answer relevancy, context precision.
|
|
257
|
+
|
|
258
|
+
## Related Skills
|
|
259
|
+
|
|
260
|
+
- vector-database-ops (`vector-database-ops`) - Qdrant/Weaviate management
|
|
261
|
+
- vllm-server (`vllm-server`) - Self-hosted LLM endpoint
|
|
262
|
+
- ollama-stack (`ollama-stack`) - Local LLM for development
|
|
263
|
+
- ai-pipeline-orchestration (`ai-pipeline-orchestration`) - Ingestion pipelines
|
|
264
|
+
|
|
265
|
+
## Limitations
|
|
266
|
+
|
|
267
|
+
- Infrastructure commands can disrupt services: confirm target host/scope and have backups/snapshots before mutating state.
|
|
268
|
+
- Docs-only import: upstream scripts and templates not bundled.
|
|
269
|
+
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rag-observability-evals
|
|
3
|
+
description: Monitor and evaluate RAG systems with retrieval quality metrics, groundedness
|
|
4
|
+
checks, hallucination detection, and continuous regression testing.
|
|
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
|
+
# RAG Observability and Evaluations
|
|
22
|
+
|
|
23
|
+
Run retrieval-augmented generation like a measurable production system, not a black box.
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
- RAG pipeline with instrumented retrieval and generation stages
|
|
28
|
+
- Python 3.10+ with evaluation libraries (ragas, langchain, openai)
|
|
29
|
+
- Prometheus endpoint for custom metrics export
|
|
30
|
+
- Benchmark dataset with gold-standard question/answer/source triples
|
|
31
|
+
- OpenTelemetry SDK integrated into the RAG service
|
|
32
|
+
|
|
33
|
+
## What to Measure
|
|
34
|
+
|
|
35
|
+
### Retrieval Quality
|
|
36
|
+
- Recall@k and MRR for top-k chunks
|
|
37
|
+
- Citation coverage and source freshness
|
|
38
|
+
- Embedding drift and index staleness
|
|
39
|
+
|
|
40
|
+
### Generation Quality
|
|
41
|
+
- Groundedness score (answer supported by retrieved context)
|
|
42
|
+
- Hallucination rate by route/use case
|
|
43
|
+
- Instruction adherence and format validity
|
|
44
|
+
|
|
45
|
+
### Reliability and Cost
|
|
46
|
+
- p50/p95 latency split by retrieval vs generation
|
|
47
|
+
- Token usage per stage
|
|
48
|
+
- Cache hit rate and cost per successful answer
|
|
49
|
+
|
|
50
|
+
## RAGAS Evaluation Script
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
# rag_eval.py
|
|
54
|
+
"""Evaluate RAG pipeline quality using RAGAS metrics."""
|
|
55
|
+
from ragas import evaluate
|
|
56
|
+
from ragas.metrics import (
|
|
57
|
+
faithfulness,
|
|
58
|
+
answer_relevancy,
|
|
59
|
+
context_precision,
|
|
60
|
+
context_recall,
|
|
61
|
+
context_entity_recall,
|
|
62
|
+
answer_similarity,
|
|
63
|
+
)
|
|
64
|
+
from datasets import Dataset
|
|
65
|
+
import json
|
|
66
|
+
import sys
|
|
67
|
+
|
|
68
|
+
def load_eval_dataset(path: str) -> Dataset:
|
|
69
|
+
"""Load evaluation dataset with required columns."""
|
|
70
|
+
with open(path) as f:
|
|
71
|
+
data = json.load(f)
|
|
72
|
+
|
|
73
|
+
return Dataset.from_dict({
|
|
74
|
+
"question": [d["question"] for d in data],
|
|
75
|
+
"answer": [d["generated_answer"] for d in data],
|
|
76
|
+
"contexts": [d["retrieved_contexts"] for d in data],
|
|
77
|
+
"ground_truth": [d["reference_answer"] for d in data],
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
def run_evaluation(dataset_path: str, output_path: str):
|
|
81
|
+
"""Run full RAGAS evaluation suite."""
|
|
82
|
+
dataset = load_eval_dataset(dataset_path)
|
|
83
|
+
|
|
84
|
+
metrics = [
|
|
85
|
+
faithfulness,
|
|
86
|
+
answer_relevancy,
|
|
87
|
+
context_precision,
|
|
88
|
+
context_recall,
|
|
89
|
+
context_entity_recall,
|
|
90
|
+
answer_similarity,
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
results = evaluate(dataset, metrics=metrics)
|
|
94
|
+
|
|
95
|
+
# Print summary
|
|
96
|
+
print("=== RAG Evaluation Results ===")
|
|
97
|
+
for metric_name, score in results.items():
|
|
98
|
+
print(f" {metric_name}: {score:.4f}")
|
|
99
|
+
|
|
100
|
+
# Save detailed results
|
|
101
|
+
with open(output_path, "w") as f:
|
|
102
|
+
json.dump({
|
|
103
|
+
"summary": {k: float(v) for k, v in results.items()},
|
|
104
|
+
"dataset_size": len(dataset),
|
|
105
|
+
}, f, indent=2)
|
|
106
|
+
|
|
107
|
+
return results
|
|
108
|
+
|
|
109
|
+
if __name__ == "__main__":
|
|
110
|
+
run_evaluation(sys.argv[1], sys.argv[2])
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Groundedness Scoring
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
# groundedness.py
|
|
117
|
+
"""Score whether generated answers are grounded in retrieved context."""
|
|
118
|
+
from openai import OpenAI
|
|
119
|
+
import json
|
|
120
|
+
from typing import List
|
|
121
|
+
|
|
122
|
+
client = OpenAI()
|
|
123
|
+
|
|
124
|
+
GROUNDEDNESS_PROMPT = """You are evaluating whether an AI answer is fully grounded
|
|
125
|
+
in the provided context documents. Score each claim in the answer.
|
|
126
|
+
|
|
127
|
+
Context documents:
|
|
128
|
+
{contexts}
|
|
129
|
+
|
|
130
|
+
Answer to evaluate:
|
|
131
|
+
{answer}
|
|
132
|
+
|
|
133
|
+
For each distinct claim in the answer, determine:
|
|
134
|
+
1. SUPPORTED - the claim is directly supported by the context
|
|
135
|
+
2. PARTIALLY_SUPPORTED - the claim is partially supported
|
|
136
|
+
3. NOT_SUPPORTED - the claim has no support in the context
|
|
137
|
+
|
|
138
|
+
Return JSON:
|
|
139
|
+
{{
|
|
140
|
+
"claims": [
|
|
141
|
+
{{"claim": "...", "verdict": "SUPPORTED|PARTIALLY_SUPPORTED|NOT_SUPPORTED", "evidence": "..."}}
|
|
142
|
+
],
|
|
143
|
+
"groundedness_score": <float 0-1>,
|
|
144
|
+
"unsupported_claims": ["..."]
|
|
145
|
+
}}
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
def score_groundedness(answer: str, contexts: List[str]) -> dict:
|
|
149
|
+
"""Score groundedness of a single answer against its contexts."""
|
|
150
|
+
context_text = "\n---\n".join(
|
|
151
|
+
f"[Document {i+1}]: {c}" for i, c in enumerate(contexts)
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
response = client.chat.completions.create(
|
|
155
|
+
model="gpt-4o",
|
|
156
|
+
messages=[{
|
|
157
|
+
"role": "user",
|
|
158
|
+
"content": GROUNDEDNESS_PROMPT.format(
|
|
159
|
+
contexts=context_text, answer=answer
|
|
160
|
+
),
|
|
161
|
+
}],
|
|
162
|
+
response_format={"type": "json_object"},
|
|
163
|
+
temperature=0,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
return json.loads(response.choices[0].message.content)
|
|
167
|
+
|
|
168
|
+
def batch_groundedness(eval_data: list) -> dict:
|
|
169
|
+
"""Score groundedness for a batch of QA pairs."""
|
|
170
|
+
scores = []
|
|
171
|
+
unsupported_count = 0
|
|
172
|
+
total_claims = 0
|
|
173
|
+
|
|
174
|
+
for item in eval_data:
|
|
175
|
+
result = score_groundedness(
|
|
176
|
+
item["generated_answer"],
|
|
177
|
+
item["retrieved_contexts"],
|
|
178
|
+
)
|
|
179
|
+
scores.append(result["groundedness_score"])
|
|
180
|
+
unsupported_count += len(result["unsupported_claims"])
|
|
181
|
+
total_claims += len(result["claims"])
|
|
182
|
+
|
|
183
|
+
avg_score = sum(scores) / len(scores) if scores else 0
|
|
184
|
+
return {
|
|
185
|
+
"average_groundedness": avg_score,
|
|
186
|
+
"total_claims": total_claims,
|
|
187
|
+
"unsupported_claims": unsupported_count,
|
|
188
|
+
"unsupported_rate": unsupported_count / total_claims if total_claims else 0,
|
|
189
|
+
"sample_count": len(eval_data),
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Retrieval Quality Metrics
|
|
194
|
+
|
|
195
|
+
```python
|
|
196
|
+
# retrieval_metrics.py
|
|
197
|
+
"""Compute retrieval quality metrics for RAG evaluation."""
|
|
198
|
+
from typing import List, Set
|
|
199
|
+
import numpy as np
|
|
200
|
+
|
|
201
|
+
def recall_at_k(
|
|
202
|
+
retrieved_ids: List[str],
|
|
203
|
+
relevant_ids: Set[str],
|
|
204
|
+
k: int
|
|
205
|
+
) -> float:
|
|
206
|
+
"""Compute Recall@K for a single query."""
|
|
207
|
+
top_k = set(retrieved_ids[:k])
|
|
208
|
+
if not relevant_ids:
|
|
209
|
+
return 0.0
|
|
210
|
+
return len(top_k & relevant_ids) / len(relevant_ids)
|
|
211
|
+
|
|
212
|
+
def mrr(
|
|
213
|
+
retrieved_ids: List[str],
|
|
214
|
+
relevant_ids: Set[str]
|
|
215
|
+
) -> float:
|
|
216
|
+
"""Compute Mean Reciprocal Rank for a single query."""
|
|
217
|
+
for i, doc_id in enumerate(retrieved_ids):
|
|
218
|
+
if doc_id in relevant_ids:
|
|
219
|
+
return 1.0 / (i + 1)
|
|
220
|
+
return 0.0
|
|
221
|
+
|
|
222
|
+
def ndcg_at_k(
|
|
223
|
+
retrieved_ids: List[str],
|
|
224
|
+
relevant_ids: Set[str],
|
|
225
|
+
k: int
|
|
226
|
+
) -> float:
|
|
227
|
+
"""Compute NDCG@K for a single query."""
|
|
228
|
+
dcg = 0.0
|
|
229
|
+
for i, doc_id in enumerate(retrieved_ids[:k]):
|
|
230
|
+
if doc_id in relevant_ids:
|
|
231
|
+
dcg += 1.0 / np.log2(i + 2)
|
|
232
|
+
|
|
233
|
+
ideal_dcg = sum(1.0 / np.log2(i + 2) for i in range(min(len(relevant_ids), k)))
|
|
234
|
+
return dcg / ideal_dcg if ideal_dcg > 0 else 0.0
|
|
235
|
+
|
|
236
|
+
def compute_retrieval_metrics(
|
|
237
|
+
queries: list,
|
|
238
|
+
k_values: list = [1, 3, 5, 10]
|
|
239
|
+
) -> dict:
|
|
240
|
+
"""Compute aggregate retrieval metrics across all queries."""
|
|
241
|
+
results = {}
|
|
242
|
+
for k in k_values:
|
|
243
|
+
recalls = [
|
|
244
|
+
recall_at_k(q["retrieved_ids"], set(q["relevant_ids"]), k)
|
|
245
|
+
for q in queries
|
|
246
|
+
]
|
|
247
|
+
mrrs = [mrr(q["retrieved_ids"], set(q["relevant_ids"])) for q in queries]
|
|
248
|
+
ndcgs = [
|
|
249
|
+
ndcg_at_k(q["retrieved_ids"], set(q["relevant_ids"]), k)
|
|
250
|
+
for q in queries
|
|
251
|
+
]
|
|
252
|
+
results[f"recall@{k}"] = np.mean(recalls)
|
|
253
|
+
results[f"ndcg@{k}"] = np.mean(ndcgs)
|
|
254
|
+
|
|
255
|
+
results["mrr"] = np.mean(mrrs)
|
|
256
|
+
return results
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Prometheus Metrics Export
|
|
260
|
+
|
|
261
|
+
```python
|
|
262
|
+
# rag_metrics_exporter.py
|
|
263
|
+
"""Export RAG quality metrics to Prometheus."""
|
|
264
|
+
from prometheus_client import Histogram, Counter, Gauge, start_http_server
|
|
265
|
+
import time
|
|
266
|
+
|
|
267
|
+
# Latency histograms by stage
|
|
268
|
+
RETRIEVAL_LATENCY = Histogram(
|
|
269
|
+
"rag_retrieval_duration_seconds",
|
|
270
|
+
"Time spent in retrieval stage",
|
|
271
|
+
["index_name", "retriever_type"],
|
|
272
|
+
buckets=[0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0],
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
GENERATION_LATENCY = Histogram(
|
|
276
|
+
"rag_generation_duration_seconds",
|
|
277
|
+
"Time spent in generation stage",
|
|
278
|
+
["model", "route"],
|
|
279
|
+
buckets=[0.5, 1.0, 2.0, 5.0, 10.0, 30.0],
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
RERANKING_LATENCY = Histogram(
|
|
283
|
+
"rag_reranking_duration_seconds",
|
|
284
|
+
"Time spent in reranking stage",
|
|
285
|
+
["reranker_model"],
|
|
286
|
+
buckets=[0.05, 0.1, 0.25, 0.5, 1.0],
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
# Quality gauges (updated from offline evals)
|
|
290
|
+
GROUNDEDNESS_SCORE = Gauge(
|
|
291
|
+
"rag_groundedness_score",
|
|
292
|
+
"Latest groundedness evaluation score",
|
|
293
|
+
["route", "model"],
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
FAITHFULNESS_SCORE = Gauge(
|
|
297
|
+
"rag_faithfulness_score",
|
|
298
|
+
"Latest faithfulness evaluation score",
|
|
299
|
+
["route", "model"],
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
CONTEXT_PRECISION = Gauge(
|
|
303
|
+
"rag_context_precision_score",
|
|
304
|
+
"Latest context precision score",
|
|
305
|
+
["route", "index_name"],
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
RECALL_AT_K = Gauge(
|
|
309
|
+
"rag_recall_at_k",
|
|
310
|
+
"Recall@K for retrieval",
|
|
311
|
+
["k", "index_name"],
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
# Operational counters
|
|
315
|
+
REQUESTS_TOTAL = Counter(
|
|
316
|
+
"rag_requests_total",
|
|
317
|
+
"Total RAG requests",
|
|
318
|
+
["route", "status"],
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
HALLUCINATION_DETECTED = Counter(
|
|
322
|
+
"rag_hallucination_detected_total",
|
|
323
|
+
"Detected hallucinations",
|
|
324
|
+
["route", "severity"],
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
FALLBACK_TRIGGERED = Counter(
|
|
328
|
+
"rag_fallback_triggered_total",
|
|
329
|
+
"Times RAG fell back to abstain/default",
|
|
330
|
+
["route", "reason"],
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
TOKENS_USED = Counter(
|
|
334
|
+
"rag_tokens_used_total",
|
|
335
|
+
"Tokens consumed by stage",
|
|
336
|
+
["stage", "model"],
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
CACHE_HITS = Counter(
|
|
340
|
+
"rag_cache_hits_total",
|
|
341
|
+
"Semantic cache hits",
|
|
342
|
+
["cache_type"],
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
# Index health
|
|
346
|
+
INDEX_STALENESS_SECONDS = Gauge(
|
|
347
|
+
"rag_index_staleness_seconds",
|
|
348
|
+
"Seconds since last index update",
|
|
349
|
+
["index_name"],
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
INDEX_DOCUMENT_COUNT = Gauge(
|
|
353
|
+
"rag_index_document_count",
|
|
354
|
+
"Number of documents in index",
|
|
355
|
+
["index_name"],
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
def start_metrics_server(port: int = 9090):
|
|
359
|
+
"""Start Prometheus metrics HTTP server."""
|
|
360
|
+
start_http_server(port)
|
|
361
|
+
print(f"RAG metrics server running on :{port}/metrics")
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Evaluation Pipeline
|
|
365
|
+
|
|
366
|
+
1. Curate a benchmark set with gold answers and source docs.
|
|
367
|
+
2. Run nightly offline evals for every retriever/model configuration.
|
|
368
|
+
3. Execute online shadow evals on sampled production traffic.
|
|
369
|
+
4. Gate releases on minimum quality + safety + latency thresholds.
|
|
370
|
+
|
|
371
|
+
```yaml
|
|
372
|
+
# eval-pipeline-cron.yaml
|
|
373
|
+
apiVersion: batch/v1
|
|
374
|
+
kind: CronJob
|
|
375
|
+
metadata:
|
|
376
|
+
name: rag-nightly-eval
|
|
377
|
+
namespace: ai-evals
|
|
378
|
+
spec:
|
|
379
|
+
schedule: "0 2 * * *"
|
|
380
|
+
jobTemplate:
|
|
381
|
+
spec:
|
|
382
|
+
template:
|
|
383
|
+
spec:
|
|
384
|
+
containers:
|
|
385
|
+
- name: eval-runner
|
|
386
|
+
image: registry.internal/rag-eval:latest
|
|
387
|
+
command:
|
|
388
|
+
- python
|
|
389
|
+
- -m
|
|
390
|
+
- rag_eval
|
|
391
|
+
- --dataset=/data/benchmark_v3.json
|
|
392
|
+
- --output=/results/nightly-$(date +%Y%m%d).json
|
|
393
|
+
- --push-metrics
|
|
394
|
+
- --fail-on-regression
|
|
395
|
+
env:
|
|
396
|
+
- name: PROMETHEUS_PUSHGATEWAY
|
|
397
|
+
value: "http://pushgateway:9091"
|
|
398
|
+
- name: MLFLOW_TRACKING_URI
|
|
399
|
+
value: "http://mlflow:5000"
|
|
400
|
+
volumeMounts:
|
|
401
|
+
- name: eval-data
|
|
402
|
+
mountPath: /data
|
|
403
|
+
- name: results
|
|
404
|
+
mountPath: /results
|
|
405
|
+
volumes:
|
|
406
|
+
- name: eval-data
|
|
407
|
+
persistentVolumeClaim:
|
|
408
|
+
claimName: eval-benchmark-data
|
|
409
|
+
- name: results
|
|
410
|
+
persistentVolumeClaim:
|
|
411
|
+
claimName: eval-results
|
|
412
|
+
restartPolicy: OnFailure
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
## Contents
|
|
417
|
+
|
|
418
|
+
- [Alerting Strategy](references/details.md)
|
|
419
|
+
- [Practical Guardrails](references/details.md)
|
|
420
|
+
- [Incident Triage Checklist](references/details.md)
|
|
421
|
+
- [Troubleshooting](references/details.md)
|
|
422
|
+
- [Related Skills](references/details.md)
|
|
423
|
+
|
|
424
|
+
## When to Use This Skill
|
|
425
|
+
|
|
426
|
+
- Deploying a RAG system to production and need quality monitoring
|
|
427
|
+
- Setting up automated evaluation pipelines for retrieval and generation
|
|
428
|
+
- Debugging hallucination or relevance regressions
|
|
429
|
+
- Building dashboards for RAG-specific golden signals
|
|
430
|
+
- Establishing quality gates for RAG pipeline changes
|
|
431
|
+
|
|
432
|
+
## Limitations
|
|
433
|
+
|
|
434
|
+
- Guidance executes against real environments: confirm target, blast radius, and rollback plan before applying anything.
|
|
435
|
+
- Never deploy to production without explicit approval. Docs-only import: upstream scripts and templates not bundled.
|
|
436
|
+
|
|
437
|
+
### Example
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
git status && git diff --stat
|
|
441
|
+
kubectl diff -f manifest.yaml
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
> 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.
|