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,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typescript-advanced-patterns
|
|
3
|
+
description: Advanced TypeScript patterns for type-safe, maintainable code using sophisticated type system features. Use when building type-safe APIs, implementing complex domain models, or leveraging TypeScript's advanced type capabilities.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TypeScript Advanced Patterns
|
|
7
|
+
|
|
8
|
+
Expert guidance for leveraging TypeScript's advanced type system features to build robust, type-safe applications with sophisticated type inference, compile-time guarantees, and maintainable domain models.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Building type-safe APIs with strict contracts and validation
|
|
13
|
+
- Implementing complex domain models with compile-time enforcement
|
|
14
|
+
- Creating reusable libraries with sophisticated type inference
|
|
15
|
+
- Enforcing business rules through the type system
|
|
16
|
+
- Building type-safe state machines and builders
|
|
17
|
+
- Developing framework integrations requiring advanced types
|
|
18
|
+
- Implementing runtime validation with type-level guarantees
|
|
19
|
+
|
|
20
|
+
## Core Concepts
|
|
21
|
+
|
|
22
|
+
TypeScript's type system enables compile-time safety through:
|
|
23
|
+
|
|
24
|
+
1. **Conditional Types**: Type selection based on conditions (type-level if/else)
|
|
25
|
+
2. **Mapped Types**: Transform object types systematically (Partial, Readonly, Pick, Omit)
|
|
26
|
+
3. **Template Literal Types**: String manipulation at compile time
|
|
27
|
+
4. **Type Guards**: Runtime checking with type narrowing (`value is Type`)
|
|
28
|
+
5. **Discriminated Unions**: Type-safe state machines with exhaustiveness checking
|
|
29
|
+
6. **Branded Types**: Nominal types for preventing primitive mixing
|
|
30
|
+
7. **Builder Pattern**: Type-safe fluent APIs with progressive type constraints
|
|
31
|
+
8. **Advanced Generics**: Constraints, inference, and higher-kinded type patterns
|
|
32
|
+
9. **Utility Types**: Deep transformations and compositions
|
|
33
|
+
10. **Type Inference**: Const assertions and contextual typing
|
|
34
|
+
|
|
35
|
+
## Quick Reference
|
|
36
|
+
|
|
37
|
+
Load detailed references on-demand:
|
|
38
|
+
|
|
39
|
+
| Topic | Reference File |
|
|
40
|
+
|-------|----------------|
|
|
41
|
+
| Conditional Types | `skills/typescript-advanced-patterns/references/conditional-types.md` |
|
|
42
|
+
| Mapped Types | `skills/typescript-advanced-patterns/references/mapped-types.md` |
|
|
43
|
+
| Template Literal Types | `skills/typescript-advanced-patterns/references/template-literal-types.md` |
|
|
44
|
+
| Type Guards | `skills/typescript-advanced-patterns/references/type-guards.md` |
|
|
45
|
+
| Discriminated Unions | `skills/typescript-advanced-patterns/references/discriminated-unions.md` |
|
|
46
|
+
| Branded Types | `skills/typescript-advanced-patterns/references/branded-types.md` |
|
|
47
|
+
| Builder Pattern | `skills/typescript-advanced-patterns/references/builder-pattern.md` |
|
|
48
|
+
| Advanced Generics | `skills/typescript-advanced-patterns/references/advanced-generics.md` |
|
|
49
|
+
| Utility Types | `skills/typescript-advanced-patterns/references/utility-types.md` |
|
|
50
|
+
| Type Inference | `skills/typescript-advanced-patterns/references/type-inference.md` |
|
|
51
|
+
| Decorators | `skills/typescript-advanced-patterns/references/decorators.md` |
|
|
52
|
+
| Performance Best Practices | `skills/typescript-advanced-patterns/references/performance-best-practices.md` |
|
|
53
|
+
| Common Pitfalls | `skills/typescript-advanced-patterns/references/common-pitfalls.md` |
|
|
54
|
+
| Testing Types | `skills/typescript-advanced-patterns/references/testing-types.md` |
|
|
55
|
+
|
|
56
|
+
## Implementation Workflow
|
|
57
|
+
|
|
58
|
+
### 1. Identify Pattern Need
|
|
59
|
+
- Analyze type safety requirements
|
|
60
|
+
- Identify runtime vs compile-time constraints
|
|
61
|
+
- Choose appropriate pattern from Quick Reference
|
|
62
|
+
|
|
63
|
+
### 2. Load Reference
|
|
64
|
+
- Read specific reference file for pattern
|
|
65
|
+
- Review examples and use cases
|
|
66
|
+
- Understand trade-offs
|
|
67
|
+
|
|
68
|
+
### 3. Implement Pattern
|
|
69
|
+
- Start simple, add complexity as needed
|
|
70
|
+
- Use strict mode (`tsconfig.json` with `"strict": true`)
|
|
71
|
+
- Test with type assertions
|
|
72
|
+
|
|
73
|
+
### 4. Validate
|
|
74
|
+
- Ensure type errors caught at compile time
|
|
75
|
+
- Verify runtime behavior matches types
|
|
76
|
+
- Check performance (avoid excessive type complexity)
|
|
77
|
+
|
|
78
|
+
### 5. Document
|
|
79
|
+
- Add JSDoc comments for public APIs
|
|
80
|
+
- Document type constraints and assumptions
|
|
81
|
+
- Provide usage examples
|
|
82
|
+
|
|
83
|
+
## Common Mistakes to Avoid
|
|
84
|
+
|
|
85
|
+
1. **Using `any` instead of `unknown`**: Loses all type safety
|
|
86
|
+
- Use `unknown` and type guards instead
|
|
87
|
+
|
|
88
|
+
2. **Type assertions without validation**: Unsafe runtime behavior
|
|
89
|
+
- Prefer type guards (`value is Type`) over `as Type`
|
|
90
|
+
|
|
91
|
+
3. **Overusing generics**: Unnecessary complexity
|
|
92
|
+
- Only use generics when types truly vary
|
|
93
|
+
|
|
94
|
+
4. **Deep type nesting**: Slow compilation, hard to debug
|
|
95
|
+
- Keep types composable and shallow
|
|
96
|
+
|
|
97
|
+
5. **Forgetting `readonly`**: Accidental mutations
|
|
98
|
+
- Mark immutable data structures as `readonly`
|
|
99
|
+
|
|
100
|
+
6. **Not enabling strict mode**: Missing null checks and type errors
|
|
101
|
+
- Always use `"strict": true` in `tsconfig.json`
|
|
102
|
+
|
|
103
|
+
7. **Mixing type and interface incorrectly**: Confusing semantics
|
|
104
|
+
- Use `type` for unions/utilities, `interface` for object shapes
|
|
105
|
+
|
|
106
|
+
## Quick Patterns
|
|
107
|
+
|
|
108
|
+
### Type-Safe ID
|
|
109
|
+
```typescript
|
|
110
|
+
type UserId = string & { readonly __brand: 'UserId' };
|
|
111
|
+
function createUserId(id: string): UserId { return id as UserId; }
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Discriminated Union
|
|
115
|
+
```typescript
|
|
116
|
+
type State =
|
|
117
|
+
| { status: 'loading' }
|
|
118
|
+
| { status: 'success'; data: string }
|
|
119
|
+
| { status: 'error'; error: Error };
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Mapped Type Transformation
|
|
123
|
+
```typescript
|
|
124
|
+
type Readonly<T> = { readonly [P in keyof T]: T[P] };
|
|
125
|
+
type Partial<T> = { [P in keyof T]?: T[P] };
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Type Guard
|
|
129
|
+
```typescript
|
|
130
|
+
function isString(value: unknown): value is string {
|
|
131
|
+
return typeof value === 'string';
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Resources
|
|
136
|
+
|
|
137
|
+
- **TypeScript Handbook**: https://www.typescriptlang.org/docs/handbook/
|
|
138
|
+
- **Type Challenges**: https://github.com/type-challenges/type-challenges
|
|
139
|
+
- **ts-toolbelt**: Advanced type utilities library
|
|
140
|
+
- **zod**: Runtime validation with TypeScript inference
|
|
141
|
+
- **tsd**: Test TypeScript type definitions
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Advanced Generics
|
|
2
|
+
|
|
3
|
+
**Generic constraints and inference:**
|
|
4
|
+
|
|
5
|
+
## Basic Constraints
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Constrain to objects with specific keys
|
|
9
|
+
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
|
|
10
|
+
return obj[key];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const user = { name: 'John', age: 30 };
|
|
14
|
+
const name = getProperty(user, 'name'); // Type: string
|
|
15
|
+
// const invalid = getProperty(user, 'invalid'); // Error
|
|
16
|
+
|
|
17
|
+
// Multiple constraints
|
|
18
|
+
function merge<T extends object, U extends object>(
|
|
19
|
+
obj1: T,
|
|
20
|
+
obj2: U
|
|
21
|
+
): T & U {
|
|
22
|
+
return { ...obj1, ...obj2 };
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Generic Inference
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Infer from function implementation
|
|
30
|
+
function createAction<T extends string, P>(
|
|
31
|
+
type: T,
|
|
32
|
+
payload: P
|
|
33
|
+
) {
|
|
34
|
+
return { type, payload };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const action = createAction('UPDATE_USER', { id: 1, name: 'John' });
|
|
38
|
+
// Type: { type: 'UPDATE_USER'; payload: { id: number; name: string } }
|
|
39
|
+
|
|
40
|
+
// Infer generic types from usage
|
|
41
|
+
function useState<S>(
|
|
42
|
+
initialState: S | (() => S)
|
|
43
|
+
): [S, (newState: S) => void] {
|
|
44
|
+
// Implementation
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const [count, setCount] = useState(0); // S inferred as number
|
|
48
|
+
const [user, setUser] = useState({ name: 'John' }); // S inferred as { name: string }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Higher-Kinded Types Pattern
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// Type-safe data structures
|
|
55
|
+
interface Functor<F> {
|
|
56
|
+
map<A, B>(fa: F extends { value: any } ? F : never, f: (a: A) => B): any;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface Box<T> {
|
|
60
|
+
value: T;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const boxFunctor: Functor<Box<any>> = {
|
|
64
|
+
map<A, B>(fa: Box<A>, f: (a: A) => B): Box<B> {
|
|
65
|
+
return { value: f(fa.value) };
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Conditional Generic Types
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// Return type varies based on parameter
|
|
74
|
+
type ApiResponse<T extends string> =
|
|
75
|
+
T extends 'json' ? object :
|
|
76
|
+
T extends 'text' ? string :
|
|
77
|
+
T extends 'blob' ? Blob :
|
|
78
|
+
never;
|
|
79
|
+
|
|
80
|
+
async function fetch<T extends 'json' | 'text' | 'blob'>(
|
|
81
|
+
url: string,
|
|
82
|
+
type: T
|
|
83
|
+
): Promise<ApiResponse<T>> {
|
|
84
|
+
// Implementation
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const json = await fetch('/api', 'json'); // Type: object
|
|
88
|
+
const text = await fetch('/api', 'text'); // Type: string
|
|
89
|
+
const blob = await fetch('/api', 'blob'); // Type: Blob
|
|
90
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Branded Types
|
|
2
|
+
|
|
3
|
+
**Create nominal types for type safety:**
|
|
4
|
+
|
|
5
|
+
## Preventing Primitive Mixing
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Prevent mixing similar primitive types
|
|
9
|
+
type UserId = string & { readonly __brand: 'UserId' };
|
|
10
|
+
type PostId = string & { readonly __brand: 'PostId' };
|
|
11
|
+
|
|
12
|
+
function createUserId(id: string): UserId {
|
|
13
|
+
return id as UserId;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function createPostId(id: string): PostId {
|
|
17
|
+
return id as PostId;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getUser(userId: UserId): User {
|
|
21
|
+
// Implementation
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const userId = createUserId('user-123');
|
|
25
|
+
const postId = createPostId('post-456');
|
|
26
|
+
|
|
27
|
+
getUser(userId); // Valid
|
|
28
|
+
// getUser(postId); // Type error: PostId not assignable to UserId
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Validation with Branded Types
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
type ValidEmail = string & { readonly __brand: 'ValidEmail' };
|
|
35
|
+
type ValidURL = string & { readonly __brand: 'ValidURL' };
|
|
36
|
+
|
|
37
|
+
function validateEmail(email: string): ValidEmail | null {
|
|
38
|
+
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
39
|
+
return regex.test(email) ? (email as ValidEmail) : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function sendEmail(to: ValidEmail, subject: string, body: string) {
|
|
43
|
+
// Guaranteed to have valid email
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const email = validateEmail('user@example.com');
|
|
47
|
+
if (email) {
|
|
48
|
+
sendEmail(email, 'Hello', 'World');
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Benefits
|
|
53
|
+
|
|
54
|
+
- Compile-time prevention of ID mixing
|
|
55
|
+
- Self-documenting code through type names
|
|
56
|
+
- Enforced validation at boundaries
|
|
57
|
+
- Zero runtime overhead
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Builder Pattern with Types
|
|
2
|
+
|
|
3
|
+
**Type-safe fluent APIs:**
|
|
4
|
+
|
|
5
|
+
## Query Builder Example
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
interface QueryBuilder<TSelect = unknown, TWhere = unknown> {
|
|
9
|
+
select<T>(): QueryBuilder<T, TWhere>;
|
|
10
|
+
where<T>(): QueryBuilder<TSelect, T>;
|
|
11
|
+
execute(): TSelect extends unknown ? never : Promise<TSelect[]>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Usage ensures select() called before execute()
|
|
15
|
+
const results = await query
|
|
16
|
+
.select<User>()
|
|
17
|
+
.where<{ age: number }>()
|
|
18
|
+
.execute(); // Type: Promise<User[]>
|
|
19
|
+
|
|
20
|
+
// query.execute(); // Error: select() not called
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Progressive Builder Types
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
interface ConfigBuilder<
|
|
27
|
+
THost extends string | undefined = undefined,
|
|
28
|
+
TPort extends number | undefined = undefined
|
|
29
|
+
> {
|
|
30
|
+
host: THost;
|
|
31
|
+
port: TPort;
|
|
32
|
+
|
|
33
|
+
withHost<H extends string>(host: H): ConfigBuilder<H, TPort>;
|
|
34
|
+
withPort<P extends number>(port: P): ConfigBuilder<THost, P>;
|
|
35
|
+
|
|
36
|
+
build: THost extends string
|
|
37
|
+
? TPort extends number
|
|
38
|
+
? () => { host: THost; port: TPort }
|
|
39
|
+
: never
|
|
40
|
+
: never;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const config = new ConfigBuilder()
|
|
44
|
+
.withHost('localhost')
|
|
45
|
+
.withPort(3000)
|
|
46
|
+
.build(); // Valid
|
|
47
|
+
|
|
48
|
+
// new ConfigBuilder().build(); // Error: host and port required
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Type State Pattern
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// Enforce method call order at compile time
|
|
55
|
+
interface EmptyBuilder {
|
|
56
|
+
addItem<T>(item: T): FilledBuilder<T>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface FilledBuilder<T> {
|
|
60
|
+
addItem(item: T): FilledBuilder<T>;
|
|
61
|
+
build(): T[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Must call addItem() before build()
|
|
65
|
+
const items = builder
|
|
66
|
+
.addItem('first')
|
|
67
|
+
.addItem('second')
|
|
68
|
+
.build(); // Valid
|
|
69
|
+
|
|
70
|
+
// builder.build(); // Error: can't build empty
|
|
71
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Common Pitfalls
|
|
2
|
+
|
|
3
|
+
## Type Assertions vs Type Guards
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Bad - unsafe type assertion
|
|
7
|
+
const value = input as string;
|
|
8
|
+
|
|
9
|
+
// Good - safe type guard
|
|
10
|
+
function assertString(value: unknown): asserts value is string {
|
|
11
|
+
if (typeof value !== 'string') {
|
|
12
|
+
throw new Error('Not a string');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
assertString(input);
|
|
17
|
+
// input is now narrowed to string
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Any vs Unknown
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// Bad - loses type safety
|
|
24
|
+
function process(data: any) {
|
|
25
|
+
return data.toUpperCase(); // No type checking
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Good - maintains type safety
|
|
29
|
+
function processUnknown(data: unknown) {
|
|
30
|
+
if (typeof data === 'string') {
|
|
31
|
+
return data.toUpperCase(); // Type guard required
|
|
32
|
+
}
|
|
33
|
+
throw new Error('Expected string');
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Overusing Generics
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// Bad - unnecessary complexity
|
|
41
|
+
function add<T extends number, U extends number>(a: T, b: U): number {
|
|
42
|
+
return a + b;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Good - simple and clear
|
|
46
|
+
function add(a: number, b: number): number {
|
|
47
|
+
return a + b;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Incorrect Type Narrowing
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// Bad - doesn't narrow type
|
|
55
|
+
function isString(value: any): boolean {
|
|
56
|
+
return typeof value === 'string';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Good - properly narrows type
|
|
60
|
+
function isString(value: unknown): value is string {
|
|
61
|
+
return typeof value === 'string';
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Forgetting Readonly
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// Bad - mutable when should be immutable
|
|
69
|
+
interface Config {
|
|
70
|
+
apiUrl: string;
|
|
71
|
+
timeout: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Good - prevent accidental mutations
|
|
75
|
+
interface Config {
|
|
76
|
+
readonly apiUrl: string;
|
|
77
|
+
readonly timeout: number;
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Enum Pitfalls
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// Bad - numeric enums allow invalid values
|
|
85
|
+
enum Status {
|
|
86
|
+
Active,
|
|
87
|
+
Inactive
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const status: Status = 999; // Valid but meaningless
|
|
91
|
+
|
|
92
|
+
// Good - use string enums or const objects
|
|
93
|
+
enum Status {
|
|
94
|
+
Active = 'ACTIVE',
|
|
95
|
+
Inactive = 'INACTIVE'
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Or use const object with as const
|
|
99
|
+
const Status = {
|
|
100
|
+
Active: 'ACTIVE',
|
|
101
|
+
Inactive: 'INACTIVE'
|
|
102
|
+
} as const;
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Not Using Strict Mode
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Always enable in tsconfig.json
|
|
109
|
+
{
|
|
110
|
+
"compilerOptions": {
|
|
111
|
+
"strict": true,
|
|
112
|
+
"strictNullChecks": true,
|
|
113
|
+
"strictFunctionTypes": true,
|
|
114
|
+
"strictPropertyInitialization": true
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Type vs Interface Confusion
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// Use type for unions, intersections, utilities
|
|
123
|
+
type ID = string | number;
|
|
124
|
+
type Point = { x: number } & { y: number };
|
|
125
|
+
|
|
126
|
+
// Use interface for object shapes that may be extended
|
|
127
|
+
interface User {
|
|
128
|
+
id: ID;
|
|
129
|
+
name: string;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface Admin extends User {
|
|
133
|
+
permissions: string[];
|
|
134
|
+
}
|
|
135
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Conditional Types
|
|
2
|
+
|
|
3
|
+
**Type selection based on conditions:**
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
type IsString<T> = T extends string ? true : false;
|
|
7
|
+
|
|
8
|
+
type A = IsString<string>; // true
|
|
9
|
+
type B = IsString<number>; // false
|
|
10
|
+
|
|
11
|
+
// Extract function return types
|
|
12
|
+
type ReturnTypeOf<T> = T extends (...args: any[]) => infer R ? R : never;
|
|
13
|
+
|
|
14
|
+
type Fn = () => { name: string; age: number };
|
|
15
|
+
type Result = ReturnTypeOf<Fn>; // { name: string; age: number }
|
|
16
|
+
|
|
17
|
+
// Extract array element types
|
|
18
|
+
type ElementOf<T> = T extends (infer E)[] ? E : never;
|
|
19
|
+
|
|
20
|
+
type Items = ElementOf<string[]>; // string
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Use Cases
|
|
24
|
+
- Type transformation and extraction
|
|
25
|
+
- Conditional API responses based on request types
|
|
26
|
+
- Generic utility type creation
|
|
27
|
+
- Framework integration types
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Decorators (Stage 3)
|
|
2
|
+
|
|
3
|
+
**Class and method decorators for cross-cutting concerns:**
|
|
4
|
+
|
|
5
|
+
## Method Decorators
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Method decorator for logging
|
|
9
|
+
function log(
|
|
10
|
+
target: any,
|
|
11
|
+
propertyKey: string,
|
|
12
|
+
descriptor: PropertyDescriptor
|
|
13
|
+
) {
|
|
14
|
+
const original = descriptor.value;
|
|
15
|
+
|
|
16
|
+
descriptor.value = function(...args: any[]) {
|
|
17
|
+
console.log(`Calling ${propertyKey} with`, args);
|
|
18
|
+
const result = original.apply(this, args);
|
|
19
|
+
console.log(`Result:`, result);
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
return descriptor;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
class Calculator {
|
|
27
|
+
@log
|
|
28
|
+
add(a: number, b: number): number {
|
|
29
|
+
return a + b;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Property Decorators
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// Property decorator for validation
|
|
38
|
+
function validate(validator: (value: any) => boolean) {
|
|
39
|
+
return function(target: any, propertyKey: string) {
|
|
40
|
+
let value = target[propertyKey];
|
|
41
|
+
|
|
42
|
+
Object.defineProperty(target, propertyKey, {
|
|
43
|
+
get: () => value,
|
|
44
|
+
set: (newValue) => {
|
|
45
|
+
if (!validator(newValue)) {
|
|
46
|
+
throw new Error(`Invalid value for ${propertyKey}`);
|
|
47
|
+
}
|
|
48
|
+
value = newValue;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
class User {
|
|
55
|
+
@validate(email => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))
|
|
56
|
+
email: string;
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Class Decorators
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// Class decorator for metadata
|
|
64
|
+
function sealed(constructor: Function) {
|
|
65
|
+
Object.seal(constructor);
|
|
66
|
+
Object.seal(constructor.prototype);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@sealed
|
|
70
|
+
class SealedClass {
|
|
71
|
+
constructor(public name: string) {}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Decorator Factories
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Decorator with parameters
|
|
79
|
+
function component(config: { selector: string }) {
|
|
80
|
+
return function(constructor: Function) {
|
|
81
|
+
constructor.prototype.selector = config.selector;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@component({ selector: 'app-user' })
|
|
86
|
+
class UserComponent {
|
|
87
|
+
// selector property added at runtime
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Common Use Cases
|
|
92
|
+
|
|
93
|
+
- **Logging**: Automatic method call logging
|
|
94
|
+
- **Validation**: Property value validation
|
|
95
|
+
- **Memoization**: Cache method results
|
|
96
|
+
- **Authorization**: Check permissions before execution
|
|
97
|
+
- **Dependency Injection**: Inject dependencies into classes
|
|
98
|
+
- **Metadata**: Attach runtime metadata for frameworks
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Discriminated Unions
|
|
2
|
+
|
|
3
|
+
**Type-safe state machines and variants:**
|
|
4
|
+
|
|
5
|
+
## State Machines
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// State machine with exhaustive checking
|
|
9
|
+
type LoadingState =
|
|
10
|
+
| { status: 'idle' }
|
|
11
|
+
| { status: 'loading' }
|
|
12
|
+
| { status: 'success'; data: string[] }
|
|
13
|
+
| { status: 'error'; error: Error };
|
|
14
|
+
|
|
15
|
+
function renderState(state: LoadingState): string {
|
|
16
|
+
switch (state.status) {
|
|
17
|
+
case 'idle':
|
|
18
|
+
return 'Not started';
|
|
19
|
+
case 'loading':
|
|
20
|
+
return 'Loading...';
|
|
21
|
+
case 'success':
|
|
22
|
+
return `Loaded ${state.data.length} items`;
|
|
23
|
+
case 'error':
|
|
24
|
+
return `Error: ${state.error.message}`;
|
|
25
|
+
}
|
|
26
|
+
// Exhaustiveness checking ensures all cases handled
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Action Types
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// API action types
|
|
34
|
+
type Action =
|
|
35
|
+
| { type: 'FETCH_USER'; payload: { userId: string } }
|
|
36
|
+
| { type: 'UPDATE_USER'; payload: { userId: string; data: Partial<User> } }
|
|
37
|
+
| { type: 'DELETE_USER'; payload: { userId: string } }
|
|
38
|
+
| { type: 'CLEAR_USERS' };
|
|
39
|
+
|
|
40
|
+
function reducer(state: State, action: Action): State {
|
|
41
|
+
switch (action.type) {
|
|
42
|
+
case 'FETCH_USER':
|
|
43
|
+
// action.payload is { userId: string }
|
|
44
|
+
return { ...state, loading: true };
|
|
45
|
+
case 'UPDATE_USER':
|
|
46
|
+
// action.payload is { userId: string; data: Partial<User> }
|
|
47
|
+
return updateUser(state, action.payload);
|
|
48
|
+
case 'DELETE_USER':
|
|
49
|
+
return deleteUser(state, action.payload.userId);
|
|
50
|
+
case 'CLEAR_USERS':
|
|
51
|
+
// action has no payload
|
|
52
|
+
return { ...state, users: [] };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Best Practices
|
|
58
|
+
|
|
59
|
+
- Always include a discriminant property (e.g., `status`, `type`)
|
|
60
|
+
- Use string literal types for discriminant values
|
|
61
|
+
- Enable `strictNullChecks` for exhaustiveness checking
|
|
62
|
+
- Use `never` to ensure all cases are handled
|