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,751 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: regex-patterns
|
|
3
|
+
description: "Comprehensive regular expressions guide covering character classes, quantifiers, anchors, groups (capturing, non-capturing, named), lookahead/lookbehind, backreferences, common patterns (email, URL, IP, phone, dates, semver), ReDoS prevention, Unicode support, flags, regex in multiple languages (JS, Python, Go, Rust), debugging techniques, and when NOT to use regex. Use when writing, debugging, or optimizing regular expressions."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Regular Expressions Mastery
|
|
8
|
+
|
|
9
|
+
## 1. Fundamentals
|
|
10
|
+
|
|
11
|
+
### Character Classes
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
. Any character except newline (unless /s flag)
|
|
15
|
+
\d Digit [0-9]
|
|
16
|
+
\D Non-digit [^0-9]
|
|
17
|
+
\w Word character [a-zA-Z0-9_]
|
|
18
|
+
\W Non-word character [^a-zA-Z0-9_]
|
|
19
|
+
\s Whitespace [ \t\n\r\f\v]
|
|
20
|
+
\S Non-whitespace
|
|
21
|
+
[abc] Any of a, b, or c
|
|
22
|
+
[^abc] Not a, b, or c
|
|
23
|
+
[a-z] Range: a through z
|
|
24
|
+
[a-zA-Z] Any letter
|
|
25
|
+
[0-9a-fA-F] Hexadecimal digit
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Custom Character Classes
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
[aeiou] Vowels
|
|
32
|
+
[^aeiou] Non-vowels (consonants and non-letters)
|
|
33
|
+
[\d\s] Digit or whitespace
|
|
34
|
+
[.\-+] Literal dot, hyphen, or plus (hyphen escaped or at start/end)
|
|
35
|
+
[\[\]] Literal square brackets
|
|
36
|
+
[^\n\r] Any character except newline
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Quantifiers
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
* Zero or more (greedy)
|
|
43
|
+
+ One or more (greedy)
|
|
44
|
+
? Zero or one (optional)
|
|
45
|
+
{3} Exactly 3
|
|
46
|
+
{2,5} Between 2 and 5
|
|
47
|
+
{3,} 3 or more
|
|
48
|
+
|
|
49
|
+
*? Zero or more (lazy -- match as few as possible)
|
|
50
|
+
+? One or more (lazy)
|
|
51
|
+
?? Zero or one (lazy)
|
|
52
|
+
{2,5}? Between 2 and 5 (lazy)
|
|
53
|
+
|
|
54
|
+
*+ Zero or more (possessive -- no backtracking, not in all engines)
|
|
55
|
+
++ One or more (possessive)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Greedy vs Lazy
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Input: <b>bold</b> and <b>more bold</b>
|
|
62
|
+
|
|
63
|
+
<b>.*</b> Greedy: matches "<b>bold</b> and <b>more bold</b>" (one match)
|
|
64
|
+
<b>.*?</b> Lazy: matches "<b>bold</b>" and "<b>more bold</b>" (two matches)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 2. Anchors and Boundaries
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
^ Start of string (or start of line with /m flag)
|
|
73
|
+
$ End of string (or end of line with /m flag)
|
|
74
|
+
\b Word boundary (between \w and \W)
|
|
75
|
+
\B Non-word boundary
|
|
76
|
+
\A Start of string (never affected by /m flag -- Python, Ruby)
|
|
77
|
+
\z End of string (absolute -- Python, Ruby)
|
|
78
|
+
\Z End of string or before final newline (Python, Ruby)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Word Boundary Examples
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
Pattern: \bcat\b
|
|
85
|
+
Matches: "The cat sat" (matches "cat")
|
|
86
|
+
No match: "concatenate" (cat is inside a word)
|
|
87
|
+
|
|
88
|
+
Pattern: \bpre\w+
|
|
89
|
+
Matches: "prefix", "preview", "predict"
|
|
90
|
+
No match: "compress" (pre not at word boundary)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 3. Groups
|
|
96
|
+
|
|
97
|
+
### Capturing Groups
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
(abc) Capture group -- stores the match for backreference
|
|
101
|
+
(\d{4}) Capture the year
|
|
102
|
+
(\w+)@(\w+) Two capture groups: username and domain
|
|
103
|
+
|
|
104
|
+
# Backreferences (refer to captured group)
|
|
105
|
+
(.)\1 Matches repeated character: "aa", "bb", "cc"
|
|
106
|
+
(\w+)\s+\1 Matches repeated word: "the the", "is is"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Named Groups
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
// JavaScript
|
|
113
|
+
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
|
|
114
|
+
const match = re.exec('2025-06-15');
|
|
115
|
+
// match.groups.year === '2025'
|
|
116
|
+
// match.groups.month === '06'
|
|
117
|
+
// match.groups.day === '15'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# Python
|
|
122
|
+
import re
|
|
123
|
+
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
|
|
124
|
+
match = re.match(pattern, '2025-06-15')
|
|
125
|
+
# match.group('year') == '2025'
|
|
126
|
+
# match.group('month') == '06'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Non-Capturing Groups
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
(?:abc) Groups but does NOT capture (no backreference)
|
|
133
|
+
|
|
134
|
+
# Use non-capturing groups for alternation without capturing
|
|
135
|
+
(?:com|org|net) Matches "com", "org", or "net" without storing
|
|
136
|
+
|
|
137
|
+
# Performance: non-capturing groups are slightly faster
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Alternation
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
cat|dog Matches "cat" or "dog"
|
|
144
|
+
(cat|dog)s Matches "cats" or "dogs"
|
|
145
|
+
(?:Mr|Mrs|Ms) Matches title without capturing
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 4. Lookahead and Lookbehind
|
|
151
|
+
|
|
152
|
+
### Lookahead (Zero-Width Assertion -- Looks Forward)
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
(?=pattern) Positive lookahead: followed by pattern
|
|
156
|
+
(?!pattern) Negative lookahead: NOT followed by pattern
|
|
157
|
+
|
|
158
|
+
# Password validation: at least one digit, one uppercase, one lowercase
|
|
159
|
+
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$
|
|
160
|
+
|
|
161
|
+
# Match "foo" only if followed by "bar"
|
|
162
|
+
foo(?=bar) Matches "foo" in "foobar", not in "foobaz"
|
|
163
|
+
|
|
164
|
+
# Match a number NOT followed by a percent sign
|
|
165
|
+
\d+(?!%) Matches "42" in "42 items", not in "42%"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Lookbehind (Zero-Width Assertion -- Looks Backward)
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
(?<=pattern) Positive lookbehind: preceded by pattern
|
|
172
|
+
(?<!pattern) Negative lookbehind: NOT preceded by pattern
|
|
173
|
+
|
|
174
|
+
# Match digits preceded by a dollar sign
|
|
175
|
+
(?<=\$)\d+ Matches "50" in "$50", not in "50 items"
|
|
176
|
+
|
|
177
|
+
# Match a word NOT preceded by "un"
|
|
178
|
+
(?<!un)happy Matches "happy" but not "unhappy"
|
|
179
|
+
|
|
180
|
+
# Note: lookbehinds must be fixed-width in most engines
|
|
181
|
+
# (?<=ab|abc) -- not allowed in some engines (variable-width)
|
|
182
|
+
# JavaScript supports variable-width lookbehind since ES2018
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Practical Lookaround Examples
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
// Format number with commas: 1234567 -> 1,234,567
|
|
189
|
+
'1234567'.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
190
|
+
// Result: "1,234,567"
|
|
191
|
+
|
|
192
|
+
// Extract values from key=value pairs without capturing the key
|
|
193
|
+
const re = /(?<=name=)\w+/g;
|
|
194
|
+
'name=Alice age=30'.match(re);
|
|
195
|
+
// Result: ["Alice"]
|
|
196
|
+
|
|
197
|
+
// Match word that is not inside quotes
|
|
198
|
+
// \b\w+\b(?=(?:[^"]*"[^"]*")*[^"]*$)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 5. Common Patterns
|
|
204
|
+
|
|
205
|
+
### Email (Simplified, RFC-Compliant Enough for Most Uses)
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
|
|
209
|
+
|
|
210
|
+
# Breakdown:
|
|
211
|
+
# ^ Start of string
|
|
212
|
+
# [a-zA-Z0-9._%+\-]+ Local part (letters, digits, dots, etc.)
|
|
213
|
+
# @ Literal @
|
|
214
|
+
# [a-zA-Z0-9.\-]+ Domain (letters, digits, dots, hyphens)
|
|
215
|
+
# \. Literal dot
|
|
216
|
+
# [a-zA-Z]{2,} TLD (at least 2 letters)
|
|
217
|
+
# $ End of string
|
|
218
|
+
|
|
219
|
+
# WARNING: For production, use a library. RFC 5322 email regex is 6,300+ chars.
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### URL
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)
|
|
226
|
+
|
|
227
|
+
# For strict validation, use the URL constructor instead:
|
|
228
|
+
# new URL(input) -- throws on invalid URL
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### IPv4 Address
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b
|
|
235
|
+
|
|
236
|
+
# Breakdown:
|
|
237
|
+
# 25[0-5] 250-255
|
|
238
|
+
# 2[0-4]\d 200-249
|
|
239
|
+
# [01]?\d\d? 0-199
|
|
240
|
+
# Repeated 4 times separated by dots
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Phone Number (US)
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
^(?:\+1[-.\s]?)?(?:\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$
|
|
247
|
+
|
|
248
|
+
# Matches:
|
|
249
|
+
# (555) 123-4567
|
|
250
|
+
# 555-123-4567
|
|
251
|
+
# 5551234567
|
|
252
|
+
# +1 555 123 4567
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Date (YYYY-MM-DD)
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$
|
|
259
|
+
|
|
260
|
+
# Validates format but NOT calendar correctness (e.g., 2025-02-31 matches).
|
|
261
|
+
# For real date validation, parse with Date or a date library.
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Semantic Versioning (SemVer)
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:(?:0|[1-9]\d*|\d*[a-zA-Z\-][\da-zA-Z\-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z\-][\da-zA-Z\-]*))*))?(?:\+[\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)*)?$
|
|
268
|
+
|
|
269
|
+
# Matches: 1.0.0, 2.1.3-beta.1, 0.0.1+build.123
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Hex Color Code
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
^#(?:[0-9a-fA-F]{3}){1,2}$
|
|
276
|
+
|
|
277
|
+
# Matches: #fff, #FFF, #a1b2c3, #A1B2C3
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Slug (URL-Safe String)
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
^[a-z0-9]+(?:-[a-z0-9]+)*$
|
|
284
|
+
|
|
285
|
+
# Matches: "hello-world", "my-blog-post", "v2"
|
|
286
|
+
# No match: "-start", "end-", "double--dash"
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 6. ReDoS Prevention (Catastrophic Backtracking)
|
|
292
|
+
|
|
293
|
+
### The Problem
|
|
294
|
+
|
|
295
|
+
Some regex patterns can take exponential time on certain inputs, causing denial of service.
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
# DANGEROUS patterns -- O(2^n) on adversarial input
|
|
299
|
+
(a+)+$ Nested quantifiers
|
|
300
|
+
(a|a)+$ Overlapping alternation
|
|
301
|
+
(\w+\s*)+$ Repeated group with optional separator
|
|
302
|
+
|
|
303
|
+
# Example attack:
|
|
304
|
+
# Pattern: (a+)+$
|
|
305
|
+
# Input: "aaaaaaaaaaaaaaaaaaaaaaaa!"
|
|
306
|
+
# The engine backtracks exponentially trying to match
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Prevention Rules
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
# 1. NEVER nest quantifiers: (a+)+, (\w+)*, (.*)+
|
|
313
|
+
# Fix: Flatten to a single quantifier
|
|
314
|
+
|
|
315
|
+
# BAD: (a+)+
|
|
316
|
+
# GOOD: a+
|
|
317
|
+
|
|
318
|
+
# 2. NEVER use overlapping alternation with quantifiers
|
|
319
|
+
# BAD: (a|a)+
|
|
320
|
+
# GOOD: a+
|
|
321
|
+
|
|
322
|
+
# 3. NEVER use .* inside a repeated group
|
|
323
|
+
# BAD: (.*,)+
|
|
324
|
+
# GOOD: ([^,]*,)+
|
|
325
|
+
|
|
326
|
+
# 4. Use atomic groups or possessive quantifiers when available
|
|
327
|
+
# a++b Possessive: never backtracks into a+ match
|
|
328
|
+
# (?>a+)b Atomic group: same effect
|
|
329
|
+
|
|
330
|
+
# 5. Use negated character classes instead of lazy quantifiers
|
|
331
|
+
# BAD: ".*?" (lazy dot-star between quotes)
|
|
332
|
+
# GOOD: "[^"]*" (negated class -- no backtracking needed)
|
|
333
|
+
|
|
334
|
+
# 6. Set regex timeouts in production
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Language-Specific Timeout
|
|
338
|
+
|
|
339
|
+
```javascript
|
|
340
|
+
// JavaScript: no built-in timeout, use a wrapper
|
|
341
|
+
function safeMatch(str, pattern, timeoutMs = 1000) {
|
|
342
|
+
// Run in a worker with a timeout, or use a library like re2
|
|
343
|
+
// Node.js: consider the 're2' package (linear-time regex engine)
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
```python
|
|
348
|
+
# Python: use the 'regex' package with timeout
|
|
349
|
+
import regex
|
|
350
|
+
try:
|
|
351
|
+
regex.match(r'(a+)+$', input_string, timeout=1.0)
|
|
352
|
+
except regex.error:
|
|
353
|
+
pass # Timed out
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Safe Alternatives
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
# Use RE2 (linear-time regex engine, no backtracking)
|
|
360
|
+
# - Available as npm 're2', Python 'google-re2', Go 'regexp' (uses RE2 by default)
|
|
361
|
+
# - RE2 does NOT support backreferences or lookaround
|
|
362
|
+
# - Trade-off: fewer features, guaranteed linear performance
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 7. Unicode Support
|
|
368
|
+
|
|
369
|
+
### Unicode Categories (\p{})
|
|
370
|
+
|
|
371
|
+
```javascript
|
|
372
|
+
// Requires /u or /v flag in JavaScript
|
|
373
|
+
|
|
374
|
+
// Match any letter (any script)
|
|
375
|
+
/\p{L}+/u // "Hello", "Bonjour", etc.
|
|
376
|
+
|
|
377
|
+
// Match any number
|
|
378
|
+
/\p{N}+/u // "123", etc.
|
|
379
|
+
|
|
380
|
+
// Match any punctuation
|
|
381
|
+
/\p{P}/u
|
|
382
|
+
|
|
383
|
+
// Match emoji (requires /v flag in JS)
|
|
384
|
+
/\p{Emoji}/v
|
|
385
|
+
|
|
386
|
+
// Match specific scripts
|
|
387
|
+
/\p{Script=Greek}+/u
|
|
388
|
+
/\p{Script=Han}+/u
|
|
389
|
+
/\p{Script=Arabic}+/u
|
|
390
|
+
|
|
391
|
+
// Common categories:
|
|
392
|
+
// \p{L} Letter (any script)
|
|
393
|
+
// \p{Lu} Uppercase letter
|
|
394
|
+
// \p{Ll} Lowercase letter
|
|
395
|
+
// \p{N} Number
|
|
396
|
+
// \p{Nd} Decimal digit
|
|
397
|
+
// \p{P} Punctuation
|
|
398
|
+
// \p{S} Symbol
|
|
399
|
+
// \p{Z} Separator (spaces)
|
|
400
|
+
// \p{M} Mark (combining characters)
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Unicode-Aware Patterns
|
|
404
|
+
|
|
405
|
+
```javascript
|
|
406
|
+
// BAD: ASCII-only word matching
|
|
407
|
+
/[a-zA-Z]+/
|
|
408
|
+
|
|
409
|
+
// GOOD: Unicode-aware word matching
|
|
410
|
+
/[\p{L}\p{M}]+/u
|
|
411
|
+
|
|
412
|
+
// BAD: ASCII-only digit matching
|
|
413
|
+
/[0-9]+/
|
|
414
|
+
|
|
415
|
+
// GOOD: Unicode-aware digit matching (includes Arabic-Indic, etc.)
|
|
416
|
+
/\p{Nd}+/u
|
|
417
|
+
|
|
418
|
+
// Match a "word" in any language
|
|
419
|
+
/\b\p{L}+\b/gu
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## 8. Flags
|
|
425
|
+
|
|
426
|
+
```
|
|
427
|
+
g Global: find all matches, not just the first
|
|
428
|
+
i Case-insensitive
|
|
429
|
+
m Multiline: ^ and $ match line boundaries, not just string boundaries
|
|
430
|
+
s DotAll: . matches newline characters
|
|
431
|
+
u Unicode: enables \p{}, correct handling of surrogate pairs
|
|
432
|
+
v UnicodeSets: extended Unicode support (JS, newer)
|
|
433
|
+
d HasIndices: capture group start/end indices (JS)
|
|
434
|
+
y Sticky: match at exact position (lastIndex)
|
|
435
|
+
x Extended/Verbose: ignore whitespace and allow comments (Python, Ruby, PCRE)
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Extended Mode (Verbose Regex)
|
|
439
|
+
|
|
440
|
+
```python
|
|
441
|
+
# Python: re.VERBOSE or re.X
|
|
442
|
+
import re
|
|
443
|
+
|
|
444
|
+
pattern = re.compile(r"""
|
|
445
|
+
^ # Start of string
|
|
446
|
+
(?P<protocol>https?) # Protocol (http or https)
|
|
447
|
+
:// # Separator
|
|
448
|
+
(?P<domain> # Domain group
|
|
449
|
+
[a-zA-Z0-9.-]+ # Domain name
|
|
450
|
+
\.[a-zA-Z]{2,} # TLD
|
|
451
|
+
)
|
|
452
|
+
(?P<path>/\S*)? # Optional path
|
|
453
|
+
$ # End of string
|
|
454
|
+
""", re.VERBOSE)
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## 9. Regex in Different Languages
|
|
460
|
+
|
|
461
|
+
### JavaScript
|
|
462
|
+
|
|
463
|
+
```javascript
|
|
464
|
+
// Literal syntax
|
|
465
|
+
const re = /^hello\s+(\w+)$/i;
|
|
466
|
+
|
|
467
|
+
// Constructor (for dynamic patterns)
|
|
468
|
+
const pattern = 'hello';
|
|
469
|
+
const re2 = new RegExp(`^${escapeRegExp(pattern)}$`, 'i');
|
|
470
|
+
|
|
471
|
+
// Methods
|
|
472
|
+
const match = str.match(re); // Returns match array or null
|
|
473
|
+
const allMatches = [...str.matchAll(/\d+/g)]; // Iterator of all matches
|
|
474
|
+
const replaced = str.replace(/foo/g, 'bar');
|
|
475
|
+
const parts = str.split(/[,;\s]+/);
|
|
476
|
+
const isValid = re.test(str); // Returns boolean
|
|
477
|
+
|
|
478
|
+
// Named groups
|
|
479
|
+
const { groups } = /(?<year>\d{4})-(?<month>\d{2})/.exec('2025-06');
|
|
480
|
+
// groups.year === '2025'
|
|
481
|
+
|
|
482
|
+
// Escape special characters for use in RegExp constructor
|
|
483
|
+
function escapeRegExp(str) {
|
|
484
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Python
|
|
489
|
+
|
|
490
|
+
```python
|
|
491
|
+
import re
|
|
492
|
+
|
|
493
|
+
# Compile for reuse
|
|
494
|
+
pattern = re.compile(r'^hello\s+(\w+)$', re.IGNORECASE)
|
|
495
|
+
|
|
496
|
+
# Methods
|
|
497
|
+
match = pattern.match(string) # Match at start
|
|
498
|
+
match = pattern.search(string) # Search anywhere
|
|
499
|
+
matches = pattern.findall(string) # All matches (list of strings/tuples)
|
|
500
|
+
matches = pattern.finditer(string) # Iterator of Match objects
|
|
501
|
+
result = pattern.sub(r'bar', string) # Replace
|
|
502
|
+
parts = pattern.split(string) # Split
|
|
503
|
+
|
|
504
|
+
# Match object
|
|
505
|
+
if match:
|
|
506
|
+
match.group(0) # Full match
|
|
507
|
+
match.group(1) # First capture group
|
|
508
|
+
match.group('name') # Named group
|
|
509
|
+
match.start() # Start position
|
|
510
|
+
match.end() # End position
|
|
511
|
+
|
|
512
|
+
# Raw strings: always use r'...' for regex patterns in Python
|
|
513
|
+
# r'\n' is a literal backslash-n, not a newline
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Go
|
|
517
|
+
|
|
518
|
+
```go
|
|
519
|
+
package main
|
|
520
|
+
|
|
521
|
+
import (
|
|
522
|
+
"fmt"
|
|
523
|
+
"regexp"
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
func main() {
|
|
527
|
+
// Compile (returns error if invalid)
|
|
528
|
+
re, err := regexp.Compile(`^hello\s+(\w+)$`)
|
|
529
|
+
if err != nil {
|
|
530
|
+
panic(err)
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// MustCompile panics on invalid pattern (use for constants)
|
|
534
|
+
re = regexp.MustCompile(`\d+`)
|
|
535
|
+
|
|
536
|
+
// Methods
|
|
537
|
+
matched := re.MatchString("hello world") // bool
|
|
538
|
+
result := re.FindString("abc 123 def") // "123"
|
|
539
|
+
allResults := re.FindAllString("a1 b2 c3", -1) // ["1", "2", "3"]
|
|
540
|
+
submatch := re.FindStringSubmatch("hello world") // ["hello world", "world"]
|
|
541
|
+
replaced := re.ReplaceAllString("foo 123", "NUM") // "foo NUM"
|
|
542
|
+
|
|
543
|
+
// Note: Go uses RE2 engine -- no backreferences or lookaround
|
|
544
|
+
fmt.Println(matched, result, allResults, submatch, replaced)
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### Rust
|
|
549
|
+
|
|
550
|
+
```rust
|
|
551
|
+
use regex::Regex;
|
|
552
|
+
|
|
553
|
+
fn main() {
|
|
554
|
+
// Compile
|
|
555
|
+
let re = Regex::new(r"^hello\s+(\w+)$").unwrap();
|
|
556
|
+
|
|
557
|
+
// Methods
|
|
558
|
+
let is_match = re.is_match("hello world"); // bool
|
|
559
|
+
let caps = re.captures("hello world").unwrap();
|
|
560
|
+
let name = &caps[1]; // "world"
|
|
561
|
+
|
|
562
|
+
// Named captures
|
|
563
|
+
let re = Regex::new(r"(?P<year>\d{4})-(?P<month>\d{2})").unwrap();
|
|
564
|
+
let caps = re.captures("2025-06").unwrap();
|
|
565
|
+
let year = &caps["year"]; // "2025"
|
|
566
|
+
|
|
567
|
+
// Find all matches
|
|
568
|
+
let re = Regex::new(r"\d+").unwrap();
|
|
569
|
+
let matches: Vec<&str> = re.find_iter("a1 b2 c3").map(|m| m.as_str()).collect();
|
|
570
|
+
// ["1", "2", "3"]
|
|
571
|
+
|
|
572
|
+
// Replace
|
|
573
|
+
let result = re.replace_all("foo 123 bar 456", "NUM");
|
|
574
|
+
// "foo NUM bar NUM"
|
|
575
|
+
|
|
576
|
+
// Note: Rust regex crate uses finite automata (like RE2)
|
|
577
|
+
// No backreferences or lookaround by default
|
|
578
|
+
// Use the 'fancy-regex' crate for those features
|
|
579
|
+
}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
---
|
|
583
|
+
|
|
584
|
+
## 10. Debugging Regex
|
|
585
|
+
|
|
586
|
+
### Techniques
|
|
587
|
+
|
|
588
|
+
```
|
|
589
|
+
1. Use regex101.com (supports PCRE, Python, JavaScript, Go, Rust)
|
|
590
|
+
- Shows match highlighting in real time
|
|
591
|
+
- Explains each token
|
|
592
|
+
- Shows capture groups
|
|
593
|
+
- Has a debugger that shows backtracking steps
|
|
594
|
+
|
|
595
|
+
2. Break complex patterns into named pieces:
|
|
596
|
+
|
|
597
|
+
JavaScript:
|
|
598
|
+
const year = '(?<year>\\d{4})';
|
|
599
|
+
const month = '(?<month>0[1-9]|1[0-2])';
|
|
600
|
+
const day = '(?<day>0[1-9]|[12]\\d|3[01])';
|
|
601
|
+
const datePattern = new RegExp(`^${year}-${month}-${day}$`);
|
|
602
|
+
|
|
603
|
+
3. Test incrementally:
|
|
604
|
+
- Start with the simplest subpattern
|
|
605
|
+
- Add one element at a time
|
|
606
|
+
- Test with both matching and non-matching inputs
|
|
607
|
+
|
|
608
|
+
4. Check edge cases:
|
|
609
|
+
- Empty string
|
|
610
|
+
- Very long string
|
|
611
|
+
- Unicode characters
|
|
612
|
+
- Newlines
|
|
613
|
+
- String with only whitespace
|
|
614
|
+
|
|
615
|
+
5. Log intermediate results:
|
|
616
|
+
const re = /(\w+)\s+(\w+)/;
|
|
617
|
+
const match = re.exec(input);
|
|
618
|
+
console.log('Full match:', match[0]);
|
|
619
|
+
console.log('Group 1:', match[1]);
|
|
620
|
+
console.log('Group 2:', match[2]);
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### Common Debugging Mistakes
|
|
624
|
+
|
|
625
|
+
```
|
|
626
|
+
# Forgetting to escape special characters
|
|
627
|
+
/file.txt/ # Matches "file_txt" too (dot matches anything)
|
|
628
|
+
/file\.txt/ # Correct: matches only "file.txt"
|
|
629
|
+
|
|
630
|
+
# Forgetting anchors
|
|
631
|
+
/\d{3}/ # Matches "123" inside "abc12345def"
|
|
632
|
+
/^\d{3}$/ # Matches only strings that are exactly 3 digits
|
|
633
|
+
|
|
634
|
+
# Greedy matching eating too much
|
|
635
|
+
/<.*>/ # On "<a>text</a>", matches the entire string
|
|
636
|
+
/<[^>]*>/ # Correct: matches "<a>" and "</a>" separately
|
|
637
|
+
|
|
638
|
+
# Multiline misunderstanding
|
|
639
|
+
/^line$/ # Only matches if entire string is "line"
|
|
640
|
+
/^line$/m # Matches "line" on any line in a multiline string
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
---
|
|
644
|
+
|
|
645
|
+
## 11. When NOT to Use Regex
|
|
646
|
+
|
|
647
|
+
### HTML/XML Parsing
|
|
648
|
+
|
|
649
|
+
```
|
|
650
|
+
# NEVER parse HTML with regex. Use a DOM parser.
|
|
651
|
+
|
|
652
|
+
# BAD:
|
|
653
|
+
/<div class="title">(.*?)<\/div>/
|
|
654
|
+
|
|
655
|
+
# Why it fails:
|
|
656
|
+
# - Nested divs
|
|
657
|
+
# - Attributes in different orders
|
|
658
|
+
# - Self-closing tags
|
|
659
|
+
# - Comments containing tags
|
|
660
|
+
# - Malformed HTML
|
|
661
|
+
|
|
662
|
+
# GOOD:
|
|
663
|
+
# JavaScript: DOMParser, cheerio
|
|
664
|
+
# Python: BeautifulSoup, lxml
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
### Complex Grammars
|
|
668
|
+
|
|
669
|
+
```
|
|
670
|
+
# Regex cannot parse:
|
|
671
|
+
# - Nested parentheses of arbitrary depth: ((()))
|
|
672
|
+
# - Matching braces in programming languages
|
|
673
|
+
# - JSON, YAML, TOML
|
|
674
|
+
# - Programming language syntax
|
|
675
|
+
# - Mathematical expressions
|
|
676
|
+
|
|
677
|
+
# Use a parser (PEG, ANTLR, tree-sitter) for these.
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
### Simple String Operations
|
|
681
|
+
|
|
682
|
+
```
|
|
683
|
+
# Do not use regex when simple string methods work:
|
|
684
|
+
|
|
685
|
+
# BAD: /^prefix/.test(str)
|
|
686
|
+
# GOOD: str.startsWith('prefix')
|
|
687
|
+
|
|
688
|
+
# BAD: /suffix$/.test(str)
|
|
689
|
+
# GOOD: str.endsWith('suffix')
|
|
690
|
+
|
|
691
|
+
# BAD: str.replace(/foo/g, 'bar') (for literal strings)
|
|
692
|
+
# GOOD: str.replaceAll('foo', 'bar')
|
|
693
|
+
|
|
694
|
+
# BAD: /^$/.test(str)
|
|
695
|
+
# GOOD: str.length === 0
|
|
696
|
+
|
|
697
|
+
# BAD: str.split(/,/)
|
|
698
|
+
# GOOD: str.split(',') (for literal delimiters)
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
### URL Parsing
|
|
702
|
+
|
|
703
|
+
```
|
|
704
|
+
# Do not regex URLs. Use the URL API.
|
|
705
|
+
|
|
706
|
+
# BAD:
|
|
707
|
+
const match = url.match(/^(https?):\/\/([^\/]+)(\/.*)?$/);
|
|
708
|
+
|
|
709
|
+
# GOOD:
|
|
710
|
+
const parsed = new URL(url);
|
|
711
|
+
// parsed.protocol, parsed.hostname, parsed.pathname, parsed.searchParams
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
### When Regex IS the Right Tool
|
|
715
|
+
|
|
716
|
+
```
|
|
717
|
+
# Regex excels at:
|
|
718
|
+
# - Pattern matching in text (log parsing, data extraction)
|
|
719
|
+
# - Input validation (format checks)
|
|
720
|
+
# - Search and replace with pattern awareness
|
|
721
|
+
# - Tokenizing simple grammars (CSV fields, log lines)
|
|
722
|
+
# - Text cleanup (normalize whitespace, strip control characters)
|
|
723
|
+
# - Splitting on complex delimiters
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
---
|
|
727
|
+
|
|
728
|
+
## 12. Critical Reminders
|
|
729
|
+
|
|
730
|
+
### ALWAYS
|
|
731
|
+
|
|
732
|
+
- Use raw strings (Python: `r'...'`) to avoid double-escaping backslashes
|
|
733
|
+
- Anchor patterns with `^` and `$` when validating entire strings
|
|
734
|
+
- Use non-capturing groups `(?:...)` when you do not need the captured value
|
|
735
|
+
- Prefer negated character classes `[^"]*` over lazy quantifiers `.*?` for performance
|
|
736
|
+
- Test with adversarial inputs to check for ReDoS
|
|
737
|
+
- Use named groups for readability in complex patterns
|
|
738
|
+
- Escape user input before inserting into regex (prevent injection)
|
|
739
|
+
- Use the `/u` flag in JavaScript for Unicode correctness
|
|
740
|
+
- Comment complex regex patterns (use verbose mode or build from named parts)
|
|
741
|
+
|
|
742
|
+
### NEVER
|
|
743
|
+
|
|
744
|
+
- Parse HTML, XML, JSON, or any recursive grammar with regex
|
|
745
|
+
- Use nested quantifiers without understanding backtracking: `(a+)+`
|
|
746
|
+
- Trust regex for email validation beyond basic format checks (use a library)
|
|
747
|
+
- Hardcode regex for international content without Unicode support
|
|
748
|
+
- Use `.` when you mean a specific character class (be explicit)
|
|
749
|
+
- Use `.*` in a pattern that processes user input without backtracking protection
|
|
750
|
+
- Forget that `^` and `$` behave differently with and without the `/m` flag
|
|
751
|
+
- Build regex from untrusted user input without escaping special characters
|