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,130 @@
|
|
|
1
|
+
# Move semantics, value categories, and modern generics
|
|
2
|
+
|
|
3
|
+
## Value categories in one pass
|
|
4
|
+
|
|
5
|
+
Every expression has a category that decides whether it can be *moved from*:
|
|
6
|
+
|
|
7
|
+
- **lvalue** — has a name and a stable identity (`x`, `obj.field`, `*p`). Persists past the
|
|
8
|
+
expression. Binds to `T&` and `const T&`.
|
|
9
|
+
- **prvalue** — a pure temporary with no name (`42`, `make()`, `a + b`). Binds to `T&&` and `const T&`.
|
|
10
|
+
- **xvalue** — an "expiring" lvalue you've cast with `std::move(x)`; its resources may be stolen.
|
|
11
|
+
|
|
12
|
+
`std::move` is just `static_cast<T&&>` — it *moves nothing*, it only relabels an lvalue as
|
|
13
|
+
movable so an overload that steals (the move ctor/assign) is selected. After a move the source is in
|
|
14
|
+
a **valid but unspecified** state: assigning to it or destroying it is fine; reading it is a bug.
|
|
15
|
+
|
|
16
|
+
## Rule of Zero vs Rule of Five
|
|
17
|
+
|
|
18
|
+
Prefer **Rule of Zero**: hold resources in members that already manage themselves (`std::string`,
|
|
19
|
+
`std::vector`, `std::unique_ptr`) and declare *none* of the five special members. The compiler
|
|
20
|
+
generates correct copy/move/destroy for free.
|
|
21
|
+
|
|
22
|
+
Write the five **only** when you manage a raw resource by hand — and treat that as a smell first
|
|
23
|
+
(could a `unique_ptr` with a custom deleter do it?). The Rule of Five: if you declare any one of
|
|
24
|
+
destructor / copy-ctor / copy-assign / move-ctor / move-assign, declare (or `= default`/`= delete`)
|
|
25
|
+
all five, because declaring one suppresses others.
|
|
26
|
+
|
|
27
|
+
```cpp
|
|
28
|
+
// Rule of Five for a hand-managed buffer. Note: every move op is noexcept.
|
|
29
|
+
class Buffer {
|
|
30
|
+
public:
|
|
31
|
+
explicit Buffer(std::size_t n) : data_(new int[n]), size_(n) {}
|
|
32
|
+
~Buffer() { delete[] data_; }
|
|
33
|
+
|
|
34
|
+
Buffer(const Buffer& o) : data_(new int[o.size_]), size_(o.size_) {
|
|
35
|
+
std::copy(o.data_, o.data_ + size_, data_);
|
|
36
|
+
}
|
|
37
|
+
Buffer& operator=(const Buffer& o) { // copy-and-swap: strong guarantee, self-safe
|
|
38
|
+
Buffer tmp(o);
|
|
39
|
+
swap(tmp);
|
|
40
|
+
return *this;
|
|
41
|
+
}
|
|
42
|
+
Buffer(Buffer&& o) noexcept // steal, leave o empty-but-valid
|
|
43
|
+
: data_(std::exchange(o.data_, nullptr)), size_(std::exchange(o.size_, 0)) {}
|
|
44
|
+
Buffer& operator=(Buffer&& o) noexcept { Buffer tmp(std::move(o)); swap(tmp); return *this; }
|
|
45
|
+
|
|
46
|
+
void swap(Buffer& o) noexcept { std::swap(data_, o.data_); std::swap(size_, o.size_); }
|
|
47
|
+
private:
|
|
48
|
+
int* data_{};
|
|
49
|
+
std::size_t size_{};
|
|
50
|
+
};
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The equivalent Rule-of-Zero version is shorter and harder to get wrong:
|
|
54
|
+
|
|
55
|
+
```cpp
|
|
56
|
+
class Buffer {
|
|
57
|
+
public:
|
|
58
|
+
explicit Buffer(std::size_t n) : data_(n) {}
|
|
59
|
+
private:
|
|
60
|
+
std::vector<int> data_; // vector is the five special members, done correctly
|
|
61
|
+
};
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## noexcept on moves — why it's load-bearing
|
|
65
|
+
|
|
66
|
+
`std::vector` reallocation uses `move_if_noexcept`: it only *moves* its elements into the new buffer
|
|
67
|
+
when the element's move constructor is `noexcept`; otherwise it falls back to *copying* to preserve
|
|
68
|
+
the strong exception guarantee. A non-`noexcept` move ctor therefore silently turns every vector
|
|
69
|
+
growth into a deep copy. Mark move operations `noexcept` whenever they can't throw (stealing
|
|
70
|
+
pointers never throws).
|
|
71
|
+
|
|
72
|
+
## RVO and copy elision — don't fight it
|
|
73
|
+
|
|
74
|
+
```cpp
|
|
75
|
+
// Good: the local is constructed directly in the caller's slot. No copy, no move.
|
|
76
|
+
Widget make() { Widget w; configure(w); return w; }
|
|
77
|
+
|
|
78
|
+
// Bad: std::move blocks NRVO and forces an actual move that elision would have removed.
|
|
79
|
+
Widget make() { Widget w; return std::move(w); } // pessimization — drop the std::move
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Return local objects by value, plainly. Only `std::move` a *member* or *parameter* out of a function
|
|
83
|
+
(those aren't elision candidates).
|
|
84
|
+
|
|
85
|
+
## Perfect forwarding
|
|
86
|
+
|
|
87
|
+
In a function template, `T&&` is a **forwarding reference** (it binds to lvalues *and* rvalues and
|
|
88
|
+
preserves which it was). Pass it on with `std::forward<T>` so an rvalue argument stays movable and an
|
|
89
|
+
lvalue stays an lvalue:
|
|
90
|
+
|
|
91
|
+
```cpp
|
|
92
|
+
template <class T, class... Args>
|
|
93
|
+
std::unique_ptr<T> make(Args&&... args) {
|
|
94
|
+
return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); // category preserved
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Use `std::forward` *only* with a deduced `T&&`. Inside a normal function, a parameter declared `T&&`
|
|
99
|
+
where `T` is concrete is an rvalue reference, not forwarding — `std::move` it, don't `std::forward`.
|
|
100
|
+
|
|
101
|
+
## CTAD and C++20 concepts
|
|
102
|
+
|
|
103
|
+
Class Template Argument Deduction lets you omit template args when the constructor implies them:
|
|
104
|
+
|
|
105
|
+
```cpp
|
|
106
|
+
std::lock_guard lg(mtx); // deduces std::lock_guard<std::mutex>
|
|
107
|
+
std::vector v{1, 2, 3}; // deduces std::vector<int>
|
|
108
|
+
std::pair p{1, "x"}; // std::pair<int, const char*>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
C++20 **concepts** constrain templates so errors fire at the call site with a readable message
|
|
112
|
+
instead of deep inside instantiation, and they document intent:
|
|
113
|
+
|
|
114
|
+
```cpp
|
|
115
|
+
#include <concepts>
|
|
116
|
+
|
|
117
|
+
template <std::integral T> // only integers
|
|
118
|
+
T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
|
|
119
|
+
|
|
120
|
+
template <class T>
|
|
121
|
+
concept Drawable = requires(const T& t) { // a custom concept
|
|
122
|
+
{ t.draw() } -> std::same_as<void>;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
void render(const Drawable auto& shape) { shape.draw(); } // constrained abbreviated template
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Prefer a concept over `enable_if`/SFINAE for new code: same constraint power, vastly better
|
|
129
|
+
diagnostics, and it reads like a type. Combine concepts with `&&`/`||`, and use `requires` clauses
|
|
130
|
+
for ad-hoc constraints the named concepts don't cover.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Undefined behavior — catalog, sanitizers, fixes
|
|
2
|
+
|
|
3
|
+
UB is not "an error at runtime." The standard says the program has *no defined meaning*, which
|
|
4
|
+
licenses the optimizer to assume the situation never happens and rewrite code on that basis. That
|
|
5
|
+
is why UB produces distant, nonsensical crashes and "works in Debug, breaks in Release." You do not
|
|
6
|
+
debug UB by reasoning about what the CPU *did*; you remove it by construction and prove its absence
|
|
7
|
+
with sanitizers.
|
|
8
|
+
|
|
9
|
+
Static analysis (clang-tidy, cppcheck) and dynamic sanitizers catch **disjoint** bug classes — run
|
|
10
|
+
both. Sanitizers only see the paths your tests exercise, so coverage matters.
|
|
11
|
+
|
|
12
|
+
## The catalog
|
|
13
|
+
|
|
14
|
+
| Class | What it is | Caught by | Fix |
|
|
15
|
+
| --- | --- | --- | --- |
|
|
16
|
+
| Lifetime / dangling | reference or pointer to a destroyed object (returned local, dangling iterator after `push_back`, view outliving its owner) | ASan (heap/stack-use-after-scope) | return by value; own with `unique_ptr`; never store a `string_view`/`span` past its backing's lifetime |
|
|
17
|
+
| Use-after-move | reading an object after `std::move` (valid but unspecified state) | clang-tidy (`bugprone-use-after-move`) — **not** ASan | reassign before reading, or don't read it |
|
|
18
|
+
| Out-of-bounds | index/iterator past the end of a container or array | ASan | `.at()` or a bounds-checked view; range-for / ranges; never trust an external index |
|
|
19
|
+
| Signed integer overflow | `INT_MAX + 1`, etc. (UB; unsigned wraps, signed does not) | UBSan | use a wider type, check before, or `<numeric>`/`ckd_add` (C++26) overflow-checked ops |
|
|
20
|
+
| Strict aliasing | reading an object through an unrelated pointer type | UBSan (partial); compiler `-Wstrict-aliasing` | `std::bit_cast` (C++20) or `memcpy`, never a reinterpret_cast pun |
|
|
21
|
+
| Uninitialized read | reading a variable before assigning it | UBSan (MemorySanitizer for full coverage) | always initialize (`int n{};`); enable `-Wuninitialized` |
|
|
22
|
+
| Data race | two threads access the same memory, one writes, no synchronization | TSan | a mutex/`scoped_lock`, `atomic<T>`, or don't share mutable state |
|
|
23
|
+
| Null / misaligned deref | dereferencing `nullptr` or a misaligned pointer | UBSan | check before deref; references can't be null — prefer them |
|
|
24
|
+
| Invalid downcast / enum | `static_cast` to the wrong dynamic type; out-of-range enum value | UBSan (`vptr`, `enum`) | `dynamic_cast` when polymorphic; validate enum inputs |
|
|
25
|
+
|
|
26
|
+
## Sanitizer flag combinations & caveats
|
|
27
|
+
|
|
28
|
+
- **ASan + UBSan together:** `-fsanitize=address,undefined -fno-omit-frame-pointer -g`. This is the
|
|
29
|
+
everyday build for tests and the local gate. Add `-fsanitize=integer` (Clang) to extend UBSan to
|
|
30
|
+
unsigned wraparound you care about.
|
|
31
|
+
- **TSan alone:** `-fsanitize=thread -g`. It is **incompatible** with ASan — never combine them. Run
|
|
32
|
+
it as a separate build/CI job over your concurrent tests.
|
|
33
|
+
- **MemorySanitizer** (Clang) for uninitialized reads needs *all* code (including libc++)
|
|
34
|
+
instrumented; usually overkill — `-Wuninitialized` + always-initialize covers most cases.
|
|
35
|
+
- Sanitizers slow execution ~2–10x and need `-g` and frame pointers for readable stacks. They are a
|
|
36
|
+
test/CI tool, not a production build.
|
|
37
|
+
- Tune at runtime via env: `ASAN_OPTIONS=detect_leaks=1:abort_on_error=1`,
|
|
38
|
+
`UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1`.
|
|
39
|
+
|
|
40
|
+
## Worked fixes
|
|
41
|
+
|
|
42
|
+
```cpp
|
|
43
|
+
// Dangling reference (ASan: stack-use-after-return).
|
|
44
|
+
const std::string& bad() { std::string s = make(); return s; } // s dies at the brace
|
|
45
|
+
std::string good() { return make(); } // by value; RVO elides the copy
|
|
46
|
+
|
|
47
|
+
// Iterator invalidation (ASan: heap-use-after-free).
|
|
48
|
+
for (auto it = v.begin(); it != v.end(); ++it)
|
|
49
|
+
if (*it == x) v.push_back(*it); // Bad: push_back may realloc, it now dangles
|
|
50
|
+
auto n = std::ranges::count(v, x); // Good: compute first, then mutate
|
|
51
|
+
|
|
52
|
+
// Signed overflow (UBSan: signed-integer-overflow).
|
|
53
|
+
int total = a + b; // Bad if a+b > INT_MAX
|
|
54
|
+
auto total = std::int64_t{a} + b; // Good: widen before the add
|
|
55
|
+
|
|
56
|
+
// Strict aliasing (type pun).
|
|
57
|
+
float f = *reinterpret_cast<float*>(&i); // Bad: UB
|
|
58
|
+
auto f = std::bit_cast<float>(i); // Good: C++20, defined
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Reading an ASan report
|
|
62
|
+
|
|
63
|
+
A typical use-after-free report has three stacks — read them bottom-up by *event*:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
==12345==ERROR: AddressSanitizer: heap-use-after-free on address 0x602...
|
|
67
|
+
READ of size 4 at 0x602... thread T0
|
|
68
|
+
#0 0x... in Cache::get(int) src/cache.cpp:42 <- where the bad access happened
|
|
69
|
+
...
|
|
70
|
+
0x602... is located 0 bytes inside of 4-byte region [0x602..,0x602..)
|
|
71
|
+
freed by thread T0 here: <- who freed it (the delete/dtor)
|
|
72
|
+
#0 0x... operator delete(void*)
|
|
73
|
+
#1 0x... in Cache::evict(int) src/cache.cpp:31
|
|
74
|
+
previously allocated by thread T0 here: <- who allocated it
|
|
75
|
+
#0 0x... operator new(unsigned long)
|
|
76
|
+
#1 0x... in Cache::put(int,int) src/cache.cpp:18
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Procedure: (1) the top READ/WRITE frame is the *symptom* line; (2) "freed by" is the line that ended
|
|
80
|
+
the object's life too early; (3) "previously allocated" is its birth. The bug is almost always that
|
|
81
|
+
the "freed by" path runs while a pointer/reference/iterator captured between allocation and the
|
|
82
|
+
symptom is still in use. The fix is an ownership fix — usually replacing the raw owning pointer with
|
|
83
|
+
a `unique_ptr`/`shared_ptr` so the lifetime can't be cut short, or extending the owner's scope.
|
|
84
|
+
|
|
85
|
+
For data races, TSan prints the two conflicting accesses (read/write) with both stacks and the thread
|
|
86
|
+
that created each; the fix is a single mutex/`scoped_lock` or an `atomic<T>` guarding that memory.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# verify.sh - local quality gate for a CMake C++ project (superset of CI).
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# cd <your-project-root> # the directory containing CMakeLists.txt
|
|
7
|
+
# ./verify.sh
|
|
8
|
+
#
|
|
9
|
+
# Runs: clang-format (dry-run), a CMake configure+build with warnings-as-errors and
|
|
10
|
+
# ASan+UBSan, the test target via ctest, and optional clang-tidy + cppcheck.
|
|
11
|
+
# Tools that are not installed are skipped with a yellow warning (not a failure).
|
|
12
|
+
# Real problems (format drift, build failure, sanitizer abort, test failure) exit non-zero.
|
|
13
|
+
# Read-only: never mutates your source. Only writes under build/verify/.
|
|
14
|
+
#
|
|
15
|
+
# Portability: runs on stock macOS bash 3.2 (no mapfile, no associative arrays,
|
|
16
|
+
# no unguarded array expansions under `set -u`).
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
# Colors only when stdout is a TTY (keeps logs/CI output clean).
|
|
21
|
+
if [ -t 1 ]; then
|
|
22
|
+
YELLOW=$'\033[33m'; RED=$'\033[31m'; GREEN=$'\033[32m'; RESET=$'\033[0m'
|
|
23
|
+
else
|
|
24
|
+
YELLOW=''; RED=''; GREEN=''; RESET=''
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
failed=0
|
|
28
|
+
BUILD_DIR="build/verify"
|
|
29
|
+
|
|
30
|
+
have() { command -v "$1" >/dev/null 2>&1; }
|
|
31
|
+
warn() { printf '%s[skip]%s %s\n' "$YELLOW" "$RESET" "$*"; }
|
|
32
|
+
fail() { printf '%s[fail]%s %s\n' "$RED" "$RESET" "$*"; failed=1; }
|
|
33
|
+
ok() { printf '%s[ ok ]%s %s\n' "$GREEN" "$RESET" "$*"; }
|
|
34
|
+
info() { printf -- '----- %s\n' "$*"; }
|
|
35
|
+
|
|
36
|
+
# Must run from a CMake project root.
|
|
37
|
+
if [ ! -f CMakeLists.txt ]; then
|
|
38
|
+
printf '%serror:%s no CMakeLists.txt in %s - cd into your project root first.\n' \
|
|
39
|
+
"$RED" "$RESET" "$(pwd)" >&2
|
|
40
|
+
exit 2
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Collect tracked C/C++ sources (git if available, else find). Read-only.
|
|
44
|
+
collect_sources() {
|
|
45
|
+
if have git && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
46
|
+
git ls-files '*.cpp' '*.cc' '*.cxx' '*.hpp' '*.hh' '*.hxx' '*.h' '*.ixx' 2>/dev/null
|
|
47
|
+
else
|
|
48
|
+
find . -path ./"$BUILD_DIR" -prune -o -type f \
|
|
49
|
+
\( -name '*.cpp' -o -name '*.cc' -o -name '*.cxx' \
|
|
50
|
+
-o -name '*.hpp' -o -name '*.hh' -o -name '*.hxx' \
|
|
51
|
+
-o -name '*.h' -o -name '*.ixx' \) -print 2>/dev/null
|
|
52
|
+
fi
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# 1. clang-format - dry-run, never rewrites. Empty source set is a clean pass.
|
|
56
|
+
info "clang-format"
|
|
57
|
+
if have clang-format; then
|
|
58
|
+
srcs="$(collect_sources)"
|
|
59
|
+
if [ -z "$srcs" ]; then
|
|
60
|
+
ok "no C/C++ sources to format"
|
|
61
|
+
else
|
|
62
|
+
fmt_failed=0
|
|
63
|
+
# -Werror + --dry-run makes clang-format exit non-zero on any drift, printing nothing else.
|
|
64
|
+
printf '%s\n' "$srcs" | while IFS= read -r f; do
|
|
65
|
+
[ -n "$f" ] || continue
|
|
66
|
+
clang-format --dry-run -Werror "$f" >/dev/null 2>&1 || printf '%s\n' "$f"
|
|
67
|
+
done > "${TMPDIR:-/tmp}/cpp_verify_fmt.$$" || true
|
|
68
|
+
if [ -s "${TMPDIR:-/tmp}/cpp_verify_fmt.$$" ]; then
|
|
69
|
+
fmt_failed=1
|
|
70
|
+
fail "files need formatting (run: clang-format -i <file>):"
|
|
71
|
+
cat "${TMPDIR:-/tmp}/cpp_verify_fmt.$$"
|
|
72
|
+
fi
|
|
73
|
+
rm -f "${TMPDIR:-/tmp}/cpp_verify_fmt.$$"
|
|
74
|
+
[ "$fmt_failed" -eq 0 ] && ok "clang-format clean"
|
|
75
|
+
fi
|
|
76
|
+
else
|
|
77
|
+
warn "clang-format not found (https://clang.llvm.org/docs/ClangFormat.html)"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# 2-4. CMake configure + build under warnings-as-errors + ASan+UBSan, then ctest.
|
|
81
|
+
info "cmake configure (ASan+UBSan, warnings-as-errors)"
|
|
82
|
+
if have cmake; then
|
|
83
|
+
SAN_FLAGS="-fsanitize=address,undefined -fno-omit-frame-pointer -g -Werror"
|
|
84
|
+
if cmake -S . -B "$BUILD_DIR" \
|
|
85
|
+
-DCMAKE_BUILD_TYPE=Debug \
|
|
86
|
+
-DCMAKE_CXX_FLAGS="$SAN_FLAGS" \
|
|
87
|
+
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON >/dev/null 2>&1; then
|
|
88
|
+
ok "configured ($BUILD_DIR)"
|
|
89
|
+
|
|
90
|
+
info "cmake build"
|
|
91
|
+
if cmake --build "$BUILD_DIR" >/dev/null 2>&1; then
|
|
92
|
+
ok "build clean (warnings-as-errors)"
|
|
93
|
+
|
|
94
|
+
info "ctest"
|
|
95
|
+
if have ctest; then
|
|
96
|
+
# ctest exits non-zero with "No tests were found" when there are none; treat that as a skip.
|
|
97
|
+
ctest_out="$(ctest --test-dir "$BUILD_DIR" --output-on-failure 2>&1 || true)"
|
|
98
|
+
if printf '%s' "$ctest_out" | grep -qi 'no tests were found'; then
|
|
99
|
+
warn "no tests registered with ctest"
|
|
100
|
+
elif printf '%s' "$ctest_out" | grep -qiE 'tests failed|failed out of|errors? while'; then
|
|
101
|
+
fail "ctest reported failures"
|
|
102
|
+
printf '%s\n' "$ctest_out"
|
|
103
|
+
else
|
|
104
|
+
ok "tests pass (ASan+UBSan)"
|
|
105
|
+
fi
|
|
106
|
+
else
|
|
107
|
+
warn "ctest not found (ships with CMake)"
|
|
108
|
+
fi
|
|
109
|
+
else
|
|
110
|
+
fail "build failed (warnings-as-errors / sanitizer compile error)"
|
|
111
|
+
fi
|
|
112
|
+
else
|
|
113
|
+
fail "cmake configure failed"
|
|
114
|
+
fi
|
|
115
|
+
else
|
|
116
|
+
warn "cmake not found - cannot build/test (https://cmake.org/download/)"
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
# 5. clang-tidy - optional; reads compile_commands.json from the build dir.
|
|
120
|
+
info "clang-tidy"
|
|
121
|
+
if have clang-tidy && [ -f "$BUILD_DIR/compile_commands.json" ]; then
|
|
122
|
+
srcs="$(collect_sources | grep -E '\.(cpp|cc|cxx)$' || true)"
|
|
123
|
+
if [ -z "$srcs" ]; then
|
|
124
|
+
warn "no translation units for clang-tidy"
|
|
125
|
+
else
|
|
126
|
+
tidy_failed=0
|
|
127
|
+
printf '%s\n' "$srcs" | while IFS= read -r f; do
|
|
128
|
+
[ -n "$f" ] || continue
|
|
129
|
+
clang-tidy -p "$BUILD_DIR" "$f" >/dev/null 2>&1 || printf '%s\n' "$f"
|
|
130
|
+
done > "${TMPDIR:-/tmp}/cpp_verify_tidy.$$" || true
|
|
131
|
+
if [ -s "${TMPDIR:-/tmp}/cpp_verify_tidy.$$" ]; then
|
|
132
|
+
tidy_failed=1
|
|
133
|
+
fail "clang-tidy reported issues in:"
|
|
134
|
+
cat "${TMPDIR:-/tmp}/cpp_verify_tidy.$$"
|
|
135
|
+
fi
|
|
136
|
+
rm -f "${TMPDIR:-/tmp}/cpp_verify_tidy.$$"
|
|
137
|
+
[ "$tidy_failed" -eq 0 ] && ok "clang-tidy clean"
|
|
138
|
+
fi
|
|
139
|
+
else
|
|
140
|
+
warn "clang-tidy not found or no compile_commands.json (optional)"
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
# 6. cppcheck - optional static analysis.
|
|
144
|
+
info "cppcheck"
|
|
145
|
+
if have cppcheck; then
|
|
146
|
+
if [ -f "$BUILD_DIR/compile_commands.json" ]; then
|
|
147
|
+
if cppcheck --enable=warning,performance --error-exitcode=1 \
|
|
148
|
+
--project="$BUILD_DIR/compile_commands.json" >/dev/null 2>&1; then
|
|
149
|
+
ok "cppcheck clean"
|
|
150
|
+
else
|
|
151
|
+
fail "cppcheck reported issues"
|
|
152
|
+
fi
|
|
153
|
+
else
|
|
154
|
+
warn "cppcheck: no compile_commands.json to analyze"
|
|
155
|
+
fi
|
|
156
|
+
else
|
|
157
|
+
warn "cppcheck not found (optional)"
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
echo
|
|
161
|
+
if [ "$failed" -ne 0 ]; then
|
|
162
|
+
printf '%sFAIL:%s one or more checks failed.\n' "$RED" "$RESET"
|
|
163
|
+
exit 1
|
|
164
|
+
fi
|
|
165
|
+
printf '%sPASS:%s all checks passed.\n' "$GREEN" "$RESET"
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: csharp-dotnet
|
|
3
|
+
description: "Use when writing, reviewing, testing, or shipping C# / .NET code, ASP.NET Core APIs, or EF Core data access — editing .cs/.csproj/.sln files, designing minimal APIs vs controllers, fixing async correctness, or structuring a dotnet solution. Triggers: 'build a .NET API', 'is this idiomatic C#', 'should this DTO be a record', 'my endpoint hangs/deadlocks under load' (sync-over-async), 'EF query hits the DB once per row' (N+1), 'set up xUnit + WebApplicationFactory', 'crea una API en .NET', 'revisa este código C# antes de hacer deploy'. NOT a Java/Spring backend (that is spring-boot), NOT a Node/TypeScript backend (that is nestjs)."
|
|
4
|
+
tags: [csharp, dotnet, aspnetcore, efcore, async]
|
|
5
|
+
recommends: [postgresdb, secure-coding, deployment]
|
|
6
|
+
origin: risco
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Modern C# and .NET services
|
|
10
|
+
|
|
11
|
+
You write and review C#, ASP.NET Core APIs, and EF Core data access. You own the
|
|
12
|
+
.NET idioms, the HTTP-contract patterns *as expressed in .NET*, async correctness,
|
|
13
|
+
and the .NET-specific quality/security gates. You delegate everything language-
|
|
14
|
+
agnostic to the right sibling.
|
|
15
|
+
|
|
16
|
+
**Target: .NET 10 (LTS, released 2025-11-11, supported 3 years) with C# 14, EF Core
|
|
17
|
+
10, ASP.NET Core 10.** .NET 9 / C# 13 is the immediate STS predecessor — still in
|
|
18
|
+
support but shorter-lived. Features gate on the target framework moniker (TFM): a
|
|
19
|
+
`net10.0` project gets C# 14 by default; a `net9.0` project caps at C# 13. When you
|
|
20
|
+
use a C# 14 feature (`field`, extension members, null-conditional assignment), say
|
|
21
|
+
which TFM it requires.
|
|
22
|
+
|
|
23
|
+
## When to use
|
|
24
|
+
|
|
25
|
+
- Authoring/reviewing/refactoring any `.cs`, `.csproj`, or `.sln`.
|
|
26
|
+
- ASP.NET Core: minimal APIs vs controllers, route groups, endpoint filters,
|
|
27
|
+
validation, ProblemDetails, OpenAPI.
|
|
28
|
+
- EF Core: `DbContext` design, LINQ queries, migrations, tracking, N+1.
|
|
29
|
+
- async/await correctness: `CancellationToken` plumbing, `async void`, deadlocks,
|
|
30
|
+
`IAsyncEnumerable`, `ValueTask`.
|
|
31
|
+
- `dotnet` CLI workflow, solution layout, NuGet, central package management.
|
|
32
|
+
- Idiom review: records, pattern matching, nullable reference types (NRT).
|
|
33
|
+
|
|
34
|
+
## When NOT to use — delegate
|
|
35
|
+
|
|
36
|
+
| Situation | Route to |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Java / Spring Boot backend | `spring-boot` |
|
|
39
|
+
| Node / NestJS TypeScript backend | `nestjs` |
|
|
40
|
+
| Language-agnostic threat modeling, OWASP authz/abuse review | `../secure-coding/SKILL.md` |
|
|
41
|
+
| Raw Postgres schema/index/query tuning | `../postgresdb/SKILL.md` |
|
|
42
|
+
| Framework-neutral REST resource taxonomy | `api-design` |
|
|
43
|
+
| Dockerfile / CI pipeline / deploy target | `../deployment/SKILL.md` |
|
|
44
|
+
| Recording per-project conventions in the workspace wiki | `../harness/SKILL.md` |
|
|
45
|
+
|
|
46
|
+
The .NET *expression* of an API contract and async correctness live HERE. Resource
|
|
47
|
+
naming theory lives in `api-design`; the JVM and Node counterparts are `spring-boot`
|
|
48
|
+
and `nestjs`. Only `secure-coding`, `postgresdb`, `deployment`, and `harness` exist on
|
|
49
|
+
disk as siblings, so only those are linked as `../<id>/SKILL.md`.
|
|
50
|
+
|
|
51
|
+
## Decision rules — apply on every C# edit
|
|
52
|
+
|
|
53
|
+
1. **NRT on.** `<Nullable>enable</Nullable>` in the csproj. Why: the compiler turns
|
|
54
|
+
whole classes of `NullReferenceException` into build-time warnings. Never disable it
|
|
55
|
+
to silence a warning — fix the nullability.
|
|
56
|
+
2. **Async all the way, flow the token.** I/O methods are `async Task`, every call is
|
|
57
|
+
`await`ed, and a `CancellationToken` threads from the endpoint down to
|
|
58
|
+
`SaveChangesAsync`/queries/HTTP calls. Why: a dropped token means requests keep
|
|
59
|
+
running after the client gives up.
|
|
60
|
+
3. **Records for DTOs and immutable data.** `public record ProductDto(int Id, string Name);`.
|
|
61
|
+
Why: value equality + `with` expressions + concise; never reuse an EF entity as the
|
|
62
|
+
wire DTO (see anti-patterns).
|
|
63
|
+
4. **Parameterize every query.** EF LINQ and `FromSql` interpolation parameterize for
|
|
64
|
+
you; never string-concatenate SQL. Why: SQL injection.
|
|
65
|
+
5. **Deterministic disposal.** `using`/`await using` (or `using` declarations) for
|
|
66
|
+
anything `IDisposable`/`IAsyncDisposable`. Why: leaked connections/handles.
|
|
67
|
+
6. **One `DbContext` per request (scoped).** Why: `DbContext` is not thread-safe;
|
|
68
|
+
sharing across requests corrupts change tracking.
|
|
69
|
+
7. **Minimal APIs for new services** unless you need MVC features (views, model
|
|
70
|
+
binders, action filters at scale). Why: less ceremony, first-class in .NET 10.
|
|
71
|
+
|
|
72
|
+
## Project & solution layout + dotnet CLI
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
dotnet new sln -n Shop # solution
|
|
76
|
+
dotnet new webapi -n Shop.Api # minimal API (default in .NET 10)
|
|
77
|
+
dotnet new webapi -n Shop.Api --use-controllers # opt into MVC controllers instead
|
|
78
|
+
dotnet new xunit -n Shop.Api.Tests # test project
|
|
79
|
+
dotnet sln add Shop.Api Shop.Api.Tests # wire into the solution
|
|
80
|
+
dotnet add Shop.Api package Npgsql.EntityFrameworkCore.PostgreSQL
|
|
81
|
+
dotnet ef migrations add Initial -p Shop.Api # create a migration
|
|
82
|
+
dotnet ef database update -p Shop.Api # apply migrations
|
|
83
|
+
dotnet build -warnaserror # compile; analyzers + NRT as errors
|
|
84
|
+
dotnet test # run tests
|
|
85
|
+
dotnet format # apply style; --verify-no-changes in CI
|
|
86
|
+
dotnet publish -c Release # produce deployable output
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Recommended shape:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
Shop.sln
|
|
93
|
+
Directory.Packages.props # central package management: <PackageVersion> here, no versions in csproj
|
|
94
|
+
Directory.Build.props # shared <Nullable>enable</Nullable>, <TreatWarningsAsErrors>, LangVersion
|
|
95
|
+
src/Shop.Api/ # endpoints grouped by feature module (Products/, Orders/)
|
|
96
|
+
src/Shop.Domain/ # entities, value objects (no EF/ASP.NET dependency)
|
|
97
|
+
tests/Shop.Api.Tests/
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Central package management: turn it on with `<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>`
|
|
101
|
+
and list versions once in `Directory.Packages.props`. Why: one source of truth, no
|
|
102
|
+
version drift across projects.
|
|
103
|
+
|
|
104
|
+
## Modern C# idioms (C# 14 / .NET 10)
|
|
105
|
+
|
|
106
|
+
DTO as a record, not a class:
|
|
107
|
+
|
|
108
|
+
```csharp
|
|
109
|
+
// Bad: mutable class, no value equality, hand-written boilerplate
|
|
110
|
+
public class ProductDto { public int Id { get; set; } public string Name { get; set; } }
|
|
111
|
+
|
|
112
|
+
// Good: immutable record DTO
|
|
113
|
+
public record ProductDto(int Id, string Name, decimal Price);
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Pattern matching over if-chains:
|
|
117
|
+
|
|
118
|
+
```csharp
|
|
119
|
+
// Bad
|
|
120
|
+
if (shape is Circle) { var c = (Circle)shape; return Math.PI * c.R * c.R; }
|
|
121
|
+
|
|
122
|
+
// Good
|
|
123
|
+
return shape switch
|
|
124
|
+
{
|
|
125
|
+
Circle c => Math.PI * c.R * c.R,
|
|
126
|
+
Rectangle r => r.W * r.H,
|
|
127
|
+
_ => throw new ArgumentOutOfRangeException(nameof(shape)),
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`field` keyword — field-backed property without a hand-written backing field
|
|
132
|
+
(**requires C# 14 / net10.0**):
|
|
133
|
+
|
|
134
|
+
```csharp
|
|
135
|
+
// Bad: explicit backing field just to trim a string
|
|
136
|
+
private string _name = "";
|
|
137
|
+
public string Name { get => _name; set => _name = value.Trim(); }
|
|
138
|
+
|
|
139
|
+
// Good (C# 14)
|
|
140
|
+
public string Name { get; set => field = value.Trim(); }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Primary constructors, `required`/`init`, collection expressions:
|
|
144
|
+
|
|
145
|
+
```csharp
|
|
146
|
+
public class OrderService(IOrderRepository repo, ILogger<OrderService> log) // primary ctor: DI in one line
|
|
147
|
+
{
|
|
148
|
+
public required string Region { get; init; } // must be set at construction, then immutable
|
|
149
|
+
private static readonly int[] DefaultTiers = [1, 2, 3]; // collection expression
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Prefer NRT annotations over defensive null checks: declare `string? note` when null is
|
|
154
|
+
valid and let the compiler force callers to handle it, instead of `if (x == null)`
|
|
155
|
+
guards scattered everywhere.
|
|
156
|
+
|
|
157
|
+
## async/await correctness
|
|
158
|
+
|
|
159
|
+
This is the highest-leverage area to get right. Core rules in body; the full catalog
|
|
160
|
+
(ConfigureAwait, ValueTask, IAsyncEnumerable, Channels, parallelism, deadlock cases)
|
|
161
|
+
is in **references/async.md** — read it before any non-trivial async review.
|
|
162
|
+
|
|
163
|
+
- **No `async void`** except top-level event handlers. Why: exceptions escape onto the
|
|
164
|
+
thread pool and crash the process; the caller cannot `await` or catch it. Use `async Task`.
|
|
165
|
+
- **Never `.Result` / `.Wait()` / `GetAwaiter().GetResult()` on the request path.** This
|
|
166
|
+
is the classic deadlock and the answer to "my endpoint hangs under load":
|
|
167
|
+
|
|
168
|
+
```csharp
|
|
169
|
+
// Bad: blocks the thread on an async call -> thread-pool starvation / deadlock under load
|
|
170
|
+
public IActionResult Get() => Ok(_svc.LoadAsync().Result);
|
|
171
|
+
|
|
172
|
+
// Good: await all the way up
|
|
173
|
+
public async Task<IActionResult> Get(CancellationToken ct) => Ok(await _svc.LoadAsync(ct));
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
- **Flow `CancellationToken`** from the endpoint into every async call.
|
|
177
|
+
- **`ValueTask` only for hot paths** that usually complete synchronously; default to
|
|
178
|
+
`Task`. Never `await` a `ValueTask` twice.
|
|
179
|
+
- **`IAsyncEnumerable<T>` for streaming** results instead of materializing a huge list.
|
|
180
|
+
|
|
181
|
+
## ASP.NET Core APIs
|
|
182
|
+
|
|
183
|
+
Decision: **minimal API** for new services; **controllers** only when you need MVC
|
|
184
|
+
machinery (model binding conventions, action filters at scale, views). Both can coexist.
|
|
185
|
+
|
|
186
|
+
Production minimal API shape — route group + DataAnnotations validation (built in for
|
|
187
|
+
minimal API parameters in .NET 10) + ProblemDetails + OpenAPI 3.1:
|
|
188
|
+
|
|
189
|
+
```csharp
|
|
190
|
+
var builder = WebApplication.CreateBuilder(args);
|
|
191
|
+
builder.Services.AddOpenApi(); // OpenAPI 3.1, JSON Schema 2020-12
|
|
192
|
+
builder.Services.AddProblemDetails(); // RFC 9457 error bodies
|
|
193
|
+
builder.Services.AddDbContext<ShopDb>(o => o.UseNpgsql(builder.Configuration.GetConnectionString("Shop")));
|
|
194
|
+
|
|
195
|
+
var app = builder.Build();
|
|
196
|
+
app.MapOpenApi(); // serves the OpenAPI document
|
|
197
|
+
app.UseExceptionHandler(); // emits ProblemDetails on unhandled errors
|
|
198
|
+
|
|
199
|
+
var products = app.MapGroup("/products").WithTags("Products");
|
|
200
|
+
products.MapGet("/{id:int}", async (int id, ShopDb db, CancellationToken ct) =>
|
|
201
|
+
await db.Products.AsNoTracking()
|
|
202
|
+
.Where(p => p.Id == id)
|
|
203
|
+
.Select(p => new ProductDto(p.Id, p.Name, p.Price)) // project to DTO, no entity leak
|
|
204
|
+
.FirstOrDefaultAsync(ct) is { } dto
|
|
205
|
+
? Results.Ok(dto)
|
|
206
|
+
: Results.NotFound());
|
|
207
|
+
products.MapPost("/", async (CreateProduct req, ShopDb db, CancellationToken ct) =>
|
|
208
|
+
{ // DataAnnotations on CreateProduct are validated automatically in .NET 10
|
|
209
|
+
var entity = new Product { Name = req.Name, Price = req.Price };
|
|
210
|
+
db.Products.Add(entity);
|
|
211
|
+
await db.SaveChangesAsync(ct);
|
|
212
|
+
return Results.Created($"/products/{entity.Id}", new ProductDto(entity.Id, entity.Name, entity.Price));
|
|
213
|
+
});
|
|
214
|
+
app.Run();
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
DI lifetimes: `Singleton` (one for the app), `Scoped` (one per request — `DbContext`
|
|
218
|
+
lives here), `Transient` (new each resolve). Never inject a `Scoped` service into a
|
|
219
|
+
`Singleton` (captive dependency — see anti-patterns). Middleware ordering, endpoint
|
|
220
|
+
filters, the options pattern, and auth defaults are in **references/aspnetcore.md**.
|
|
221
|
+
|
|
222
|
+
## EF Core 10
|
|
223
|
+
|
|
224
|
+
```csharp
|
|
225
|
+
// Bad: tracking + N+1 — loads orders, then one query per order's customer
|
|
226
|
+
var orders = await db.Orders.ToListAsync(ct);
|
|
227
|
+
foreach (var o in orders) { var name = o.Customer.Name; /* lazy/round-trip per row */ }
|
|
228
|
+
|
|
229
|
+
// Good: no-tracking read + single query via projection
|
|
230
|
+
var rows = await db.Orders.AsNoTracking()
|
|
231
|
+
.Select(o => new OrderRow(o.Id, o.Customer.Name)) // EF translates to one JOIN
|
|
232
|
+
.ToListAsync(ct);
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
- `AsNoTracking()` on every read-only query — skips change-tracking overhead.
|
|
236
|
+
- Kill N+1 with projection (`Select`) or `Include`/`ThenInclude`; use `AsSplitQuery()`
|
|
237
|
+
when an `Include` cartesian explosion hurts.
|
|
238
|
+
- Migrations: `dotnet ef migrations add <Name>` then review the generated `Up`/`Down`
|
|
239
|
+
before `database update`. Never hand-edit applied migrations.
|
|
240
|
+
- EF Core 10 highlights: native `json` column type, `vector` type + `VECTOR_DISTANCE()`
|
|
241
|
+
for embeddings/RAG, `LeftJoin`/`RightJoin` LINQ operators, and named query filters
|
|
242
|
+
(multiple filters per entity, selectively disabled).
|
|
243
|
+
|
|
244
|
+
Raw SQL only via parameterized `FromSql`/`ExecuteSql` interpolated strings (EF
|
|
245
|
+
parameterizes the holes). Query patterns, migration workflow, the EF Core 10 features,
|
|
246
|
+
and raw-SQL safety in full are in **references/efcore.md**. Schema/index tuning is
|
|
247
|
+
`../postgresdb/SKILL.md`.
|
|
248
|
+
|
|
249
|
+
## .NET security controls
|
|
250
|
+
|
|
251
|
+
Keep only the .NET-specific controls here; threat modeling and OWASP review go to
|
|
252
|
+
`../secure-coding/SKILL.md`.
|
|
253
|
+
|
|
254
|
+
- **Parameterized data access** — EF LINQ / parameterized `FromSql` / ADO.NET
|
|
255
|
+
`SqlParameter`. Never concatenate user input into SQL.
|
|
256
|
+
- **Secrets** — `dotnet user-secrets` in dev, Key Vault / environment in prod. Never in
|
|
257
|
+
`appsettings.json` or source.
|
|
258
|
+
- **Antiforgery** for cookie-auth browser POSTs; **Data Protection** for cookies/tokens
|
|
259
|
+
(configure a persisted key ring across instances).
|
|
260
|
+
- **Auth defaults** — authenticate then authorize via middleware; prefer policy-based
|
|
261
|
+
authorization; ASP.NET Core 10 is secure-by-default but still verify HTTPS redirection
|
|
262
|
+
and HSTS in production.
|
|
263
|
+
|
|
264
|
+
## Testing
|
|
265
|
+
|
|
266
|
+
- **xUnit** is the default. Unit-test domain logic with no framework dependency.
|
|
267
|
+
- **Integration tests** via `WebApplicationFactory<Program>` — boots the real pipeline
|
|
268
|
+
in-memory and lets you `HttpClient` your endpoints.
|
|
269
|
+
- **Testcontainers** to run a real Postgres in a container for EF integration tests
|
|
270
|
+
instead of the in-memory provider (which lies about relational behavior).
|
|
271
|
+
- Gate everything with `scripts/verify.sh` (format + build-warnaserror + test + vuln scan).
|
|
272
|
+
|
|
273
|
+
## Anti-patterns
|
|
274
|
+
|
|
275
|
+
| Anti-pattern | Why it bites | Do instead |
|
|
276
|
+
|---|---|---|
|
|
277
|
+
| `async void` (non-event-handler) | Exceptions crash the process; uncatchable by caller | `async Task` |
|
|
278
|
+
| `.Result` / `.Wait()` on request path | Deadlock / thread-pool starvation under load | `await` all the way |
|
|
279
|
+
| Scoped service injected into a Singleton | Captive dependency: stale/`DbContext` reused across requests | Inject `IServiceScopeFactory`, or make the consumer scoped |
|
|
280
|
+
| Reusing an EF entity as the wire DTO | Over-posting, serialization cycles, leaked columns | Separate `record` DTO + mapping |
|
|
281
|
+
| Tracking queries on read-only reads | Wasted memory/CPU on change tracking | `AsNoTracking()` |
|
|
282
|
+
| Lazy navigation in a loop | N+1 round-trips | Projection or `Include` |
|
|
283
|
+
| Missing `CancellationToken` | Work continues after client disconnects | Flow the token to all I/O |
|
|
284
|
+
| `catch (Exception) { }` swallow | Hides failures; corrupt state continues | Handle specifically or let `UseExceptionHandler` map it |
|
|
285
|
+
| `<Nullable>disable</Nullable>` to mute a warning | Re-opens the NRE class of bugs | Keep NRT on; fix the nullability |
|
|
286
|
+
|
|
287
|
+
## Project grounding
|
|
288
|
+
|
|
289
|
+
Record per-project conventions (target TFM, package manager, lint rules, deploy
|
|
290
|
+
target) in the workspace wiki via `../harness/SKILL.md`, not inline assumptions. Before
|
|
291
|
+
calling a C# change done, run `scripts/verify.sh` from the solution/project root.
|