cfsa-antigravity 3.0.2 → 3.1.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/README.md +27 -10
- package/bin/cli.mjs +7 -6
- package/package.json +1 -1
- package/template/.agent/PRDS/codex-runtime-support.md +2 -2
- package/template/.agent/TASKS/codex-runtime-support.md +2 -2
- package/template/.agent/instructions/workflow.md +3 -3
- package/template/.agent/kit-sync.md +3 -3
- package/template/.agent/rules/completion-checklist.md +3 -3
- package/template/.agent/skills/parallel-agents/SKILL.md +1 -1
- package/template/.agent/skills/session-continuity/SKILL.md +6 -6
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +1 -1
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +3 -3
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +4 -4
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +1 -1
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +2 -2
- package/template/.agent/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
- package/template/.agent/workflows/create-prd-architecture.md +2 -2
- package/template/.agent/workflows/create-prd-design-system.md +2 -2
- package/template/.agent/workflows/create-prd-security.md +2 -2
- package/template/.agent/workflows/create-prd-stack.md +2 -2
- package/template/.agent/workflows/create-prd.md +2 -2
- package/template/.agent/workflows/decompose-architecture-validate.md +1 -1
- package/template/.agent/workflows/decompose-architecture.md +2 -2
- package/template/.agent/workflows/ideate.md +2 -2
- package/template/.agent/workflows/implement-slice-setup.md +1 -1
- package/template/.agent/workflows/implement-slice-tdd.md +3 -3
- package/template/.agent/workflows/implement-slice.md +2 -2
- package/template/.agent/workflows/plan-phase-preflight.md +2 -2
- package/template/.agent/workflows/plan-phase-write.md +2 -2
- package/template/.agent/workflows/plan-phase.md +2 -2
- package/template/.agent/workflows/setup-workspace.md +2 -2
- package/template/.agent/workflows/update-architecture-map.md +1 -1
- package/template/.agent/workflows/validate-phase-quality.md +1 -1
- package/template/.agent/workflows/validate-phase-readiness.md +2 -2
- package/template/.agent/workflows/validate-phase.md +2 -2
- package/template/.agent/workflows/verify-infrastructure.md +1 -1
- package/template/.agent/workflows/write-architecture-spec-deepen.md +3 -3
- package/template/.agent/workflows/write-architecture-spec-design.md +1 -1
- package/template/.agent/workflows/write-architecture-spec.md +3 -3
- package/template/.agent/workflows/write-be-spec-classify.md +1 -1
- package/template/.agent/workflows/write-be-spec-write.md +3 -3
- package/template/.agent/workflows/write-be-spec.md +3 -3
- package/template/.agent/workflows/write-fe-spec-classify.md +1 -1
- package/template/.agent/workflows/write-fe-spec-write.md +2 -2
- package/template/.agent/workflows/write-fe-spec.md +3 -3
- package/template/.claude/README.md +3 -1
- package/template/.claude/instructions/workflow.md +3 -3
- package/template/.claude/kit-sync.md +3 -3
- package/template/.claude/rules/completion-checklist.md +3 -3
- package/template/.claude/skills/parallel-agents/SKILL.md +1 -1
- package/template/.claude/skills/plan-phase/SKILL.md +2 -2
- package/template/.claude/skills/plan-phase-preflight/SKILL.md +2 -2
- package/template/.claude/skills/session-continuity/SKILL.md +6 -6
- package/template/.claude/skills/session-continuity/protocols/01-session-resumption.md +1 -1
- package/template/.claude/skills/session-continuity/protocols/02-progress-generation.md +3 -3
- package/template/.claude/skills/session-continuity/protocols/03-progress-update.md +4 -4
- package/template/.claude/skills/session-continuity/protocols/07-spec-pipeline-generation.md +1 -1
- package/template/.claude/skills/session-continuity/protocols/08-spec-pipeline-update.md +2 -2
- package/template/.claude/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
- package/template/.claude/skills/setup/setup-cfsa.md +1 -1
- package/template/.claude/skills/write-architecture-spec/SKILL.md +2 -2
- package/template/.claude/skills/write-architecture-spec-deepen/SKILL.md +1 -1
- package/template/.claude/skills/write-architecture-spec-design/SKILL.md +1 -1
- package/template/.claude/skills/write-be-spec/SKILL.md +3 -3
- package/template/.claude/skills/write-be-spec-classify/SKILL.md +1 -1
- package/template/.claude/skills/write-be-spec-write/SKILL.md +1 -1
- package/template/.claude/skills/write-fe-spec/SKILL.md +3 -3
- package/template/.claude/skills/write-fe-spec-write/SKILL.md +1 -1
- package/template/.codex/README.md +99 -0
- package/template/.codex/instructions/commands.md +24 -0
- package/template/.codex/instructions/example.md +21 -0
- package/template/.codex/instructions/patterns.md +61 -0
- package/template/.codex/instructions/structure.md +29 -0
- package/template/.codex/instructions/tech-stack.md +93 -0
- package/template/.codex/instructions/workflow.md +64 -0
- package/template/.codex/kit-sync.md +6 -0
- package/template/.codex/rules/boundary-not-placeholder.md +146 -0
- package/template/.codex/rules/completion-checklist.md +60 -0
- package/template/.codex/rules/debug-by-test.md +49 -0
- package/template/.codex/rules/decision-classification.md +113 -0
- package/template/.codex/rules/extensibility.md +52 -0
- package/template/.codex/rules/memory-capture.md +84 -0
- package/template/.codex/rules/question-vs-command.md +91 -0
- package/template/.codex/rules/security-first.md +54 -0
- package/template/.codex/rules/single-question.md +59 -0
- package/template/.codex/rules/skill-mcp-first.md +45 -0
- package/template/.codex/rules/source-before-ask.md +93 -0
- package/template/.codex/rules/specificity-standards.md +64 -0
- package/template/.codex/rules/tdd-contract-first.md +67 -0
- package/template/.codex/rules/vertical-slices.md +83 -0
- package/template/.codex/skill-library/MANIFEST.md +498 -0
- package/template/.codex/skill-library/README.md +38 -0
- package/template/.codex/skill-library/meta/claude-code/README.md +9 -0
- package/template/.codex/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.codex/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.codex/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.codex/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.codex/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.codex/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.codex/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.codex/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.codex/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.codex/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.codex/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.codex/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.codex/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.codex/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.codex/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.codex/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.codex/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.codex/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.codex/skill-library/stack/auth/lucia/SKILL.md +230 -0
- package/template/.codex/skill-library/stack/auth/supabase-auth/SKILL.md +293 -0
- package/template/.codex/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.codex/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.codex/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.codex/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.codex/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.codex/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.codex/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.codex/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.codex/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.codex/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.codex/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.codex/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.codex/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.codex/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.codex/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.codex/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.codex/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.codex/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.codex/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.codex/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.codex/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.codex/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.codex/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.codex/skill-library/stack/devops/git-advanced/SKILL.md +972 -0
- package/template/.codex/skill-library/stack/devops/git-workflow/SKILL.md +420 -0
- package/template/.codex/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.codex/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.codex/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.codex/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.codex/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.codex/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.codex/skill-library/stack/extensions/plasmo/SKILL.md +195 -0
- package/template/.codex/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.codex/skill-library/stack/extensions/wxt/SKILL.md +216 -0
- package/template/.codex/skill-library/stack/feature-flags/flagsmith/SKILL.md +187 -0
- package/template/.codex/skill-library/stack/feature-flags/launchdarkly/SKILL.md +183 -0
- package/template/.codex/skill-library/stack/feature-flags/posthog-flags/SKILL.md +189 -0
- package/template/.codex/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.codex/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.codex/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.codex/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.codex/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.codex/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.codex/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/SKILL.md +81 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/events.md +353 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/migration.md +339 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/performance.md +443 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/runes.md +394 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/snippets.md +291 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/sveltekit.md +401 -0
- package/template/.codex/skill-library/stack/frameworks/svelte5/references/typescript.md +305 -0
- package/template/.codex/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.codex/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.codex/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.codex/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.codex/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.codex/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.codex/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.codex/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.codex/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.codex/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.codex/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.codex/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.codex/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.codex/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.codex/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.codex/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.codex/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.codex/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.codex/skill-library/stack/messaging/nats/SKILL.md +147 -0
- package/template/.codex/skill-library/stack/messaging/rabbitmq/SKILL.md +178 -0
- package/template/.codex/skill-library/stack/messaging/sqs/SKILL.md +187 -0
- package/template/.codex/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.codex/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.codex/skill-library/stack/mobile/kotlin-compose/SKILL.md +215 -0
- package/template/.codex/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.codex/skill-library/stack/mobile/swiftui/SKILL.md +261 -0
- package/template/.codex/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.codex/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.codex/skill-library/stack/notifications/fcm/SKILL.md +229 -0
- package/template/.codex/skill-library/stack/notifications/sendgrid/SKILL.md +220 -0
- package/template/.codex/skill-library/stack/notifications/twilio/SKILL.md +204 -0
- package/template/.codex/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.codex/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.codex/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.codex/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.codex/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.codex/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.codex/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.codex/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.codex/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.codex/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.codex/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.codex/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.codex/skill-library/stack/search/algolia/SKILL.md +206 -0
- package/template/.codex/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.codex/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.codex/skill-library/stack/search/typesense/SKILL.md +189 -0
- package/template/.codex/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.codex/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.codex/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.codex/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.codex/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.codex/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.codex/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.codex/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.codex/skill-library/stack/storage/cloudflare-r2/SKILL.md +252 -0
- package/template/.codex/skill-library/stack/storage/gcs/SKILL.md +229 -0
- package/template/.codex/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.codex/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.codex/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.codex/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.codex/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.codex/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.codex/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.codex/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.codex/skill-library/stack/ui/svelte-flow/SKILL.md +390 -0
- package/template/.codex/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.codex/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.codex/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.codex/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.codex/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.codex/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.codex/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.codex/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.codex/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.codex/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.codex/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.codex/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.codex/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.codex/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.codex/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.codex/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.codex/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.codex/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.codex/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.codex/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.codex/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.codex/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.codex/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.codex/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.codex/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.codex/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.codex/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.codex/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.codex/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.codex/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.codex/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.codex/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.codex/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.codex/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.codex/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.codex/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.codex/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.codex/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.codex/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.codex/skill-library/surface/web/i18n-localization/SKILL.md +332 -0
- package/template/.codex/skill-library/surface/web/i18n-localization/references/icu-message-format.md +223 -0
- package/template/.codex/skill-library/surface/web/i18n-localization/references/intl-api-patterns.md +326 -0
- package/template/.codex/skill-library/surface/web/i18n-localization/references/rtl-support.md +298 -0
- package/template/.codex/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.codex/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.codex/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.codex/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.codex/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.codex/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.codex/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.codex/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.codex/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.codex/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.codex/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.codex/skills/README.md +78 -0
- package/template/.codex/skills/accessibility/SKILL.md +522 -0
- package/template/.codex/skills/accessibility/references/WCAG.md +162 -0
- package/template/.codex/skills/accessibility/references/ia-spec-checklist.md +35 -0
- package/template/.codex/skills/adversarial-review/SKILL.md +90 -0
- package/template/.codex/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.codex/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.codex/skills/api-design-principles/SKILL.md +169 -0
- package/template/.codex/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.codex/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.codex/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.codex/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.codex/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.codex/skills/api-versioning/SKILL.md +166 -0
- package/template/.codex/skills/api-versioning/references/typescript.md +157 -0
- package/template/.codex/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.codex/skills/audit-ambiguity/SKILL.md +54 -0
- package/template/.codex/skills/audit-ambiguity-execute/SKILL.md +86 -0
- package/template/.codex/skills/audit-ambiguity-rubrics/SKILL.md +58 -0
- package/template/.codex/skills/bootstrap-agents/SKILL.md +258 -0
- package/template/.codex/skills/bootstrap-agents-fill/SKILL.md +25 -0
- package/template/.codex/skills/bootstrap-agents-provision/SKILL.md +22 -0
- package/template/.codex/skills/brainstorming/SKILL.md +177 -0
- package/template/.codex/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.codex/skills/clean-code/SKILL.md +196 -0
- package/template/.codex/skills/clean-code/references/typescript.md +126 -0
- package/template/.codex/skills/code-review-pro/SKILL.md +152 -0
- package/template/.codex/skills/concise-planning/SKILL.md +107 -0
- package/template/.codex/skills/create-prd/SKILL.md +94 -0
- package/template/.codex/skills/create-prd-architecture/SKILL.md +72 -0
- package/template/.codex/skills/create-prd-compile/SKILL.md +85 -0
- package/template/.codex/skills/create-prd-design-system/SKILL.md +69 -0
- package/template/.codex/skills/create-prd-security/SKILL.md +66 -0
- package/template/.codex/skills/create-prd-stack/SKILL.md +84 -0
- package/template/.codex/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.codex/skills/database-schema-design/SKILL.md +205 -0
- package/template/.codex/skills/database-schema-design/references/relational.md +228 -0
- package/template/.codex/skills/decompose-architecture/SKILL.md +72 -0
- package/template/.codex/skills/decompose-architecture-structure/SKILL.md +62 -0
- package/template/.codex/skills/decompose-architecture-validate/SKILL.md +72 -0
- package/template/.codex/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.codex/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.codex/skills/design-direction/SKILL.md +45 -0
- package/template/.codex/skills/error-handling-patterns/SKILL.md +226 -0
- package/template/.codex/skills/error-handling-patterns/references/go.md +162 -0
- package/template/.codex/skills/error-handling-patterns/references/python.md +262 -0
- package/template/.codex/skills/error-handling-patterns/references/rust.md +112 -0
- package/template/.codex/skills/error-handling-patterns/references/typescript.md +178 -0
- package/template/.codex/skills/evolve-contract/SKILL.md +24 -0
- package/template/.codex/skills/evolve-feature/SKILL.md +18 -0
- package/template/.codex/skills/evolve-feature-cascade/SKILL.md +24 -0
- package/template/.codex/skills/evolve-feature-classify/SKILL.md +21 -0
- package/template/.codex/skills/find-skills/SKILL.md +145 -0
- package/template/.codex/skills/git-advanced/SKILL.md +972 -0
- package/template/.codex/skills/git-workflow/SKILL.md +420 -0
- package/template/.codex/skills/idea-extraction/SKILL.md +644 -0
- package/template/.codex/skills/ideate/SKILL.md +77 -0
- package/template/.codex/skills/ideate-discover/SKILL.md +89 -0
- package/template/.codex/skills/ideate-extract/SKILL.md +77 -0
- package/template/.codex/skills/ideate-validate/SKILL.md +75 -0
- package/template/.codex/skills/implement-slice/SKILL.md +64 -0
- package/template/.codex/skills/implement-slice-setup/SKILL.md +70 -0
- package/template/.codex/skills/implement-slice-tdd/SKILL.md +78 -0
- package/template/.codex/skills/logging-best-practices/SKILL.md +192 -0
- package/template/.codex/skills/logging-best-practices/references/go.md +49 -0
- package/template/.codex/skills/logging-best-practices/references/python.md +52 -0
- package/template/.codex/skills/logging-best-practices/references/typescript.md +215 -0
- package/template/.codex/skills/migration-management/SKILL.md +200 -0
- package/template/.codex/skills/migration-management/references/relational.md +214 -0
- package/template/.codex/skills/minimalist-surgical-development/SKILL.md +135 -0
- package/template/.codex/skills/parallel-agents/SKILL.md +165 -0
- package/template/.codex/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.codex/skills/parallel-feature-development/SKILL.md +157 -0
- package/template/.codex/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.codex/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.codex/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.codex/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.codex/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.codex/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.codex/skills/pipeline-rubrics/references/scoring.md +32 -0
- package/template/.codex/skills/pipeline-rubrics/references/vision-rubric.md +12 -0
- package/template/.codex/skills/plan-phase/SKILL.md +62 -0
- package/template/.codex/skills/plan-phase-preflight/SKILL.md +75 -0
- package/template/.codex/skills/plan-phase-write/SKILL.md +85 -0
- package/template/.codex/skills/prd-templates/SKILL.md +107 -0
- package/template/.codex/skills/prd-templates/references/architecture-completeness-checklist.md +28 -0
- package/template/.codex/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.codex/skills/prd-templates/references/be-spec-classification.md +41 -0
- package/template/.codex/skills/prd-templates/references/be-spec-template.md +107 -0
- package/template/.codex/skills/prd-templates/references/bootstrap-verification-protocol.md +50 -0
- package/template/.codex/skills/prd-templates/references/constraint-exploration.md +41 -0
- package/template/.codex/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.codex/skills/prd-templates/references/decision-confirmation-protocol.md +68 -0
- package/template/.codex/skills/prd-templates/references/decision-propagation.md +121 -0
- package/template/.codex/skills/prd-templates/references/decomposition-templates.md +226 -0
- package/template/.codex/skills/prd-templates/references/deep-ideation-loading-protocol.md +114 -0
- package/template/.codex/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.codex/skills/prd-templates/references/design-system-prerequisite-check.md +18 -0
- package/template/.codex/skills/prd-templates/references/domain-exhaustion-criteria.md +37 -0
- package/template/.codex/skills/prd-templates/references/engagement-tier-protocol.md +58 -0
- package/template/.codex/skills/prd-templates/references/engineering-standards-template.md +126 -0
- package/template/.codex/skills/prd-templates/references/evolution-layer-guidance.md +91 -0
- package/template/.codex/skills/prd-templates/references/expansion-modes.md +27 -0
- package/template/.codex/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.codex/skills/prd-templates/references/fe-spec-template.md +90 -0
- package/template/.codex/skills/prd-templates/references/feature-ledger-protocol.md +149 -0
- package/template/.codex/skills/prd-templates/references/folder-seeding-protocol.md +77 -0
- package/template/.codex/skills/prd-templates/references/fractal-cx-template.md +58 -0
- package/template/.codex/skills/prd-templates/references/fractal-feature-template.md +93 -0
- package/template/.codex/skills/prd-templates/references/fractal-node-index-template.md +55 -0
- package/template/.codex/skills/prd-templates/references/gate-applicability.md +92 -0
- package/template/.codex/skills/prd-templates/references/ideation-crosscut-template.md +36 -0
- package/template/.codex/skills/prd-templates/references/ideation-index-template.md +111 -0
- package/template/.codex/skills/prd-templates/references/ideation-meta-template.md +126 -0
- package/template/.codex/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.codex/skills/prd-templates/references/input-classification.md +23 -0
- package/template/.codex/skills/prd-templates/references/map-guard-protocol.md +65 -0
- package/template/.codex/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.codex/skills/prd-templates/references/persona-completeness-gate.md +20 -0
- package/template/.codex/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.codex/skills/prd-templates/references/placeholder-workflow-mapping.md +50 -0
- package/template/.codex/skills/prd-templates/references/shard-boundary-analysis.md +103 -0
- package/template/.codex/skills/prd-templates/references/shard-split-remediation.md +157 -0
- package/template/.codex/skills/prd-templates/references/skill-loading-protocol.md +36 -0
- package/template/.codex/skills/prd-templates/references/slice-completion-gates.md +29 -0
- package/template/.codex/skills/prd-templates/references/spec-coverage-sweep.md +44 -0
- package/template/.codex/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.codex/skills/prd-templates/references/tdd-testing-policy.md +39 -0
- package/template/.codex/skills/prd-templates/references/vision-template.md +57 -0
- package/template/.codex/skills/prd-templates/references/workflow-checkpoint-protocol.md +112 -0
- package/template/.codex/skills/prd-templates/references/write-verification-protocol.md +57 -0
- package/template/.codex/skills/prompt-engineer/SKILL.md +203 -0
- package/template/.codex/skills/propagate-decision/SKILL.md +18 -0
- package/template/.codex/skills/propagate-decision-apply/SKILL.md +22 -0
- package/template/.codex/skills/propagate-decision-scan/SKILL.md +20 -0
- package/template/.codex/skills/regex-patterns/SKILL.md +333 -0
- package/template/.codex/skills/regex-patterns/references/go.md +44 -0
- package/template/.codex/skills/regex-patterns/references/javascript.md +63 -0
- package/template/.codex/skills/regex-patterns/references/python.md +77 -0
- package/template/.codex/skills/regex-patterns/references/rust.md +43 -0
- package/template/.codex/skills/remediate-pipeline/SKILL.md +18 -0
- package/template/.codex/skills/remediate-pipeline-assess/SKILL.md +21 -0
- package/template/.codex/skills/remediate-pipeline-execute/SKILL.md +23 -0
- package/template/.codex/skills/remediate-shard-split/SKILL.md +21 -0
- package/template/.codex/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.codex/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.codex/skills/session-continuity/SKILL.md +732 -0
- package/template/.codex/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.codex/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.codex/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.codex/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.codex/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.codex/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.codex/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.codex/skills/session-continuity/protocols/08-spec-pipeline-update.md +65 -0
- package/template/.codex/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.codex/skills/session-continuity/protocols/10-placeholder-verification-gate.md +83 -0
- package/template/.codex/skills/session-continuity/protocols/11-parallel-synthesis.md +21 -0
- package/template/.codex/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.codex/skills/setup/README.md +24 -0
- package/template/.codex/skills/setup/setup-cfsa.md +200 -0
- package/template/.codex/skills/setup/setup-fill-placeholders.md +192 -0
- package/template/.codex/skills/setup/setup-provision-skills.md +82 -0
- package/template/.codex/skills/setup/setup-verify.md +89 -0
- package/template/.codex/skills/setup-workspace/SKILL.md +83 -0
- package/template/.codex/skills/setup-workspace-cicd/SKILL.md +56 -0
- package/template/.codex/skills/setup-workspace-data/SKILL.md +69 -0
- package/template/.codex/skills/setup-workspace-hosting/SKILL.md +59 -0
- package/template/.codex/skills/setup-workspace-scaffold/SKILL.md +72 -0
- package/template/.codex/skills/skill-creator/SKILL.md +203 -0
- package/template/.codex/skills/spec-writing/SKILL.md +110 -0
- package/template/.codex/skills/sync-kit/SKILL.md +23 -0
- package/template/.codex/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.codex/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.codex/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.codex/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.codex/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.codex/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.codex/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.codex/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.codex/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.codex/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.codex/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.codex/skills/tdd-workflow/SKILL.md +186 -0
- package/template/.codex/skills/tdd-workflow/references/typescript.md +231 -0
- package/template/.codex/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.codex/skills/tech-stack-catalog/references/constraint-questions.md +237 -0
- package/template/.codex/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.codex/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.codex/skills/technical-writer/SKILL.md +242 -0
- package/template/.codex/skills/testing-strategist/SKILL.md +319 -0
- package/template/.codex/skills/testing-strategist/references/typescript.md +328 -0
- package/template/.codex/skills/update-architecture-map/SKILL.md +21 -0
- package/template/.codex/skills/utilities/resolve-skill.md +195 -0
- package/template/.codex/skills/validate-phase/SKILL.md +62 -0
- package/template/.codex/skills/validate-phase-quality/SKILL.md +67 -0
- package/template/.codex/skills/validate-phase-readiness/SKILL.md +74 -0
- package/template/.codex/skills/verification-before-completion/SKILL.md +97 -0
- package/template/.codex/skills/verify-infrastructure/SKILL.md +25 -0
- package/template/.codex/skills/workflow-automation/SKILL.md +166 -0
- package/template/.codex/skills/workflow-automation/references/inngest.md +88 -0
- package/template/.codex/skills/workflow-automation/references/temporal.md +64 -0
- package/template/.codex/skills/write-architecture-spec/SKILL.md +78 -0
- package/template/.codex/skills/write-architecture-spec-deepen/SKILL.md +82 -0
- package/template/.codex/skills/write-architecture-spec-design/SKILL.md +80 -0
- package/template/.codex/skills/write-be-spec/SKILL.md +75 -0
- package/template/.codex/skills/write-be-spec-classify/SKILL.md +80 -0
- package/template/.codex/skills/write-be-spec-write/SKILL.md +99 -0
- package/template/.codex/skills/write-fe-spec/SKILL.md +79 -0
- package/template/.codex/skills/write-fe-spec-classify/SKILL.md +77 -0
- package/template/.codex/skills/write-fe-spec-write/SKILL.md +88 -0
- package/template/.factory/README.md +2 -3
- package/template/.factory/instructions/workflow.md +3 -3
- package/template/.factory/kit-sync.md +3 -3
- package/template/.factory/skills/completion-checklist/SKILL.md +3 -3
- package/template/.factory/skills/parallel-agents/SKILL.md +1 -1
- package/template/.factory/skills/plan-phase/SKILL.md +2 -2
- package/template/.factory/skills/plan-phase-preflight/SKILL.md +2 -2
- package/template/.factory/skills/session-continuity/SKILL.md +6 -6
- package/template/.factory/skills/session-continuity/protocols/01-session-resumption.md +1 -1
- package/template/.factory/skills/session-continuity/protocols/02-progress-generation.md +3 -3
- package/template/.factory/skills/session-continuity/protocols/03-progress-update.md +4 -4
- package/template/.factory/skills/session-continuity/protocols/07-spec-pipeline-generation.md +1 -1
- package/template/.factory/skills/session-continuity/protocols/08-spec-pipeline-update.md +2 -2
- package/template/.factory/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
- package/template/.factory/skills/setup-cfsa/SKILL.md +1 -1
- package/template/.factory/skills/write-architecture-spec/SKILL.md +2 -2
- package/template/.factory/skills/write-architecture-spec-deepen/SKILL.md +1 -1
- package/template/.factory/skills/write-architecture-spec-design/SKILL.md +1 -1
- package/template/.factory/skills/write-be-spec/SKILL.md +3 -3
- package/template/.factory/skills/write-be-spec-classify/SKILL.md +1 -1
- package/template/.factory/skills/write-be-spec-write/SKILL.md +1 -1
- package/template/.factory/skills/write-fe-spec/SKILL.md +3 -3
- package/template/.factory/skills/write-fe-spec-write/SKILL.md +1 -1
- package/template/.memory/README.md +1 -0
- package/template/.memory/mcp-server/README.md +10 -2
- package/template/.memory/mcp-server/client.mjs +61 -18
- package/template/.memory/mcp-server/daemon.mjs +8 -3
- package/template/.memory/mcp-server/runtime.mjs +51 -14
- package/template/.memory/mcp-server/start.mjs +4 -2
- package/template/.memory/migrate/migrate-legacy.mjs +1 -0
- package/template/.memory/pipeline/README.md +1 -0
- package/template/CLAUDE.md +4 -4
- package/template/CODEX.md +6 -53
- package/template/GEMINI.md +2 -2
- package/template/docs/README.md +5 -2
- package/template/docs/kit-architecture.md +36 -19
- package/template/docs/progress-state-catalog.md +48 -0
- package/template/.factory/progress/memory/.gitkeep +0 -0
- /package/template/{.agent/progress → .codex/skills/skill-creator/references}/.gitkeep +0 -0
- /package/template/{.agent/progress/memory → .codex/skills/skill-creator/scripts}/.gitkeep +0 -0
- /package/template/{.agent/progress/sessions → .memory/pipeline/progress}/.gitkeep +0 -0
- /package/template/{.claude/progress → .memory/pipeline/progress/memory}/.gitkeep +0 -0
- /package/template/{.claude/progress/memory → .memory/pipeline/progress/phases}/.gitkeep +0 -0
- /package/template/{.claude → .memory/pipeline}/progress/sessions/.gitkeep +0 -0
- /package/template/{.factory/progress → .memory/pipeline/progress/slices}/.gitkeep +0 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Testing Strategist
|
|
3
|
+
description: Design and implement comprehensive testing strategies. Use when setting up tests, choosing test types, implementing TDD, or improving code quality. Covers unit tests, integration tests, E2E tests, test-driven development, and testing best practices.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Testing Strategist
|
|
8
|
+
|
|
9
|
+
Test the right things at the right level — write tests that give you confidence to ship.
|
|
10
|
+
|
|
11
|
+
## Stack-Specific References
|
|
12
|
+
|
|
13
|
+
After reading the methodology below, read the reference matching your surface's Languages column in the surface stack map (`.codex/instructions/tech-stack.md`):
|
|
14
|
+
|
|
15
|
+
| Language | Reference |
|
|
16
|
+
|----------|-----------|
|
|
17
|
+
| TypeScript / JavaScript | `references/typescript.md` |
|
|
18
|
+
| Python | `references/python.md` |
|
|
19
|
+
| Go | `references/go.md` |
|
|
20
|
+
| Rust | `references/rust.md` |
|
|
21
|
+
|
|
22
|
+
## Core Principle
|
|
23
|
+
|
|
24
|
+
**The Testing Pyramid:** 70% unit tests, 20% integration tests, 10% E2E tests.
|
|
25
|
+
|
|
26
|
+
Tests should be:
|
|
27
|
+
|
|
28
|
+
- **Fast** — Run in milliseconds (unit) to seconds (integration) to minutes (E2E)
|
|
29
|
+
- **Isolated** — Test one thing at a time
|
|
30
|
+
- **Repeatable** — Same input = same output
|
|
31
|
+
- **Self-checking** — Pass/fail automatically, no manual verification
|
|
32
|
+
- **Timely** — Written alongside code (or before, with TDD)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## The Testing Pyramid
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
/\
|
|
40
|
+
/ \ E2E Tests (10%)
|
|
41
|
+
/----\ - Slow, brittle, expensive
|
|
42
|
+
/ \ - Test critical user journeys
|
|
43
|
+
/--------\ - Example: "User can complete checkout"
|
|
44
|
+
/ \
|
|
45
|
+
/------------\ Integration Tests (20%)
|
|
46
|
+
/ \ - Medium speed, test components together
|
|
47
|
+
/----------------\ - Example: "API endpoint returns correct data"
|
|
48
|
+
/ \
|
|
49
|
+
/--------------------\ Unit Tests (70%)
|
|
50
|
+
/______________________\ - Fast, isolated, test functions/components
|
|
51
|
+
- Example: "calculateTotal returns sum"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Why This Ratio?
|
|
55
|
+
|
|
56
|
+
- **Unit tests:** Fast feedback, pinpoint bugs precisely, easy to maintain
|
|
57
|
+
- **Integration tests:** Ensure components work together, catch interface issues
|
|
58
|
+
- **E2E tests:** Verify actual user flows, catch UI bugs, but slow and brittle
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Level 1: Unit Tests (70%)
|
|
63
|
+
|
|
64
|
+
### What to Test
|
|
65
|
+
|
|
66
|
+
Test individual functions, components, or classes in isolation.
|
|
67
|
+
|
|
68
|
+
**Good candidates:**
|
|
69
|
+
|
|
70
|
+
- ✅ Business logic functions (calculations, validation, transformations)
|
|
71
|
+
- ✅ Utility functions (formatting, parsing, etc.)
|
|
72
|
+
- ✅ UI components (rendering, props, state)
|
|
73
|
+
- ✅ Pure functions (same input = same output)
|
|
74
|
+
|
|
75
|
+
**Skip:**
|
|
76
|
+
|
|
77
|
+
- ❌ Third-party libraries (assume they work)
|
|
78
|
+
- ❌ Framework internals
|
|
79
|
+
- ❌ Simple getters/setters with no logic
|
|
80
|
+
|
|
81
|
+
### Unit Test Best Practices
|
|
82
|
+
|
|
83
|
+
✅ **Do:**
|
|
84
|
+
|
|
85
|
+
- Test behavior, not implementation
|
|
86
|
+
- Use descriptive test names
|
|
87
|
+
- Follow AAA pattern: Arrange, Act, Assert
|
|
88
|
+
- Test edge cases (empty, null, negative, boundary values)
|
|
89
|
+
- Keep tests simple and readable
|
|
90
|
+
|
|
91
|
+
❌ **Don't:**
|
|
92
|
+
|
|
93
|
+
- Test private methods directly
|
|
94
|
+
- Over-mock (makes tests brittle)
|
|
95
|
+
- Test framework internals
|
|
96
|
+
- Write tests that depend on other tests
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Level 2: Integration Tests (20%)
|
|
101
|
+
|
|
102
|
+
### What to Test
|
|
103
|
+
|
|
104
|
+
Test multiple units working together — typically API routes, database operations, or service integrations.
|
|
105
|
+
|
|
106
|
+
**Good candidates:**
|
|
107
|
+
|
|
108
|
+
- ✅ API endpoints (request → handler → database → response)
|
|
109
|
+
- ✅ Database operations (queries, transactions)
|
|
110
|
+
- ✅ Third-party integrations (payment, email, etc.)
|
|
111
|
+
- ✅ Authentication flows
|
|
112
|
+
- ✅ File upload/download
|
|
113
|
+
|
|
114
|
+
### Integration Test Best Practices
|
|
115
|
+
|
|
116
|
+
✅ **Do:**
|
|
117
|
+
|
|
118
|
+
- Use test database (separate from development/production)
|
|
119
|
+
- Clean up test data before/after each test
|
|
120
|
+
- Test happy path + error cases
|
|
121
|
+
- Test authentication/authorization
|
|
122
|
+
- Use factories/fixtures for test data
|
|
123
|
+
|
|
124
|
+
❌ **Don't:**
|
|
125
|
+
|
|
126
|
+
- Test against production database
|
|
127
|
+
- Leave test data behind
|
|
128
|
+
- Mock database (defeats purpose of integration test)
|
|
129
|
+
- Depend on external services (mock external APIs)
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Level 3: E2E Tests (10%)
|
|
134
|
+
|
|
135
|
+
### What to Test
|
|
136
|
+
|
|
137
|
+
Test complete user journeys through the actual UI.
|
|
138
|
+
|
|
139
|
+
**Good candidates:**
|
|
140
|
+
|
|
141
|
+
- ✅ Critical user flows (signup, login, checkout)
|
|
142
|
+
- ✅ Core business processes
|
|
143
|
+
- ✅ Multi-step workflows
|
|
144
|
+
|
|
145
|
+
**Skip:**
|
|
146
|
+
|
|
147
|
+
- ❌ Every possible UI interaction (too slow/brittle)
|
|
148
|
+
- ❌ Edge cases (cover with unit/integration tests)
|
|
149
|
+
|
|
150
|
+
### E2E Test Best Practices
|
|
151
|
+
|
|
152
|
+
✅ **Do:**
|
|
153
|
+
|
|
154
|
+
- Test critical paths only (< 20 tests)
|
|
155
|
+
- Use stable selectors (test IDs, roles, labels — not CSS classes)
|
|
156
|
+
- Run in CI/CD pipeline
|
|
157
|
+
- Test across browsers if web surface
|
|
158
|
+
- Take screenshots on failure
|
|
159
|
+
|
|
160
|
+
❌ **Don't:**
|
|
161
|
+
|
|
162
|
+
- Test every UI variation
|
|
163
|
+
- Use fragile selectors (nth-child, CSS classes)
|
|
164
|
+
- Run E2E tests on every commit (too slow)
|
|
165
|
+
- Ignore flaky tests (fix or remove them)
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Test-Driven Development (TDD)
|
|
170
|
+
|
|
171
|
+
### The Red-Green-Refactor Cycle
|
|
172
|
+
|
|
173
|
+
1. **Red:** Write a failing test that defines expected behavior
|
|
174
|
+
2. **Green:** Write minimal code to make it pass
|
|
175
|
+
3. **Refactor:** Improve code while keeping tests green
|
|
176
|
+
|
|
177
|
+
### When to Use TDD
|
|
178
|
+
|
|
179
|
+
**Good for:**
|
|
180
|
+
|
|
181
|
+
- ✅ Complex business logic
|
|
182
|
+
- ✅ Bug fixes (write test that reproduces bug first)
|
|
183
|
+
- ✅ Well-defined requirements
|
|
184
|
+
- ✅ Critical algorithms
|
|
185
|
+
|
|
186
|
+
**Skip for:**
|
|
187
|
+
|
|
188
|
+
- ❌ Exploratory coding (don't know requirements yet)
|
|
189
|
+
- ❌ Throwaway prototypes
|
|
190
|
+
- ❌ Simple CRUD operations
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Mocking Strategies
|
|
195
|
+
|
|
196
|
+
### When to Mock
|
|
197
|
+
|
|
198
|
+
- ✅ External APIs (slow, unreliable, cost money)
|
|
199
|
+
- ✅ Time/randomness (make tests deterministic)
|
|
200
|
+
- ✅ File system operations
|
|
201
|
+
- ✅ Database (in unit tests only — NEVER in integration tests)
|
|
202
|
+
|
|
203
|
+
### Anti-Mock-Abuse Rules
|
|
204
|
+
|
|
205
|
+
1. **Never mock what you own** — if you wrote the module, test it directly
|
|
206
|
+
2. **One mock = one boundary** — only mock at the boundary between your code and external systems
|
|
207
|
+
3. **Verify mock interactions** — assert that mocked deps were called with correct arguments
|
|
208
|
+
4. **Mock return values, not internals** — mock the return value, not the internal implementation
|
|
209
|
+
|
|
210
|
+
### Mocking Best Practices
|
|
211
|
+
|
|
212
|
+
✅ **Do:**
|
|
213
|
+
|
|
214
|
+
- Mock at boundaries (APIs, file system, network)
|
|
215
|
+
- Restore mocks after tests
|
|
216
|
+
- Make mocks realistic (same shape as real data)
|
|
217
|
+
|
|
218
|
+
❌ **Don't:**
|
|
219
|
+
|
|
220
|
+
- Over-mock (makes tests brittle and meaningless)
|
|
221
|
+
- Mock your own code (test real behavior)
|
|
222
|
+
- Leave mocks unreset between tests
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Assertion Depth Rules
|
|
227
|
+
|
|
228
|
+
### ❌ Shallow Assertions (BANNED)
|
|
229
|
+
|
|
230
|
+
Assertions that prove nothing about correctness:
|
|
231
|
+
- "Result is defined" — undefined would also be defined
|
|
232
|
+
- "Result is truthy" — empty arrays and objects are truthy
|
|
233
|
+
- "Status is 200" alone — doesn't verify response body
|
|
234
|
+
|
|
235
|
+
### ✅ Deep Assertions (REQUIRED)
|
|
236
|
+
|
|
237
|
+
Every test must assert:
|
|
238
|
+
1. **The correct output** — specific values, not just types
|
|
239
|
+
2. **The correct side effects** — what changed in the system
|
|
240
|
+
3. **The correct error behavior** — specific error type and message
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Code Coverage
|
|
245
|
+
|
|
246
|
+
### Coverage Targets
|
|
247
|
+
|
|
248
|
+
- **70% minimum** — Below this, you're missing important tests
|
|
249
|
+
- **80% good** — Solid coverage of critical paths
|
|
250
|
+
- **90%+ diminishing returns** — Chasing 100% often not worth it
|
|
251
|
+
|
|
252
|
+
### What to Focus On
|
|
253
|
+
|
|
254
|
+
**High priority (90%+ coverage):**
|
|
255
|
+
|
|
256
|
+
- Business logic
|
|
257
|
+
- Authentication/authorization
|
|
258
|
+
- Payment processing
|
|
259
|
+
- Data validation
|
|
260
|
+
|
|
261
|
+
**Medium priority (70%+):**
|
|
262
|
+
|
|
263
|
+
- API routes
|
|
264
|
+
- Database queries
|
|
265
|
+
- Utility functions
|
|
266
|
+
|
|
267
|
+
**Low priority (okay to skip):**
|
|
268
|
+
|
|
269
|
+
- UI components (test behavior, not rendering)
|
|
270
|
+
- Configuration files
|
|
271
|
+
- Type definitions
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Common Testing Patterns
|
|
276
|
+
|
|
277
|
+
### Testing Async Code
|
|
278
|
+
Write tests that properly wait for async operations to complete before asserting. Use your framework's async test utilities.
|
|
279
|
+
|
|
280
|
+
### Testing Error Handling
|
|
281
|
+
Mock dependencies to throw errors, then assert your code handles them correctly — shows the right error message, returns the right status code, logs appropriately.
|
|
282
|
+
|
|
283
|
+
### Testing Forms
|
|
284
|
+
Fill form fields programmatically, submit, and assert both the submission data and any validation errors.
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Test Organization
|
|
289
|
+
|
|
290
|
+
### File Structure
|
|
291
|
+
|
|
292
|
+
Tests co-locate with source files:
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
source-file.ext → source-file.test.ext (unit tests)
|
|
296
|
+
route-handler.ext → route-handler.test.ext (integration tests)
|
|
297
|
+
e2e/ → feature-name.e2e.ext (E2E tests)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Naming Conventions
|
|
301
|
+
|
|
302
|
+
- Unit/Integration: `*.test.*` or `*.spec.*`
|
|
303
|
+
- E2E: `*.e2e.*` or `*.spec.*` (in tests/e2e/)
|
|
304
|
+
- Test names should describe behavior: "returns X when Y" or "throws error for invalid input"
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## When to Use This Skill
|
|
309
|
+
|
|
310
|
+
- ✅ Setting up testing for new project
|
|
311
|
+
- ✅ Choosing test frameworks
|
|
312
|
+
- ✅ Deciding what to test and at what level
|
|
313
|
+
- ✅ Implementing TDD
|
|
314
|
+
- ✅ Improving code coverage
|
|
315
|
+
- ✅ Fixing flaky tests
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
**Good tests give you confidence to ship.** ✅
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# TypeScript Testing Patterns
|
|
2
|
+
|
|
3
|
+
Language-specific patterns for the `testing-strategist` skill. Read `SKILL.md` first for universal methodology.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Framework Stack
|
|
8
|
+
|
|
9
|
+
| Level | Tool | Purpose |
|
|
10
|
+
|-------|------|---------|
|
|
11
|
+
| Unit | **Jest** or **Vitest** | Test runner, assertions, mocking |
|
|
12
|
+
| Component | **React Testing Library** | User-centric component testing |
|
|
13
|
+
| Integration | **Supertest** | HTTP API testing |
|
|
14
|
+
| E2E | **Playwright** | Browser automation |
|
|
15
|
+
|
|
16
|
+
## Commands
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm test # Run tests
|
|
20
|
+
npm test -- --watch # Watch mode
|
|
21
|
+
npm run test:coverage # Coverage report
|
|
22
|
+
npx playwright test # E2E tests
|
|
23
|
+
open coverage/lcov-report/index.html # View HTML report
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Unit Test: Business Logic
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// src/lib/pricing.ts
|
|
32
|
+
export function calculateTotal(items: { price: number; quantity: number }[]) {
|
|
33
|
+
return items.reduce((sum, item) => sum + item.price * item.quantity, 0)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function applyDiscount(total: number, discountPercent: number) {
|
|
37
|
+
if (discountPercent < 0 || discountPercent > 100) {
|
|
38
|
+
throw new Error('Invalid discount percentage')
|
|
39
|
+
}
|
|
40
|
+
return total * (1 - discountPercent / 100)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/lib/pricing.test.ts
|
|
44
|
+
import { calculateTotal, applyDiscount } from './pricing'
|
|
45
|
+
|
|
46
|
+
describe('calculateTotal', () => {
|
|
47
|
+
it('calculates total for single item', () => {
|
|
48
|
+
const items = [{ price: 10, quantity: 2 }]
|
|
49
|
+
expect(calculateTotal(items)).toBe(20)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('calculates total for multiple items', () => {
|
|
53
|
+
const items = [
|
|
54
|
+
{ price: 10, quantity: 2 },
|
|
55
|
+
{ price: 5, quantity: 3 }
|
|
56
|
+
]
|
|
57
|
+
expect(calculateTotal(items)).toBe(35)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('returns 0 for empty array', () => {
|
|
61
|
+
expect(calculateTotal([])).toBe(0)
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
describe('applyDiscount', () => {
|
|
66
|
+
it('applies discount correctly', () => {
|
|
67
|
+
expect(applyDiscount(100, 20)).toBe(80)
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('throws error for invalid discount', () => {
|
|
71
|
+
expect(() => applyDiscount(100, -10)).toThrow('Invalid discount')
|
|
72
|
+
expect(() => applyDiscount(100, 150)).toThrow('Invalid discount')
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Unit Test: React Components
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { render, screen, fireEvent } from '@testing-library/react'
|
|
81
|
+
import { Button } from './Button'
|
|
82
|
+
|
|
83
|
+
describe('Button', () => {
|
|
84
|
+
it('renders with correct text', () => {
|
|
85
|
+
render(<Button>Click me</Button>)
|
|
86
|
+
expect(screen.getByText('Click me')).toBeInTheDocument()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('applies primary variant by default', () => {
|
|
90
|
+
render(<Button>Click me</Button>)
|
|
91
|
+
expect(screen.getByRole('button')).toHaveClass('btn-primary')
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('calls onClick when clicked', () => {
|
|
95
|
+
const handleClick = jest.fn()
|
|
96
|
+
render(<Button onClick={handleClick}>Click me</Button>)
|
|
97
|
+
|
|
98
|
+
fireEvent.click(screen.getByRole('button'))
|
|
99
|
+
expect(handleClick).toHaveBeenCalledTimes(1)
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Unit Test: Custom Hooks
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import { renderHook, act } from '@testing-library/react'
|
|
108
|
+
import { useCounter } from './useCounter'
|
|
109
|
+
|
|
110
|
+
describe('useCounter', () => {
|
|
111
|
+
it('initializes with default value', () => {
|
|
112
|
+
const { result } = renderHook(() => useCounter())
|
|
113
|
+
expect(result.current.count).toBe(0)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
it('increments count', () => {
|
|
117
|
+
const { result } = renderHook(() => useCounter())
|
|
118
|
+
act(() => { result.current.increment() })
|
|
119
|
+
expect(result.current.count).toBe(1)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('resets to initial value', () => {
|
|
123
|
+
const { result } = renderHook(() => useCounter(10))
|
|
124
|
+
act(() => {
|
|
125
|
+
result.current.increment()
|
|
126
|
+
result.current.reset()
|
|
127
|
+
})
|
|
128
|
+
expect(result.current.count).toBe(10)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Integration Test: API Routes
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { testClient } from '@/lib/test-utils'
|
|
139
|
+
|
|
140
|
+
describe('POST /api/posts', () => {
|
|
141
|
+
beforeEach(async () => {
|
|
142
|
+
await db.post.deleteMany()
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('creates a new post', async () => {
|
|
146
|
+
const response = await testClient
|
|
147
|
+
.post('/api/posts')
|
|
148
|
+
.set('Authorization', `Bearer ${authToken}`)
|
|
149
|
+
.send({ title: 'Test Post', content: 'This is a test post' })
|
|
150
|
+
|
|
151
|
+
expect(response.status).toBe(201)
|
|
152
|
+
expect(response.body).toMatchObject({
|
|
153
|
+
title: 'Test Post',
|
|
154
|
+
content: 'This is a test post'
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
// Verify in database
|
|
158
|
+
const posts = await db.post.findMany()
|
|
159
|
+
expect(posts).toHaveLength(1)
|
|
160
|
+
expect(posts[0].title).toBe('Test Post')
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
it('returns 400 for invalid data', async () => {
|
|
164
|
+
const response = await testClient
|
|
165
|
+
.post('/api/posts')
|
|
166
|
+
.set('Authorization', `Bearer ${authToken}`)
|
|
167
|
+
.send({ title: '' })
|
|
168
|
+
|
|
169
|
+
expect(response.status).toBe(400)
|
|
170
|
+
expect(response.body.errors).toBeDefined()
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
it('returns 401 for unauthenticated request', async () => {
|
|
174
|
+
const response = await testClient.post('/api/posts')
|
|
175
|
+
.send({ title: 'Test', content: 'Test' })
|
|
176
|
+
|
|
177
|
+
expect(response.status).toBe(401)
|
|
178
|
+
})
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Integration Test: Database Operations
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
describe('userRepository', () => {
|
|
186
|
+
beforeEach(async () => { await db.user.deleteMany() })
|
|
187
|
+
afterAll(async () => { await db.$disconnect() })
|
|
188
|
+
|
|
189
|
+
describe('createUser', () => {
|
|
190
|
+
it('creates user with hashed password', async () => {
|
|
191
|
+
const user = await createUser({
|
|
192
|
+
email: 'test@example.com',
|
|
193
|
+
password: 'password123'
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
expect(user.email).toBe('test@example.com')
|
|
197
|
+
expect(user.password).not.toBe('password123')
|
|
198
|
+
expect(user.password).toMatch(/^\$2[aby]/) // bcrypt hash
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
it('throws error for duplicate email', async () => {
|
|
202
|
+
await createUser({ email: 'test@example.com', password: 'pass' })
|
|
203
|
+
await expect(createUser({ email: 'test@example.com', password: 'pass' }))
|
|
204
|
+
.rejects.toThrow()
|
|
205
|
+
})
|
|
206
|
+
})
|
|
207
|
+
})
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## E2E Test: Playwright
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
import { test, expect } from '@playwright/test'
|
|
216
|
+
|
|
217
|
+
test.describe('Authentication', () => {
|
|
218
|
+
test('user can sign up and log in', async ({ page }) => {
|
|
219
|
+
await page.goto('/signup')
|
|
220
|
+
await page.fill('input[name="email"]', 'test@example.com')
|
|
221
|
+
await page.fill('input[name="password"]', 'SecurePass123!')
|
|
222
|
+
await page.fill('input[name="confirmPassword"]', 'SecurePass123!')
|
|
223
|
+
await page.click('button[type="submit"]')
|
|
224
|
+
|
|
225
|
+
await expect(page).toHaveURL('/dashboard')
|
|
226
|
+
await expect(page.locator('h1')).toContainText('Welcome')
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
test('shows error for invalid credentials', async ({ page }) => {
|
|
230
|
+
await page.goto('/login')
|
|
231
|
+
await page.fill('input[name="email"]', 'wrong@example.com')
|
|
232
|
+
await page.fill('input[name="password"]', 'wrongpassword')
|
|
233
|
+
await page.click('button[type="submit"]')
|
|
234
|
+
|
|
235
|
+
await expect(page.locator('[role="alert"]')).toContainText('Invalid credentials')
|
|
236
|
+
await expect(page).toHaveURL('/login')
|
|
237
|
+
})
|
|
238
|
+
})
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Mocking
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
// Mock external API
|
|
247
|
+
import { fetchUserData } from '@/lib/api'
|
|
248
|
+
|
|
249
|
+
jest.mock('@/lib/api')
|
|
250
|
+
const mockFetchUserData = fetchUserData as jest.MockedFunction<typeof fetchUserData>
|
|
251
|
+
|
|
252
|
+
it('displays user data', async () => {
|
|
253
|
+
mockFetchUserData.mockResolvedValue({
|
|
254
|
+
id: '1', name: 'John Doe', email: 'john@example.com'
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
render(<UserProfile userId="1" />)
|
|
258
|
+
|
|
259
|
+
await waitFor(() => {
|
|
260
|
+
expect(screen.getByText('John Doe')).toBeInTheDocument()
|
|
261
|
+
})
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
// Mock Date
|
|
265
|
+
beforeAll(() => {
|
|
266
|
+
jest.useFakeTimers()
|
|
267
|
+
jest.setSystemTime(new Date('2024-01-01'))
|
|
268
|
+
})
|
|
269
|
+
afterAll(() => { jest.useRealTimers() })
|
|
270
|
+
|
|
271
|
+
// Mock Math.random
|
|
272
|
+
const mockRandom = jest.spyOn(Math, 'random')
|
|
273
|
+
mockRandom.mockReturnValue(0.5)
|
|
274
|
+
// ... assertions ...
|
|
275
|
+
mockRandom.mockRestore()
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Coverage Configuration
|
|
281
|
+
|
|
282
|
+
```javascript
|
|
283
|
+
// jest.config.js
|
|
284
|
+
module.exports = {
|
|
285
|
+
collectCoverageFrom: [
|
|
286
|
+
'src/**/*.{ts,tsx}',
|
|
287
|
+
'!src/**/*.d.ts',
|
|
288
|
+
'!src/**/*.stories.tsx',
|
|
289
|
+
'!src/types/**'
|
|
290
|
+
],
|
|
291
|
+
coverageThresholds: {
|
|
292
|
+
global: {
|
|
293
|
+
branches: 70, functions: 70, lines: 70, statements: 70
|
|
294
|
+
},
|
|
295
|
+
'./src/lib/auth/**': {
|
|
296
|
+
branches: 90, functions: 90, lines: 90
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## CI/CD
|
|
303
|
+
|
|
304
|
+
```yaml
|
|
305
|
+
- name: Run Tests
|
|
306
|
+
run: npm test -- --coverage
|
|
307
|
+
- name: Upload Coverage
|
|
308
|
+
uses: codecov/codecov-action@v3
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Assertion Examples
|
|
312
|
+
|
|
313
|
+
### ❌ Shallow (BANNED)
|
|
314
|
+
```typescript
|
|
315
|
+
expect(result).toBeDefined()
|
|
316
|
+
expect(result).toBeTruthy()
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### ✅ Deep (REQUIRED)
|
|
320
|
+
```typescript
|
|
321
|
+
expect(result).toEqual({
|
|
322
|
+
id: expect.any(String),
|
|
323
|
+
name: 'Test',
|
|
324
|
+
items: expect.arrayContaining([
|
|
325
|
+
expect.objectContaining({ amount: 100 })
|
|
326
|
+
])
|
|
327
|
+
})
|
|
328
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-architecture-map
|
|
3
|
+
description: Generate or refresh docs/ARCHITECTURE.md from current codebase state with evidence-backed component and data-flow mapping
|
|
4
|
+
parameters:
|
|
5
|
+
- name: mode
|
|
6
|
+
type: string
|
|
7
|
+
required: false
|
|
8
|
+
description: Optional mode override (create|update)
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## Step-by-Step
|
|
15
|
+
|
|
16
|
+
1. Verify latest phase validation report passed.
|
|
17
|
+
2. Load architecture-mapping skill.
|
|
18
|
+
3. Perform filesystem reconnaissance and deep file reads.
|
|
19
|
+
4. Extract components, schemas, data flows, and key patterns with citations.
|
|
20
|
+
5. Create/update `docs/ARCHITECTURE.md` holistically and refresh timestamp.
|
|
21
|
+
6. Evaluate phase completion gate and emit phase-aware next-step guidance.
|