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,53 @@
|
|
|
1
|
+
# Mapped Types
|
|
2
|
+
|
|
3
|
+
**Transform object types systematically:**
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Make all properties optional
|
|
7
|
+
type Partial<T> = {
|
|
8
|
+
[P in keyof T]?: T[P];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// Make all properties readonly
|
|
12
|
+
type Readonly<T> = {
|
|
13
|
+
readonly [P in keyof T]: T[P];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// Pick specific properties
|
|
17
|
+
type Pick<T, K extends keyof T> = {
|
|
18
|
+
[P in K]: T[P];
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
interface User {
|
|
22
|
+
id: number;
|
|
23
|
+
name: string;
|
|
24
|
+
email: string;
|
|
25
|
+
password: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Create API response type
|
|
29
|
+
type UserResponse = Omit<User, 'password'>;
|
|
30
|
+
|
|
31
|
+
// Create update type (all optional)
|
|
32
|
+
type UserUpdate = Partial<User>;
|
|
33
|
+
|
|
34
|
+
// Create creation type (no id)
|
|
35
|
+
type UserCreate = Omit<User, 'id'>;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Advanced Mapping
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// Add prefix to all keys
|
|
42
|
+
type Prefixed<T, Prefix extends string> = {
|
|
43
|
+
[K in keyof T as `${Prefix}${string & K}`]: T[K];
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
type Events = {
|
|
47
|
+
click: MouseEvent;
|
|
48
|
+
focus: FocusEvent;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
type Handlers = Prefixed<Events, 'on'>;
|
|
52
|
+
// { onclick: MouseEvent; onfocus: FocusEvent }
|
|
53
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Performance Best Practices
|
|
2
|
+
|
|
3
|
+
## Avoid Excessive Type Complexity
|
|
4
|
+
|
|
5
|
+
**Keep types simple and composable:**
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Bad - deeply nested types
|
|
9
|
+
type Complex<T> = T extends Array<infer U>
|
|
10
|
+
? U extends Array<infer V>
|
|
11
|
+
? V extends Array<infer W>
|
|
12
|
+
? W extends Array<infer X>
|
|
13
|
+
? X
|
|
14
|
+
: never
|
|
15
|
+
: never
|
|
16
|
+
: never
|
|
17
|
+
: never;
|
|
18
|
+
|
|
19
|
+
// Good - iterative approach
|
|
20
|
+
type ElementType<T> = T extends (infer E)[] ? E : T;
|
|
21
|
+
|
|
22
|
+
type Deep1<T> = ElementType<T>;
|
|
23
|
+
type Deep2<T> = ElementType<Deep1<T>>;
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Use Type Aliases for Reusability
|
|
27
|
+
|
|
28
|
+
**Extract common patterns:**
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// Define once, reuse everywhere
|
|
32
|
+
type ID = string | number;
|
|
33
|
+
type Timestamp = number;
|
|
34
|
+
type Optional<T> = T | null | undefined;
|
|
35
|
+
|
|
36
|
+
interface User {
|
|
37
|
+
id: ID;
|
|
38
|
+
createdAt: Timestamp;
|
|
39
|
+
lastLogin: Optional<Timestamp>;
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Leverage Inference
|
|
44
|
+
|
|
45
|
+
**Let TypeScript infer when possible:**
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// Don't over-annotate
|
|
49
|
+
const users = [
|
|
50
|
+
{ id: 1, name: 'John' },
|
|
51
|
+
{ id: 2, name: 'Jane' }
|
|
52
|
+
]; // Type inferred automatically
|
|
53
|
+
|
|
54
|
+
// Use inference in generics
|
|
55
|
+
function identity<T>(value: T): T {
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const num = identity(42); // T inferred as 42 (literal type)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Avoid Type Computation Overhead
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// Bad - expensive type computation on every use
|
|
66
|
+
type ExpensiveUnion<T> = T extends any
|
|
67
|
+
? { [K in keyof T]: SomeComplexType<T[K]> }
|
|
68
|
+
: never;
|
|
69
|
+
|
|
70
|
+
// Good - compute once, reuse
|
|
71
|
+
type PrecomputedType = ExpensiveUnion<MyType>;
|
|
72
|
+
function useType(value: PrecomputedType) { }
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Use Index Signatures Wisely
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Bad - loses type safety
|
|
79
|
+
interface LooseMap {
|
|
80
|
+
[key: string]: any;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Good - constrained types
|
|
84
|
+
interface TypedMap {
|
|
85
|
+
[key: string]: string | number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Better - use Record for known types
|
|
89
|
+
type StrictMap = Record<'id' | 'name' | 'age', string | number>;
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Optimize Union Types
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// Bad - large union causes slow checking
|
|
96
|
+
type ManyStrings = 'a' | 'b' | 'c' | /* ...100 more */ | 'z';
|
|
97
|
+
|
|
98
|
+
// Good - use branded types or enums for large sets
|
|
99
|
+
enum StringEnum {
|
|
100
|
+
A = 'a',
|
|
101
|
+
B = 'b',
|
|
102
|
+
// ...
|
|
103
|
+
}
|
|
104
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Template Literal Types
|
|
2
|
+
|
|
3
|
+
**String type manipulation at compile time:**
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Event handler types
|
|
7
|
+
type EventNames = 'click' | 'focus' | 'blur';
|
|
8
|
+
type EventHandlers = `on${Capitalize<EventNames>}`;
|
|
9
|
+
// 'onClick' | 'onFocus' | 'onBlur'
|
|
10
|
+
|
|
11
|
+
// URL path types
|
|
12
|
+
type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
13
|
+
type Endpoint = `/api/${'users' | 'posts' | 'comments'}`;
|
|
14
|
+
type Route = `${HTTPMethod} ${Endpoint}`;
|
|
15
|
+
// 'GET /api/users' | 'POST /api/users' | ...
|
|
16
|
+
|
|
17
|
+
// CSS property types
|
|
18
|
+
type CSSUnit = 'px' | 'em' | 'rem' | '%';
|
|
19
|
+
type Size = `${number}${CSSUnit}`;
|
|
20
|
+
|
|
21
|
+
const width: Size = '100px'; // Valid
|
|
22
|
+
const height: Size = '2em'; // Valid
|
|
23
|
+
// const invalid: Size = '100'; // Error
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Nested Template Literals
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
type DeepKey<T> = T extends object
|
|
30
|
+
? {
|
|
31
|
+
[K in keyof T & string]: K | `${K}.${DeepKey<T[K]>}`;
|
|
32
|
+
}[keyof T & string]
|
|
33
|
+
: never;
|
|
34
|
+
|
|
35
|
+
interface Config {
|
|
36
|
+
database: {
|
|
37
|
+
host: string;
|
|
38
|
+
port: number;
|
|
39
|
+
credentials: {
|
|
40
|
+
username: string;
|
|
41
|
+
password: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type ConfigKeys = DeepKey<Config>;
|
|
47
|
+
// 'database' | 'database.host' | 'database.port' |
|
|
48
|
+
// 'database.credentials' | 'database.credentials.username' | ...
|
|
49
|
+
```
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Testing Type-Safe Code
|
|
2
|
+
|
|
3
|
+
## Type Assertion Tests
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Type equality checker
|
|
7
|
+
type AssertEqual<T, U> = T extends U ? (U extends T ? true : false) : false;
|
|
8
|
+
|
|
9
|
+
type Test1 = AssertEqual<Pick<User, 'name'>, { name: string }>; // true
|
|
10
|
+
type Test2 = AssertEqual<string, number>; // false
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Compile-Time Validation
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Expect type to match
|
|
17
|
+
function expectType<T>(value: T): T {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const user: User = { id: 1, name: 'John', email: 'john@example.com', password: 'secret' };
|
|
22
|
+
expectType<UserResponse>(user); // Error: password should not exist
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Test Helper Types
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
// Assert never (for exhaustiveness checking)
|
|
29
|
+
type AssertNever<T extends never> = T;
|
|
30
|
+
|
|
31
|
+
// Assert extends
|
|
32
|
+
type AssertExtends<T, U extends T> = U;
|
|
33
|
+
|
|
34
|
+
// Assert assignable
|
|
35
|
+
type AssertAssignable<T, U> = U extends T ? true : false;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Runtime Type Testing
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { expectType, expectError, expectAssignable } from 'tsd';
|
|
42
|
+
|
|
43
|
+
// Test type inference
|
|
44
|
+
const result = identity(42);
|
|
45
|
+
expectType<number>(result);
|
|
46
|
+
|
|
47
|
+
// Test error cases
|
|
48
|
+
// @ts-expect-error
|
|
49
|
+
expectError(getUser('invalid-id'));
|
|
50
|
+
|
|
51
|
+
// Test assignability
|
|
52
|
+
interface Base { id: number; }
|
|
53
|
+
interface Extended extends Base { name: string; }
|
|
54
|
+
|
|
55
|
+
expectAssignable<Base>({} as Extended);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Property-Based Type Testing
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
// Test all properties of a type
|
|
62
|
+
type TestUserProperties = {
|
|
63
|
+
[K in keyof User]: User[K] extends string | number ? true : false;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Ensure required properties exist
|
|
67
|
+
type RequiredFields = Required<Pick<User, 'id' | 'name' | 'email'>>;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Testing Discriminated Unions
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
type State =
|
|
74
|
+
| { status: 'idle' }
|
|
75
|
+
| { status: 'loading' }
|
|
76
|
+
| { status: 'success'; data: string };
|
|
77
|
+
|
|
78
|
+
// Test exhaustiveness
|
|
79
|
+
function testExhaustive(state: State) {
|
|
80
|
+
switch (state.status) {
|
|
81
|
+
case 'idle':
|
|
82
|
+
case 'loading':
|
|
83
|
+
case 'success':
|
|
84
|
+
return;
|
|
85
|
+
default:
|
|
86
|
+
// Should be never
|
|
87
|
+
const _exhaustive: never = state;
|
|
88
|
+
return _exhaustive;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Type Coverage Tools
|
|
94
|
+
|
|
95
|
+
Use `type-coverage` to ensure high type safety:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm install --save-dev type-coverage
|
|
99
|
+
|
|
100
|
+
# Check type coverage
|
|
101
|
+
npx type-coverage
|
|
102
|
+
|
|
103
|
+
# Require 100% coverage
|
|
104
|
+
npx type-coverage --at-least 100
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Testing Frameworks
|
|
108
|
+
|
|
109
|
+
- **tsd**: Test TypeScript type definitions
|
|
110
|
+
- **dtslint**: Linter for .d.ts files
|
|
111
|
+
- **type-coverage**: Measure type coverage percentage
|
|
112
|
+
- **ts-expect**: Runtime type checking for tests
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Type Guards
|
|
2
|
+
|
|
3
|
+
**Runtime type checking with type narrowing:**
|
|
4
|
+
|
|
5
|
+
## Basic Type Guards
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Basic type guard
|
|
9
|
+
function isString(value: unknown): value is string {
|
|
10
|
+
return typeof value === 'string';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Discriminated union guard
|
|
14
|
+
interface Success {
|
|
15
|
+
status: 'success';
|
|
16
|
+
data: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface Error {
|
|
20
|
+
status: 'error';
|
|
21
|
+
message: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type Result = Success | Error;
|
|
25
|
+
|
|
26
|
+
function isSuccess(result: Result): result is Success {
|
|
27
|
+
return result.status === 'success';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function handleResult(result: Result) {
|
|
31
|
+
if (isSuccess(result)) {
|
|
32
|
+
console.log(result.data); // Type narrowed to Success
|
|
33
|
+
} else {
|
|
34
|
+
console.log(result.message); // Type narrowed to Error
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Generic Type Guards
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
function isArrayOf<T>(
|
|
43
|
+
value: unknown,
|
|
44
|
+
check: (item: unknown) => item is T
|
|
45
|
+
): value is T[] {
|
|
46
|
+
return Array.isArray(value) && value.every(check);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const data: unknown = [1, 2, 3];
|
|
50
|
+
|
|
51
|
+
if (isArrayOf(data, (x): x is number => typeof x === 'number')) {
|
|
52
|
+
data.forEach(n => n.toFixed(2)); // Type: number[]
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Assertion Functions
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Type assertion function
|
|
60
|
+
function assertString(value: unknown): asserts value is string {
|
|
61
|
+
if (typeof value !== 'string') {
|
|
62
|
+
throw new Error('Not a string');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const input: unknown = 'hello';
|
|
67
|
+
assertString(input);
|
|
68
|
+
// input is now narrowed to string
|
|
69
|
+
input.toUpperCase(); // Valid
|
|
70
|
+
```
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Type Inference Techniques
|
|
2
|
+
|
|
3
|
+
**Leverage TypeScript's type inference:**
|
|
4
|
+
|
|
5
|
+
## Const Assertions
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Without const assertion
|
|
9
|
+
const colors1 = ['red', 'green', 'blue'];
|
|
10
|
+
// Type: string[]
|
|
11
|
+
|
|
12
|
+
// With const assertion
|
|
13
|
+
const colors2 = ['red', 'green', 'blue'] as const;
|
|
14
|
+
// Type: readonly ['red', 'green', 'blue']
|
|
15
|
+
|
|
16
|
+
// Narrow object types
|
|
17
|
+
const config = {
|
|
18
|
+
endpoint: '/api/users',
|
|
19
|
+
method: 'GET'
|
|
20
|
+
} as const;
|
|
21
|
+
// Type: { readonly endpoint: '/api/users'; readonly method: 'GET' }
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Inference from Implementation
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// Infer from function implementation
|
|
28
|
+
function createAction<T extends string, P>(
|
|
29
|
+
type: T,
|
|
30
|
+
payload: P
|
|
31
|
+
) {
|
|
32
|
+
return { type, payload };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const action = createAction('UPDATE_USER', { id: 1, name: 'John' });
|
|
36
|
+
// Type: { type: 'UPDATE_USER'; payload: { id: number; name: string } }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Inference with Generics
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// Let TypeScript infer generic types
|
|
43
|
+
function identity<T>(value: T): T {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const num = identity(42); // T inferred as 42 (literal type)
|
|
48
|
+
const str = identity('hello'); // T inferred as 'hello'
|
|
49
|
+
|
|
50
|
+
// Inference from array methods
|
|
51
|
+
const numbers = [1, 2, 3];
|
|
52
|
+
const doubled = numbers.map(n => n * 2); // Type: number[]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Discriminated Union Inference
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// Use in discriminated unions
|
|
59
|
+
type Action =
|
|
60
|
+
| ReturnType<typeof createAction<'INCREMENT'>>
|
|
61
|
+
| ReturnType<typeof createAction<'DECREMENT'>>;
|
|
62
|
+
|
|
63
|
+
function reducer(state: number, action: Action): number {
|
|
64
|
+
switch (action.type) {
|
|
65
|
+
case 'INCREMENT':
|
|
66
|
+
return state + 1;
|
|
67
|
+
case 'DECREMENT':
|
|
68
|
+
return state - 1;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Tuple Inference
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// Infer tuple types
|
|
77
|
+
function tuple<T extends any[]>(...args: T): T {
|
|
78
|
+
return args;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const pair = tuple(1, 'hello'); // Type: [number, string]
|
|
82
|
+
const triple = tuple(1, 'hello', true); // Type: [number, string, boolean]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Contextual Typing
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Type inferred from context
|
|
89
|
+
interface Point {
|
|
90
|
+
x: number;
|
|
91
|
+
y: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const points: Point[] = [
|
|
95
|
+
{ x: 0, y: 0 }, // Type inferred from array type
|
|
96
|
+
{ x: 1, y: 1 }
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
// Callback inference
|
|
100
|
+
['1', '2', '3'].map(str => parseInt(str)); // str inferred as string
|
|
101
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Utility Types Composition
|
|
2
|
+
|
|
3
|
+
**Combine utility types for complex transformations:**
|
|
4
|
+
|
|
5
|
+
## Deep Transformations
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Deep partial
|
|
9
|
+
type DeepPartial<T> = {
|
|
10
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// Make specific keys required
|
|
14
|
+
type RequireKeys<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
|
|
15
|
+
|
|
16
|
+
interface User {
|
|
17
|
+
id?: number;
|
|
18
|
+
name?: string;
|
|
19
|
+
email?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type UserWithId = RequireKeys<User, 'id'>;
|
|
23
|
+
// { id: number; name?: string; email?: string }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Function Type Utilities
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Extract function parameter types
|
|
30
|
+
type Parameters<T extends (...args: any[]) => any> =
|
|
31
|
+
T extends (...args: infer P) => any ? P : never;
|
|
32
|
+
|
|
33
|
+
function processUser(id: number, name: string): void {}
|
|
34
|
+
|
|
35
|
+
type ProcessUserParams = Parameters<typeof processUser>;
|
|
36
|
+
// [number, string]
|
|
37
|
+
|
|
38
|
+
// Extract return type
|
|
39
|
+
type ReturnType<T extends (...args: any[]) => any> =
|
|
40
|
+
T extends (...args: any[]) => infer R ? R : never;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Advanced Transformations
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Flatten nested types
|
|
47
|
+
type Flatten<T> = T extends any[] ? T[number] : T;
|
|
48
|
+
|
|
49
|
+
type Nested = (string | number)[][];
|
|
50
|
+
type Flat = Flatten<Nested>; // (string | number)[]
|
|
51
|
+
|
|
52
|
+
// Exclude nullable values
|
|
53
|
+
type NonNullable<T> = T extends null | undefined ? never : T;
|
|
54
|
+
|
|
55
|
+
// Recursive type definitions
|
|
56
|
+
type JSONValue =
|
|
57
|
+
| string
|
|
58
|
+
| number
|
|
59
|
+
| boolean
|
|
60
|
+
| null
|
|
61
|
+
| JSONValue[]
|
|
62
|
+
| { [key: string]: JSONValue };
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Readonly Utilities
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// Deep readonly
|
|
69
|
+
type DeepReadonly<T> = {
|
|
70
|
+
readonly [P in keyof T]: T[P] extends object
|
|
71
|
+
? DeepReadonly<T[P]>
|
|
72
|
+
: T[P];
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Mutable (remove readonly)
|
|
76
|
+
type Mutable<T> = {
|
|
77
|
+
-readonly [P in keyof T]: T[P];
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Key Manipulation
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// Extract keys of specific type
|
|
85
|
+
type KeysOfType<T, U> = {
|
|
86
|
+
[K in keyof T]: T[K] extends U ? K : never;
|
|
87
|
+
}[keyof T];
|
|
88
|
+
|
|
89
|
+
interface Example {
|
|
90
|
+
name: string;
|
|
91
|
+
age: number;
|
|
92
|
+
active: boolean;
|
|
93
|
+
count: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
type StringKeys = KeysOfType<Example, string>; // 'name'
|
|
97
|
+
type NumberKeys = KeysOfType<Example, number>; // 'age' | 'count'
|
|
98
|
+
```
|