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,57 @@
|
|
|
1
|
+
skill: postgresdb
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "This query takes 8 seconds and the page won't load. Can you help me figure out why and speed it up?"
|
|
5
|
+
why: "Slow query / latency complaint is core scope; the skill owns reading the plan and fixing scans even though the user never says SQL or index."
|
|
6
|
+
- prompt: "We need to add a column to a 40-million-row table that's getting live traffic without taking the app down. What's the safe way?"
|
|
7
|
+
why: "Zero-downtime migration against a large table with live traffic — expand-contract, lock_timeout, batched backfill — is explicitly in scope."
|
|
8
|
+
- prompt: "Here's my EXPLAIN ANALYZE output. Why is it doing a Seq Scan on orders when I have an index on user_id?"
|
|
9
|
+
why: "Reading a plan, diagnosing Seq Scan vs index usage, and stale-stats/predicate issues are the heart of query-optimization."
|
|
10
|
+
- prompt: "Should I store this as an enum or a separate lookup table with a foreign key? The set of statuses keeps changing."
|
|
11
|
+
why: "Schema/DDL type decision (enum-vs-lookup) is a named When-to-use case with a decision rule in the skill."
|
|
12
|
+
- prompt: "Different tenants keep seeing each other's rows in our shared table. I want the database itself to enforce isolation per tenant."
|
|
13
|
+
why: "This is row-level security (RLS) operational/security scope, even though the user never names RLS or Postgres explicitly."
|
|
14
|
+
- prompt: "Our background workers keep grabbing the same job and processing it twice. They poll a jobs table. How do I make concurrent workers not collide?"
|
|
15
|
+
why: "Postgres-as-queue with FOR UPDATE SKIP LOCKED is explicitly the one queue pattern in scope; concurrency/locking is core."
|
|
16
|
+
- prompt: "I have a list view and every time I load a user's page it fires hundreds of little SELECTs, one per row. How do I fix this?"
|
|
17
|
+
why: "Classic N+1 described without the term; skill owns fixing it at the SQL boundary with a set-based query / LATERAL join."
|
|
18
|
+
- prompt: "We're running out of Postgres connections under load on our serverless app. How should we set up pooling?"
|
|
19
|
+
why: "Connection pooling / PgBouncer is named operations scope (the engine-side answer, not vendor console clicks)."
|
|
20
|
+
|
|
21
|
+
should_not_trigger:
|
|
22
|
+
- prompt: "My Prisma updateMany returns the wrong count and isn't updating the rows I expect. What's the ORM doing?"
|
|
23
|
+
route_to: "none"
|
|
24
|
+
why: "Explicitly out of scope: ORM-API ergonomics like Prisma's updateMany count trap belong to the ORM's own docs, not this engine-level skill."
|
|
25
|
+
- prompt: "I need to add a SQLite full-text search index in my Expo mobile app's local database."
|
|
26
|
+
route_to: "flutter"
|
|
27
|
+
why: "Non-Postgres engine (SQLite) is explicitly out of scope — different MVCC/planner; mobile-app data lands closer to the app-framework skill, not postgresdb."
|
|
28
|
+
- prompt: "How do I configure a managed Postgres instance on RDS through the AWS console and set up automated snapshots in the UI?"
|
|
29
|
+
route_to: "deployment"
|
|
30
|
+
why: "Cloud-vendor console clicks are explicitly out of scope; provisioning/infra-through-UI is deployment territory, not engine-level SQL."
|
|
31
|
+
- prompt: "Build a FastAPI endpoint with a Pydantic request model that returns paginated results."
|
|
32
|
+
route_to: "fastapi"
|
|
33
|
+
why: "This is API-framework / request-validation work; the SQL it eventually emits could touch postgresdb but the prompt as stated is fastapi's domain."
|
|
34
|
+
- prompt: "How do I prevent SQL injection in my Node app — is parameterizing enough, and how should I handle untrusted input generally?"
|
|
35
|
+
route_to: "secure-coding"
|
|
36
|
+
why: "A general application-security question about untrusted input belongs to secure-coding; postgresdb owns engine behavior, not app-layer input handling."
|
|
37
|
+
- prompt: "Should I cache these hot query results in Redis to cut database load?"
|
|
38
|
+
route_to: "none"
|
|
39
|
+
why: "App-layer caching / Redis as a product is explicitly out of scope; only Postgres-as-queue via SKIP LOCKED is in scope, not caching layers."
|
|
40
|
+
|
|
41
|
+
capability:
|
|
42
|
+
- scenario: "User has a query `SELECT * FROM orders WHERE user_id = $1 AND created_at >= $2 ORDER BY created_at DESC LIMIT 20` that is slow on a large orders table, and asks which index to add and how to confirm it helps."
|
|
43
|
+
must_include:
|
|
44
|
+
- "Proposes a composite btree index with equality column first, range/sort column second: ON orders (user_id, created_at DESC)"
|
|
45
|
+
- "Explains the index ORDER BY direction must match the query to avoid a sort, and column order rationale (equality then range)"
|
|
46
|
+
- "Instructs running EXPLAIN (ANALYZE, BUFFERS) and confirming an Index Cond (not a Filter / Rows Removed by Filter) before declaring success"
|
|
47
|
+
- "Recommends CREATE INDEX CONCURRENTLY on a live table (cannot run inside a transaction) rather than plain CREATE INDEX"
|
|
48
|
+
- "Recommends keyset/cursor pagination over large OFFSET, or at least flags OFFSET as O(n) for deep pages"
|
|
49
|
+
- "Warns against blindly adding an index when selectivity is low or the column is already a left prefix of an existing index"
|
|
50
|
+
- scenario: "User wants to add a NOT NULL `country` column to a 50M-row table that serves live traffic, with zero downtime, using a generic migration tool."
|
|
51
|
+
must_include:
|
|
52
|
+
- "Splits the change into steps (expand-contract): add nullable column first, backfill, then enforce NOT NULL — never ADD COLUMN ... NOT NULL with backfill in one shot on a large table"
|
|
53
|
+
- "Notes that a constant (non-volatile) default is instant on PG11+, but a volatile default (e.g. now()/uuid) forces a full table rewrite under ACCESS EXCLUSIVE"
|
|
54
|
+
- "Backfills in batches to avoid a long transaction / lock and bloat, rather than a single UPDATE"
|
|
55
|
+
- "Adds the NOT NULL via a CHECK ... NOT VALID then VALIDATE CONSTRAINT (or NOT NULL after backfill) to avoid a blocking full-table scan under heavy lock"
|
|
56
|
+
- "Wraps DDL with SET lock_timeout and SET statement_timeout so a blocked DDL fails fast instead of queueing behind/ahead of traffic"
|
|
57
|
+
- "States migrations are forward-only in prod and never edit an already-applied migration"
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# PostgreSQL zero-downtime migrations
|
|
2
|
+
|
|
3
|
+
Safe DDL against tables with real data and live traffic, on PostgreSQL 16, across raw SQL,
|
|
4
|
+
golang-migrate, Alembic, and Prisma. Running example: add `avatar_url` to `users`, index it
|
|
5
|
+
concurrently, backfill `display_name`.
|
|
6
|
+
|
|
7
|
+
> Using Drizzle, Kysely, Django, or another migration runner not shown here? The engine-level rules
|
|
8
|
+
> below (expand–contract, `CONCURRENTLY` outside a txn, `NOT VALID` then `VALIDATE`, batched backfill)
|
|
9
|
+
> are identical regardless of runner — translate the raw-SQL recipes into your tool's directives. The
|
|
10
|
+
> per-tool workflow/wiring of those runners lives in each runner's own upstream documentation (they are
|
|
11
|
+
> external tools, not companion skills); the engine-level recipes here are what those directives must
|
|
12
|
+
> ultimately emit.
|
|
13
|
+
|
|
14
|
+
## Principles
|
|
15
|
+
|
|
16
|
+
- **Forward-only in prod.** Roll back with a new forward migration, not by editing history.
|
|
17
|
+
- **DDL and DML in separate migrations.** A schema change and a data backfill have different lock and
|
|
18
|
+
duration profiles; never mix them.
|
|
19
|
+
- **Immutable once applied.** Editing an applied migration drifts environments (and breaks Prisma's
|
|
20
|
+
checksum).
|
|
21
|
+
- **Test against prod-sized data.** A migration that is instant on 100 rows can hold ACCESS EXCLUSIVE
|
|
22
|
+
for minutes on 10M.
|
|
23
|
+
- **Bound every risky DDL** so a wait can never become an outage:
|
|
24
|
+
|
|
25
|
+
```sql
|
|
26
|
+
SET lock_timeout = '3s'; -- give up acquiring the lock rather than queueing behind it
|
|
27
|
+
SET statement_timeout = '0'; -- or a bounded value per backfill step
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
A blocked DDL holding ACCESS EXCLUSIVE queues *every* subsequent query behind it; `lock_timeout` makes
|
|
31
|
+
the migration fail fast instead of stalling the whole table.
|
|
32
|
+
|
|
33
|
+
## Lock-impact reference
|
|
34
|
+
|
|
35
|
+
| Operation | Lock | Reads | Writes | Safe variant |
|
|
36
|
+
| --- | --- | --- | --- | --- |
|
|
37
|
+
| `ADD COLUMN` (nullable, no default) | ACCESS EXCLUSIVE (brief) | no | no | metadata-only, instant |
|
|
38
|
+
| `ADD COLUMN ... DEFAULT <const>` (PG11+) | ACCESS EXCLUSIVE (brief) | no | no | instant; default stored in catalog |
|
|
39
|
+
| `ADD COLUMN ... DEFAULT <volatile>` | ACCESS EXCLUSIVE (long) | yes | yes | add nullable → batched backfill |
|
|
40
|
+
| `ALTER COLUMN ... TYPE` (rewrite) | ACCESS EXCLUSIVE (long) | yes | yes | expand-contract new column |
|
|
41
|
+
| `ADD CHECK` | ACCESS EXCLUSIVE + full scan | yes | yes | `... NOT VALID` then `VALIDATE` |
|
|
42
|
+
| `ADD FOREIGN KEY` | SHARE ROW EXCLUSIVE + scan | no | yes | `... NOT VALID` then `VALIDATE` |
|
|
43
|
+
| `SET NOT NULL` | ACCESS EXCLUSIVE + full scan | yes | yes | add validated CHECK first (PG12+ skips re-scan) |
|
|
44
|
+
| `CREATE INDEX` | SHARE (blocks writes) | no | yes | `CREATE INDEX CONCURRENTLY` |
|
|
45
|
+
| `CREATE INDEX CONCURRENTLY` | SHARE UPDATE EXCLUSIVE | no | no | the safe one; 2 scans, no txn |
|
|
46
|
+
| `DROP COLUMN` | ACCESS EXCLUSIVE (brief) | no | no | code-first, then drop |
|
|
47
|
+
| `VACUUM FULL` | ACCESS EXCLUSIVE (long) | yes | yes | autovacuum / `pg_repack` |
|
|
48
|
+
|
|
49
|
+
## Expand–contract (zero-downtime)
|
|
50
|
+
|
|
51
|
+
The only safe way to rename a column, change its type, or split/merge columns. Each arrow is a
|
|
52
|
+
deployable step; the schema and the app are always compatible.
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
1. EXPAND add the new column/table (nullable or instant-default). Schema-only, no app change.
|
|
56
|
+
2. DUAL-WRITE + BACKFILL deploy app that writes BOTH old and new; backfill old rows in batches.
|
|
57
|
+
3. MIGRATE READS deploy app that reads NEW, still writes both; verify parity.
|
|
58
|
+
4. CONTRACT deploy app that uses only NEW; in a later migration drop the old column.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Never collapse these into one migration. The gap between deploys is where reads and writes stay
|
|
62
|
+
consistent across rolling app instances running mixed versions.
|
|
63
|
+
|
|
64
|
+
## Safe recipes (raw SQL)
|
|
65
|
+
|
|
66
|
+
### Add a NOT NULL column safely
|
|
67
|
+
|
|
68
|
+
```sql
|
|
69
|
+
-- 1. add nullable (instant, metadata-only)
|
|
70
|
+
ALTER TABLE users ADD COLUMN display_name text;
|
|
71
|
+
-- 2. batched backfill (see "Batched backfill" below)
|
|
72
|
+
-- 3. add the NOT NULL invariant as a NOT VALID check, then validate under a light lock
|
|
73
|
+
ALTER TABLE users ADD CONSTRAINT ck_users_display_name_nn
|
|
74
|
+
CHECK (display_name IS NOT NULL) NOT VALID;
|
|
75
|
+
ALTER TABLE users VALIDATE CONSTRAINT ck_users_display_name_nn; -- scans, SHARE UPDATE EXCLUSIVE
|
|
76
|
+
-- 4. promote to a real NOT NULL: PG12+ reuses the proven CHECK and skips the full re-scan
|
|
77
|
+
ALTER TABLE users ALTER COLUMN display_name SET NOT NULL;
|
|
78
|
+
ALTER TABLE users DROP CONSTRAINT ck_users_display_name_nn;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Add an index concurrently (and clean a failed one)
|
|
82
|
+
|
|
83
|
+
```sql
|
|
84
|
+
CREATE INDEX CONCURRENTLY ix_users_avatar_url ON users (avatar_url);
|
|
85
|
+
-- A failed CONCURRENTLY build leaves an INVALID index that still costs writes:
|
|
86
|
+
SELECT indexrelid::regclass FROM pg_index WHERE NOT indisvalid;
|
|
87
|
+
DROP INDEX CONCURRENTLY ix_users_avatar_url; -- drop it, then recreate
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`CONCURRENTLY` cannot run inside a transaction block (it does two table scans and a wait). It is the
|
|
91
|
+
mandatory form on any live table.
|
|
92
|
+
|
|
93
|
+
### Add a foreign key without a long lock
|
|
94
|
+
|
|
95
|
+
```sql
|
|
96
|
+
ALTER TABLE orders ADD CONSTRAINT fk_orders_user
|
|
97
|
+
FOREIGN KEY (user_id) REFERENCES users (id) NOT VALID; -- brief lock, checks new rows only
|
|
98
|
+
ALTER TABLE orders VALIDATE CONSTRAINT fk_orders_user; -- scans existing rows, light lock
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Change a column type via expand-contract
|
|
102
|
+
|
|
103
|
+
In-place `ALTER COLUMN ... TYPE` rewrites the whole table under ACCESS EXCLUSIVE. When the conversion
|
|
104
|
+
is not assignment-cast-free, expand-contract instead:
|
|
105
|
+
|
|
106
|
+
```sql
|
|
107
|
+
-- 1. expand: new typed column
|
|
108
|
+
ALTER TABLE orders ADD COLUMN amount_v2 numeric(19,4);
|
|
109
|
+
-- 2. backfill in batches; app dual-writes amount and amount_v2
|
|
110
|
+
-- 3. migrate reads to amount_v2; verify parity
|
|
111
|
+
-- 4. contract: drop the old column in a later migration
|
|
112
|
+
ALTER TABLE orders DROP COLUMN amount;
|
|
113
|
+
ALTER TABLE orders RENAME COLUMN amount_v2 TO amount; -- brief lock, metadata-only
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Drop a column
|
|
117
|
+
|
|
118
|
+
```sql
|
|
119
|
+
-- code-first: ship an app release that no longer references the column, THEN:
|
|
120
|
+
ALTER TABLE orders DROP COLUMN legacy_status; -- brief ACCESS EXCLUSIVE, metadata-only
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Batched backfill
|
|
124
|
+
|
|
125
|
+
Backfill in bounded, committed batches so no single transaction holds locks or bloats WAL, and
|
|
126
|
+
autovacuum can keep up. Drive the loop from the app/migration tool (primary), or use a `DO` block in
|
|
127
|
+
`psql` (fallback).
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
# Primary: psycopg 3, keyset + SKIP LOCKED, commit per batch
|
|
131
|
+
last_id = 0
|
|
132
|
+
while True:
|
|
133
|
+
rows = conn.execute(
|
|
134
|
+
"WITH b AS (SELECT id FROM users WHERE id > %s AND display_name IS NULL "
|
|
135
|
+
"ORDER BY id LIMIT 5000 FOR UPDATE SKIP LOCKED) "
|
|
136
|
+
"UPDATE users u SET display_name = u.username FROM b WHERE u.id = b.id "
|
|
137
|
+
"RETURNING u.id", (last_id,)).fetchall()
|
|
138
|
+
conn.commit()
|
|
139
|
+
if not rows:
|
|
140
|
+
break
|
|
141
|
+
last_id = max(r[0] for r in rows)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```sql
|
|
145
|
+
-- Fallback in psql: a DO block that commits each batch (PG11+ allows COMMIT inside DO)
|
|
146
|
+
DO $$
|
|
147
|
+
DECLARE last_id bigint := 0; max_id bigint;
|
|
148
|
+
BEGIN
|
|
149
|
+
LOOP
|
|
150
|
+
WITH batch AS (
|
|
151
|
+
SELECT id FROM users WHERE id > last_id AND display_name IS NULL
|
|
152
|
+
ORDER BY id LIMIT 5000 FOR UPDATE SKIP LOCKED
|
|
153
|
+
), upd AS (
|
|
154
|
+
UPDATE users u SET display_name = u.username
|
|
155
|
+
FROM batch WHERE u.id = batch.id
|
|
156
|
+
RETURNING u.id
|
|
157
|
+
)
|
|
158
|
+
SELECT max(id) INTO max_id FROM upd;
|
|
159
|
+
EXIT WHEN max_id IS NULL; -- no rows updated this round
|
|
160
|
+
last_id := max_id;
|
|
161
|
+
COMMIT;
|
|
162
|
+
END LOOP;
|
|
163
|
+
END $$;
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Per-tool concrete examples
|
|
167
|
+
|
|
168
|
+
### Plain SQL (golang-migrate-style file pair)
|
|
169
|
+
|
|
170
|
+
```sql
|
|
171
|
+
-- 000003_add_avatar.up.sql
|
|
172
|
+
ALTER TABLE users ADD COLUMN avatar_url text;
|
|
173
|
+
CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_users_avatar_url ON users (avatar_url);
|
|
174
|
+
-- (backfill of display_name runs as a SEPARATE migration / job, not here)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```sql
|
|
178
|
+
-- 000003_add_avatar.down.sql
|
|
179
|
+
DROP INDEX CONCURRENTLY IF EXISTS ix_users_avatar_url;
|
|
180
|
+
ALTER TABLE users DROP COLUMN IF EXISTS avatar_url;
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### golang-migrate
|
|
184
|
+
|
|
185
|
+
golang-migrate wraps each migration file in a single transaction by default, and `CONCURRENTLY` cannot
|
|
186
|
+
run in a transaction. The `postgres`/`pgx` driver exposes only a driver-level `x-multi-statement` /
|
|
187
|
+
`TransactionsEnabled=false` toggle (set when constructing the driver, applied to the whole run) — there
|
|
188
|
+
is no per-file "disable transaction" directive. So the honest, canonical approach is: **put the
|
|
189
|
+
concurrent-index statement in its own migration file and apply that step out-of-band**, or switch to a
|
|
190
|
+
tool that supports a per-file no-transaction directive (`dbmate` `-- migrate:up transaction:false`,
|
|
191
|
+
`atlas`, or `tern`) for that one step.
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# create the pair
|
|
195
|
+
migrate create -ext sql -dir migrations -seq add_avatar_index
|
|
196
|
+
|
|
197
|
+
# put ONLY the concurrent index in its own file, apply it (it will fail if wrapped in a txn —
|
|
198
|
+
# run it with psql directly, or via a tool that does not open a transaction):
|
|
199
|
+
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 \
|
|
200
|
+
-c "CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_users_avatar_url ON users (avatar_url);"
|
|
201
|
+
|
|
202
|
+
# if a previous run left the migration marked dirty, clear it:
|
|
203
|
+
migrate -path migrations -database "$DATABASE_URL" force 3
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```sql
|
|
207
|
+
-- migrations/000004_add_avatar_col.up.sql (this file IS safe inside a txn)
|
|
208
|
+
ALTER TABLE users ADD COLUMN avatar_url text;
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Alembic (SQLAlchemy 2.0, Python 3.12)
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
from alembic import op
|
|
215
|
+
import sqlalchemy as sa
|
|
216
|
+
|
|
217
|
+
def upgrade() -> None:
|
|
218
|
+
op.add_column("users", sa.Column("avatar_url", sa.Text(), nullable=True))
|
|
219
|
+
with op.get_context().autocommit_block(): # required for CONCURRENTLY (leaves the txn)
|
|
220
|
+
op.create_index(
|
|
221
|
+
"ix_users_avatar_url", "users", ["avatar_url"],
|
|
222
|
+
postgresql_concurrently=True, if_not_exists=True,
|
|
223
|
+
)
|
|
224
|
+
op.execute("UPDATE users SET display_name = username WHERE display_name IS NULL")
|
|
225
|
+
op.create_check_constraint(
|
|
226
|
+
"ck_users_display_name_nn", "users", "display_name IS NOT NULL",
|
|
227
|
+
postgresql_not_valid=True,
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
def downgrade() -> None:
|
|
231
|
+
op.drop_constraint("ck_users_display_name_nn", "users", type_="check")
|
|
232
|
+
op.drop_index("ix_users_avatar_url", "users", postgresql_concurrently=True, if_exists=True)
|
|
233
|
+
op.drop_column("users", "avatar_url")
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
For a large backfill, replace the single `op.execute(...)` with the batched loop from above (run via a
|
|
237
|
+
raw connection inside the migration, committing per batch).
|
|
238
|
+
|
|
239
|
+
### Prisma
|
|
240
|
+
|
|
241
|
+
Prisma cannot emit `CONCURRENTLY`; generate an empty migration and hand-edit the SQL.
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# 1. create the migration WITHOUT applying it
|
|
245
|
+
npx prisma migrate dev --create-only --name add_avatar_url
|
|
246
|
+
|
|
247
|
+
# 2. hand-edit prisma/migrations/<ts>_add_avatar_url/migration.sql (see below)
|
|
248
|
+
|
|
249
|
+
# 3. apply in CI/CD with deploy (never migrate dev on shared envs — it can reset the DB)
|
|
250
|
+
npx prisma migrate deploy
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```sql
|
|
254
|
+
-- prisma/migrations/<ts>_add_avatar_url/migration.sql
|
|
255
|
+
ALTER TABLE "users" ADD COLUMN "avatar_url" TEXT;
|
|
256
|
+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "ix_users_avatar_url" ON "users" ("avatar_url");
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Prisma checksums every migration file: once applied, editing it triggers `P3006` on every environment
|
|
260
|
+
where the original already ran — create a new migration instead. ORM-surface traps
|
|
261
|
+
(`updateMany` returning a count, `@updatedAt` skipped on bulk writes, serverless connection
|
|
262
|
+
exhaustion) are out of scope for this engine-level skill — see Prisma's own documentation.
|
|
263
|
+
|
|
264
|
+
## Rollback reality
|
|
265
|
+
|
|
266
|
+
Down-migrations are best-effort. Data-destructive forward changes are not reversible from a
|
|
267
|
+
down-migration:
|
|
268
|
+
|
|
269
|
+
- `DROP COLUMN` discards the data — only a backup restores it.
|
|
270
|
+
- Type narrowing (`numeric(19,4)` → `int`) loses precision irreversibly.
|
|
271
|
+
- A completed backfill cannot be un-derived if the source was dropped.
|
|
272
|
+
|
|
273
|
+
Before the **contract** phase, snapshot the affected table:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
pg_dump -Fc -t orders "$DATABASE_URL" > orders_pre_contract.dump # restore with pg_restore -t orders
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Treat the down-migration as a convenience for local dev; in prod, recover from backup or roll forward.
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# PostgreSQL operations & security
|
|
2
|
+
|
|
3
|
+
Running, securing, and monitoring PostgreSQL 16: least-privilege roles, row-level security,
|
|
4
|
+
connection pooling, vacuum, observability, partitioning, backups, and HA basics. Running example
|
|
5
|
+
tables: `orders`, `users`, `jobs`, `events`.
|
|
6
|
+
|
|
7
|
+
## Roles & least privilege
|
|
8
|
+
|
|
9
|
+
A role is a login role when it has `LOGIN`; group roles aggregate grants. The app connects as a role
|
|
10
|
+
that can do exactly its work and nothing more — never as a superuser, never as the schema owner in
|
|
11
|
+
normal traffic.
|
|
12
|
+
|
|
13
|
+
By default every user can create objects in `public` and execute functions there; lock it down first:
|
|
14
|
+
|
|
15
|
+
```sql
|
|
16
|
+
-- 1. close the open default on the public schema
|
|
17
|
+
REVOKE ALL ON SCHEMA public FROM PUBLIC;
|
|
18
|
+
|
|
19
|
+
-- 2. an application read/write role with only DML, no DDL, no superuser
|
|
20
|
+
CREATE ROLE app_rw LOGIN PASSWORD :'app_pw';
|
|
21
|
+
GRANT USAGE ON SCHEMA public TO app_rw;
|
|
22
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_rw;
|
|
23
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_rw;
|
|
24
|
+
|
|
25
|
+
-- 3. make the grants apply to tables created LATER, too
|
|
26
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
27
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_rw;
|
|
28
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
29
|
+
GRANT USAGE, SELECT ON SEQUENCES TO app_rw;
|
|
30
|
+
|
|
31
|
+
-- 4. a read-only reporting / replica role (PG14+ predefined role reads every table)
|
|
32
|
+
CREATE ROLE reporter LOGIN PASSWORD :'rep_pw';
|
|
33
|
+
GRANT pg_read_all_data TO reporter; -- PG14+: SELECT on all current and future tables
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`ALTER DEFAULT PRIVILEGES` is keyed to the role that **creates** the object — run it as whichever role
|
|
37
|
+
owns the migrations, or the grants will silently not apply to new tables. The `:'app_pw'` form is a
|
|
38
|
+
`psql` variable; pass it with `psql -v app_pw=...` so the secret never lands in shell history.
|
|
39
|
+
|
|
40
|
+
## Row-Level Security
|
|
41
|
+
|
|
42
|
+
RLS filters rows per the connecting role. Two facts that bite everyone: it is **opt-in per table**
|
|
43
|
+
(disabled by default), and the **table owner bypasses every policy** unless you also `FORCE` it.
|
|
44
|
+
|
|
45
|
+
```sql
|
|
46
|
+
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
|
|
47
|
+
ALTER TABLE orders FORCE ROW LEVEL SECURITY; -- owner is subject to policies too
|
|
48
|
+
|
|
49
|
+
CREATE POLICY tenant_isolation ON orders
|
|
50
|
+
USING (tenant_id = (SELECT current_setting('app.tenant_id', true)::bigint))
|
|
51
|
+
WITH CHECK (tenant_id = (SELECT current_setting('app.tenant_id', true)::bigint));
|
|
52
|
+
|
|
53
|
+
-- per request: scope the tenant for the duration of the transaction
|
|
54
|
+
SET LOCAL app.tenant_id = '42'; -- inside a txn; cleared at COMMIT
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- `USING` filters which existing rows are **visible** (SELECT/UPDATE/DELETE); `WITH CHECK` constrains
|
|
58
|
+
what **new/changed** rows may contain (INSERT/UPDATE). Set both or an insert can write a row the role
|
|
59
|
+
cannot then read.
|
|
60
|
+
- Wrap the setting in `(SELECT current_setting(...))` so it is evaluated **once per statement**, not
|
|
61
|
+
once per row — the single biggest RLS performance trap.
|
|
62
|
+
- `current_setting('app.tenant_id', true)` — the `true` means "missing → NULL" instead of erroring,
|
|
63
|
+
so an unscoped connection sees zero rows (fail-closed).
|
|
64
|
+
|
|
65
|
+
Test as a non-owner role, or the owner bypass will make a broken policy look like it works:
|
|
66
|
+
|
|
67
|
+
```sql
|
|
68
|
+
SET ROLE app_rw;
|
|
69
|
+
SET app.tenant_id = '42';
|
|
70
|
+
SELECT count(*) FROM orders; -- must equal only tenant 42's rows
|
|
71
|
+
RESET ROLE;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
On Supabase the same pattern uses `auth.uid()`; still wrap it: `USING (user_id = (SELECT auth.uid()))`.
|
|
75
|
+
|
|
76
|
+
## Connection pooling
|
|
77
|
+
|
|
78
|
+
A PostgreSQL backend is a forked OS process (~5-10 MB RSS) with its own snapshot and caches, so
|
|
79
|
+
connections are expensive and `max_connections` should stay modest (a few hundred). Funnel the app
|
|
80
|
+
through a pooler.
|
|
81
|
+
|
|
82
|
+
**PgBouncer transaction mode** assigns a server connection only for the duration of a transaction —
|
|
83
|
+
the highest reuse, but with hard caveats:
|
|
84
|
+
|
|
85
|
+
- No session state across statements: `SET`/`SET search_path`, session-level `SET TIME ZONE`, and
|
|
86
|
+
`LISTEN`/`NOTIFY` do not survive. Use `SET LOCAL` inside a transaction instead.
|
|
87
|
+
- **Session** advisory locks (`pg_advisory_lock`) leak across clients — use `pg_advisory_xact_lock`.
|
|
88
|
+
- Prepared statements need a driver using **protocol-level** prepared statements (libpq `PQprepare`,
|
|
89
|
+
JDBC `PreparedStatement`, etc. — not text `PREPARE`) **and** PgBouncer ≥ 1.21 with
|
|
90
|
+
`max_prepared_statements > 0`; older combinations error with "prepared statement already exists".
|
|
91
|
+
(Protocol-level `DEALLOCATE`/close requires PG17+; before that PgBouncer cannot deallocate them.)
|
|
92
|
+
|
|
93
|
+
```ini
|
|
94
|
+
; pgbouncer.ini
|
|
95
|
+
[databases]
|
|
96
|
+
appdb = host=10.0.0.5 port=5432 dbname=appdb
|
|
97
|
+
|
|
98
|
+
[pgbouncer]
|
|
99
|
+
pool_mode = transaction
|
|
100
|
+
max_client_conn = 5000
|
|
101
|
+
default_pool_size = 20 ; server conns per (user,db); pool_size ~= cores * 2..4
|
|
102
|
+
max_prepared_statements = 200 ; >=1.21, enables protocol prepared statements in txn mode
|
|
103
|
+
server_idle_timeout = 600
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Sizing: `default_pool_size ≈ cores × 2..4`; the **sum** of all app-side pool maxima must stay below the
|
|
107
|
+
server's `max_connections`. Serverless functions should set `connection_limit=1` per instance and rely
|
|
108
|
+
on the external pooler — set the `connection_limit=1` and `pgbouncer=true` `DATABASE_URL` parameters
|
|
109
|
+
per your client's documentation (e.g. Prisma's `?connection_limit=1&pgbouncer=true`).
|
|
110
|
+
|
|
111
|
+
## VACUUM & autovacuum
|
|
112
|
+
|
|
113
|
+
`VACUUM` reclaims dead tuples (left by every UPDATE/DELETE under MVCC), updates the visibility map
|
|
114
|
+
(enabling index-only scans), and freezes old transaction IDs to prevent wraparound. Autovacuum does
|
|
115
|
+
this automatically; tune it harder for hot tables instead of disabling it.
|
|
116
|
+
|
|
117
|
+
```sql
|
|
118
|
+
-- A high-churn table: vacuum sooner and let it work harder
|
|
119
|
+
ALTER TABLE jobs SET (
|
|
120
|
+
autovacuum_vacuum_scale_factor = 0.02, -- vacuum at 2% dead tuples, not the 20% default
|
|
121
|
+
autovacuum_vacuum_cost_limit = 2000 -- more I/O budget per round
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
-- Transaction-ID wraparound watch: if age() approaches ~2^31, the DB will force a shutdown to protect data
|
|
125
|
+
SELECT datname, age(datfrozenxid) AS xid_age
|
|
126
|
+
FROM pg_database ORDER BY xid_age DESC;
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`VACUUM (ANALYZE) orders;` is the safe manual form — reclaims space and refreshes planner stats while
|
|
130
|
+
allowing reads and writes. `VACUUM FULL` rewrites the entire table under ACCESS EXCLUSIVE — never on a
|
|
131
|
+
live hot table; use `pg_repack` for online compaction.
|
|
132
|
+
|
|
133
|
+
## Monitoring
|
|
134
|
+
|
|
135
|
+
Enable `pg_stat_statements` (the single most useful extension) — it requires a preload and a restart:
|
|
136
|
+
|
|
137
|
+
```sql
|
|
138
|
+
-- postgresql.conf: shared_preload_libraries = 'pg_stat_statements'
|
|
139
|
+
-- pg_stat_statements.track = top
|
|
140
|
+
-- then, once, after restart:
|
|
141
|
+
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```sql
|
|
145
|
+
-- Worst total-time queries (where the time actually goes)
|
|
146
|
+
SELECT calls,
|
|
147
|
+
round(mean_exec_time::numeric, 2) AS mean_ms,
|
|
148
|
+
round(total_exec_time::numeric, 2) AS total_ms,
|
|
149
|
+
query
|
|
150
|
+
FROM pg_stat_statements
|
|
151
|
+
ORDER BY total_exec_time DESC
|
|
152
|
+
LIMIT 20;
|
|
153
|
+
|
|
154
|
+
-- Table/index activity: seq scans on big tables, dead tuples, unused indexes
|
|
155
|
+
SELECT relname, seq_scan, idx_scan, n_dead_tup, last_autovacuum
|
|
156
|
+
FROM pg_stat_user_tables ORDER BY seq_scan DESC LIMIT 20;
|
|
157
|
+
|
|
158
|
+
SELECT relname, indexrelname, idx_scan
|
|
159
|
+
FROM pg_stat_user_indexes WHERE idx_scan = 0 ORDER BY relname;
|
|
160
|
+
|
|
161
|
+
-- Buffer cache hit ratio (aim > 0.99; sustained lower → undersized shared_buffers or cold working set)
|
|
162
|
+
SELECT sum(heap_blks_hit) / nullif(sum(heap_blks_hit + heap_blks_read), 0) AS cache_hit_ratio
|
|
163
|
+
FROM pg_statio_user_tables;
|
|
164
|
+
|
|
165
|
+
-- Who is blocking whom
|
|
166
|
+
SELECT blocked.pid AS blocked_pid, blocking.pid AS blocking_pid,
|
|
167
|
+
blocked.query AS blocked_query, blocking.query AS blocking_query
|
|
168
|
+
FROM pg_stat_activity blocked
|
|
169
|
+
JOIN pg_locks bl ON bl.pid = blocked.pid AND NOT bl.granted
|
|
170
|
+
JOIN pg_locks gl ON gl.locktype = bl.locktype
|
|
171
|
+
AND gl.database IS NOT DISTINCT FROM bl.database
|
|
172
|
+
AND gl.relation IS NOT DISTINCT FROM bl.relation AND gl.granted
|
|
173
|
+
JOIN pg_stat_activity blocking ON blocking.pid = gl.pid;
|
|
174
|
+
|
|
175
|
+
-- Replication lag on the primary (seconds behind per standby)
|
|
176
|
+
SELECT client_addr, state, replay_lag FROM pg_stat_replication;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Set guardrails globally so a single runaway query or leaked transaction cannot take the cluster down:
|
|
180
|
+
|
|
181
|
+
```sql
|
|
182
|
+
ALTER SYSTEM SET statement_timeout = '30s';
|
|
183
|
+
ALTER SYSTEM SET idle_in_transaction_session_timeout = '60s'; -- kill txns that pin snapshots
|
|
184
|
+
SELECT pg_reload_conf();
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Declarative partitioning
|
|
188
|
+
|
|
189
|
+
Split one logical table into physical partitions by a key — almost always `RANGE` on a timestamp for
|
|
190
|
+
time-series. The win is fast bulk drop of old data (`DETACH` + `DROP`, no row-by-row delete) and
|
|
191
|
+
partition pruning that skips irrelevant partitions at plan time.
|
|
192
|
+
|
|
193
|
+
```sql
|
|
194
|
+
CREATE TABLE events (
|
|
195
|
+
id bigint GENERATED ALWAYS AS IDENTITY,
|
|
196
|
+
created_at timestamptz NOT NULL,
|
|
197
|
+
payload jsonb NOT NULL
|
|
198
|
+
) PARTITION BY RANGE (created_at);
|
|
199
|
+
|
|
200
|
+
-- one partition per month
|
|
201
|
+
CREATE TABLE events_2026_06 PARTITION OF events
|
|
202
|
+
FOR VALUES FROM ('2026-06-01') TO ('2026-07-01');
|
|
203
|
+
CREATE TABLE events_2026_07 PARTITION OF events
|
|
204
|
+
FOR VALUES FROM ('2026-07-01') TO ('2026-08-01');
|
|
205
|
+
|
|
206
|
+
-- index on the parent propagates to all partitions (PG11+)
|
|
207
|
+
CREATE INDEX ix_events_created ON events (created_at);
|
|
208
|
+
|
|
209
|
+
-- drop a month of data instantly
|
|
210
|
+
ALTER TABLE events DETACH PARTITION events_2026_06;
|
|
211
|
+
DROP TABLE events_2026_06;
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Note: the partition key must be part of the primary key / unique constraints. Automate partition
|
|
215
|
+
creation with `pg_partman` rather than hand-managing months. It **helps** for huge time-series with a
|
|
216
|
+
rolling retention window; it **hurts** small tables (pure overhead), queries that cannot prune (no
|
|
217
|
+
partition-key predicate), and schemas with thousands of partitions (planning slows). Do not partition
|
|
218
|
+
a table under ~10s of millions of rows.
|
|
219
|
+
|
|
220
|
+
## Backups & PITR
|
|
221
|
+
|
|
222
|
+
Two independent strategies — run both:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Logical: portable, per-object, restorable to a different major version. Custom format + parallel.
|
|
226
|
+
pg_dump -Fc -j4 -f appdb.dump "$DATABASE_URL"
|
|
227
|
+
pg_restore -j4 -d "$TARGET_URL" appdb.dump # parallel restore; -t orders for one table
|
|
228
|
+
|
|
229
|
+
# Physical base backup for point-in-time recovery
|
|
230
|
+
pg_basebackup -D /backups/base -Ft -z -P -h "$PGHOST" -U replicator
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
```ini
|
|
234
|
+
# postgresql.conf — continuous WAL archiving enables PITR
|
|
235
|
+
wal_level = replica
|
|
236
|
+
archive_mode = on
|
|
237
|
+
# ILLUSTRATIVE ONLY — do NOT ship this archive_command to production. Plain `cp` is not crash-safe:
|
|
238
|
+
# it does not fsync the archived file or its directory, so a crash mid-archive can silently corrupt or
|
|
239
|
+
# lose a WAL segment and break recovery. Use a tool that fsyncs and verifies — pgBackRest or wal-g
|
|
240
|
+
# (referenced below) — as the real archive_command.
|
|
241
|
+
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```ini
|
|
245
|
+
# recovery target on the restored cluster (postgresql.conf + standby.signal)
|
|
246
|
+
restore_command = 'cp /archive/%f %p'
|
|
247
|
+
recovery_target_time = '2026-06-01 09:30:00+00'
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Test restores on a schedule — a backup you have never restored is a hypothesis, not a backup. For
|
|
251
|
+
production at scale use a purpose-built tool such as `pgBackRest` or `wal-g` (parallel, incremental,
|
|
252
|
+
encrypted, crash-safe archiving with retention and verify) instead of a hand-rolled `cp`-based
|
|
253
|
+
`archive_command`.
|
|
254
|
+
|
|
255
|
+
## HA basics
|
|
256
|
+
|
|
257
|
+
Streaming replication ships WAL from a primary to one or more standbys:
|
|
258
|
+
|
|
259
|
+
- **Async** (default): low write latency, but a standby may lag and a failover can lose the last few
|
|
260
|
+
committed transactions.
|
|
261
|
+
- **Sync** (`synchronous_standby_names`): no data loss on failover, at the cost of write latency that
|
|
262
|
+
depends on the slowest synchronous standby.
|
|
263
|
+
|
|
264
|
+
Read replicas offload SELECTs but lag behind the primary, so reads that must see a just-committed write
|
|
265
|
+
(read-after-write) must go to the primary; route only lag-tolerant reads to replicas. This is not a
|
|
266
|
+
deep HA guide — use **Patroni** (or a managed equivalent) for automated failover, leader election, and
|
|
267
|
+
fencing; configure it per its docs.
|