rsc-universal 0.1.1
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/LICENSE +21 -0
- package/README.md +279 -0
- package/manifest.json +4761 -0
- package/package.json +59 -0
- package/schema/frontmatter.schema.json +12 -0
- package/scripts/build-manifest.js +72 -0
- package/scripts/consult.js +106 -0
- package/scripts/detect-repo.js +118 -0
- package/scripts/doctor.js +21 -0
- package/scripts/eval-lint.sh +179 -0
- package/scripts/install-apply.js +52 -0
- package/scripts/install-plan.js +13 -0
- package/scripts/lib/behavior-score.js +103 -0
- package/scripts/lib/frontmatter.js +47 -0
- package/scripts/lib/harden-policy.js +41 -0
- package/scripts/lib/manifest.js +18 -0
- package/scripts/lib/recommend.js +36 -0
- package/scripts/lib/registry.js +110 -0
- package/scripts/lib/result-envelope.js +35 -0
- package/scripts/lib/state.js +12 -0
- package/scripts/lib/ui.js +17 -0
- package/scripts/reviewer-guard.sh +67 -0
- package/scripts/rsc.js +108 -0
- package/scripts/skill-behavior-eval.js +33 -0
- package/scripts/skill-behavior-eval.workflow.js +136 -0
- package/scripts/skill-behavior-rubric.md +63 -0
- package/scripts/skill-harden-rubric.md +40 -0
- package/scripts/skill-harden.workflow.js +161 -0
- package/scripts/skill-rubric.md +39 -0
- package/scripts/skill-scoreboard.workflow.js +35 -0
- package/skills/ab-testing/SKILL.md +191 -0
- package/skills/ab-testing/evals/README.md +8 -0
- package/skills/ab-testing/evals/cases.yaml +49 -0
- package/skills/ab-testing/references/pitfalls.md +74 -0
- package/skills/ab-testing/references/sample-size-and-cuped.md +128 -0
- package/skills/ab-testing/scripts/verify.sh +89 -0
- package/skills/accessibility/SKILL.md +218 -0
- package/skills/accessibility/evals/README.md +3 -0
- package/skills/accessibility/evals/cases.yaml +47 -0
- package/skills/accessibility/references/aria-patterns.md +113 -0
- package/skills/accessibility/references/wcag22-checklist.md +83 -0
- package/skills/accessibility/scripts/verify.sh +103 -0
- package/skills/ads/SKILL.md +175 -0
- package/skills/ads/evals/README.md +15 -0
- package/skills/ads/evals/cases.yaml +58 -0
- package/skills/ads/references/platform-specs.md +73 -0
- package/skills/ads/references/roas-model.md +77 -0
- package/skills/ads/scripts/verify.sh +210 -0
- package/skills/agent-eval/SKILL.md +213 -0
- package/skills/agent-eval/evals/README.md +12 -0
- package/skills/agent-eval/evals/cases.yaml +45 -0
- package/skills/agent-eval/references/judge-design.md +118 -0
- package/skills/agent-eval/references/runner-and-gate.md +183 -0
- package/skills/agent-eval/scripts/verify.sh +161 -0
- package/skills/agent-safety/SKILL.md +176 -0
- package/skills/agent-safety/evals/README.md +12 -0
- package/skills/agent-safety/evals/cases.yaml +46 -0
- package/skills/agent-safety/references/threat-model.md +51 -0
- package/skills/ai-media/SKILL.md +196 -0
- package/skills/ai-media/evals/README.md +3 -0
- package/skills/ai-media/evals/cases.yaml +45 -0
- package/skills/ai-media/references/ffmpeg-assembly.md +117 -0
- package/skills/ai-media/references/models-and-params.md +78 -0
- package/skills/ai-media/scripts/verify.sh +103 -0
- package/skills/analytics/SKILL.md +219 -0
- package/skills/analytics/evals/README.md +9 -0
- package/skills/analytics/evals/cases.yaml +53 -0
- package/skills/analytics/references/event-taxonomy.md +75 -0
- package/skills/analytics/references/ga4-setup.md +122 -0
- package/skills/analytics/references/posthog-setup.md +100 -0
- package/skills/analytics/scripts/verify.sh +95 -0
- package/skills/analyze/SKILL.md +136 -0
- package/skills/analyze/evals/README.md +72 -0
- package/skills/analyze/evals/cases.yaml +74 -0
- package/skills/angular/SKILL.md +288 -0
- package/skills/angular/evals/README.md +3 -0
- package/skills/angular/evals/cases.yaml +38 -0
- package/skills/angular/references/migration.md +81 -0
- package/skills/angular/references/signals-rxjs.md +92 -0
- package/skills/angular/scripts/verify.sh +122 -0
- package/skills/api-connector-builder/SKILL.md +285 -0
- package/skills/api-connector-builder/evals/README.md +11 -0
- package/skills/api-connector-builder/evals/cases.yaml +47 -0
- package/skills/api-connector-builder/references/auth-flows.md +132 -0
- package/skills/api-connector-builder/references/pagination.md +144 -0
- package/skills/api-connector-builder/scripts/verify.sh +172 -0
- package/skills/api-design/SKILL.md +189 -0
- package/skills/api-design/evals/README.md +3 -0
- package/skills/api-design/evals/cases.yaml +45 -0
- package/skills/api-design/references/graphql-design.md +70 -0
- package/skills/api-design/references/openapi-contract.md +86 -0
- package/skills/api-design/references/rest-conventions.md +63 -0
- package/skills/api-design/references/versioning-and-evolution.md +49 -0
- package/skills/api-design/scripts/verify.sh +138 -0
- package/skills/article-writing/SKILL.md +175 -0
- package/skills/article-writing/evals/README.md +3 -0
- package/skills/article-writing/evals/cases.yaml +47 -0
- package/skills/article-writing/references/ai-tell-banlist.md +114 -0
- package/skills/article-writing/references/on-page-seo.md +133 -0
- package/skills/article-writing/scripts/verify.sh +165 -0
- package/skills/astro/SKILL.md +275 -0
- package/skills/astro/evals/README.md +3 -0
- package/skills/astro/evals/cases.yaml +41 -0
- package/skills/astro/references/content-layer.md +118 -0
- package/skills/astro/references/deploy-and-integrations.md +163 -0
- package/skills/astro/scripts/verify.sh +137 -0
- package/skills/author-skill/SKILL.md +206 -0
- package/skills/author-skill/evals/README.md +66 -0
- package/skills/author-skill/evals/cases.yaml +75 -0
- package/skills/author-skill/references/description-recipe.md +84 -0
- package/skills/author-skill/references/eval-authoring.md +74 -0
- package/skills/author-skill/references/rsc-conventions.md +91 -0
- package/skills/automation-flows/SKILL.md +132 -0
- package/skills/automation-flows/evals/README.md +5 -0
- package/skills/automation-flows/evals/cases.yaml +44 -0
- package/skills/automation-flows/references/error-handling.md +58 -0
- package/skills/automation-flows/references/n8n-workflow-json.md +63 -0
- package/skills/automation-flows/scripts/verify.sh +78 -0
- package/skills/aws-essentials/SKILL.md +223 -0
- package/skills/aws-essentials/evals/README.md +10 -0
- package/skills/aws-essentials/evals/cases.yaml +44 -0
- package/skills/aws-essentials/references/iam-least-privilege.md +134 -0
- package/skills/aws-essentials/references/rds-cloudfront-recipes.md +127 -0
- package/skills/aws-essentials/scripts/verify.sh +99 -0
- package/skills/backups/SKILL.md +137 -0
- package/skills/backups/evals/README.md +3 -0
- package/skills/backups/evals/cases.yaml +42 -0
- package/skills/backups/references/engine-recipes.md +121 -0
- package/skills/backups/references/restore-runbook.md +65 -0
- package/skills/backups/scripts/verify.sh +80 -0
- package/skills/bash-scripting/SKILL.md +231 -0
- package/skills/bash-scripting/evals/README.md +3 -0
- package/skills/bash-scripting/evals/cases.yaml +45 -0
- package/skills/bash-scripting/references/portability.md +97 -0
- package/skills/bash-scripting/scripts/verify.sh +140 -0
- package/skills/bookkeeping/SKILL.md +184 -0
- package/skills/bookkeeping/evals/README.md +5 -0
- package/skills/bookkeeping/evals/cases.yaml +52 -0
- package/skills/bookkeeping/references/chart-of-accounts.md +87 -0
- package/skills/bookkeeping/references/reconciliation-playbook.md +54 -0
- package/skills/bookkeeping/references/tricky-transactions.md +192 -0
- package/skills/brand-identity/SKILL.md +161 -0
- package/skills/brand-identity/evals/README.md +14 -0
- package/skills/brand-identity/evals/cases.yaml +43 -0
- package/skills/brand-identity/references/color-and-tokens.md +129 -0
- package/skills/brand-identity/references/logo-and-assets.md +117 -0
- package/skills/brand-identity/scripts/verify.sh +224 -0
- package/skills/brand-voice/SKILL.md +183 -0
- package/skills/brand-voice/evals/README.md +3 -0
- package/skills/brand-voice/evals/cases.yaml +57 -0
- package/skills/brand-voice/references/voice-guide-template.md +150 -0
- package/skills/brand-voice/references/word-bank.md +61 -0
- package/skills/brand-voice/scripts/verify.sh +190 -0
- package/skills/building-agents/SKILL.md +469 -0
- package/skills/building-agents/evals/README.md +68 -0
- package/skills/building-agents/evals/cases.yaml +60 -0
- package/skills/building-agents/references/agent-loops-and-harness.md +371 -0
- package/skills/building-agents/references/evals-and-observability.md +420 -0
- package/skills/building-agents/references/mcp-servers.md +294 -0
- package/skills/building-agents/references/provider-abstraction.md +489 -0
- package/skills/building-agents/references/tools-and-rag.md +417 -0
- package/skills/building-agents/scripts/verify.sh +121 -0
- package/skills/business-intelligence/SKILL.md +176 -0
- package/skills/business-intelligence/evals/README.md +3 -0
- package/skills/business-intelligence/evals/cases.yaml +43 -0
- package/skills/business-intelligence/references/authoring-semantic-models.md +120 -0
- package/skills/business-intelligence/references/wiring-agents-and-apis.md +79 -0
- package/skills/business-intelligence/scripts/verify.sh +143 -0
- package/skills/calendar-scheduling/SKILL.md +196 -0
- package/skills/calendar-scheduling/evals/README.md +14 -0
- package/skills/calendar-scheduling/evals/cases.yaml +45 -0
- package/skills/calendar-scheduling/references/google-calendar-sync.md +78 -0
- package/skills/calendar-scheduling/references/provider-matrix.md +71 -0
- package/skills/calendar-scheduling/scripts/verify.sh +117 -0
- package/skills/case-studies/SKILL.md +147 -0
- package/skills/case-studies/evals/README.md +3 -0
- package/skills/case-studies/evals/cases.yaml +63 -0
- package/skills/case-studies/references/case-study-skeleton.md +90 -0
- package/skills/case-studies/references/consent-and-substantiation.md +80 -0
- package/skills/case-studies/scripts/verify.sh +161 -0
- package/skills/chatbot/SKILL.md +168 -0
- package/skills/chatbot/evals/README.md +13 -0
- package/skills/chatbot/evals/cases.yaml +43 -0
- package/skills/chatbot/references/handoff-and-sales.md +71 -0
- package/skills/chatbot/references/system-prompt-and-guardrails.md +78 -0
- package/skills/chatbot/scripts/verify.sh +162 -0
- package/skills/chrome-extension/SKILL.md +169 -0
- package/skills/chrome-extension/evals/README.md +12 -0
- package/skills/chrome-extension/evals/cases.yaml +40 -0
- package/skills/chrome-extension/references/store-and-migration.md +84 -0
- package/skills/chrome-extension/scripts/verify.sh +62 -0
- package/skills/clarify/SKILL.md +159 -0
- package/skills/clarify/evals/README.md +70 -0
- package/skills/clarify/evals/cases.yaml +71 -0
- package/skills/clickhouse-analytics/SKILL.md +165 -0
- package/skills/clickhouse-analytics/evals/README.md +3 -0
- package/skills/clickhouse-analytics/evals/cases.yaml +45 -0
- package/skills/clickhouse-analytics/references/ingestion-and-mvs.md +109 -0
- package/skills/clickhouse-analytics/references/query-optimization.md +76 -0
- package/skills/clickhouse-analytics/references/schema-and-engines.md +63 -0
- package/skills/clickhouse-analytics/scripts/verify.sh +109 -0
- package/skills/client-onboarding/SKILL.md +254 -0
- package/skills/client-onboarding/evals/README.md +14 -0
- package/skills/client-onboarding/evals/cases.yaml +40 -0
- package/skills/client-onboarding/references/onboarding-playbook.md +126 -0
- package/skills/cloudflare/SKILL.md +191 -0
- package/skills/cloudflare/evals/README.md +15 -0
- package/skills/cloudflare/evals/cases.yaml +46 -0
- package/skills/cloudflare/references/storage-primitives.md +104 -0
- package/skills/cloudflare/references/wrangler-config.md +91 -0
- package/skills/cloudflare/scripts/verify.sh +133 -0
- package/skills/code-review/SKILL.md +143 -0
- package/skills/code-review/evals/README.md +3 -0
- package/skills/code-review/evals/cases.yaml +55 -0
- package/skills/code-review/references/pr-workflow.md +67 -0
- package/skills/codebase-onboarding/SKILL.md +133 -0
- package/skills/codebase-onboarding/evals/README.md +3 -0
- package/skills/codebase-onboarding/evals/cases.yaml +69 -0
- package/skills/codebase-onboarding/references/recon-playbook.md +57 -0
- package/skills/codebase-onboarding/scripts/verify.sh +54 -0
- package/skills/cold-outreach/SKILL.md +206 -0
- package/skills/cold-outreach/evals/README.md +3 -0
- package/skills/cold-outreach/evals/cases.yaml +60 -0
- package/skills/cold-outreach/references/compliance-footer.md +50 -0
- package/skills/cold-outreach/references/hook-derivation.md +73 -0
- package/skills/cold-outreach/references/templates.md +88 -0
- package/skills/cold-outreach/scripts/verify.sh +170 -0
- package/skills/community/SKILL.md +225 -0
- package/skills/community/evals/README.md +3 -0
- package/skills/community/evals/cases.yaml +40 -0
- package/skills/community/references/metrics-and-rituals.md +58 -0
- package/skills/community/references/platform-playbooks.md +64 -0
- package/skills/community/scripts/verify.sh +83 -0
- package/skills/competitor-watch/SKILL.md +193 -0
- package/skills/competitor-watch/evals/README.md +19 -0
- package/skills/competitor-watch/evals/cases.yaml +54 -0
- package/skills/competitor-watch/references/monitoring-config.md +124 -0
- package/skills/competitor-watch/references/tracker-schema.md +79 -0
- package/skills/competitor-watch/scripts/verify.sh +253 -0
- package/skills/compliance/SKILL.md +184 -0
- package/skills/compliance/evals/README.md +14 -0
- package/skills/compliance/evals/cases.yaml +46 -0
- package/skills/compliance/references/frameworks.md +108 -0
- package/skills/compliance/references/operating-rhythm.md +79 -0
- package/skills/compliance/scripts/verify.sh +168 -0
- package/skills/compose-multiplatform/SKILL.md +198 -0
- package/skills/compose-multiplatform/evals/README.md +3 -0
- package/skills/compose-multiplatform/evals/cases.yaml +40 -0
- package/skills/compose-multiplatform/references/ios-interop.md +91 -0
- package/skills/compose-multiplatform/references/project-setup.md +96 -0
- package/skills/compose-multiplatform/scripts/verify.sh +123 -0
- package/skills/constitution/SKILL.md +160 -0
- package/skills/constitution/evals/README.md +68 -0
- package/skills/constitution/evals/cases.yaml +72 -0
- package/skills/constitution/references/constitution-template.md +90 -0
- package/skills/content-engine/SKILL.md +164 -0
- package/skills/content-engine/evals/README.md +17 -0
- package/skills/content-engine/evals/cases.yaml +62 -0
- package/skills/content-engine/references/atomization.md +81 -0
- package/skills/content-engine/references/brief-and-pipeline.md +90 -0
- package/skills/content-engine/scripts/verify.sh +146 -0
- package/skills/context-budget/SKILL.md +132 -0
- package/skills/context-budget/evals/README.md +11 -0
- package/skills/context-budget/evals/cases.yaml +40 -0
- package/skills/context-budget/references/handoff-and-compaction.md +96 -0
- package/skills/continuous-learning/SKILL.md +136 -0
- package/skills/continuous-learning/evals/README.md +16 -0
- package/skills/continuous-learning/evals/cases.yaml +39 -0
- package/skills/continuous-learning/references/lesson-routing.md +106 -0
- package/skills/contracts/SKILL.md +124 -0
- package/skills/contracts/evals/README.md +3 -0
- package/skills/contracts/evals/cases.yaml +42 -0
- package/skills/contracts/references/clause-library.md +129 -0
- package/skills/contracts/references/review-playbook.md +49 -0
- package/skills/contracts/scripts/verify.sh +53 -0
- package/skills/coolify/SKILL.md +201 -0
- package/skills/coolify/evals/README.md +21 -0
- package/skills/coolify/evals/cases.yaml +46 -0
- package/skills/coolify/references/databases-and-backups.md +99 -0
- package/skills/coolify/references/deploy-recipes.md +105 -0
- package/skills/coolify/references/install-and-proxy.md +80 -0
- package/skills/coolify/scripts/verify.sh +123 -0
- package/skills/cost-tracking/SKILL.md +183 -0
- package/skills/cost-tracking/evals/README.md +3 -0
- package/skills/cost-tracking/evals/cases.yaml +45 -0
- package/skills/cost-tracking/references/cloud-caps.md +52 -0
- package/skills/cost-tracking/references/pricing-tables.md +51 -0
- package/skills/cost-tracking/scripts/verify.sh +135 -0
- package/skills/course-builder/SKILL.md +186 -0
- package/skills/course-builder/evals/README.md +16 -0
- package/skills/course-builder/evals/cases.yaml +49 -0
- package/skills/course-builder/references/assessment-design.md +74 -0
- package/skills/course-builder/references/grounding-and-scoping.md +69 -0
- package/skills/course-builder/references/outcomes-and-blooms.md +82 -0
- package/skills/course-builder/scripts/verify.sh +247 -0
- package/skills/course-storytelling/SKILL.md +205 -0
- package/skills/course-storytelling/evals/README.md +54 -0
- package/skills/course-storytelling/evals/cases.yaml +50 -0
- package/skills/course-storytelling/references/brunson-frameworks.md +190 -0
- package/skills/course-storytelling/references/concept-landing-recipe.md +136 -0
- package/skills/course-storytelling/references/course-analysis.md +124 -0
- package/skills/course-storytelling/references/learner-grounding.md +183 -0
- package/skills/course-storytelling/references/mental-models.md +115 -0
- package/skills/course-storytelling/scripts/verify.sh +223 -0
- package/skills/cpp/SKILL.md +349 -0
- package/skills/cpp/evals/README.md +14 -0
- package/skills/cpp/evals/cases.yaml +44 -0
- package/skills/cpp/references/cmake.md +167 -0
- package/skills/cpp/references/move-and-templates.md +130 -0
- package/skills/cpp/references/undefined-behavior.md +86 -0
- package/skills/cpp/scripts/verify.sh +165 -0
- package/skills/csharp-dotnet/SKILL.md +291 -0
- package/skills/csharp-dotnet/evals/README.md +3 -0
- package/skills/csharp-dotnet/evals/cases.yaml +48 -0
- package/skills/csharp-dotnet/references/aspnetcore.md +99 -0
- package/skills/csharp-dotnet/references/async.md +82 -0
- package/skills/csharp-dotnet/references/efcore.md +96 -0
- package/skills/csharp-dotnet/scripts/verify.sh +90 -0
- package/skills/customer-support/SKILL.md +193 -0
- package/skills/customer-support/evals/README.md +13 -0
- package/skills/customer-support/evals/cases.yaml +61 -0
- package/skills/customer-support/references/macros-and-sla.md +142 -0
- package/skills/dashboard/SKILL.md +205 -0
- package/skills/dashboard/evals/README.md +3 -0
- package/skills/dashboard/evals/cases.yaml +50 -0
- package/skills/dashboard/references/chart-selection.md +34 -0
- package/skills/dashboard/references/tile-schema.md +164 -0
- package/skills/dashboard/scripts/verify.sh +130 -0
- package/skills/data-cleaning/SKILL.md +285 -0
- package/skills/data-cleaning/evals/README.md +16 -0
- package/skills/data-cleaning/evals/cases.yaml +57 -0
- package/skills/data-cleaning/references/normalization-recipes.md +136 -0
- package/skills/data-cleaning/references/validation-patterns.md +134 -0
- package/skills/data-cleaning/scripts/verify.sh +115 -0
- package/skills/data-policy/SKILL.md +163 -0
- package/skills/data-policy/evals/README.md +15 -0
- package/skills/data-policy/evals/cases.yaml +44 -0
- package/skills/data-policy/references/consent-and-ropa.md +97 -0
- package/skills/data-policy/references/retention-schedule.md +83 -0
- package/skills/data-policy/scripts/verify.sh +143 -0
- package/skills/data-scraper/SKILL.md +134 -0
- package/skills/data-scraper/evals/README.md +3 -0
- package/skills/data-scraper/evals/cases.yaml +46 -0
- package/skills/data-scraper/references/anti-bot.md +85 -0
- package/skills/data-scraper/references/frameworks.md +116 -0
- package/skills/data-scraper/references/legal-compliance.md +59 -0
- package/skills/data-scraper/scripts/verify.sh +166 -0
- package/skills/db-migrations/SKILL.md +254 -0
- package/skills/db-migrations/evals/README.md +10 -0
- package/skills/db-migrations/evals/cases.yaml +46 -0
- package/skills/db-migrations/references/backfill-and-batching.md +105 -0
- package/skills/db-migrations/references/expand-contract-playbook.md +152 -0
- package/skills/db-migrations/references/tools-and-runners.md +88 -0
- package/skills/db-migrations/scripts/verify.sh +112 -0
- package/skills/debug/SKILL.md +227 -0
- package/skills/debug/evals/README.md +88 -0
- package/skills/debug/evals/cases.yaml +74 -0
- package/skills/decision-records/SKILL.md +189 -0
- package/skills/decision-records/evals/README.md +3 -0
- package/skills/decision-records/evals/cases.yaml +43 -0
- package/skills/decision-records/references/templates.md +232 -0
- package/skills/decision-records/scripts/verify.sh +105 -0
- package/skills/deployment/SKILL.md +439 -0
- package/skills/deployment/evals/README.md +50 -0
- package/skills/deployment/evals/cases.yaml +53 -0
- package/skills/deployment/references/coolify.md +216 -0
- package/skills/deployment/references/dockerfiles-by-stack.md +319 -0
- package/skills/deployment/references/github-actions.md +295 -0
- package/skills/deployment/references/hosting-targets.md +272 -0
- package/skills/deployment/scripts/verify.sh +134 -0
- package/skills/design/SKILL.md +399 -0
- package/skills/design/evals/README.md +53 -0
- package/skills/design/evals/cases.yaml +56 -0
- package/skills/design/references/brand-grounding.md +187 -0
- package/skills/design/references/copywriting-frameworks.md +138 -0
- package/skills/design/references/landing-anatomy-and-cro.md +202 -0
- package/skills/design/references/motion-and-interaction.md +182 -0
- package/skills/design/references/research-method.md +147 -0
- package/skills/design/references/signature-and-craft.md +148 -0
- package/skills/design/references/trends-2026.md +80 -0
- package/skills/design/references/visual-system.md +236 -0
- package/skills/design/scripts/verify.sh +248 -0
- package/skills/digitalocean/SKILL.md +251 -0
- package/skills/digitalocean/evals/README.md +10 -0
- package/skills/digitalocean/evals/cases.yaml +37 -0
- package/skills/digitalocean/references/app-spec.md +126 -0
- package/skills/digitalocean/references/droplet-ops.md +95 -0
- package/skills/digitalocean/scripts/verify.sh +102 -0
- package/skills/django/SKILL.md +268 -0
- package/skills/django/evals/README.md +11 -0
- package/skills/django/evals/cases.yaml +47 -0
- package/skills/django/references/drf.md +109 -0
- package/skills/django/references/orm-performance.md +91 -0
- package/skills/django/references/security.md +81 -0
- package/skills/django/references/testing.md +86 -0
- package/skills/django/scripts/verify.sh +115 -0
- package/skills/docker/SKILL.md +283 -0
- package/skills/docker/evals/README.md +10 -0
- package/skills/docker/evals/cases.yaml +44 -0
- package/skills/docker/references/base-images-and-stages.md +104 -0
- package/skills/docker/references/compose-recipes.md +109 -0
- package/skills/docker/scripts/verify.sh +149 -0
- package/skills/document-processing/SKILL.md +214 -0
- package/skills/document-processing/evals/README.md +3 -0
- package/skills/document-processing/evals/cases.yaml +65 -0
- package/skills/document-processing/references/engines.md +67 -0
- package/skills/document-processing/scripts/verify.sh +172 -0
- package/skills/domains-dns/SKILL.md +146 -0
- package/skills/domains-dns/evals/README.md +16 -0
- package/skills/domains-dns/evals/cases.yaml +47 -0
- package/skills/domains-dns/references/record-cookbook.md +94 -0
- package/skills/domains-dns/references/tls-and-acme.md +90 -0
- package/skills/domains-dns/references/verify-and-debug.md +64 -0
- package/skills/domains-dns/scripts/verify.sh +163 -0
- package/skills/drizzle-orm/SKILL.md +234 -0
- package/skills/drizzle-orm/evals/README.md +12 -0
- package/skills/drizzle-orm/evals/cases.yaml +47 -0
- package/skills/drizzle-orm/references/relations-and-drivers.md +118 -0
- package/skills/drizzle-orm/scripts/verify.sh +155 -0
- package/skills/duckdb/SKILL.md +207 -0
- package/skills/duckdb/evals/README.md +31 -0
- package/skills/duckdb/evals/cases.yaml +41 -0
- package/skills/duckdb/references/python-and-interop.md +105 -0
- package/skills/duckdb/references/remote-and-lakehouse.md +101 -0
- package/skills/duckdb/scripts/verify.sh +71 -0
- package/skills/dynamodb/SKILL.md +217 -0
- package/skills/dynamodb/evals/README.md +8 -0
- package/skills/dynamodb/evals/cases.yaml +46 -0
- package/skills/dynamodb/references/access-patterns.md +127 -0
- package/skills/dynamodb/references/capacity-and-limits.md +78 -0
- package/skills/dynamodb/scripts/verify.sh +108 -0
- package/skills/e-signature/SKILL.md +185 -0
- package/skills/e-signature/evals/README.md +3 -0
- package/skills/e-signature/evals/cases.yaml +44 -0
- package/skills/e-signature/references/docusign.md +83 -0
- package/skills/e-signature/references/dropbox-sign.md +73 -0
- package/skills/e-signature/references/legal-tiers.md +37 -0
- package/skills/e-signature/scripts/verify.sh +81 -0
- package/skills/e2e-testing/SKILL.md +243 -0
- package/skills/e2e-testing/evals/README.md +10 -0
- package/skills/e2e-testing/evals/cases.yaml +64 -0
- package/skills/e2e-testing/references/config-and-ci.md +156 -0
- package/skills/e2e-testing/references/flakiness-playbook.md +124 -0
- package/skills/e2e-testing/scripts/verify.sh +117 -0
- package/skills/electron/SKILL.md +221 -0
- package/skills/electron/evals/README.md +13 -0
- package/skills/electron/evals/cases.yaml +38 -0
- package/skills/electron/references/packaging-and-updates.md +122 -0
- package/skills/electron/references/security-and-ipc.md +158 -0
- package/skills/electron/scripts/verify.sh +143 -0
- package/skills/elixir/SKILL.md +217 -0
- package/skills/elixir/evals/README.md +3 -0
- package/skills/elixir/evals/cases.yaml +41 -0
- package/skills/elixir/references/mix-and-releases.md +91 -0
- package/skills/elixir/references/otp-patterns.md +96 -0
- package/skills/elixir/scripts/verify.sh +76 -0
- package/skills/email-connector/SKILL.md +294 -0
- package/skills/email-connector/evals/README.md +19 -0
- package/skills/email-connector/evals/cases.yaml +39 -0
- package/skills/email-connector/references/providers.md +107 -0
- package/skills/email-connector/scripts/verify.sh +72 -0
- package/skills/email-deliverability/SKILL.md +168 -0
- package/skills/email-deliverability/evals/README.md +21 -0
- package/skills/email-deliverability/evals/cases.yaml +45 -0
- package/skills/email-deliverability/scripts/verify.sh +98 -0
- package/skills/embeddings-search/SKILL.md +193 -0
- package/skills/embeddings-search/evals/README.md +10 -0
- package/skills/embeddings-search/evals/cases.yaml +44 -0
- package/skills/embeddings-search/references/evaluation.md +86 -0
- package/skills/embeddings-search/references/models.md +73 -0
- package/skills/embeddings-search/scripts/verify.sh +103 -0
- package/skills/error-handling/SKILL.md +307 -0
- package/skills/error-handling/evals/README.md +12 -0
- package/skills/error-handling/evals/cases.yaml +46 -0
- package/skills/error-handling/references/boundaries-and-messaging.md +120 -0
- package/skills/error-handling/references/retry-and-resilience.md +154 -0
- package/skills/error-handling/scripts/verify.sh +110 -0
- package/skills/expo/SKILL.md +253 -0
- package/skills/expo/evals/README.md +13 -0
- package/skills/expo/evals/cases.yaml +44 -0
- package/skills/expo/references/config-plugins.md +117 -0
- package/skills/expo/references/eas-update.md +118 -0
- package/skills/expo/scripts/verify.sh +132 -0
- package/skills/fal/SKILL.md +210 -0
- package/skills/fal/evals/README.md +3 -0
- package/skills/fal/evals/cases.yaml +42 -0
- package/skills/fal/references/models-and-cost.md +53 -0
- package/skills/fal/references/queue-and-webhooks.md +153 -0
- package/skills/fal/scripts/verify.sh +72 -0
- package/skills/fastapi/SKILL.md +499 -0
- package/skills/fastapi/evals/README.md +50 -0
- package/skills/fastapi/evals/cases.yaml +55 -0
- package/skills/fastapi/references/database.md +347 -0
- package/skills/fastapi/references/production.md +338 -0
- package/skills/fastapi/references/security.md +330 -0
- package/skills/fastapi/references/testing.md +349 -0
- package/skills/fastapi/scripts/verify.sh +116 -0
- package/skills/finance-ops/SKILL.md +149 -0
- package/skills/finance-ops/evals/README.md +3 -0
- package/skills/finance-ops/evals/cases.yaml +39 -0
- package/skills/finance-ops/references/cash-flow-forecast.md +57 -0
- package/skills/finance-ops/references/month-close.md +59 -0
- package/skills/finance-ops/references/reconciliation.md +65 -0
- package/skills/finance-ops/scripts/verify.sh +166 -0
- package/skills/financial-model/SKILL.md +170 -0
- package/skills/financial-model/evals/README.md +3 -0
- package/skills/financial-model/evals/cases.yaml +53 -0
- package/skills/financial-model/references/benchmarks-and-scenarios.md +55 -0
- package/skills/financial-model/references/model-structure.md +67 -0
- package/skills/financial-model/references/revenue-build.md +68 -0
- package/skills/financial-model/scripts/verify.sh +232 -0
- package/skills/firebase/SKILL.md +251 -0
- package/skills/firebase/evals/README.md +12 -0
- package/skills/firebase/evals/cases.yaml +45 -0
- package/skills/firebase/references/cloud-functions.md +102 -0
- package/skills/firebase/references/data-modeling.md +108 -0
- package/skills/firebase/references/security-rules.md +137 -0
- package/skills/firebase/scripts/verify.sh +98 -0
- package/skills/flutter/SKILL.md +448 -0
- package/skills/flutter/evals/README.md +54 -0
- package/skills/flutter/evals/cases.yaml +69 -0
- package/skills/flutter/references/architecture-and-state.md +499 -0
- package/skills/flutter/references/i18n-and-dependencies.md +197 -0
- package/skills/flutter/references/performance.md +299 -0
- package/skills/flutter/references/testing.md +385 -0
- package/skills/flutter/references/ui-and-navigation.md +378 -0
- package/skills/flutter/scripts/verify.sh +104 -0
- package/skills/fly-io/SKILL.md +206 -0
- package/skills/fly-io/evals/README.md +3 -0
- package/skills/fly-io/evals/cases.yaml +42 -0
- package/skills/fly-io/references/fly-toml.md +155 -0
- package/skills/fly-io/references/multi-region.md +66 -0
- package/skills/fly-io/scripts/verify.sh +90 -0
- package/skills/forecasting/SKILL.md +139 -0
- package/skills/forecasting/evals/README.md +13 -0
- package/skills/forecasting/evals/cases.yaml +47 -0
- package/skills/forecasting/references/accuracy-and-backtesting.md +104 -0
- package/skills/forecasting/references/methods-cheatsheet.md +94 -0
- package/skills/forecasting/scripts/verify.sh +99 -0
- package/skills/fundraising/SKILL.md +162 -0
- package/skills/fundraising/evals/README.md +18 -0
- package/skills/fundraising/evals/cases.yaml +76 -0
- package/skills/fundraising/references/funnel-math.md +90 -0
- package/skills/fundraising/references/process-playbook.md +97 -0
- package/skills/gcp-essentials/SKILL.md +327 -0
- package/skills/gcp-essentials/evals/README.md +12 -0
- package/skills/gcp-essentials/evals/cases.yaml +38 -0
- package/skills/gcp-essentials/references/deploy-recipes.md +81 -0
- package/skills/gcp-essentials/references/iam-and-auth.md +94 -0
- package/skills/gcp-essentials/references/networking-and-sql.md +74 -0
- package/skills/gcp-essentials/scripts/verify.sh +158 -0
- package/skills/gdpr-privacy/SKILL.md +167 -0
- package/skills/gdpr-privacy/evals/README.md +3 -0
- package/skills/gdpr-privacy/evals/cases.yaml +47 -0
- package/skills/gdpr-privacy/references/dpa-and-transfers.md +63 -0
- package/skills/gdpr-privacy/references/dsar-and-consent.md +83 -0
- package/skills/gdpr-privacy/references/privacy-policy-blueprint.md +99 -0
- package/skills/gdpr-privacy/scripts/verify.sh +84 -0
- package/skills/git-workflow/SKILL.md +190 -0
- package/skills/git-workflow/evals/README.md +10 -0
- package/skills/git-workflow/evals/cases.yaml +47 -0
- package/skills/git-workflow/references/interactive-rebase.md +89 -0
- package/skills/github-actions/SKILL.md +256 -0
- package/skills/github-actions/evals/README.md +3 -0
- package/skills/github-actions/evals/cases.yaml +45 -0
- package/skills/github-actions/references/caching-and-matrix.md +92 -0
- package/skills/github-actions/references/oidc-deploys.md +130 -0
- package/skills/github-actions/scripts/verify.sh +105 -0
- package/skills/go/SKILL.md +438 -0
- package/skills/go/evals/README.md +56 -0
- package/skills/go/evals/cases.yaml +55 -0
- package/skills/go/references/concurrency.md +557 -0
- package/skills/go/references/http-services.md +529 -0
- package/skills/go/references/testing.md +338 -0
- package/skills/go/scripts/verify.sh +109 -0
- package/skills/google-workspace/SKILL.md +287 -0
- package/skills/google-workspace/evals/README.md +16 -0
- package/skills/google-workspace/evals/cases.yaml +44 -0
- package/skills/google-workspace/references/api-recipes.md +148 -0
- package/skills/google-workspace/references/auth-setup.md +100 -0
- package/skills/google-workspace/scripts/verify.sh +128 -0
- package/skills/grants/SKILL.md +171 -0
- package/skills/grants/evals/README.md +3 -0
- package/skills/grants/evals/cases.yaml +69 -0
- package/skills/grants/references/budget-justification.md +71 -0
- package/skills/grants/references/jurisdictions.md +35 -0
- package/skills/grants/references/logic-model.md +66 -0
- package/skills/grants/scripts/verify.sh +193 -0
- package/skills/harness/SKILL.md +329 -0
- package/skills/harness/assets/_TEMPLATE/.env.example +8 -0
- package/skills/harness/assets/_TEMPLATE/CREDENTIALS.md +25 -0
- package/skills/harness/assets/_TEMPLATE/README.md +25 -0
- package/skills/harness/assets/_TEMPLATE/test_connection.sh +30 -0
- package/skills/harness/evals/README.md +54 -0
- package/skills/harness/evals/cases.yaml +72 -0
- package/skills/harness/examples/audit-example.md +120 -0
- package/skills/harness/references/agents-md-template.md +41 -0
- package/skills/harness/references/audit-report-template.html +140 -0
- package/skills/harness/references/audit-report-template.md +116 -0
- package/skills/harness/references/claude-md-template.md +98 -0
- package/skills/harness/references/inbox-readme-template.md +51 -0
- package/skills/harness/references/ingest-formats.md +185 -0
- package/skills/harness/references/providers.yaml +3410 -0
- package/skills/harness/references/tools-readme-template.md +88 -0
- package/skills/harness/references/wiki-archive-template.html +81 -0
- package/skills/harness/references/wiki-article-template.md +20 -0
- package/skills/harness/references/wiki-dashboard-template.html +136 -0
- package/skills/harness/references/wiki-deep-improve-report-template.html +126 -0
- package/skills/harness/references/wiki-gaps-template.md +18 -0
- package/skills/harness/references/wiki-index-template.md +23 -0
- package/skills/harness/references/wiki-protocol.md +699 -0
- package/skills/harness/references/wiki-raw-template.md +7 -0
- package/skills/hetzner/SKILL.md +221 -0
- package/skills/hetzner/evals/README.md +35 -0
- package/skills/hetzner/evals/cases.yaml +46 -0
- package/skills/hetzner/references/cloud-init.md +120 -0
- package/skills/hetzner/references/plans-and-locations.md +56 -0
- package/skills/hetzner/scripts/verify.sh +122 -0
- package/skills/hiring/SKILL.md +248 -0
- package/skills/hiring/evals/README.md +13 -0
- package/skills/hiring/evals/cases.yaml +41 -0
- package/skills/hiring/references/templates.md +118 -0
- package/skills/htmx/SKILL.md +261 -0
- package/skills/htmx/evals/README.md +3 -0
- package/skills/htmx/evals/cases.yaml +38 -0
- package/skills/htmx/references/patterns.md +113 -0
- package/skills/htmx/references/server-contract.md +91 -0
- package/skills/htmx/scripts/verify.sh +93 -0
- package/skills/huggingface/SKILL.md +190 -0
- package/skills/huggingface/evals/README.md +11 -0
- package/skills/huggingface/evals/cases.yaml +41 -0
- package/skills/huggingface/references/endpoints-and-spaces.md +99 -0
- package/skills/huggingface/references/hub-and-cli.md +85 -0
- package/skills/huggingface/references/inference-providers.md +115 -0
- package/skills/huggingface/scripts/verify.sh +123 -0
- package/skills/implement/SKILL.md +283 -0
- package/skills/implement/evals/README.md +56 -0
- package/skills/implement/evals/cases.yaml +43 -0
- package/skills/init/SKILL.md +184 -0
- package/skills/init/evals/README.md +49 -0
- package/skills/init/evals/cases.yaml +74 -0
- package/skills/init/references/accompaniment-and-profile.md +140 -0
- package/skills/init/references/discovery.md +90 -0
- package/skills/init/references/recommend-skills.md +115 -0
- package/skills/init/scripts/verify.sh +122 -0
- package/skills/instagram-api/SKILL.md +241 -0
- package/skills/instagram-api/evals/README.md +3 -0
- package/skills/instagram-api/evals/cases.yaml +43 -0
- package/skills/instagram-api/references/insights-metrics.md +88 -0
- package/skills/instagram-api/references/publish-reel.md +98 -0
- package/skills/instagram-api/scripts/verify.sh +137 -0
- package/skills/inventory/SKILL.md +131 -0
- package/skills/inventory/evals/README.md +3 -0
- package/skills/inventory/evals/cases.yaml +43 -0
- package/skills/inventory/references/abc-xyz.md +52 -0
- package/skills/inventory/references/ddmrp.md +32 -0
- package/skills/inventory/references/reorder-policies.md +85 -0
- package/skills/inventory/references/safety-stock.md +63 -0
- package/skills/inventory/scripts/verify.sh +155 -0
- package/skills/investor-materials/SKILL.md +175 -0
- package/skills/investor-materials/evals/README.md +15 -0
- package/skills/investor-materials/evals/cases.yaml +60 -0
- package/skills/investor-materials/references/dataroom-checklist.md +134 -0
- package/skills/investor-materials/references/update-and-onepager-templates.md +152 -0
- package/skills/investor-materials/scripts/verify.sh +148 -0
- package/skills/invoicing/SKILL.md +154 -0
- package/skills/invoicing/evals/README.md +5 -0
- package/skills/invoicing/evals/cases.yaml +49 -0
- package/skills/invoicing/references/dunning-ladder.md +53 -0
- package/skills/invoicing/references/e-invoicing-mandates.md +43 -0
- package/skills/invoicing/scripts/fixtures/broken-invoice.json +13 -0
- package/skills/invoicing/scripts/fixtures/valid-invoice.json +15 -0
- package/skills/invoicing/scripts/verify.sh +133 -0
- package/skills/ip-trademark/SKILL.md +186 -0
- package/skills/ip-trademark/evals/README.md +10 -0
- package/skills/ip-trademark/evals/cases.yaml +47 -0
- package/skills/ip-trademark/references/jurisdictions.md +63 -0
- package/skills/ip-trademark/references/ownership-and-licensing.md +90 -0
- package/skills/java/SKILL.md +341 -0
- package/skills/java/evals/README.md +23 -0
- package/skills/java/evals/cases.yaml +43 -0
- package/skills/java/references/builds.md +133 -0
- package/skills/java/references/concurrency.md +108 -0
- package/skills/java/references/streams.md +102 -0
- package/skills/java/scripts/verify.sh +107 -0
- package/skills/knowledge-ops/SKILL.md +125 -0
- package/skills/knowledge-ops/evals/README.md +16 -0
- package/skills/knowledge-ops/evals/cases.yaml +50 -0
- package/skills/knowledge-ops/references/gardening-playbook.md +116 -0
- package/skills/kotlin-android/SKILL.md +245 -0
- package/skills/kotlin-android/evals/README.md +13 -0
- package/skills/kotlin-android/evals/cases.yaml +56 -0
- package/skills/kotlin-android/references/architecture.md +200 -0
- package/skills/kotlin-android/references/gradle-setup.md +125 -0
- package/skills/kotlin-android/scripts/verify.sh +109 -0
- package/skills/kpi-framework/SKILL.md +199 -0
- package/skills/kpi-framework/evals/README.md +11 -0
- package/skills/kpi-framework/evals/cases.yaml +42 -0
- package/skills/kpi-framework/references/definition-and-targets.md +64 -0
- package/skills/kpi-framework/references/metric-catalog.md +84 -0
- package/skills/landing-copy/SKILL.md +153 -0
- package/skills/landing-copy/evals/README.md +18 -0
- package/skills/landing-copy/evals/cases.yaml +63 -0
- package/skills/landing-copy/references/frameworks.md +61 -0
- package/skills/landing-copy/references/page-skeleton.md +92 -0
- package/skills/landing-copy/scripts/verify.sh +164 -0
- package/skills/laravel/SKILL.md +301 -0
- package/skills/laravel/evals/README.md +10 -0
- package/skills/laravel/evals/cases.yaml +45 -0
- package/skills/laravel/references/eloquent-patterns.md +126 -0
- package/skills/laravel/references/queues-and-scheduling.md +153 -0
- package/skills/laravel/scripts/verify.sh +128 -0
- package/skills/lead-gen/SKILL.md +155 -0
- package/skills/lead-gen/evals/README.md +3 -0
- package/skills/lead-gen/evals/cases.yaml +43 -0
- package/skills/lead-gen/references/data-sources.md +87 -0
- package/skills/lead-gen/references/scoring-model.md +93 -0
- package/skills/lead-gen/scripts/verify.sh +179 -0
- package/skills/linkedin-api/SKILL.md +211 -0
- package/skills/linkedin-api/evals/README.md +3 -0
- package/skills/linkedin-api/evals/cases.yaml +41 -0
- package/skills/linkedin-api/references/api-reference.md +168 -0
- package/skills/linkedin-api/scripts/verify.sh +98 -0
- package/skills/linkedin-carousels/SKILL.md +239 -0
- package/skills/linkedin-carousels/evals/README.md +13 -0
- package/skills/linkedin-carousels/evals/cases.yaml +62 -0
- package/skills/linkedin-carousels/references/carousel-patterns.md +200 -0
- package/skills/linkedin-carousels/scripts/verify.sh +160 -0
- package/skills/linkedin-content/SKILL.md +162 -0
- package/skills/linkedin-content/evals/README.md +13 -0
- package/skills/linkedin-content/evals/cases.yaml +62 -0
- package/skills/linkedin-content/references/hooks-and-formats.md +114 -0
- package/skills/linkedin-content/scripts/verify.sh +154 -0
- package/skills/linkedin-outreach/SKILL.md +174 -0
- package/skills/linkedin-outreach/evals/README.md +3 -0
- package/skills/linkedin-outreach/evals/cases.yaml +43 -0
- package/skills/linkedin-outreach/references/ledger-schema.md +48 -0
- package/skills/linkedin-outreach/references/sales-navigator-playbook.md +61 -0
- package/skills/linkedin-outreach/scripts/verify.sh +120 -0
- package/skills/linkedin-strategy/SKILL.md +167 -0
- package/skills/linkedin-strategy/evals/README.md +3 -0
- package/skills/linkedin-strategy/evals/cases.yaml +49 -0
- package/skills/linkedin-strategy/references/ssi-and-pillars.md +59 -0
- package/skills/linkedin-strategy/references/wiki-records.md +62 -0
- package/skills/linkedin-strategy/scripts/verify.sh +120 -0
- package/skills/llm-pipeline/SKILL.md +155 -0
- package/skills/llm-pipeline/evals/README.md +3 -0
- package/skills/llm-pipeline/evals/cases.yaml +44 -0
- package/skills/llm-pipeline/references/caching-layers.md +60 -0
- package/skills/llm-pipeline/references/litellm-router.md +101 -0
- package/skills/llm-pipeline/scripts/verify.sh +169 -0
- package/skills/logistics-ops/SKILL.md +219 -0
- package/skills/logistics-ops/evals/README.md +20 -0
- package/skills/logistics-ops/evals/cases.yaml +48 -0
- package/skills/logistics-ops/references/carriers-and-claims.md +105 -0
- package/skills/market-research/SKILL.md +145 -0
- package/skills/market-research/evals/README.md +3 -0
- package/skills/market-research/evals/cases.yaml +48 -0
- package/skills/market-research/references/demand-signals.md +63 -0
- package/skills/market-research/references/sizing-playbook.md +121 -0
- package/skills/market-research/scripts/verify.sh +215 -0
- package/skills/marketing/SKILL.md +233 -0
- package/skills/marketing/evals/README.md +61 -0
- package/skills/marketing/evals/cases.yaml +84 -0
- package/skills/marketing/references/brand-grounding.md +197 -0
- package/skills/marketing/references/campaigns-and-channels.md +151 -0
- package/skills/marketing/references/copy-frameworks.md +166 -0
- package/skills/marketing/references/landing-copy.md +191 -0
- package/skills/marketing/references/seo-geo.md +391 -0
- package/skills/marketing/scripts/seo_audit.py +166 -0
- package/skills/marketing/scripts/verify.sh +233 -0
- package/skills/medium-publishing/SKILL.md +152 -0
- package/skills/medium-publishing/evals/README.md +3 -0
- package/skills/medium-publishing/evals/cases.yaml +42 -0
- package/skills/medium-publishing/references/cross-post-and-canonical.md +65 -0
- package/skills/medium-publishing/references/legacy-api.md +100 -0
- package/skills/medium-strategy/SKILL.md +161 -0
- package/skills/medium-strategy/evals/README.md +3 -0
- package/skills/medium-strategy/evals/cases.yaml +50 -0
- package/skills/medium-strategy/references/distribution-and-boost.md +65 -0
- package/skills/medium-strategy/references/wiki-records.md +60 -0
- package/skills/medium-strategy/scripts/verify.sh +118 -0
- package/skills/medium-writing/SKILL.md +140 -0
- package/skills/medium-writing/evals/README.md +5 -0
- package/skills/medium-writing/evals/cases.yaml +39 -0
- package/skills/medium-writing/references/title-patterns.md +79 -0
- package/skills/meeting-notes/SKILL.md +168 -0
- package/skills/meeting-notes/evals/README.md +14 -0
- package/skills/meeting-notes/evals/cases.yaml +46 -0
- package/skills/meeting-notes/references/templates.md +140 -0
- package/skills/modal/SKILL.md +307 -0
- package/skills/modal/evals/README.md +29 -0
- package/skills/modal/evals/cases.yaml +50 -0
- package/skills/modal/references/images-gpu-cookbook.md +160 -0
- package/skills/modal/references/web-and-scaling.md +138 -0
- package/skills/modal/scripts/verify.sh +127 -0
- package/skills/mongodb/SKILL.md +342 -0
- package/skills/mongodb/evals/README.md +29 -0
- package/skills/mongodb/evals/cases.yaml +41 -0
- package/skills/mongodb/references/aggregation.md +115 -0
- package/skills/mongodb/references/data-modeling.md +135 -0
- package/skills/mongodb/references/transactions-and-ops.md +128 -0
- package/skills/mongodb/scripts/verify.sh +151 -0
- package/skills/monitoring/SKILL.md +155 -0
- package/skills/monitoring/evals/README.md +3 -0
- package/skills/monitoring/evals/cases.yaml +47 -0
- package/skills/monitoring/references/burn-rate-and-oncall.md +128 -0
- package/skills/monitoring/references/tool-setup.md +154 -0
- package/skills/monitoring/scripts/verify.sh +145 -0
- package/skills/mysql/SKILL.md +249 -0
- package/skills/mysql/evals/README.md +12 -0
- package/skills/mysql/evals/cases.yaml +49 -0
- package/skills/mysql/references/indexing-and-explain.md +161 -0
- package/skills/mysql/references/mysql-vs-mariadb.md +78 -0
- package/skills/mysql/references/online-ddl-and-migrations.md +120 -0
- package/skills/mysql/references/replication-and-ha.md +115 -0
- package/skills/mysql/scripts/verify.sh +141 -0
- package/skills/neon/SKILL.md +218 -0
- package/skills/neon/evals/README.md +11 -0
- package/skills/neon/evals/cases.yaml +45 -0
- package/skills/neon/references/branching-ci.md +86 -0
- package/skills/neon/scripts/verify.sh +78 -0
- package/skills/nestjs/SKILL.md +225 -0
- package/skills/nestjs/evals/README.md +3 -0
- package/skills/nestjs/evals/cases.yaml +38 -0
- package/skills/nestjs/references/cross-cutting.md +135 -0
- package/skills/nestjs/references/testing-recipes.md +105 -0
- package/skills/nestjs/scripts/verify.sh +98 -0
- package/skills/netlify/SKILL.md +208 -0
- package/skills/netlify/evals/README.md +13 -0
- package/skills/netlify/evals/cases.yaml +43 -0
- package/skills/netlify/references/functions.md +97 -0
- package/skills/netlify/references/netlify-toml.md +115 -0
- package/skills/netlify/scripts/verify.sh +95 -0
- package/skills/newsletter/SKILL.md +162 -0
- package/skills/newsletter/evals/README.md +12 -0
- package/skills/newsletter/evals/cases.yaml +42 -0
- package/skills/newsletter/references/growth-loops.md +73 -0
- package/skills/newsletter/references/welcome-sequence.md +62 -0
- package/skills/newsletter/scripts/verify.sh +173 -0
- package/skills/nextjs/SKILL.md +472 -0
- package/skills/nextjs/evals/README.md +59 -0
- package/skills/nextjs/evals/cases.yaml +56 -0
- package/skills/nextjs/references/data-and-caching.md +309 -0
- package/skills/nextjs/references/metadata.md +208 -0
- package/skills/nextjs/references/performance.md +325 -0
- package/skills/nextjs/references/react.md +383 -0
- package/skills/nextjs/references/security.md +239 -0
- package/skills/nextjs/references/testing.md +290 -0
- package/skills/nextjs/scripts/verify.sh +141 -0
- package/skills/no-code-app/SKILL.md +153 -0
- package/skills/no-code-app/evals/README.md +3 -0
- package/skills/no-code-app/evals/cases.yaml +43 -0
- package/skills/no-code-app/references/platform-limits.md +100 -0
- package/skills/nodejs/SKILL.md +242 -0
- package/skills/nodejs/evals/README.md +3 -0
- package/skills/nodejs/evals/cases.yaml +39 -0
- package/skills/nodejs/references/express5-migration.md +53 -0
- package/skills/nodejs/references/graceful-shutdown.md +73 -0
- package/skills/nodejs/scripts/verify.sh +122 -0
- package/skills/notion-connector/SKILL.md +234 -0
- package/skills/notion-connector/evals/README.md +15 -0
- package/skills/notion-connector/evals/cases.yaml +45 -0
- package/skills/notion-connector/references/api-versions.md +63 -0
- package/skills/notion-connector/references/property-shapes.md +110 -0
- package/skills/notion-connector/references/sync-patterns.md +95 -0
- package/skills/notion-connector/scripts/verify.sh +162 -0
- package/skills/observability/SKILL.md +231 -0
- package/skills/observability/evals/README.md +3 -0
- package/skills/observability/evals/cases.yaml +49 -0
- package/skills/observability/references/collector-config.md +98 -0
- package/skills/observability/references/instrumentation-recipes.md +115 -0
- package/skills/observability/scripts/verify.sh +156 -0
- package/skills/ollama/SKILL.md +213 -0
- package/skills/ollama/evals/README.md +9 -0
- package/skills/ollama/evals/cases.yaml +43 -0
- package/skills/ollama/references/api.md +148 -0
- package/skills/ollama/references/hardware-sizing.md +87 -0
- package/skills/ollama/scripts/verify.sh +116 -0
- package/skills/orient/SKILL.md +54 -0
- package/skills/orient/evals/README.md +16 -0
- package/skills/orient/evals/cases.yaml +57 -0
- package/skills/orient/references/orientation-contract.md +34 -0
- package/skills/parallel/SKILL.md +198 -0
- package/skills/parallel/evals/README.md +62 -0
- package/skills/parallel/evals/cases.yaml +44 -0
- package/skills/people-ops/SKILL.md +122 -0
- package/skills/people-ops/evals/README.md +14 -0
- package/skills/people-ops/evals/cases.yaml +43 -0
- package/skills/people-ops/references/templates.md +129 -0
- package/skills/performance/SKILL.md +221 -0
- package/skills/performance/evals/README.md +3 -0
- package/skills/performance/evals/cases.yaml +47 -0
- package/skills/performance/references/profiling-playbook.md +54 -0
- package/skills/performance/scripts/verify.sh +94 -0
- package/skills/phoenix/SKILL.md +169 -0
- package/skills/phoenix/evals/README.md +3 -0
- package/skills/phoenix/evals/cases.yaml +40 -0
- package/skills/phoenix/references/auth-and-scopes.md +82 -0
- package/skills/phoenix/references/ecto-patterns.md +93 -0
- package/skills/phoenix/references/liveview.md +134 -0
- package/skills/phoenix/scripts/verify.sh +73 -0
- package/skills/php/SKILL.md +397 -0
- package/skills/php/evals/README.md +12 -0
- package/skills/php/evals/cases.yaml +45 -0
- package/skills/php/references/tooling.md +170 -0
- package/skills/php/references/type-system.md +220 -0
- package/skills/php/scripts/verify.sh +155 -0
- package/skills/pitch-deck/SKILL.md +209 -0
- package/skills/pitch-deck/evals/README.md +15 -0
- package/skills/pitch-deck/evals/cases.yaml +55 -0
- package/skills/pitch-deck/references/numbers-that-matter.md +78 -0
- package/skills/pitch-deck/references/slide-spine.md +149 -0
- package/skills/pitch-deck/scripts/verify.sh +186 -0
- package/skills/plan/SKILL.md +204 -0
- package/skills/plan/evals/README.md +62 -0
- package/skills/plan/evals/cases.yaml +49 -0
- package/skills/plan/references/plan-template.md +124 -0
- package/skills/planetscale/SKILL.md +223 -0
- package/skills/planetscale/evals/README.md +11 -0
- package/skills/planetscale/evals/cases.yaml +46 -0
- package/skills/planetscale/references/deploy-requests.md +75 -0
- package/skills/planetscale/references/no-foreign-keys.md +88 -0
- package/skills/planetscale/scripts/verify.sh +115 -0
- package/skills/podcast/SKILL.md +166 -0
- package/skills/podcast/evals/README.md +17 -0
- package/skills/podcast/evals/cases.yaml +61 -0
- package/skills/podcast/references/rss-and-namespace.md +136 -0
- package/skills/podcast/scripts/verify.sh +246 -0
- package/skills/postgresdb/SKILL.md +372 -0
- package/skills/postgresdb/evals/README.md +55 -0
- package/skills/postgresdb/evals/cases.yaml +57 -0
- package/skills/postgresdb/references/migrations.md +279 -0
- package/skills/postgresdb/references/operations-and-security.md +267 -0
- package/skills/postgresdb/references/query-optimization.md +374 -0
- package/skills/postgresdb/references/schema-and-indexing.md +379 -0
- package/skills/postgresdb/scripts/verify.sh +191 -0
- package/skills/presentations/SKILL.md +296 -0
- package/skills/presentations/evals/README.md +61 -0
- package/skills/presentations/evals/cases.yaml +56 -0
- package/skills/presentations/references/brand-grounding.md +160 -0
- package/skills/presentations/references/markdown-decks.md +290 -0
- package/skills/presentations/references/pptx-python.md +242 -0
- package/skills/presentations/references/slide-design.md +261 -0
- package/skills/presentations/references/storytelling-and-decks.md +150 -0
- package/skills/presentations/scripts/verify.sh +252 -0
- package/skills/press-kit/SKILL.md +243 -0
- package/skills/press-kit/evals/README.md +15 -0
- package/skills/press-kit/evals/cases.yaml +55 -0
- package/skills/press-kit/references/release-types.md +102 -0
- package/skills/press-kit/references/templates.md +132 -0
- package/skills/press-kit/scripts/verify.sh +161 -0
- package/skills/pricing/SKILL.md +160 -0
- package/skills/pricing/evals/README.md +5 -0
- package/skills/pricing/evals/cases.yaml +44 -0
- package/skills/pricing/references/localization.md +56 -0
- package/skills/pricing/references/pricing-models.md +55 -0
- package/skills/pricing/scripts/verify.sh +91 -0
- package/skills/prisma-orm/SKILL.md +320 -0
- package/skills/prisma-orm/evals/README.md +12 -0
- package/skills/prisma-orm/evals/cases.yaml +56 -0
- package/skills/prisma-orm/references/migrations-and-v7-upgrade.md +197 -0
- package/skills/prisma-orm/references/queries-and-performance.md +169 -0
- package/skills/prisma-orm/scripts/verify.sh +137 -0
- package/skills/procurement/SKILL.md +179 -0
- package/skills/procurement/evals/README.md +20 -0
- package/skills/procurement/evals/cases.yaml +49 -0
- package/skills/procurement/references/scorecard-and-tco.md +100 -0
- package/skills/procurement/references/sourcing-requests.md +116 -0
- package/skills/procurement/scripts/verify.sh +280 -0
- package/skills/project-ops/SKILL.md +130 -0
- package/skills/project-ops/evals/README.md +3 -0
- package/skills/project-ops/evals/cases.yaml +71 -0
- package/skills/project-ops/references/raid-and-rag.md +58 -0
- package/skills/project-ops/references/status-report-template.md +68 -0
- package/skills/project-ops/scripts/verify.sh +257 -0
- package/skills/prompt-engineering/SKILL.md +138 -0
- package/skills/prompt-engineering/evals/README.md +11 -0
- package/skills/prompt-engineering/evals/cases.yaml +46 -0
- package/skills/prompt-engineering/references/eval-templates.md +94 -0
- package/skills/prompt-engineering/references/output-contracts.md +120 -0
- package/skills/prompt-engineering/scripts/verify.sh +84 -0
- package/skills/proposals/SKILL.md +159 -0
- package/skills/proposals/evals/README.md +3 -0
- package/skills/proposals/evals/cases.yaml +53 -0
- package/skills/proposals/references/proposal-skeleton.md +110 -0
- package/skills/proposals/references/sow-skeleton.md +79 -0
- package/skills/proposals/scripts/verify.sh +201 -0
- package/skills/python/SKILL.md +369 -0
- package/skills/python/evals/README.md +19 -0
- package/skills/python/evals/cases.yaml +46 -0
- package/skills/python/references/async.md +136 -0
- package/skills/python/references/stdlib.md +162 -0
- package/skills/python/references/typing.md +160 -0
- package/skills/python/scripts/verify.sh +125 -0
- package/skills/rag/SKILL.md +226 -0
- package/skills/rag/evals/README.md +13 -0
- package/skills/rag/evals/cases.yaml +45 -0
- package/skills/rag/references/evaluation.md +99 -0
- package/skills/rag/references/pipeline.md +151 -0
- package/skills/rag/scripts/verify.sh +99 -0
- package/skills/rails/SKILL.md +264 -0
- package/skills/rails/evals/README.md +12 -0
- package/skills/rails/evals/cases.yaml +47 -0
- package/skills/rails/references/activerecord.md +148 -0
- package/skills/rails/references/hotwire.md +139 -0
- package/skills/rails/references/testing.md +110 -0
- package/skills/rails/scripts/verify.sh +128 -0
- package/skills/railway/SKILL.md +245 -0
- package/skills/railway/evals/README.md +14 -0
- package/skills/railway/evals/cases.yaml +44 -0
- package/skills/railway/references/cli-cookbook.md +137 -0
- package/skills/railway/references/config-as-code.md +120 -0
- package/skills/railway/scripts/verify.sh +162 -0
- package/skills/react/SKILL.md +222 -0
- package/skills/react/evals/README.md +3 -0
- package/skills/react/evals/cases.yaml +43 -0
- package/skills/react/references/data-and-state.md +152 -0
- package/skills/react/references/performance.md +75 -0
- package/skills/react/references/routing.md +99 -0
- package/skills/react/scripts/verify.sh +123 -0
- package/skills/react-native/SKILL.md +220 -0
- package/skills/react-native/evals/README.md +3 -0
- package/skills/react-native/evals/cases.yaml +42 -0
- package/skills/react-native/references/native-modules.md +123 -0
- package/skills/react-native/references/performance-debugging.md +46 -0
- package/skills/react-native/scripts/verify.sh +117 -0
- package/skills/redis/SKILL.md +298 -0
- package/skills/redis/evals/README.md +10 -0
- package/skills/redis/evals/cases.yaml +43 -0
- package/skills/redis/references/caching.md +116 -0
- package/skills/redis/references/locks-and-rate-limiting.md +140 -0
- package/skills/redis/references/queues.md +102 -0
- package/skills/redis/scripts/verify.sh +164 -0
- package/skills/remotion-video/SKILL.md +218 -0
- package/skills/remotion-video/evals/README.md +23 -0
- package/skills/remotion-video/evals/cases.yaml +64 -0
- package/skills/remotion-video/references/captions-pipeline.md +163 -0
- package/skills/remotion-video/references/render-and-pipeline.md +131 -0
- package/skills/remotion-video/scripts/verify.sh +169 -0
- package/skills/render/SKILL.md +256 -0
- package/skills/render/evals/README.md +12 -0
- package/skills/render/evals/cases.yaml +45 -0
- package/skills/render/references/blueprint-reference.md +203 -0
- package/skills/render/scripts/verify.sh +167 -0
- package/skills/replicate/SKILL.md +210 -0
- package/skills/replicate/evals/README.md +9 -0
- package/skills/replicate/evals/cases.yaml +45 -0
- package/skills/replicate/references/cog-packaging.md +89 -0
- package/skills/replicate/references/deployments-api.md +87 -0
- package/skills/replicate/references/webhooks-and-async.md +110 -0
- package/skills/replicate/scripts/verify.sh +162 -0
- package/skills/replicate-images/SKILL.md +241 -0
- package/skills/replicate-images/evals/README.md +13 -0
- package/skills/replicate-images/evals/cases.yaml +41 -0
- package/skills/replicate-images/references/editing-recipes.md +129 -0
- package/skills/replicate-images/references/models.md +131 -0
- package/skills/replicate-images/scripts/verify.sh +178 -0
- package/skills/reporting/SKILL.md +178 -0
- package/skills/reporting/evals/README.md +12 -0
- package/skills/reporting/evals/cases.yaml +46 -0
- package/skills/reporting/references/pipeline.md +213 -0
- package/skills/reporting/scripts/verify.sh +149 -0
- package/skills/research-ops/SKILL.md +200 -0
- package/skills/research-ops/evals/README.md +13 -0
- package/skills/research-ops/evals/cases.yaml +38 -0
- package/skills/research-ops/references/credibility-rubric.md +78 -0
- package/skills/research-ops/references/memo-template.md +63 -0
- package/skills/research-ops/scripts/verify.sh +181 -0
- package/skills/retention/SKILL.md +206 -0
- package/skills/retention/evals/README.md +13 -0
- package/skills/retention/evals/cases.yaml +42 -0
- package/skills/retention/references/health-score-and-metrics.md +97 -0
- package/skills/retention/references/save-and-winback-plays.md +65 -0
- package/skills/review/SKILL.md +222 -0
- package/skills/review/evals/README.md +84 -0
- package/skills/review/evals/cases.yaml +55 -0
- package/skills/review-management/SKILL.md +204 -0
- package/skills/review-management/evals/README.md +13 -0
- package/skills/review-management/evals/cases.yaml +60 -0
- package/skills/review-management/references/platform-apis.md +86 -0
- package/skills/review-management/scripts/verify.sh +128 -0
- package/skills/ruby/SKILL.md +316 -0
- package/skills/ruby/evals/README.md +12 -0
- package/skills/ruby/evals/cases.yaml +41 -0
- package/skills/ruby/references/gems-and-testing.md +208 -0
- package/skills/ruby/references/metaprogramming.md +161 -0
- package/skills/ruby/scripts/verify.sh +83 -0
- package/skills/runpod/SKILL.md +238 -0
- package/skills/runpod/evals/README.md +11 -0
- package/skills/runpod/evals/cases.yaml +47 -0
- package/skills/runpod/references/cost-and-scaling.md +85 -0
- package/skills/runpod/references/serverless-workers.md +101 -0
- package/skills/runpod/scripts/verify.sh +126 -0
- package/skills/rust/SKILL.md +395 -0
- package/skills/rust/evals/README.md +12 -0
- package/skills/rust/evals/cases.yaml +42 -0
- package/skills/rust/references/async-tokio.md +141 -0
- package/skills/rust/references/axum-service.md +132 -0
- package/skills/rust/references/ownership.md +86 -0
- package/skills/rust/references/testing.md +108 -0
- package/skills/rust/scripts/verify.sh +91 -0
- package/skills/sales-pipeline/SKILL.md +162 -0
- package/skills/sales-pipeline/evals/README.md +13 -0
- package/skills/sales-pipeline/evals/cases.yaml +60 -0
- package/skills/sales-pipeline/references/forecasting-math.md +82 -0
- package/skills/sales-pipeline/references/stage-playbook.md +84 -0
- package/skills/sales-pipeline/scripts/verify.sh +210 -0
- package/skills/scaling/SKILL.md +137 -0
- package/skills/scaling/evals/README.md +3 -0
- package/skills/scaling/evals/cases.yaml +42 -0
- package/skills/scaling/references/load-testing-k6.md +127 -0
- package/skills/scaling/scripts/example.load.js +24 -0
- package/skills/scaling/scripts/verify.sh +70 -0
- package/skills/sdd/SKILL.md +203 -0
- package/skills/sdd/evals/README.md +60 -0
- package/skills/sdd/evals/cases.yaml +78 -0
- package/skills/sdd-init/SKILL.md +148 -0
- package/skills/sdd-init/evals/README.md +3 -0
- package/skills/sdd-init/evals/cases.yaml +43 -0
- package/skills/secure-coding/SKILL.md +365 -0
- package/skills/secure-coding/evals/README.md +68 -0
- package/skills/secure-coding/evals/cases.yaml +55 -0
- package/skills/secure-coding/references/authn-authz.md +249 -0
- package/skills/secure-coding/references/owasp-by-stack.md +574 -0
- package/skills/secure-coding/references/secrets-and-supply-chain.md +205 -0
- package/skills/secure-coding/references/threat-modeling.md +213 -0
- package/skills/secure-coding/scripts/verify.sh +208 -0
- package/skills/security-scan/SKILL.md +239 -0
- package/skills/security-scan/evals/README.md +14 -0
- package/skills/security-scan/evals/cases.yaml +50 -0
- package/skills/security-scan/references/tools.md +98 -0
- package/skills/security-scan/references/triage.md +93 -0
- package/skills/security-scan/scripts/verify.sh +108 -0
- package/skills/seo-geo/SKILL.md +192 -0
- package/skills/seo-geo/evals/README.md +14 -0
- package/skills/seo-geo/evals/cases.yaml +45 -0
- package/skills/seo-geo/references/ai-crawler-control.md +104 -0
- package/skills/seo-geo/references/schema-recipes.md +130 -0
- package/skills/seo-geo/scripts/verify.sh +236 -0
- package/skills/ship/SKILL.md +258 -0
- package/skills/ship/evals/README.md +89 -0
- package/skills/ship/evals/cases.yaml +44 -0
- package/skills/shopify/SKILL.md +229 -0
- package/skills/shopify/evals/README.md +14 -0
- package/skills/shopify/evals/cases.yaml +41 -0
- package/skills/shopify/references/apps-graphql.md +103 -0
- package/skills/shopify/references/checkout-extensibility.md +71 -0
- package/skills/shopify/references/liquid-themes.md +89 -0
- package/skills/shopify/scripts/verify.sh +120 -0
- package/skills/shortform-editing/SKILL.md +161 -0
- package/skills/shortform-editing/evals/README.md +16 -0
- package/skills/shortform-editing/evals/cases.yaml +61 -0
- package/skills/shortform-editing/references/captions.md +85 -0
- package/skills/shortform-editing/references/ffmpeg-pipeline.md +126 -0
- package/skills/shortform-editing/scripts/verify.sh +148 -0
- package/skills/shortform-ideation/SKILL.md +153 -0
- package/skills/shortform-ideation/evals/README.md +20 -0
- package/skills/shortform-ideation/evals/cases.yaml +58 -0
- package/skills/shortform-ideation/references/experiment-ledger.md +85 -0
- package/skills/shortform-ideation/references/trend-sources.md +69 -0
- package/skills/shortform-ideation/scripts/verify.sh +172 -0
- package/skills/shortform-packaging/SKILL.md +247 -0
- package/skills/shortform-packaging/evals/README.md +10 -0
- package/skills/shortform-packaging/evals/cases.yaml +48 -0
- package/skills/shortform-packaging/references/package-templates.md +117 -0
- package/skills/shortform-packaging/scripts/verify.sh +210 -0
- package/skills/shortform-strategy/SKILL.md +149 -0
- package/skills/shortform-strategy/evals/README.md +3 -0
- package/skills/shortform-strategy/evals/cases.yaml +52 -0
- package/skills/shortform-strategy/references/learning-loop-template.md +49 -0
- package/skills/shortform-strategy/references/platform-signals-2026.md +46 -0
- package/skills/shortform-strategy/scripts/verify.sh +176 -0
- package/skills/skill-scout/SKILL.md +133 -0
- package/skills/skill-scout/evals/README.md +12 -0
- package/skills/skill-scout/evals/cases.yaml +56 -0
- package/skills/skill-scout/references/install-commands.md +76 -0
- package/skills/skill-scout/scripts/verify.sh +154 -0
- package/skills/social-publisher/SKILL.md +179 -0
- package/skills/social-publisher/evals/README.md +14 -0
- package/skills/social-publisher/evals/cases.yaml +55 -0
- package/skills/social-publisher/references/calendar-schema.md +97 -0
- package/skills/social-publisher/references/platform-limits.md +56 -0
- package/skills/social-publisher/scripts/verify.sh +232 -0
- package/skills/solid-js/SKILL.md +260 -0
- package/skills/solid-js/evals/README.md +3 -0
- package/skills/solid-js/evals/cases.yaml +38 -0
- package/skills/solid-js/references/reactivity-deep-dive.md +89 -0
- package/skills/solid-js/references/router-and-start.md +93 -0
- package/skills/solid-js/scripts/verify.sh +130 -0
- package/skills/sop-builder/SKILL.md +233 -0
- package/skills/sop-builder/evals/README.md +14 -0
- package/skills/sop-builder/evals/cases.yaml +48 -0
- package/skills/sop-builder/references/sop-skeleton.md +170 -0
- package/skills/specify/SKILL.md +214 -0
- package/skills/specify/evals/README.md +73 -0
- package/skills/specify/evals/cases.yaml +80 -0
- package/skills/specify/references/eliciting-requirements.md +77 -0
- package/skills/specify/references/spec-template.md +60 -0
- package/skills/spreadsheet-ops/SKILL.md +180 -0
- package/skills/spreadsheet-ops/evals/README.md +33 -0
- package/skills/spreadsheet-ops/evals/cases.yaml +42 -0
- package/skills/spreadsheet-ops/references/formula-cookbook.md +70 -0
- package/skills/spreadsheet-ops/references/python-excel.md +87 -0
- package/skills/spreadsheet-ops/references/sheets-api-appsscript.md +118 -0
- package/skills/spreadsheet-ops/scripts/verify.sh +152 -0
- package/skills/spring-boot/SKILL.md +375 -0
- package/skills/spring-boot/evals/README.md +11 -0
- package/skills/spring-boot/evals/cases.yaml +49 -0
- package/skills/spring-boot/references/jpa.md +94 -0
- package/skills/spring-boot/references/security.md +92 -0
- package/skills/spring-boot/references/testing.md +95 -0
- package/skills/spring-boot/scripts/verify.sh +115 -0
- package/skills/sql/SKILL.md +286 -0
- package/skills/sql/evals/README.md +9 -0
- package/skills/sql/evals/cases.yaml +49 -0
- package/skills/sql/references/ctes-and-recursion.md +63 -0
- package/skills/sql/references/joins-and-sets.md +71 -0
- package/skills/sql/references/portability.md +38 -0
- package/skills/sql/references/window-functions.md +72 -0
- package/skills/sql/scripts/verify.sh +139 -0
- package/skills/sqlite-turso/SKILL.md +214 -0
- package/skills/sqlite-turso/evals/README.md +24 -0
- package/skills/sqlite-turso/evals/cases.yaml +45 -0
- package/skills/sqlite-turso/references/embedded-replicas.md +96 -0
- package/skills/sqlite-turso/scripts/verify.sh +95 -0
- package/skills/stripe/SKILL.md +269 -0
- package/skills/stripe/evals/README.md +11 -0
- package/skills/stripe/evals/cases.yaml +45 -0
- package/skills/stripe/references/going-live.md +64 -0
- package/skills/stripe/references/webhook-events.md +79 -0
- package/skills/stripe/scripts/verify.sh +130 -0
- package/skills/structured-extraction/SKILL.md +230 -0
- package/skills/structured-extraction/evals/README.md +13 -0
- package/skills/structured-extraction/evals/cases.yaml +70 -0
- package/skills/structured-extraction/references/providers.md +152 -0
- package/skills/structured-extraction/scripts/verify.sh +160 -0
- package/skills/suggest/SKILL.md +30 -0
- package/skills/suggest/evals/README.md +14 -0
- package/skills/suggest/evals/cases.yaml +51 -0
- package/skills/supabase/SKILL.md +268 -0
- package/skills/supabase/evals/README.md +12 -0
- package/skills/supabase/evals/cases.yaml +42 -0
- package/skills/supabase/references/auth-ssr.md +173 -0
- package/skills/supabase/references/rls-cookbook.md +122 -0
- package/skills/supabase/scripts/verify.sh +149 -0
- package/skills/svelte/SKILL.md +238 -0
- package/skills/svelte/evals/README.md +3 -0
- package/skills/svelte/evals/cases.yaml +41 -0
- package/skills/svelte/references/runes.md +97 -0
- package/skills/svelte/references/sveltekit-data.md +156 -0
- package/skills/svelte/scripts/verify.sh +128 -0
- package/skills/swift-ios/SKILL.md +217 -0
- package/skills/swift-ios/evals/README.md +3 -0
- package/skills/swift-ios/evals/cases.yaml +46 -0
- package/skills/swift-ios/references/concurrency.md +132 -0
- package/skills/swift-ios/references/testing.md +112 -0
- package/skills/swift-ios/scripts/verify.sh +98 -0
- package/skills/tasks/SKILL.md +260 -0
- package/skills/tasks/evals/README.md +70 -0
- package/skills/tasks/evals/cases.yaml +75 -0
- package/skills/tauri/SKILL.md +224 -0
- package/skills/tauri/evals/README.md +12 -0
- package/skills/tauri/evals/cases.yaml +46 -0
- package/skills/tauri/references/bundling-distribution.md +129 -0
- package/skills/tauri/references/security.md +143 -0
- package/skills/tauri/scripts/verify.sh +178 -0
- package/skills/technical-writing/SKILL.md +230 -0
- package/skills/technical-writing/evals/README.md +12 -0
- package/skills/technical-writing/evals/cases.yaml +53 -0
- package/skills/technical-writing/references/diataxis-modes.md +131 -0
- package/skills/technical-writing/references/vale-starter.md +90 -0
- package/skills/technical-writing/scripts/verify.sh +83 -0
- package/skills/terms-conditions/SKILL.md +147 -0
- package/skills/terms-conditions/evals/README.md +14 -0
- package/skills/terms-conditions/evals/cases.yaml +48 -0
- package/skills/terms-conditions/references/clause-library.md +158 -0
- package/skills/terms-conditions/references/notices-and-aup.md +125 -0
- package/skills/terms-conditions/scripts/verify.sh +92 -0
- package/skills/testing-go/SKILL.md +246 -0
- package/skills/testing-go/evals/README.md +3 -0
- package/skills/testing-go/evals/cases.yaml +44 -0
- package/skills/testing-go/references/coverage-and-benchmarks.md +85 -0
- package/skills/testing-go/references/mocks-and-fakes.md +140 -0
- package/skills/testing-go/references/synctest-and-concurrency.md +82 -0
- package/skills/testing-go/scripts/verify.sh +72 -0
- package/skills/testing-py/SKILL.md +179 -0
- package/skills/testing-py/evals/README.md +5 -0
- package/skills/testing-py/evals/cases.yaml +44 -0
- package/skills/testing-py/references/mocking.md +141 -0
- package/skills/testing-py/references/property-testing.md +99 -0
- package/skills/testing-py/scripts/verify.sh +117 -0
- package/skills/testing-web/SKILL.md +224 -0
- package/skills/testing-web/evals/README.md +11 -0
- package/skills/testing-web/evals/cases.yaml +52 -0
- package/skills/testing-web/references/jest-setup.md +88 -0
- package/skills/testing-web/references/recipes.md +116 -0
- package/skills/testing-web/scripts/verify.sh +111 -0
- package/skills/tiktok-api/SKILL.md +315 -0
- package/skills/tiktok-api/evals/README.md +17 -0
- package/skills/tiktok-api/evals/cases.yaml +51 -0
- package/skills/tiktok-api/references/metrics-and-publish.md +127 -0
- package/skills/tiktok-api/references/oauth-setup.md +105 -0
- package/skills/tiktok-api/references/wiki-schema.md +85 -0
- package/skills/tiktok-api/scripts/verify.sh +96 -0
- package/skills/together-fireworks/SKILL.md +181 -0
- package/skills/together-fireworks/evals/README.md +3 -0
- package/skills/together-fireworks/evals/cases.yaml +50 -0
- package/skills/together-fireworks/references/batch-and-tuning.md +59 -0
- package/skills/together-fireworks/references/models-and-pricing.md +79 -0
- package/skills/together-fireworks/scripts/verify.sh +165 -0
- package/skills/translation-l10n/SKILL.md +229 -0
- package/skills/translation-l10n/evals/README.md +3 -0
- package/skills/translation-l10n/evals/cases.yaml +39 -0
- package/skills/translation-l10n/references/icu-cookbook.md +82 -0
- package/skills/translation-l10n/references/rtl-and-bidi.md +60 -0
- package/skills/typescript/SKILL.md +258 -0
- package/skills/typescript/evals/README.md +15 -0
- package/skills/typescript/evals/cases.yaml +46 -0
- package/skills/typescript/references/build-and-monorepo.md +141 -0
- package/skills/typescript/references/type-system.md +162 -0
- package/skills/typescript/scripts/verify.sh +52 -0
- package/skills/unit-economics/SKILL.md +180 -0
- package/skills/unit-economics/evals/README.md +5 -0
- package/skills/unit-economics/evals/cases.yaml +43 -0
- package/skills/unit-economics/references/formulas.md +144 -0
- package/skills/unit-economics/scripts/verify.sh +179 -0
- package/skills/vector-db/SKILL.md +189 -0
- package/skills/vector-db/evals/README.md +10 -0
- package/skills/vector-db/evals/cases.yaml +45 -0
- package/skills/vector-db/references/engines.md +175 -0
- package/skills/vector-db/references/tuning.md +62 -0
- package/skills/vector-db/scripts/verify.sh +110 -0
- package/skills/vercel/SKILL.md +242 -0
- package/skills/vercel/evals/README.md +23 -0
- package/skills/vercel/evals/cases.yaml +45 -0
- package/skills/vercel/references/cli-cookbook.md +98 -0
- package/skills/vercel/references/vercel-json.md +120 -0
- package/skills/vercel/scripts/verify.sh +168 -0
- package/skills/verify/SKILL.md +188 -0
- package/skills/verify/evals/README.md +78 -0
- package/skills/verify/evals/cases.yaml +74 -0
- package/skills/video-shorts/SKILL.md +163 -0
- package/skills/video-shorts/evals/README.md +15 -0
- package/skills/video-shorts/evals/cases.yaml +56 -0
- package/skills/video-shorts/references/hook-and-script-patterns.md +95 -0
- package/skills/video-shorts/references/specs-and-safe-zones.md +74 -0
- package/skills/video-shorts/scripts/verify.sh +172 -0
- package/skills/vue-nuxt/SKILL.md +384 -0
- package/skills/vue-nuxt/evals/README.md +11 -0
- package/skills/vue-nuxt/evals/cases.yaml +49 -0
- package/skills/vue-nuxt/references/data-and-state.md +127 -0
- package/skills/vue-nuxt/references/migration-nuxt4.md +79 -0
- package/skills/vue-nuxt/references/nitro-and-rendering.md +117 -0
- package/skills/vue-nuxt/references/reactivity.md +135 -0
- package/skills/vue-nuxt/scripts/verify.sh +148 -0
- package/skills/webhooks/SKILL.md +246 -0
- package/skills/webhooks/evals/README.md +15 -0
- package/skills/webhooks/evals/cases.yaml +46 -0
- package/skills/webhooks/references/framework-raw-body.md +97 -0
- package/skills/webhooks/references/signature-schemes.md +66 -0
- package/skills/webhooks/scripts/verify.sh +142 -0
- package/skills/webinar/SKILL.md +196 -0
- package/skills/webinar/evals/README.md +14 -0
- package/skills/webinar/evals/cases.yaml +44 -0
- package/skills/webinar/references/email-cadence.md +75 -0
- package/skills/webinar/references/run-of-show.md +83 -0
- package/skills/whatsapp-telegram/SKILL.md +235 -0
- package/skills/whatsapp-telegram/evals/README.md +11 -0
- package/skills/whatsapp-telegram/evals/cases.yaml +44 -0
- package/skills/whatsapp-telegram/references/telegram-bot-api.md +91 -0
- package/skills/whatsapp-telegram/references/whatsapp-cloud-api.md +103 -0
- package/skills/whatsapp-telegram/scripts/verify.sh +90 -0
- package/skills/wordpress/SKILL.md +224 -0
- package/skills/wordpress/evals/README.md +3 -0
- package/skills/wordpress/evals/cases.yaml +50 -0
- package/skills/wordpress/references/hardening.md +108 -0
- package/skills/wordpress/references/performance.md +80 -0
- package/skills/wordpress/references/woocommerce.md +65 -0
- package/skills/wordpress/scripts/verify.sh +96 -0
- package/skills/worktrees/SKILL.md +199 -0
- package/skills/worktrees/evals/README.md +78 -0
- package/skills/worktrees/evals/cases.yaml +47 -0
- package/skills/youtube-api/SKILL.md +286 -0
- package/skills/youtube-api/evals/README.md +3 -0
- package/skills/youtube-api/evals/cases.yaml +50 -0
- package/skills/youtube-api/references/analytics-queries.md +89 -0
- package/skills/youtube-api/references/oauth-setup.md +55 -0
- package/skills/youtube-api/references/wiki-schema.md +70 -0
- package/skills/youtube-api/scripts/verify.sh +84 -0
- package/skills/youtube-ideation/SKILL.md +234 -0
- package/skills/youtube-ideation/evals/README.md +14 -0
- package/skills/youtube-ideation/evals/cases.yaml +52 -0
- package/skills/youtube-ideation/references/idea-ledger-and-loop.md +89 -0
- package/skills/youtube-ideation/references/research-and-signals.md +92 -0
- package/skills/youtube-ideation/scripts/verify.sh +237 -0
- package/skills/youtube-packaging/SKILL.md +220 -0
- package/skills/youtube-packaging/evals/README.md +16 -0
- package/skills/youtube-packaging/evals/cases.yaml +48 -0
- package/skills/youtube-packaging/references/description-and-chapters.md +135 -0
- package/skills/youtube-packaging/scripts/verify.sh +250 -0
- package/skills/youtube-strategy/SKILL.md +157 -0
- package/skills/youtube-strategy/evals/README.md +5 -0
- package/skills/youtube-strategy/evals/cases.yaml +61 -0
- package/skills/youtube-strategy/references/channel-architecture.md +46 -0
- package/skills/youtube-strategy/references/wiki-records.md +86 -0
- package/skills/youtube-strategy/scripts/verify.sh +118 -0
- package/skills/youtube-thumbnails/SKILL.md +180 -0
- package/skills/youtube-thumbnails/evals/README.md +11 -0
- package/skills/youtube-thumbnails/evals/cases.yaml +48 -0
- package/skills/youtube-thumbnails/references/composition-and-specs.md +69 -0
- package/skills/youtube-thumbnails/references/experiment-log-format.md +65 -0
- package/skills/youtube-thumbnails/scripts/verify.sh +123 -0
- package/targets/claude.js +23 -0
- package/targets/codex.js +29 -0
- package/targets/cursor.js +20 -0
- package/targets/gemini.js +29 -0
- package/targets/index.js +55 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
skill: redis
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "Our product cache key expires and the database gets hammered by a flood of concurrent requests until it's rebuilt."
|
|
5
|
+
why: Cache stampede / thundering herd — the core caching correctness contract this skill owns.
|
|
6
|
+
- prompt: "Two cron workers across our instances sometimes run the same nightly job. I need only one to actually do it."
|
|
7
|
+
why: Distributed lock / mutual exclusion — SET NX PX + Lua release + the de-dup decision.
|
|
8
|
+
- prompt: "My rate limiter occasionally lets bursts through and some users get throttled forever. I do INCR then EXPIRE in the app."
|
|
9
|
+
why: Non-obvious — the lost-EXPIRE race that leaves a TTL-less immortal counter, the canonical rate-limit foot-gun.
|
|
10
|
+
- prompt: "BullMQ jobs keep getting marked stalled and reprocessed. How do the job locks and lockRenewTime work?"
|
|
11
|
+
why: Redis queue reliability and stalled-job lock renewal — at-least-once + idempotency territory.
|
|
12
|
+
- prompt: "A reviewer flagged `KEYS user:*` in our request hot path. Is that actually a problem?"
|
|
13
|
+
why: Non-obvious ops foot-gun — KEYS is O(N) and blocks the single thread; route to SCAN. Review trigger.
|
|
14
|
+
- prompt: "Should we use Redlock or is a single SET NX PX enough for our locks? Do we need fencing tokens?"
|
|
15
|
+
why: Lock correctness decision — single-instance vs Redlock vs fencing for hard mutual exclusion.
|
|
16
|
+
- prompt: "Our Redis cache started returning OOM errors and refusing writes when memory filled up."
|
|
17
|
+
why: Eviction policy — a cache left on the default noeviction with no TTLs; route to allkeys-lru + TTL.
|
|
18
|
+
|
|
19
|
+
should_not_trigger:
|
|
20
|
+
- prompt: "Build a durable background job queue in Postgres using SELECT ... FOR UPDATE SKIP LOCKED."
|
|
21
|
+
route_to: postgresdb
|
|
22
|
+
why: The durable relational store IS the queue — that's the postgresdb boundary, not a Redis queue.
|
|
23
|
+
- prompt: "Add semantic similarity search over our document embeddings with ANN indexing."
|
|
24
|
+
route_to: vector-db
|
|
25
|
+
why: Vector similarity as the primary job; Redis vector sets are only noted here, not owned.
|
|
26
|
+
- prompt: "Provision and size an ElastiCache / fly.io Redis cluster, set the node type and replicas."
|
|
27
|
+
route_to: fly-io
|
|
28
|
+
why: Provisioning and console/cluster sizing, not the client-side correctness contract.
|
|
29
|
+
- prompt: "Tune Cache-Control headers and ISR revalidation for our Next.js pages."
|
|
30
|
+
route_to: nextjs
|
|
31
|
+
why: HTTP/CDN/edge caching, not the Redis data-layer contract.
|
|
32
|
+
- prompt: "We need a high-throughput analytical store for clickstream events with columnar aggregation."
|
|
33
|
+
route_to: clickhouse-analytics
|
|
34
|
+
why: Analytical/event store, not a hot-path cache, lock, rate limiter, or queue.
|
|
35
|
+
|
|
36
|
+
capability:
|
|
37
|
+
- scenario: "We have a hot product-detail cache that stampedes the DB on expiry, a cron that must run exactly once across 3 instances, and a per-API-key rate limiter built on INCR then EXPIRE. Fix all three correctly."
|
|
38
|
+
must_include:
|
|
39
|
+
- "Stampede: TTL with jitter plus a recompute-lock (SET NX) or probabilistic early expiry (XFetch); lock TTL must exceed worst-case rebuild."
|
|
40
|
+
- "Lock: SET <random-token> NX PX <ttl> released only via a Lua compare-and-delete (GET == my token then DEL); mentions TTL-vs-work-duration and fencing tokens for hard mutual exclusion."
|
|
41
|
+
- "Rate limiter: collapse INCR + EXPIRE into one atomic EVAL (or set EXPIRE only when n == 1); names the lost-EXPIRE race that creates an immortal counter."
|
|
42
|
+
- "Notes at-least-once / idempotency wherever double-execution is possible (the cron, the rate-limit edge)."
|
|
43
|
+
- "Examples stay client-agnostic (Lua / redis-cli), not tied to a single SDK."
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Caching — depth
|
|
2
|
+
|
|
3
|
+
Read this when the cache is more than `SET k v EX`: read-through/write-through/write-behind,
|
|
4
|
+
multi-level caches, probabilistic early expiry, negative caching, and hot/big-key mitigation.
|
|
5
|
+
All patterns are client-agnostic (`redis-cli` / Lua / pseudo-client).
|
|
6
|
+
|
|
7
|
+
## Cache topologies
|
|
8
|
+
|
|
9
|
+
| Pattern | Who reads/writes the DB | Failure mode | Use when |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| **Cache-aside** (lazy) | the app, on a miss | stale until TTL; first read is slow | the default; read-heavy, tolerant of brief staleness |
|
|
12
|
+
| **Read-through** | the cache layer/lib | same as aside, hidden behind the lib | you want the cache to own the fetch |
|
|
13
|
+
| **Write-through** | app writes cache + DB synchronously | write latency = DB + cache; double write to keep consistent | reads must never see stale after a write |
|
|
14
|
+
| **Write-behind** (write-back) | app writes cache, a worker flushes to DB later | data loss window if Redis dies before flush | write-heavy, can tolerate a flush-lag loss window |
|
|
15
|
+
|
|
16
|
+
Default to **cache-aside with a TTL**. Reach for write-through only when a read immediately after a
|
|
17
|
+
write must reflect it; reach for write-behind only when you can afford to lose the un-flushed window
|
|
18
|
+
(and you have AOF or a durable journal to bound it).
|
|
19
|
+
|
|
20
|
+
## TTL + jitter
|
|
21
|
+
|
|
22
|
+
A fixed TTL applied to keys warmed together synchronizes their expiry — they all die in the same
|
|
23
|
+
second and stampede the origin simultaneously. Always jitter.
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
ttl = base + random(0, base * 0.2) # e.g. 300s base, up to +60s jitter
|
|
27
|
+
SET product:42 <json> EX ttl
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
*Why:* spreading expirations turns one giant stampede into a trickle of independent misses.
|
|
31
|
+
|
|
32
|
+
## Negative caching
|
|
33
|
+
|
|
34
|
+
Caching only hits means every request for a non-existent id falls through to the origin — an easy
|
|
35
|
+
DoS via random ids. Cache the miss too, with a *short* TTL so a row that appears soon isn't hidden long.
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
val = GET product:42
|
|
39
|
+
if val == "__MISS__": return null # cached absence, no DB call
|
|
40
|
+
if val == nil:
|
|
41
|
+
row = db.fetch(42)
|
|
42
|
+
if row == null: SET product:42 "__MISS__" EX 30 # short negative TTL
|
|
43
|
+
else: SET product:42 row EX 300
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Keep the negative TTL much shorter than the positive one (seconds, not minutes) so freshly created
|
|
47
|
+
rows surface quickly.
|
|
48
|
+
|
|
49
|
+
## Stampede prevention
|
|
50
|
+
|
|
51
|
+
When a hot key expires, N concurrent readers all miss and hit the origin at once. Three approaches,
|
|
52
|
+
in increasing sophistication:
|
|
53
|
+
|
|
54
|
+
### 1. Recompute lock (request coalescing)
|
|
55
|
+
|
|
56
|
+
One reader claims the rebuild; the rest serve stale or briefly wait.
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
val = GET product:42
|
|
60
|
+
if val != nil: return val
|
|
61
|
+
if SET product:42:lock 1 NX PX 5000 == OK: # 5000ms MUST exceed worst-case rebuild
|
|
62
|
+
val = db.fetch(42); SET product:42 val EX (300 + jitter); DEL product:42:lock
|
|
63
|
+
return val
|
|
64
|
+
else:
|
|
65
|
+
return GET product:42:stale or sleep(50ms) and retry GET
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
*Why the lock TTL matters:* if it is shorter than the rebuild, a second reader claims the lock while
|
|
69
|
+
the first is still rebuilding and you stampede anyway. Size it above the slowest origin call.
|
|
70
|
+
|
|
71
|
+
### 2. Probabilistic early expiration (XFetch)
|
|
72
|
+
|
|
73
|
+
Refresh *before* the key actually expires, with a probability that rises as expiry approaches, so one
|
|
74
|
+
reader renews early while everyone else still hits a warm key. The classic XFetch test:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
# delta = how long the last recompute took (seconds)
|
|
78
|
+
# beta = tuning knob, ~1.0 (higher = refresh earlier)
|
|
79
|
+
# expiry = absolute unix time the key expires
|
|
80
|
+
recompute if now - delta * beta * ln(random(0,1)) >= expiry
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Store `delta` and `expiry` alongside the value (a small hash works). Because the random term only
|
|
84
|
+
crosses the threshold for an unlucky few before TTL, exactly one or two readers refresh early and the
|
|
85
|
+
stampede never forms. No lock, no stale window.
|
|
86
|
+
|
|
87
|
+
### 3. Serve-stale-while-revalidate
|
|
88
|
+
|
|
89
|
+
Keep two TTLs: a soft "fresh until" and a hard "evict at". Past the soft TTL, serve the stale value
|
|
90
|
+
*and* kick off one async refresh. Readers never block; the origin sees one refresh per key per window.
|
|
91
|
+
|
|
92
|
+
## Multi-level caching
|
|
93
|
+
|
|
94
|
+
In-process LRU (per app instance) in front of Redis cuts Redis round-trips for the hottest keys. The
|
|
95
|
+
cost is coherence: a write must invalidate *both* levels, and different instances can hold different
|
|
96
|
+
local copies for up to the local TTL. Keep the local TTL very short (1-5s) so divergence is bounded,
|
|
97
|
+
and treat Redis as the source of truth the local cache merely fronts.
|
|
98
|
+
|
|
99
|
+
## Invalidation
|
|
100
|
+
|
|
101
|
+
- **On write, delete the key** (cache-aside) — the next read rebuilds. Simple and correct as long as
|
|
102
|
+
every write path deletes.
|
|
103
|
+
- **Never** rely on manual invalidation *instead of* a TTL: you will miss a code path and serve stale
|
|
104
|
+
forever. TTL is the backstop; explicit invalidation is the latency optimization on top.
|
|
105
|
+
- **Tag/group invalidation** (drop everything for a tenant): keep a set of member keys per tag and
|
|
106
|
+
`DEL` them together, or namespace by a version counter you bump (`v:tenant:7 -> 12`, keys read
|
|
107
|
+
`tenant:7:v12:*`) so a bump orphans the whole old generation to be evicted by LRU.
|
|
108
|
+
|
|
109
|
+
## Hot keys and big keys
|
|
110
|
+
|
|
111
|
+
- **Hot key** (one key, enormous read rate) can saturate a single shard/CPU. Mitigate with a
|
|
112
|
+
per-instance local cache in front, or shard the value across N suffixed keys read at random.
|
|
113
|
+
- **Big key** (one huge value or a multi-million-element collection) blocks the single thread on
|
|
114
|
+
every access and on eviction. Find them with `redis-cli --bigkeys` and `MEMORY USAGE <key>`; split
|
|
115
|
+
big hashes/lists into smaller keyed chunks; never `DEL` a giant key on the hot path — `UNLINK` it
|
|
116
|
+
(frees memory in a background thread).
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Locks and rate limiting — depth
|
|
2
|
+
|
|
3
|
+
The full Redlock algorithm and its critique, lease renewal, fencing tokens, and all four
|
|
4
|
+
rate-limit algorithms with complete Lua. Client-agnostic.
|
|
5
|
+
|
|
6
|
+
## Single-instance lock (the baseline)
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
SET resource:lock <random-token> NX PX <ttl-ms> # acquire: only if absent, auto-expires
|
|
10
|
+
# ... protected work ...
|
|
11
|
+
# release via the compare-and-delete Lua below — NEVER a bare DEL
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The token must be unguessable and unique per acquisition (a UUID or `<host>:<pid>:<rand>`), because
|
|
15
|
+
release is "delete only if the value is still mine":
|
|
16
|
+
|
|
17
|
+
```lua
|
|
18
|
+
-- KEYS[1] = lock key, ARGV[1] = my token. Returns 1 if I held and released, else 0.
|
|
19
|
+
if redis.call('GET', KEYS[1]) == ARGV[1] then
|
|
20
|
+
return redis.call('DEL', KEYS[1])
|
|
21
|
+
else
|
|
22
|
+
return 0
|
|
23
|
+
end
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Lease renewal (watchdog)
|
|
27
|
+
|
|
28
|
+
If protected work can outlast the TTL, the lock expires mid-task and a second worker starts. Renew
|
|
29
|
+
the TTL periodically — but only if you still own it (same token guard), or you will extend a lock
|
|
30
|
+
someone else now holds:
|
|
31
|
+
|
|
32
|
+
```lua
|
|
33
|
+
-- KEYS[1] = lock key, ARGV[1] = my token, ARGV[2] = new ttl ms.
|
|
34
|
+
if redis.call('GET', KEYS[1]) == ARGV[1] then
|
|
35
|
+
return redis.call('PEXPIRE', KEYS[1], ARGV[2])
|
|
36
|
+
else
|
|
37
|
+
return 0
|
|
38
|
+
end
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Run this from a watchdog at ~`ttl/3`. If a renewal ever returns 0, you lost the lock — stop the work,
|
|
42
|
+
do not assume you still hold it.
|
|
43
|
+
|
|
44
|
+
## Redlock (multi-instance) and why it is contested
|
|
45
|
+
|
|
46
|
+
Redlock acquires the same lock on a majority of N independent masters (e.g. 3 of 5), each with
|
|
47
|
+
`SET NX PX`, and considers the lock held only if the majority succeeded *within* a small fraction of
|
|
48
|
+
the TTL (so the remaining validity time is still positive). Release deletes on all N.
|
|
49
|
+
|
|
50
|
+
The critique (Kleppmann; acknowledged by antirez): Redlock's safety rests on **bounded clock drift**
|
|
51
|
+
and **no long process pauses**. A GC pause, a hypervisor stop-the-world, or an NTP jump can let the
|
|
52
|
+
TTL expire on the holder's wall clock while the holder still believes it is inside the lease; a second
|
|
53
|
+
client then acquires, and both act. Majority-acquisition does not fix this — it is a *timing* problem,
|
|
54
|
+
not a *quorum* problem.
|
|
55
|
+
|
|
56
|
+
### Fencing tokens — the only real fix
|
|
57
|
+
|
|
58
|
+
Issue a **monotonically increasing token** with every successful acquisition (e.g. `INCR
|
|
59
|
+
resource:fence`). The protected resource (DB, file store, queue) records the highest token it has
|
|
60
|
+
accepted and **rejects any write carrying a lower token**. Now even a paused-then-resumed holder is
|
|
61
|
+
harmless: its token is stale, so its write is refused. No pure-Redis lock provides fencing; you must
|
|
62
|
+
add the counter and enforce it at the resource.
|
|
63
|
+
|
|
64
|
+
### Decision
|
|
65
|
+
|
|
66
|
+
- **Idempotent / best-effort work** (cron de-dup, cache warm): single-instance `SET NX PX` is fine —
|
|
67
|
+
an occasional double-run is harmless.
|
|
68
|
+
- **Hard mutual exclusion** (money, non-idempotent side effects): a Redis lock alone is *not* a safety
|
|
69
|
+
guarantee. Fence the resource, or use a real lease/consensus system (ZooKeeper, etcd, a DB advisory
|
|
70
|
+
lock). Redlock buys availability across instances, not correctness under pauses.
|
|
71
|
+
|
|
72
|
+
## Rate limiting — four algorithms
|
|
73
|
+
|
|
74
|
+
Every one must be a **single atomic `EVAL`**. The classic bug is splitting count and TTL: if the
|
|
75
|
+
process dies between `INCR` and `EXPIRE`, the key never expires and the user is throttled forever.
|
|
76
|
+
|
|
77
|
+
### Fixed window
|
|
78
|
+
|
|
79
|
+
```lua
|
|
80
|
+
-- KEYS[1]=counter, ARGV[1]=limit, ARGV[2]=window-seconds. 1=allow, 0=deny.
|
|
81
|
+
local n = redis.call('INCR', KEYS[1])
|
|
82
|
+
if n == 1 then redis.call('EXPIRE', KEYS[1], ARGV[2]) end
|
|
83
|
+
if n > tonumber(ARGV[1]) then return 0 end
|
|
84
|
+
return 1
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Cheapest (one integer per key). Flaw: allows up to ~2× the limit across a window boundary (a burst at
|
|
88
|
+
the end of one window plus a burst at the start of the next).
|
|
89
|
+
|
|
90
|
+
### Sliding-window log
|
|
91
|
+
|
|
92
|
+
Exact: store one timestamp per request in a sorted set, prune the old, count what remains.
|
|
93
|
+
|
|
94
|
+
```lua
|
|
95
|
+
-- KEYS[1]=zset, ARGV[1]=now-ms, ARGV[2]=window-ms, ARGV[3]=limit, ARGV[4]=member.
|
|
96
|
+
redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, ARGV[1] - ARGV[2]) -- drop entries older than window
|
|
97
|
+
local count = redis.call('ZCARD', KEYS[1])
|
|
98
|
+
if count >= tonumber(ARGV[3]) then return 0 end
|
|
99
|
+
redis.call('ZADD', KEYS[1], ARGV[1], ARGV[4]) -- record this request
|
|
100
|
+
redis.call('PEXPIRE', KEYS[1], ARGV[2]) -- self-clean idle keys
|
|
101
|
+
return 1
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Exact, but O(requests) memory per key — expensive at high limits.
|
|
105
|
+
|
|
106
|
+
### Sliding-window counter
|
|
107
|
+
|
|
108
|
+
Approximates the log with two fixed-window counters (current + previous), weighting the previous one
|
|
109
|
+
by how far into the current window you are. Near-exact at a fraction of the memory of the log. Keep
|
|
110
|
+
both counters and compute `prev * (1 - elapsed_fraction) + curr` in Lua; deny if that exceeds the limit.
|
|
111
|
+
|
|
112
|
+
### Token bucket
|
|
113
|
+
|
|
114
|
+
Allows controlled bursts: a bucket of capacity C refills at R tokens/sec; each request costs one token.
|
|
115
|
+
|
|
116
|
+
```lua
|
|
117
|
+
-- KEYS[1]=hash{tokens,ts}, ARGV[1]=capacity, ARGV[2]=refill/sec, ARGV[3]=now-sec, ARGV[4]=cost.
|
|
118
|
+
local s = redis.call('HMGET', KEYS[1], 'tokens', 'ts')
|
|
119
|
+
local tokens = tonumber(s[1]) or tonumber(ARGV[1])
|
|
120
|
+
local ts = tonumber(s[2]) or tonumber(ARGV[3])
|
|
121
|
+
tokens = math.min(tonumber(ARGV[1]), tokens + (ARGV[3] - ts) * ARGV[2]) -- refill by elapsed time
|
|
122
|
+
if tokens < tonumber(ARGV[4]) then
|
|
123
|
+
redis.call('HSET', KEYS[1], 'tokens', tokens, 'ts', ARGV[3]); return 0
|
|
124
|
+
end
|
|
125
|
+
tokens = tokens - tonumber(ARGV[4])
|
|
126
|
+
redis.call('HSET', KEYS[1], 'tokens', tokens, 'ts', ARGV[3])
|
|
127
|
+
redis.call('PEXPIRE', KEYS[1], math.ceil(tonumber(ARGV[1]) / tonumber(ARGV[2]) * 1000))
|
|
128
|
+
return 1
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Smallest memory (one small hash per key), smooth average rate, configurable burst. The usual default.
|
|
132
|
+
|
|
133
|
+
### Choosing
|
|
134
|
+
|
|
135
|
+
| Need | Pick |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| Cheapest, OK with 2× edge bursts | fixed window |
|
|
138
|
+
| Exact, low traffic | sliding-window log |
|
|
139
|
+
| Near-exact, high traffic | sliding-window counter |
|
|
140
|
+
| Smooth rate + intentional bursts | token bucket |
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Queues — depth
|
|
2
|
+
|
|
3
|
+
Full reliable-list and Streams consumer-group implementations, stalled/pending recovery, dead-letter
|
|
4
|
+
queues, idempotency, and the library comparison. Client-agnostic.
|
|
5
|
+
|
|
6
|
+
## Reliable list pattern
|
|
7
|
+
|
|
8
|
+
Never `RPOP` straight into a worker: a crash between the pop and the work loses the job. Move it
|
|
9
|
+
atomically to a per-worker processing list, do the work idempotently, then ack by removing it. A
|
|
10
|
+
separate reaper requeues anything orphaned in a processing list whose worker has died.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 1. Atomic claim: pop from the queue, push onto THIS worker's processing list, in one command.
|
|
14
|
+
job=$(redis-cli LMOVE jobs jobs:proc:w1 LEFT RIGHT) # BLMOVE for a blocking variant
|
|
15
|
+
|
|
16
|
+
# 2. Do the work — idempotently, because delivery is at-least-once (see below).
|
|
17
|
+
|
|
18
|
+
# 3. Ack: remove the job from the processing list.
|
|
19
|
+
redis-cli LREM jobs:proc:w1 1 "$job"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Reaper (runs periodically): for each `jobs:proc:*`, if its worker is gone (heartbeat key expired),
|
|
23
|
+
`LMOVE` every element back to `jobs`. The trade-off: a job that was *almost* done but un-acked gets
|
|
24
|
+
re-run — hence handlers must be idempotent.
|
|
25
|
+
|
|
26
|
+
`LMOVE`/`BLMOVE` (Redis 6.2+) replace the older `RPOPLPUSH`/`BRPOPLPUSH`, which still work.
|
|
27
|
+
|
|
28
|
+
## Streams + consumer groups (preferred for reliable jobs)
|
|
29
|
+
|
|
30
|
+
Streams give per-message acks and a Pending Entries List (PEL) for free — no hand-rolled processing
|
|
31
|
+
list. This is the right native primitive for reliable jobs.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Create the group once (MKSTREAM creates the stream if absent). '$' = only new messages.
|
|
35
|
+
redis-cli XGROUP CREATE jobs g1 '$' MKSTREAM
|
|
36
|
+
|
|
37
|
+
# Producer: append, capping growth so the stream can't grow unbounded.
|
|
38
|
+
redis-cli XADD jobs MAXLEN '~' 100000 '*' type email to user@x.com
|
|
39
|
+
|
|
40
|
+
# Consumer: read new messages ('>'), each delivered message enters this consumer's PEL.
|
|
41
|
+
redis-cli XREADGROUP GROUP g1 worker1 COUNT 10 BLOCK 5000 STREAMS jobs '>'
|
|
42
|
+
|
|
43
|
+
# Ack a finished message — removes it from the PEL.
|
|
44
|
+
redis-cli XACK jobs g1 <id>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Stalled / pending recovery
|
|
48
|
+
|
|
49
|
+
A worker that dies leaves its in-flight messages in the PEL, un-acked. Reclaim them with
|
|
50
|
+
`XAUTOCLAIM` (Redis 6.2+), which transfers messages idle longer than a threshold to a live consumer:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Claim messages in group g1 idle > 60000ms, reassigning them to worker2, starting at id 0.
|
|
54
|
+
redis-cli XAUTOCLAIM jobs g1 worker2 60000 0
|
|
55
|
+
# Inspect the backlog: XPENDING jobs g1 (summary) / XPENDING jobs g1 - + 10 (detail)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Track a delivery count per message (`XPENDING` reports it); after K deliveries, stop retrying and
|
|
59
|
+
route to a dead-letter stream instead of looping forever on a poison message.
|
|
60
|
+
|
|
61
|
+
### Dead-letter queue
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Poison message exceeded max deliveries: copy to a DLQ stream, then ack it off the main group.
|
|
65
|
+
redis-cli XADD jobs:dead '*' orig_id <id> reason max-deliveries-exceeded payload "$payload"
|
|
66
|
+
redis-cli XACK jobs g1 <id>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Trim both the main and DLQ streams (`MAXLEN ~`) so neither grows without bound. Redis 8.2 adds
|
|
70
|
+
`XDELEX`/`XACKDEL` for ack-and-delete in one step.
|
|
71
|
+
|
|
72
|
+
## Idempotency and at-least-once
|
|
73
|
+
|
|
74
|
+
Every Redis queue (list or stream) is **at-least-once**: a crash after work but before ack re-runs
|
|
75
|
+
the job. Make handlers idempotent:
|
|
76
|
+
|
|
77
|
+
- Carry an **idempotency key** (a job id or a hash of the payload). Before the side effect, `SET
|
|
78
|
+
done:<key> 1 NX EX <ttl>`; if it returns nil, the job already ran — skip the side effect, just ack.
|
|
79
|
+
- Or make the side effect itself idempotent (upserts keyed by id, conditional writes with a fencing
|
|
80
|
+
token, external APIs that accept an idempotency key).
|
|
81
|
+
|
|
82
|
+
Exactly-once delivery does not exist over a network; exactly-once *effect* is achievable only by
|
|
83
|
+
making the effect idempotent.
|
|
84
|
+
|
|
85
|
+
## When to use a library instead of hand-rolling
|
|
86
|
+
|
|
87
|
+
| Library | Language | You get |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| **BullMQ** | TypeScript/Node | retries, delays, repeatable jobs, priorities, a dashboard, **stalled-job lock renewal** via `lockDuration`/`lockRenewTime` |
|
|
90
|
+
| **Sidekiq** | Ruby | multi-threaded workers, retries, scheduling, web UI |
|
|
91
|
+
| **RQ** | Python | simple, list-based, easy to reason about |
|
|
92
|
+
| **Celery** (Redis broker) | Python | mature, broad feature set, can use Redis or others |
|
|
93
|
+
|
|
94
|
+
Reach for a library the moment you need retries with backoff, scheduled/delayed jobs, priorities, or a
|
|
95
|
+
dashboard — do not reinvent them. BullMQ's stalled-job handling is the canonical example: a worker
|
|
96
|
+
holds a lock on its active job and renews it every `lockRenewTime`; if a worker dies, the lock lapses
|
|
97
|
+
after `lockDuration` and the job is moved back to be retried up to its attempt limit. Setting
|
|
98
|
+
`lockDuration` below your real job duration is the usual cause of "my jobs keep getting marked
|
|
99
|
+
stalled and reprocessed" — raise it above the worst-case job time (and renew), don't lower your
|
|
100
|
+
expectations.
|
|
101
|
+
|
|
102
|
+
Hand-roll lists/streams only for the simplest cases or when no good library exists for your runtime.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# verify.sh — redis skill gate. Run from your PROJECT root.
|
|
5
|
+
#
|
|
6
|
+
# What it does (read-only, idempotent, NEVER connects to a Redis server, never writes):
|
|
7
|
+
# Scans discovered Redis-touching source/config for high-confidence foot-guns. It exits
|
|
8
|
+
# non-zero ONLY on a near-certain production bug (`KEYS` / `KEYS *` in non-test source).
|
|
9
|
+
# Everything else is advisory [warn], and an absence of Redis usage is [skip] (exit 0).
|
|
10
|
+
#
|
|
11
|
+
# Heuristics are deliberately conservative: client SDKs and config look wildly different across
|
|
12
|
+
# node-redis, ioredis, redis-py, go-redis and Lettuce, so all the soft checks are warnings you
|
|
13
|
+
# eyeball, not build-breakers. The hard fail is reserved for `KEYS` because it is essentially
|
|
14
|
+
# always wrong on a hot path and trivially confirmable.
|
|
15
|
+
#
|
|
16
|
+
# Portability: stock macOS bash 3.2 (no mapfile, no associative arrays). Arrays are initialised so
|
|
17
|
+
# they expand safely under `set -u`.
|
|
18
|
+
|
|
19
|
+
YELLOW=$'\033[33m'; GREEN=$'\033[32m'; RED=$'\033[31m'; NC=$'\033[0m'
|
|
20
|
+
EXIT=0
|
|
21
|
+
skip() { printf '%s[skip]%s %s\n' "$YELLOW" "$NC" "$*"; }
|
|
22
|
+
note() { printf '%s[warn]%s %s\n' "$YELLOW" "$NC" "$*"; }
|
|
23
|
+
ok() { printf '%s[ok]%s %s\n' "$GREEN" "$NC" "$*"; }
|
|
24
|
+
err() { printf '%s[fail]%s %s\n' "$RED" "$NC" "$*"; EXIT=1; }
|
|
25
|
+
|
|
26
|
+
ROOT="$(pwd)"
|
|
27
|
+
|
|
28
|
+
# is_test_path <path> — true for files that look like tests/specs/fixtures, where foot-guns are fine.
|
|
29
|
+
is_test_path() {
|
|
30
|
+
case "$1" in
|
|
31
|
+
*test*|*Test*|*spec*|*Spec*|*__tests__*|*fixtures*|*/mocks/*) return 0 ;;
|
|
32
|
+
*) return 1 ;;
|
|
33
|
+
esac
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Discover candidate source files (common Redis-client languages) and redis.conf, excluding vendor dirs.
|
|
37
|
+
SRC_FILES=()
|
|
38
|
+
while IFS= read -r -d '' f; do
|
|
39
|
+
SRC_FILES+=("$f")
|
|
40
|
+
done < <(
|
|
41
|
+
find "$ROOT" \
|
|
42
|
+
\( -path '*/node_modules/*' -o -path '*/.git/*' -o -path '*/vendor/*' -o -path '*/.venv/*' \
|
|
43
|
+
-o -path '*/dist/*' -o -path '*/build/*' -o -path '*/.next/*' \) -prune -o \
|
|
44
|
+
-type f \( -name '*.js' -o -name '*.ts' -o -name '*.jsx' -o -name '*.tsx' -o -name '*.mjs' \
|
|
45
|
+
-o -name '*.py' -o -name '*.go' -o -name '*.rb' -o -name '*.java' -o -name '*.kt' \
|
|
46
|
+
-o -name '*.lua' -o -name '*.php' -o -name '*.rs' \) -print0 2>/dev/null
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
CONF_FILES=()
|
|
50
|
+
while IFS= read -r -d '' f; do
|
|
51
|
+
CONF_FILES+=("$f")
|
|
52
|
+
done < <(
|
|
53
|
+
find "$ROOT" \
|
|
54
|
+
\( -path '*/node_modules/*' -o -path '*/.git/*' -o -path '*/vendor/*' \) -prune -o \
|
|
55
|
+
-type f \( -name 'redis.conf' -o -name 'valkey.conf' -o -name '*redis*.conf' \) -print0 2>/dev/null
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# Decide whether this project touches Redis at all. If not, skip cleanly.
|
|
59
|
+
# Use -l (newline-separated) not -Z: BSD/macOS grep ignores -Z when listing filenames, so a
|
|
60
|
+
# NUL-delimited read loop would mis-parse. Filenames with newlines are not supported here (rare),
|
|
61
|
+
# which is an acceptable trade for portability across BSD and GNU grep.
|
|
62
|
+
REDIS_HINT=0
|
|
63
|
+
HINT_FILES=()
|
|
64
|
+
if [ "${#SRC_FILES[@]}" -gt 0 ]; then
|
|
65
|
+
while IFS= read -r f; do
|
|
66
|
+
[ -n "$f" ] && HINT_FILES+=("$f")
|
|
67
|
+
done < <(
|
|
68
|
+
grep -ril -E 'redis|valkey|ioredis|bullmq|sidekiq|XREADGROUP|maxmemory' "${SRC_FILES[@]}" 2>/dev/null || true
|
|
69
|
+
)
|
|
70
|
+
fi
|
|
71
|
+
if [ "${#HINT_FILES[@]}" -gt 0 ] || [ "${#CONF_FILES[@]}" -gt 0 ]; then
|
|
72
|
+
REDIS_HINT=1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
if [ "$REDIS_HINT" -eq 0 ]; then
|
|
76
|
+
skip "no Redis/Valkey usage detected in this project — nothing to check"
|
|
77
|
+
ok "verify.sh passed"
|
|
78
|
+
exit 0
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Only scan the files that actually mentioned Redis (plus conf files), to cut false positives.
|
|
82
|
+
SCAN_FILES=()
|
|
83
|
+
for f in ${HINT_FILES[@]+"${HINT_FILES[@]}"}; do SCAN_FILES+=("$f"); done
|
|
84
|
+
for f in ${CONF_FILES[@]+"${CONF_FILES[@]}"}; do SCAN_FILES+=("$f"); done
|
|
85
|
+
|
|
86
|
+
# ---- 1. KEYS / KEYS * in non-test source -> HARD FAIL ----
|
|
87
|
+
# Match a KEYS command (quoted, or as a client method call), not the identifier "keys" in general.
|
|
88
|
+
KEYS_HIT=0
|
|
89
|
+
for f in "${SCAN_FILES[@]}"; do
|
|
90
|
+
is_test_path "$f" && continue
|
|
91
|
+
if grep -Eniq "([\"'\` ]KEYS[[:space:]]+[^)]|\.keys\(|->keys\(|[\"'\`]KEYS\*)" "$f" 2>/dev/null; then
|
|
92
|
+
# Exclude obvious false friends: object key iteration like Object.keys(, dict.keys(), .Keys (Go map helpers vary; conservative).
|
|
93
|
+
if grep -Eniq "([\"'\`][[:space:]]*KEYS[[:space:]]|[\"'\`]KEYS\*|redis[^.]*\.keys\(|client\.keys\(|->keys\()" "$f" 2>/dev/null; then
|
|
94
|
+
err "$f: uses Redis KEYS (O(N), blocks the single thread). Use SCAN MATCH ... COUNT ... instead."
|
|
95
|
+
KEYS_HIT=1
|
|
96
|
+
fi
|
|
97
|
+
fi
|
|
98
|
+
done
|
|
99
|
+
[ "$KEYS_HIT" -eq 0 ] && ok "no Redis KEYS in non-test source"
|
|
100
|
+
|
|
101
|
+
# ---- 2. FLUSHALL / FLUSHDB in non-test source -> warn ----
|
|
102
|
+
for f in "${SCAN_FILES[@]}"; do
|
|
103
|
+
is_test_path "$f" && continue
|
|
104
|
+
if grep -Eniq "FLUSHALL|FLUSHDB|\.flushall\(|\.flushdb\(" "$f" 2>/dev/null; then
|
|
105
|
+
note "$f: FLUSHALL/FLUSHDB present — wipes the instance; never run on a shared/prod Redis."
|
|
106
|
+
fi
|
|
107
|
+
done
|
|
108
|
+
|
|
109
|
+
# ---- 3. Lock release via DEL near a lock key without a token compare -> warn ----
|
|
110
|
+
for f in "${SCAN_FILES[@]}"; do
|
|
111
|
+
is_test_path "$f" && continue
|
|
112
|
+
if grep -Eniq "lock" "$f" 2>/dev/null \
|
|
113
|
+
&& grep -Eniq "(\.del\(|\.delete\(|->del\(|[\"'\`]DEL[\"'\` ])" "$f" 2>/dev/null \
|
|
114
|
+
&& ! grep -Eiq "get'?\)?[[:space:]]*==[[:space:]]*ARGV|get'?[^=]*==[^=]*token|compare.?and.?del|redis\.call\('get'" "$f" 2>/dev/null; then
|
|
115
|
+
note "$f: lock + DEL but no visible token compare-and-delete — a bare DEL can release another owner's lock. Use a Lua GET==token then DEL."
|
|
116
|
+
fi
|
|
117
|
+
done
|
|
118
|
+
|
|
119
|
+
# ---- 4. SET ... NX for a lock with no PX/EX -> warn (lock that can't expire) ----
|
|
120
|
+
for f in "${SCAN_FILES[@]}"; do
|
|
121
|
+
is_test_path "$f" && continue
|
|
122
|
+
# A SET with NX but neither PX nor EX on the same line/call is a lock that never auto-frees.
|
|
123
|
+
if grep -Eni "set[^\n]*\bNX\b" "$f" 2>/dev/null | grep -Eivq "\bP?X\b|expire|ttl" 2>/dev/null; then
|
|
124
|
+
if grep -Eni "set[^\n]*\bNX\b" "$f" 2>/dev/null | grep -Eiq "lock" 2>/dev/null; then
|
|
125
|
+
note "$f: SET ... NX on a lock with no PX/EX — a crashed owner holds it forever. Add PX <ttl-ms>."
|
|
126
|
+
fi
|
|
127
|
+
fi
|
|
128
|
+
done
|
|
129
|
+
|
|
130
|
+
# ---- 5. INCR not followed by an EXPIRE (counter with no TTL) -> warn ----
|
|
131
|
+
for f in "${SCAN_FILES[@]}"; do
|
|
132
|
+
is_test_path "$f" && continue
|
|
133
|
+
if grep -Eniq "(\.incr\(|->incr\(|[\"'\`]INCR[\"'\` ])" "$f" 2>/dev/null \
|
|
134
|
+
&& ! grep -Eniq "(expire|EXPIRE|pexpire|PEXPIRE|EX[[:space:]]|setex|SETEX)" "$f" 2>/dev/null; then
|
|
135
|
+
note "$f: INCR with no EXPIRE in the same file — a rate-limit counter with no TTL counts forever. Set EXPIRE atomically (Lua, or only when n==1)."
|
|
136
|
+
fi
|
|
137
|
+
done
|
|
138
|
+
|
|
139
|
+
# ---- 6/7. redis.conf eviction checks -> warn ----
|
|
140
|
+
for f in ${CONF_FILES[@]+"${CONF_FILES[@]}"}; do
|
|
141
|
+
if grep -Eiq "^[[:space:]]*maxmemory[[:space:]]" "$f" 2>/dev/null \
|
|
142
|
+
&& ! grep -Eiq "^[[:space:]]*maxmemory-policy" "$f" 2>/dev/null; then
|
|
143
|
+
note "$f: maxmemory set without maxmemory-policy — defaults to noeviction, which 500s a full cache. Set allkeys-lru/lfu for a cache."
|
|
144
|
+
fi
|
|
145
|
+
if grep -Eiq "^[[:space:]]*maxmemory-policy[[:space:]]+noeviction" "$f" 2>/dev/null; then
|
|
146
|
+
case "$f" in
|
|
147
|
+
*cache*|*Cache*) note "$f: maxmemory-policy noeviction on a file that looks like a cache config — a cache must evict (allkeys-lru/lfu), not fail writes." ;;
|
|
148
|
+
esac
|
|
149
|
+
fi
|
|
150
|
+
done
|
|
151
|
+
|
|
152
|
+
# ---- 8. while/long loop inside an inline Lua EVAL string -> warn ----
|
|
153
|
+
for f in "${SCAN_FILES[@]}"; do
|
|
154
|
+
is_test_path "$f" && continue
|
|
155
|
+
if grep -Eniq "EVAL|eval" "$f" 2>/dev/null \
|
|
156
|
+
&& grep -Eniq "while[[:space:]].*do|for[[:space:]].*=.*,.*do" "$f" 2>/dev/null \
|
|
157
|
+
&& grep -Eniq "redis\.call" "$f" 2>/dev/null; then
|
|
158
|
+
note "$f: a loop inside Lua run via EVAL blocks ALL clients while it runs (Redis is single-threaded). Keep each EVAL a short bounded step."
|
|
159
|
+
fi
|
|
160
|
+
done
|
|
161
|
+
|
|
162
|
+
printf '\n'
|
|
163
|
+
if [ "$EXIT" -eq 0 ]; then ok "verify.sh passed"; else err "verify.sh found failures"; fi
|
|
164
|
+
exit "$EXIT"
|