cfsa-antigravity 1.0.0
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/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: elasticsearch
|
|
3
|
+
description: "Expert Elasticsearch guide covering index design (mappings, analyzers, sharding), query DSL (full-text, filters, aggregations, fuzzy), indexing patterns (bulk API, ingest pipelines), performance (query profiling, caching, segment management), and operational best practices. Use when building search features, log analytics, or autocomplete with Elasticsearch or OpenSearch."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Elasticsearch Expert Guide
|
|
8
|
+
|
|
9
|
+
> Use this skill when building full-text search, autocomplete, log analytics, or faceted navigation with Elasticsearch (8.x) or OpenSearch.
|
|
10
|
+
|
|
11
|
+
## When to Use This Skill
|
|
12
|
+
|
|
13
|
+
- Building search features (product search, site search, document search)
|
|
14
|
+
- Implementing autocomplete / search-as-you-type
|
|
15
|
+
- Log analytics and aggregation dashboards
|
|
16
|
+
- Faceted navigation with filters and counts
|
|
17
|
+
- Geo-spatial search
|
|
18
|
+
|
|
19
|
+
## When NOT to Use This Skill
|
|
20
|
+
|
|
21
|
+
- Primary database → use PostgreSQL or MongoDB
|
|
22
|
+
- Simple key-value lookups → use Redis
|
|
23
|
+
- Vector similarity search → use a vector DB (Qdrant, Pinecone)
|
|
24
|
+
- Small dataset (<100K docs) with basic search → PostgreSQL full-text may suffice
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 1. Index Design (CRITICAL)
|
|
29
|
+
|
|
30
|
+
### Mapping
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"mappings": {
|
|
35
|
+
"properties": {
|
|
36
|
+
"title": {
|
|
37
|
+
"type": "text",
|
|
38
|
+
"analyzer": "english",
|
|
39
|
+
"fields": {
|
|
40
|
+
"keyword": { "type": "keyword" },
|
|
41
|
+
"autocomplete": {
|
|
42
|
+
"type": "text",
|
|
43
|
+
"analyzer": "autocomplete_analyzer"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"description": { "type": "text", "analyzer": "english" },
|
|
48
|
+
"price": { "type": "scaled_float", "scaling_factor": 100 },
|
|
49
|
+
"category": { "type": "keyword" },
|
|
50
|
+
"tags": { "type": "keyword" },
|
|
51
|
+
"created_at": { "type": "date" },
|
|
52
|
+
"location": { "type": "geo_point" },
|
|
53
|
+
"in_stock": { "type": "boolean" }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Field Type Selection
|
|
60
|
+
|
|
61
|
+
| Data | Type | When |
|
|
62
|
+
|------|------|------|
|
|
63
|
+
| Full-text search | `text` | Search with relevance scoring |
|
|
64
|
+
| Exact match / filter / sort | `keyword` | Enums, IDs, tags, status |
|
|
65
|
+
| Both search + filter | Multi-field (`text` + `.keyword`) | Title, name |
|
|
66
|
+
| Numbers | `integer`, `long`, `scaled_float` | Prices, counts |
|
|
67
|
+
| Dates | `date` | Timestamps, created_at |
|
|
68
|
+
| Booleans | `boolean` | Flags |
|
|
69
|
+
| Geo | `geo_point` | Coordinates |
|
|
70
|
+
|
|
71
|
+
### Analyzers
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"settings": {
|
|
76
|
+
"analysis": {
|
|
77
|
+
"analyzer": {
|
|
78
|
+
"autocomplete_analyzer": {
|
|
79
|
+
"type": "custom",
|
|
80
|
+
"tokenizer": "autocomplete_tokenizer",
|
|
81
|
+
"filter": ["lowercase"]
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"tokenizer": {
|
|
85
|
+
"autocomplete_tokenizer": {
|
|
86
|
+
"type": "edge_ngram",
|
|
87
|
+
"min_gram": 2,
|
|
88
|
+
"max_gram": 20,
|
|
89
|
+
"token_chars": ["letter", "digit"]
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Sharding Strategy
|
|
98
|
+
|
|
99
|
+
| Shard size | Rule |
|
|
100
|
+
|-----------|------|
|
|
101
|
+
| Target | 10–50 GB per shard |
|
|
102
|
+
| Max | Never exceed 65 GB |
|
|
103
|
+
| Small indices (<10GB) | 1 primary shard |
|
|
104
|
+
| Time-series | ILM with rollover |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 2. Query DSL (CRITICAL)
|
|
109
|
+
|
|
110
|
+
### Full-Text Search
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"query": {
|
|
115
|
+
"bool": {
|
|
116
|
+
"must": [
|
|
117
|
+
{
|
|
118
|
+
"multi_match": {
|
|
119
|
+
"query": "wireless headphones",
|
|
120
|
+
"fields": ["title^3", "description", "tags^2"],
|
|
121
|
+
"type": "best_fields",
|
|
122
|
+
"fuzziness": "AUTO"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"filter": [
|
|
127
|
+
{ "term": { "category": "electronics" } },
|
|
128
|
+
{ "range": { "price": { "gte": 20, "lte": 200 } } },
|
|
129
|
+
{ "term": { "in_stock": true } }
|
|
130
|
+
],
|
|
131
|
+
"should": [
|
|
132
|
+
{ "term": { "featured": { "value": true, "boost": 5 } } }
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"highlight": {
|
|
137
|
+
"fields": { "title": {}, "description": {} }
|
|
138
|
+
},
|
|
139
|
+
"sort": [
|
|
140
|
+
"_score",
|
|
141
|
+
{ "created_at": "desc" }
|
|
142
|
+
],
|
|
143
|
+
"from": 0,
|
|
144
|
+
"size": 20
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
> **Rule**: Use `filter` for exact matches (no scoring, cached), `must` for relevance-scored text.
|
|
149
|
+
|
|
150
|
+
### Autocomplete
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"query": {
|
|
155
|
+
"match": {
|
|
156
|
+
"title.autocomplete": {
|
|
157
|
+
"query": "wire",
|
|
158
|
+
"analyzer": "standard"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"_source": ["title", "category"],
|
|
163
|
+
"size": 5
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Aggregations
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"size": 0,
|
|
172
|
+
"aggs": {
|
|
173
|
+
"by_category": {
|
|
174
|
+
"terms": { "field": "category", "size": 20 },
|
|
175
|
+
"aggs": {
|
|
176
|
+
"avg_price": { "avg": { "field": "price" } },
|
|
177
|
+
"price_ranges": {
|
|
178
|
+
"range": {
|
|
179
|
+
"field": "price",
|
|
180
|
+
"ranges": [
|
|
181
|
+
{ "to": 50 },
|
|
182
|
+
{ "from": 50, "to": 100 },
|
|
183
|
+
{ "from": 100 }
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 3. Indexing Patterns
|
|
196
|
+
|
|
197
|
+
### Bulk API
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
POST _bulk
|
|
201
|
+
{"index": {"_index": "products", "_id": "1"}}
|
|
202
|
+
{"title": "Wireless Headphones", "price": 79.99, "category": "electronics"}
|
|
203
|
+
{"index": {"_index": "products", "_id": "2"}}
|
|
204
|
+
{"title": "Running Shoes", "price": 129.99, "category": "sports"}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
| Rule | Detail |
|
|
208
|
+
|------|--------|
|
|
209
|
+
| Batch size | 5–15 MB per bulk request |
|
|
210
|
+
| Refresh interval | Set `refresh_interval: 30s` during bulk indexing |
|
|
211
|
+
| Replicas | Set `number_of_replicas: 0` during initial load, restore after |
|
|
212
|
+
|
|
213
|
+
### Index Lifecycle Management (ILM)
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"policy": {
|
|
218
|
+
"phases": {
|
|
219
|
+
"hot": { "actions": { "rollover": { "max_size": "50gb", "max_age": "7d" } } },
|
|
220
|
+
"warm": { "min_age": "30d", "actions": { "shrink": { "number_of_shards": 1 }, "forcemerge": { "max_num_segments": 1 } } },
|
|
221
|
+
"cold": { "min_age": "90d", "actions": { "searchable_snapshot": { "snapshot_repository": "backups" } } },
|
|
222
|
+
"delete": { "min_age": "365d", "actions": { "delete": {} } }
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 4. Common Anti-Patterns
|
|
231
|
+
|
|
232
|
+
1. **Using ES as a primary database** — it's a search engine, not ACID storage
|
|
233
|
+
2. **Not setting explicit mappings** — dynamic mapping guesses wrong types
|
|
234
|
+
3. **Keyword fields for full-text search** — use `text` with analyzers
|
|
235
|
+
4. **Querying without filters** — filters are cached and avoid scoring overhead
|
|
236
|
+
5. **Too many shards** — small indices need 1 shard; over-sharding wastes resources
|
|
237
|
+
6. **Deep pagination with `from`+`size`** — use `search_after` for >10K results
|
|
238
|
+
7. **Not using bulk API** — single-doc indexing is orders of magnitude slower
|
|
239
|
+
8. **Wildcard queries on large fields** — extremely expensive; use `edge_ngram` instead
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## References
|
|
244
|
+
|
|
245
|
+
- [Elasticsearch Guide](https://www.elastic.co/guide/en/elasticsearch/reference/current/)
|
|
246
|
+
- [Query DSL](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html)
|
|
247
|
+
- [Mapping Types](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html)
|
|
248
|
+
- [Index Lifecycle Management](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html)
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meilisearch
|
|
3
|
+
description: Integrate Meilisearch for fast, typo-tolerant full-text search including index management, filtering, faceting, geo search, and relevancy tuning. Use when adding search functionality to applications that need instant, typo-tolerant results.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Meilisearch
|
|
8
|
+
|
|
9
|
+
Integrate Meilisearch for fast, typo-tolerant full-text search. Meilisearch is an open-source search engine designed for instant search experiences with minimal configuration.
|
|
10
|
+
|
|
11
|
+
## When to Use This Skill
|
|
12
|
+
|
|
13
|
+
- Adding search functionality to web applications
|
|
14
|
+
- Implementing faceted search (filter by category, price range, etc.)
|
|
15
|
+
- Building autocomplete / search-as-you-type experiences
|
|
16
|
+
- Searching content that needs typo tolerance and relevancy ranking
|
|
17
|
+
- Implementing geo-based search (find nearby locations)
|
|
18
|
+
- Multi-tenant search with secure tenant tokens
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Install JavaScript client
|
|
24
|
+
pnpm add meilisearch
|
|
25
|
+
|
|
26
|
+
# Run Meilisearch locally (Docker)
|
|
27
|
+
docker run -d -p 7700:7700 \
|
|
28
|
+
-v $(pwd)/meili_data:/meili_data \
|
|
29
|
+
-e MEILI_MASTER_KEY='your-master-key' \
|
|
30
|
+
getmeili/meilisearch:latest
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Client Initialization
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// src/lib/search/meilisearch.ts
|
|
37
|
+
import { MeiliSearch } from 'meilisearch';
|
|
38
|
+
|
|
39
|
+
export const meili = new MeiliSearch({
|
|
40
|
+
host: process.env.MEILISEARCH_HOST ?? 'http://localhost:7700',
|
|
41
|
+
apiKey: process.env.MEILISEARCH_ADMIN_KEY, // Admin key for server-side operations
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// For client-side search, use a search-only API key
|
|
45
|
+
export const meiliSearch = new MeiliSearch({
|
|
46
|
+
host: process.env.MEILISEARCH_HOST ?? 'http://localhost:7700',
|
|
47
|
+
apiKey: process.env.MEILISEARCH_SEARCH_KEY, // Read-only key
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Index Management
|
|
52
|
+
|
|
53
|
+
### Creating and Configuring an Index
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Create index with primary key
|
|
57
|
+
const index = await meili.createIndex('products', { primaryKey: 'id' });
|
|
58
|
+
|
|
59
|
+
// Configure searchable attributes (order defines relevancy weight)
|
|
60
|
+
await meili.index('products').updateSearchableAttributes([
|
|
61
|
+
'name', // Highest weight
|
|
62
|
+
'description',
|
|
63
|
+
'category',
|
|
64
|
+
'brand', // Lowest weight
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
// Configure filterable attributes (for filtering and faceting)
|
|
68
|
+
await meili.index('products').updateFilterableAttributes([
|
|
69
|
+
'category',
|
|
70
|
+
'brand',
|
|
71
|
+
'price',
|
|
72
|
+
'inStock',
|
|
73
|
+
'rating',
|
|
74
|
+
'tags',
|
|
75
|
+
'_geo', // Required for geo search
|
|
76
|
+
]);
|
|
77
|
+
|
|
78
|
+
// Configure sortable attributes
|
|
79
|
+
await meili.index('products').updateSortableAttributes([
|
|
80
|
+
'price',
|
|
81
|
+
'rating',
|
|
82
|
+
'createdAt',
|
|
83
|
+
]);
|
|
84
|
+
|
|
85
|
+
// Configure displayed attributes (what is returned in results)
|
|
86
|
+
await meili.index('products').updateDisplayedAttributes([
|
|
87
|
+
'id', 'name', 'description', 'price', 'category',
|
|
88
|
+
'brand', 'imageUrl', 'rating', 'slug',
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
// Configure ranking rules (order matters)
|
|
92
|
+
await meili.index('products').updateRankingRules([
|
|
93
|
+
'words', // Number of matched query words
|
|
94
|
+
'typo', // Number of typos
|
|
95
|
+
'proximity', // Distance between matched words
|
|
96
|
+
'attribute', // Position in searchableAttributes list
|
|
97
|
+
'sort', // User-defined sort
|
|
98
|
+
'exactness', // Exact vs prefix match
|
|
99
|
+
'rating:desc', // Custom ranking: higher rating first
|
|
100
|
+
]);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Typo Tolerance
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
await meili.index('products').updateTypoTolerance({
|
|
107
|
+
enabled: true,
|
|
108
|
+
minWordSizeForTypos: {
|
|
109
|
+
oneTypo: 4, // Allow 1 typo for words >= 4 chars
|
|
110
|
+
twoTypos: 8, // Allow 2 typos for words >= 8 chars
|
|
111
|
+
},
|
|
112
|
+
disableOnAttributes: ['sku', 'barcode'], // Exact match only for these
|
|
113
|
+
disableOnWords: ['iPhone', 'MacBook'], // Exact match for specific terms
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Synonyms
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
await meili.index('products').updateSynonyms({
|
|
121
|
+
'phone': ['smartphone', 'mobile', 'cellphone'],
|
|
122
|
+
'laptop': ['notebook', 'portable computer'],
|
|
123
|
+
'tv': ['television', 'monitor', 'screen'],
|
|
124
|
+
// One-way synonym
|
|
125
|
+
'iphone': ['phone'],
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Stop Words
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
await meili.index('products').updateStopWords([
|
|
133
|
+
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'of', 'for', 'in',
|
|
134
|
+
]);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Document Operations
|
|
138
|
+
|
|
139
|
+
### Adding Documents
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const products = [
|
|
143
|
+
{
|
|
144
|
+
id: 'prod_1',
|
|
145
|
+
name: 'Wireless Noise-Canceling Headphones',
|
|
146
|
+
description: 'Premium wireless headphones with active noise cancellation',
|
|
147
|
+
category: 'Electronics',
|
|
148
|
+
brand: 'AudioTech',
|
|
149
|
+
price: 299.99,
|
|
150
|
+
rating: 4.7,
|
|
151
|
+
inStock: true,
|
|
152
|
+
tags: ['wireless', 'noise-canceling', 'bluetooth'],
|
|
153
|
+
slug: 'wireless-noise-canceling-headphones',
|
|
154
|
+
_geo: { lat: 40.7128, lng: -74.0060 },
|
|
155
|
+
},
|
|
156
|
+
// ... more products
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
// Add or replace documents
|
|
160
|
+
const task = await meili.index('products').addDocuments(products);
|
|
161
|
+
|
|
162
|
+
// Wait for indexing to complete
|
|
163
|
+
await meili.waitForTask(task.taskUid);
|
|
164
|
+
|
|
165
|
+
// Update specific documents (partial update)
|
|
166
|
+
await meili.index('products').updateDocuments([
|
|
167
|
+
{ id: 'prod_1', price: 249.99, inStock: false },
|
|
168
|
+
]);
|
|
169
|
+
|
|
170
|
+
// Delete documents
|
|
171
|
+
await meili.index('products').deleteDocument('prod_1');
|
|
172
|
+
await meili.index('products').deleteDocuments(['prod_1', 'prod_2']);
|
|
173
|
+
await meili.index('products').deleteAllDocuments();
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Batch Indexing
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// For large datasets, batch in chunks
|
|
180
|
+
async function indexAllProducts(products: Product[]) {
|
|
181
|
+
const BATCH_SIZE = 1000;
|
|
182
|
+
const tasks: number[] = [];
|
|
183
|
+
|
|
184
|
+
for (let i = 0; i < products.length; i += BATCH_SIZE) {
|
|
185
|
+
const batch = products.slice(i, i + BATCH_SIZE);
|
|
186
|
+
const task = await meili.index('products').addDocuments(batch);
|
|
187
|
+
tasks.push(task.taskUid);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Wait for all batches to finish
|
|
191
|
+
for (const taskUid of tasks) {
|
|
192
|
+
await meili.waitForTask(taskUid);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Searching
|
|
198
|
+
|
|
199
|
+
### Basic Search
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
const results = await meili.index('products').search('wireless headphones');
|
|
203
|
+
|
|
204
|
+
// results shape:
|
|
205
|
+
// {
|
|
206
|
+
// hits: [...], // Matching documents
|
|
207
|
+
// query: 'wireless headphones',
|
|
208
|
+
// processingTimeMs: 2,
|
|
209
|
+
// limit: 20,
|
|
210
|
+
// offset: 0,
|
|
211
|
+
// estimatedTotalHits: 42,
|
|
212
|
+
// }
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Search with Filters
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const results = await meili.index('products').search('headphones', {
|
|
219
|
+
filter: [
|
|
220
|
+
'category = "Electronics"',
|
|
221
|
+
'price >= 50 AND price <= 300',
|
|
222
|
+
'inStock = true',
|
|
223
|
+
'rating >= 4.0',
|
|
224
|
+
],
|
|
225
|
+
sort: ['price:asc'],
|
|
226
|
+
limit: 20,
|
|
227
|
+
offset: 0,
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Array of filter strings are ANDed together
|
|
231
|
+
// Use OR within a string: 'category = "Electronics" OR category = "Audio"'
|
|
232
|
+
// Use arrays for AND between groups, strings for OR within groups:
|
|
233
|
+
// filter: [['category = "Electronics"', 'category = "Audio"'], 'inStock = true']
|
|
234
|
+
// = (Electronics OR Audio) AND inStock
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Search with Facets
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
const results = await meili.index('products').search('headphones', {
|
|
241
|
+
facets: ['category', 'brand', 'tags'],
|
|
242
|
+
filter: ['inStock = true'],
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// results.facetDistribution:
|
|
246
|
+
// {
|
|
247
|
+
// category: { Electronics: 15, Audio: 8, Accessories: 3 },
|
|
248
|
+
// brand: { AudioTech: 10, SoundMax: 8, BassKing: 5 },
|
|
249
|
+
// tags: { wireless: 18, bluetooth: 15, 'noise-canceling': 12 },
|
|
250
|
+
// }
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Search with Highlighting
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
const results = await meili.index('products').search('wireless headphones', {
|
|
257
|
+
attributesToHighlight: ['name', 'description'],
|
|
258
|
+
highlightPreTag: '<mark>',
|
|
259
|
+
highlightPostTag: '</mark>',
|
|
260
|
+
attributesToCrop: ['description'],
|
|
261
|
+
cropLength: 30,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Each hit includes _formatted with highlighted matches:
|
|
265
|
+
// hit._formatted.name = '<mark>Wireless</mark> Noise-Canceling <mark>Headphones</mark>'
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Geo Search
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// Find products within 10km of a location
|
|
272
|
+
const results = await meili.index('products').search('coffee shop', {
|
|
273
|
+
filter: ['_geoRadius(40.7128, -74.0060, 10000)'], // lat, lng, radius in meters
|
|
274
|
+
sort: ['_geoPoint(40.7128, -74.0060):asc'], // Sort by distance
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Bounding box filter
|
|
278
|
+
const results2 = await meili.index('products').search('', {
|
|
279
|
+
filter: ['_geoBoundingBox([40.82, -74.02], [40.70, -73.95])'], // top-left, bottom-right
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Multi-Index Search
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
const results = await meili.multiSearch({
|
|
287
|
+
queries: [
|
|
288
|
+
{ indexUid: 'products', q: 'wireless', limit: 5 },
|
|
289
|
+
{ indexUid: 'articles', q: 'wireless', limit: 5 },
|
|
290
|
+
{ indexUid: 'categories', q: 'wireless', limit: 3 },
|
|
291
|
+
],
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// results.results is an array of search results, one per query
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Tenant Tokens (Multi-Tenancy)
|
|
298
|
+
|
|
299
|
+
Tenant tokens restrict search to specific filter rules. Generate them server-side, use them client-side.
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
// Server: Generate a tenant token
|
|
303
|
+
import { MeiliSearch } from 'meilisearch';
|
|
304
|
+
|
|
305
|
+
const client = new MeiliSearch({
|
|
306
|
+
host: process.env.MEILISEARCH_HOST!,
|
|
307
|
+
apiKey: process.env.MEILISEARCH_ADMIN_KEY!,
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
function generateTenantToken(tenantId: string): string {
|
|
311
|
+
return client.generateTenantToken(
|
|
312
|
+
process.env.MEILISEARCH_SEARCH_KEY_UID!, // UID of the search key
|
|
313
|
+
{
|
|
314
|
+
products: {
|
|
315
|
+
filter: `tenantId = "${tenantId}"`, // Enforced filter
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
expiresAt: new Date(Date.now() + 3600 * 1000), // 1 hour
|
|
320
|
+
},
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
// Client: Use the tenant token
|
|
327
|
+
const tenantClient = new MeiliSearch({
|
|
328
|
+
host: 'https://search.example.com',
|
|
329
|
+
apiKey: tenantToken, // Token from server
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// All searches are automatically scoped to the tenant
|
|
333
|
+
const results = await tenantClient.index('products').search('headphones');
|
|
334
|
+
// Only returns products where tenantId matches
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Syncing Data
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// Pattern: Sync database changes to Meilisearch
|
|
341
|
+
// Call this from your database hooks/triggers
|
|
342
|
+
|
|
343
|
+
async function syncProductToSearch(product: Product, action: 'upsert' | 'delete') {
|
|
344
|
+
const index = meili.index('products');
|
|
345
|
+
|
|
346
|
+
if (action === 'delete') {
|
|
347
|
+
await index.deleteDocument(product.id);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
await index.addDocuments([{
|
|
352
|
+
id: product.id,
|
|
353
|
+
name: product.name,
|
|
354
|
+
description: product.description,
|
|
355
|
+
category: product.category,
|
|
356
|
+
brand: product.brand,
|
|
357
|
+
price: product.price,
|
|
358
|
+
rating: product.rating,
|
|
359
|
+
inStock: product.inStock,
|
|
360
|
+
tags: product.tags,
|
|
361
|
+
slug: product.slug,
|
|
362
|
+
updatedAt: product.updatedAt,
|
|
363
|
+
}]);
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
## Anti-Patterns
|
|
368
|
+
|
|
369
|
+
| Anti-Pattern | Correct Approach |
|
|
370
|
+
|-------------|-----------------|
|
|
371
|
+
| Using the admin key on the client | Use search-only keys or tenant tokens client-side |
|
|
372
|
+
| Not configuring searchableAttributes | Without it, all fields are searchable (slow, noisy results) |
|
|
373
|
+
| Indexing raw database rows with all columns | Index only fields needed for search, display, and filtering |
|
|
374
|
+
| Calling `waitForTask` in request handlers | Indexing is async -- return immediately, let it process in background |
|
|
375
|
+
| Re-indexing entire dataset on every change | Use incremental `addDocuments` (upserts by primary key) |
|
|
376
|
+
| Using Meilisearch as a primary database | It is a search index -- your database is the source of truth |
|
|
377
|
+
|
|
378
|
+
## Environment Variables
|
|
379
|
+
|
|
380
|
+
```env
|
|
381
|
+
MEILISEARCH_HOST=http://localhost:7700
|
|
382
|
+
MEILISEARCH_ADMIN_KEY= # Admin key -- server-side only
|
|
383
|
+
MEILISEARCH_SEARCH_KEY= # Search-only key -- safe for client
|
|
384
|
+
MEILISEARCH_SEARCH_KEY_UID= # UID of search key (for tenant tokens)
|
|
385
|
+
```
|