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,513 @@
|
|
|
1
|
+
# API Design Principles Implementation Playbook
|
|
2
|
+
|
|
3
|
+
This file contains detailed patterns, checklists, and code samples referenced by the skill.
|
|
4
|
+
|
|
5
|
+
## Core Concepts
|
|
6
|
+
|
|
7
|
+
### 1. RESTful Design Principles
|
|
8
|
+
|
|
9
|
+
**Resource-Oriented Architecture**
|
|
10
|
+
|
|
11
|
+
- Resources are nouns (users, orders, products), not verbs
|
|
12
|
+
- Use HTTP methods for actions (GET, POST, PUT, PATCH, DELETE)
|
|
13
|
+
- URLs represent resource hierarchies
|
|
14
|
+
- Consistent naming conventions
|
|
15
|
+
|
|
16
|
+
**HTTP Methods Semantics:**
|
|
17
|
+
|
|
18
|
+
- `GET`: Retrieve resources (idempotent, safe)
|
|
19
|
+
- `POST`: Create new resources
|
|
20
|
+
- `PUT`: Replace entire resource (idempotent)
|
|
21
|
+
- `PATCH`: Partial resource updates
|
|
22
|
+
- `DELETE`: Remove resources (idempotent)
|
|
23
|
+
|
|
24
|
+
### 2. GraphQL Design Principles
|
|
25
|
+
|
|
26
|
+
**Schema-First Development**
|
|
27
|
+
|
|
28
|
+
- Types define your domain model
|
|
29
|
+
- Queries for reading data
|
|
30
|
+
- Mutations for modifying data
|
|
31
|
+
- Subscriptions for real-time updates
|
|
32
|
+
|
|
33
|
+
**Query Structure:**
|
|
34
|
+
|
|
35
|
+
- Clients request exactly what they need
|
|
36
|
+
- Single endpoint, multiple operations
|
|
37
|
+
- Strongly typed schema
|
|
38
|
+
- Introspection built-in
|
|
39
|
+
|
|
40
|
+
### 3. API Versioning Strategies
|
|
41
|
+
|
|
42
|
+
**URL Versioning:**
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
/api/v1/users
|
|
46
|
+
/api/v2/users
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Header Versioning:**
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Accept: application/vnd.api+json; version=1
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Query Parameter Versioning:**
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
/api/users?version=1
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## REST API Design Patterns
|
|
62
|
+
|
|
63
|
+
### Pattern 1: Resource Collection Design
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
# Good: Resource-oriented endpoints
|
|
67
|
+
GET /api/users # List users (with pagination)
|
|
68
|
+
POST /api/users # Create user
|
|
69
|
+
GET /api/users/{id} # Get specific user
|
|
70
|
+
PUT /api/users/{id} # Replace user
|
|
71
|
+
PATCH /api/users/{id} # Update user fields
|
|
72
|
+
DELETE /api/users/{id} # Delete user
|
|
73
|
+
|
|
74
|
+
# Nested resources
|
|
75
|
+
GET /api/users/{id}/orders # Get user's orders
|
|
76
|
+
POST /api/users/{id}/orders # Create order for user
|
|
77
|
+
|
|
78
|
+
# Bad: Action-oriented endpoints (avoid)
|
|
79
|
+
POST /api/createUser
|
|
80
|
+
POST /api/getUserById
|
|
81
|
+
POST /api/deleteUser
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Pattern 2: Pagination and Filtering
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from typing import List, Optional
|
|
88
|
+
from pydantic import BaseModel, Field
|
|
89
|
+
|
|
90
|
+
class PaginationParams(BaseModel):
|
|
91
|
+
page: int = Field(1, ge=1, description="Page number")
|
|
92
|
+
page_size: int = Field(20, ge=1, le=100, description="Items per page")
|
|
93
|
+
|
|
94
|
+
class FilterParams(BaseModel):
|
|
95
|
+
status: Optional[str] = None
|
|
96
|
+
created_after: Optional[str] = None
|
|
97
|
+
search: Optional[str] = None
|
|
98
|
+
|
|
99
|
+
class PaginatedResponse(BaseModel):
|
|
100
|
+
items: List[dict]
|
|
101
|
+
total: int
|
|
102
|
+
page: int
|
|
103
|
+
page_size: int
|
|
104
|
+
pages: int
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def has_next(self) -> bool:
|
|
108
|
+
return self.page < self.pages
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def has_prev(self) -> bool:
|
|
112
|
+
return self.page > 1
|
|
113
|
+
|
|
114
|
+
# FastAPI endpoint example
|
|
115
|
+
from fastapi import FastAPI, Query, Depends
|
|
116
|
+
|
|
117
|
+
app = FastAPI()
|
|
118
|
+
|
|
119
|
+
@app.get("/api/users", response_model=PaginatedResponse)
|
|
120
|
+
async def list_users(
|
|
121
|
+
page: int = Query(1, ge=1),
|
|
122
|
+
page_size: int = Query(20, ge=1, le=100),
|
|
123
|
+
status: Optional[str] = Query(None),
|
|
124
|
+
search: Optional[str] = Query(None)
|
|
125
|
+
):
|
|
126
|
+
# Apply filters
|
|
127
|
+
query = build_query(status=status, search=search)
|
|
128
|
+
|
|
129
|
+
# Count total
|
|
130
|
+
total = await count_users(query)
|
|
131
|
+
|
|
132
|
+
# Fetch page
|
|
133
|
+
offset = (page - 1) * page_size
|
|
134
|
+
users = await fetch_users(query, limit=page_size, offset=offset)
|
|
135
|
+
|
|
136
|
+
return PaginatedResponse(
|
|
137
|
+
items=users,
|
|
138
|
+
total=total,
|
|
139
|
+
page=page,
|
|
140
|
+
page_size=page_size,
|
|
141
|
+
pages=(total + page_size - 1) // page_size
|
|
142
|
+
)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Pattern 3: Error Handling and Status Codes
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
from fastapi import HTTPException, status
|
|
149
|
+
from pydantic import BaseModel
|
|
150
|
+
|
|
151
|
+
class ErrorResponse(BaseModel):
|
|
152
|
+
error: str
|
|
153
|
+
message: str
|
|
154
|
+
details: Optional[dict] = None
|
|
155
|
+
timestamp: str
|
|
156
|
+
path: str
|
|
157
|
+
|
|
158
|
+
class ValidationErrorDetail(BaseModel):
|
|
159
|
+
field: str
|
|
160
|
+
message: str
|
|
161
|
+
value: Any
|
|
162
|
+
|
|
163
|
+
# Consistent error responses
|
|
164
|
+
STATUS_CODES = {
|
|
165
|
+
"success": 200,
|
|
166
|
+
"created": 201,
|
|
167
|
+
"no_content": 204,
|
|
168
|
+
"bad_request": 400,
|
|
169
|
+
"unauthorized": 401,
|
|
170
|
+
"forbidden": 403,
|
|
171
|
+
"not_found": 404,
|
|
172
|
+
"conflict": 409,
|
|
173
|
+
"unprocessable": 422,
|
|
174
|
+
"internal_error": 500
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
def raise_not_found(resource: str, id: str):
|
|
178
|
+
raise HTTPException(
|
|
179
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
180
|
+
detail={
|
|
181
|
+
"error": "NotFound",
|
|
182
|
+
"message": f"{resource} not found",
|
|
183
|
+
"details": {"id": id}
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def raise_validation_error(errors: List[ValidationErrorDetail]):
|
|
188
|
+
raise HTTPException(
|
|
189
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
190
|
+
detail={
|
|
191
|
+
"error": "ValidationError",
|
|
192
|
+
"message": "Request validation failed",
|
|
193
|
+
"details": {"errors": [e.dict() for e in errors]}
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Example usage
|
|
198
|
+
@app.get("/api/users/{user_id}")
|
|
199
|
+
async def get_user(user_id: str):
|
|
200
|
+
user = await fetch_user(user_id)
|
|
201
|
+
if not user:
|
|
202
|
+
raise_not_found("User", user_id)
|
|
203
|
+
return user
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Pattern 4: HATEOAS (Hypermedia as the Engine of Application State)
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
class UserResponse(BaseModel):
|
|
210
|
+
id: str
|
|
211
|
+
name: str
|
|
212
|
+
email: str
|
|
213
|
+
_links: dict
|
|
214
|
+
|
|
215
|
+
@classmethod
|
|
216
|
+
def from_user(cls, user: User, base_url: str):
|
|
217
|
+
return cls(
|
|
218
|
+
id=user.id,
|
|
219
|
+
name=user.name,
|
|
220
|
+
email=user.email,
|
|
221
|
+
_links={
|
|
222
|
+
"self": {"href": f"{base_url}/api/users/{user.id}"},
|
|
223
|
+
"orders": {"href": f"{base_url}/api/users/{user.id}/orders"},
|
|
224
|
+
"update": {
|
|
225
|
+
"href": f"{base_url}/api/users/{user.id}",
|
|
226
|
+
"method": "PATCH"
|
|
227
|
+
},
|
|
228
|
+
"delete": {
|
|
229
|
+
"href": f"{base_url}/api/users/{user.id}",
|
|
230
|
+
"method": "DELETE"
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## GraphQL Design Patterns
|
|
237
|
+
|
|
238
|
+
### Pattern 1: Schema Design
|
|
239
|
+
|
|
240
|
+
```graphql
|
|
241
|
+
# schema.graphql
|
|
242
|
+
|
|
243
|
+
# Clear type definitions
|
|
244
|
+
type User {
|
|
245
|
+
id: ID!
|
|
246
|
+
email: String!
|
|
247
|
+
name: String!
|
|
248
|
+
createdAt: DateTime!
|
|
249
|
+
|
|
250
|
+
# Relationships
|
|
251
|
+
orders(first: Int = 20, after: String, status: OrderStatus): OrderConnection!
|
|
252
|
+
|
|
253
|
+
profile: UserProfile
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
type Order {
|
|
257
|
+
id: ID!
|
|
258
|
+
status: OrderStatus!
|
|
259
|
+
total: Money!
|
|
260
|
+
items: [OrderItem!]!
|
|
261
|
+
createdAt: DateTime!
|
|
262
|
+
|
|
263
|
+
# Back-reference
|
|
264
|
+
user: User!
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
# Pagination pattern (Relay-style)
|
|
268
|
+
type OrderConnection {
|
|
269
|
+
edges: [OrderEdge!]!
|
|
270
|
+
pageInfo: PageInfo!
|
|
271
|
+
totalCount: Int!
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
type OrderEdge {
|
|
275
|
+
node: Order!
|
|
276
|
+
cursor: String!
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
type PageInfo {
|
|
280
|
+
hasNextPage: Boolean!
|
|
281
|
+
hasPreviousPage: Boolean!
|
|
282
|
+
startCursor: String
|
|
283
|
+
endCursor: String
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
# Enums for type safety
|
|
287
|
+
enum OrderStatus {
|
|
288
|
+
PENDING
|
|
289
|
+
CONFIRMED
|
|
290
|
+
SHIPPED
|
|
291
|
+
DELIVERED
|
|
292
|
+
CANCELLED
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
# Custom scalars
|
|
296
|
+
scalar DateTime
|
|
297
|
+
scalar Money
|
|
298
|
+
|
|
299
|
+
# Query root
|
|
300
|
+
type Query {
|
|
301
|
+
user(id: ID!): User
|
|
302
|
+
users(first: Int = 20, after: String, search: String): UserConnection!
|
|
303
|
+
|
|
304
|
+
order(id: ID!): Order
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
# Mutation root
|
|
308
|
+
type Mutation {
|
|
309
|
+
createUser(input: CreateUserInput!): CreateUserPayload!
|
|
310
|
+
updateUser(input: UpdateUserInput!): UpdateUserPayload!
|
|
311
|
+
deleteUser(id: ID!): DeleteUserPayload!
|
|
312
|
+
|
|
313
|
+
createOrder(input: CreateOrderInput!): CreateOrderPayload!
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
# Input types for mutations
|
|
317
|
+
input CreateUserInput {
|
|
318
|
+
email: String!
|
|
319
|
+
name: String!
|
|
320
|
+
password: String!
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
# Payload types for mutations
|
|
324
|
+
type CreateUserPayload {
|
|
325
|
+
user: User
|
|
326
|
+
errors: [Error!]
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
type Error {
|
|
330
|
+
field: String
|
|
331
|
+
message: String!
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Pattern 2: Resolver Design
|
|
336
|
+
|
|
337
|
+
```python
|
|
338
|
+
from typing import Optional, List
|
|
339
|
+
from ariadne import QueryType, MutationType, ObjectType
|
|
340
|
+
from dataclasses import dataclass
|
|
341
|
+
|
|
342
|
+
query = QueryType()
|
|
343
|
+
mutation = MutationType()
|
|
344
|
+
user_type = ObjectType("User")
|
|
345
|
+
|
|
346
|
+
@query.field("user")
|
|
347
|
+
async def resolve_user(obj, info, id: str) -> Optional[dict]:
|
|
348
|
+
"""Resolve single user by ID."""
|
|
349
|
+
return await fetch_user_by_id(id)
|
|
350
|
+
|
|
351
|
+
@query.field("users")
|
|
352
|
+
async def resolve_users(
|
|
353
|
+
obj,
|
|
354
|
+
info,
|
|
355
|
+
first: int = 20,
|
|
356
|
+
after: Optional[str] = None,
|
|
357
|
+
search: Optional[str] = None
|
|
358
|
+
) -> dict:
|
|
359
|
+
"""Resolve paginated user list."""
|
|
360
|
+
# Decode cursor
|
|
361
|
+
offset = decode_cursor(after) if after else 0
|
|
362
|
+
|
|
363
|
+
# Fetch users
|
|
364
|
+
users = await fetch_users(
|
|
365
|
+
limit=first + 1, # Fetch one extra to check hasNextPage
|
|
366
|
+
offset=offset,
|
|
367
|
+
search=search
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
# Pagination
|
|
371
|
+
has_next = len(users) > first
|
|
372
|
+
if has_next:
|
|
373
|
+
users = users[:first]
|
|
374
|
+
|
|
375
|
+
edges = [
|
|
376
|
+
{
|
|
377
|
+
"node": user,
|
|
378
|
+
"cursor": encode_cursor(offset + i)
|
|
379
|
+
}
|
|
380
|
+
for i, user in enumerate(users)
|
|
381
|
+
]
|
|
382
|
+
|
|
383
|
+
return {
|
|
384
|
+
"edges": edges,
|
|
385
|
+
"pageInfo": {
|
|
386
|
+
"hasNextPage": has_next,
|
|
387
|
+
"hasPreviousPage": offset > 0,
|
|
388
|
+
"startCursor": edges[0]["cursor"] if edges else None,
|
|
389
|
+
"endCursor": edges[-1]["cursor"] if edges else None
|
|
390
|
+
},
|
|
391
|
+
"totalCount": await count_users(search=search)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
@user_type.field("orders")
|
|
395
|
+
async def resolve_user_orders(user: dict, info, first: int = 20) -> dict:
|
|
396
|
+
"""Resolve user's orders (N+1 prevention with DataLoader)."""
|
|
397
|
+
# Use DataLoader to batch requests
|
|
398
|
+
loader = info.context["loaders"]["orders_by_user"]
|
|
399
|
+
orders = await loader.load(user["id"])
|
|
400
|
+
|
|
401
|
+
return paginate_orders(orders, first)
|
|
402
|
+
|
|
403
|
+
@mutation.field("createUser")
|
|
404
|
+
async def resolve_create_user(obj, info, input: dict) -> dict:
|
|
405
|
+
"""Create new user."""
|
|
406
|
+
try:
|
|
407
|
+
# Validate input
|
|
408
|
+
validate_user_input(input)
|
|
409
|
+
|
|
410
|
+
# Create user
|
|
411
|
+
user = await create_user(
|
|
412
|
+
email=input["email"],
|
|
413
|
+
name=input["name"],
|
|
414
|
+
password=hash_password(input["password"])
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
return {
|
|
418
|
+
"user": user,
|
|
419
|
+
"errors": []
|
|
420
|
+
}
|
|
421
|
+
except ValidationError as e:
|
|
422
|
+
return {
|
|
423
|
+
"user": None,
|
|
424
|
+
"errors": [{"field": e.field, "message": e.message}]
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Pattern 3: DataLoader (N+1 Problem Prevention)
|
|
429
|
+
|
|
430
|
+
```python
|
|
431
|
+
from aiodataloader import DataLoader
|
|
432
|
+
from typing import List, Optional
|
|
433
|
+
|
|
434
|
+
class UserLoader(DataLoader):
|
|
435
|
+
"""Batch load users by ID."""
|
|
436
|
+
|
|
437
|
+
async def batch_load_fn(self, user_ids: List[str]) -> List[Optional[dict]]:
|
|
438
|
+
"""Load multiple users in single query."""
|
|
439
|
+
users = await fetch_users_by_ids(user_ids)
|
|
440
|
+
|
|
441
|
+
# Map results back to input order
|
|
442
|
+
user_map = {user["id"]: user for user in users}
|
|
443
|
+
return [user_map.get(user_id) for user_id in user_ids]
|
|
444
|
+
|
|
445
|
+
class OrdersByUserLoader(DataLoader):
|
|
446
|
+
"""Batch load orders by user ID."""
|
|
447
|
+
|
|
448
|
+
async def batch_load_fn(self, user_ids: List[str]) -> List[List[dict]]:
|
|
449
|
+
"""Load orders for multiple users in single query."""
|
|
450
|
+
orders = await fetch_orders_by_user_ids(user_ids)
|
|
451
|
+
|
|
452
|
+
# Group orders by user_id
|
|
453
|
+
orders_by_user = {}
|
|
454
|
+
for order in orders:
|
|
455
|
+
user_id = order["user_id"]
|
|
456
|
+
if user_id not in orders_by_user:
|
|
457
|
+
orders_by_user[user_id] = []
|
|
458
|
+
orders_by_user[user_id].append(order)
|
|
459
|
+
|
|
460
|
+
# Return in input order
|
|
461
|
+
return [orders_by_user.get(user_id, []) for user_id in user_ids]
|
|
462
|
+
|
|
463
|
+
# Context setup
|
|
464
|
+
def create_context():
|
|
465
|
+
return {
|
|
466
|
+
"loaders": {
|
|
467
|
+
"user": UserLoader(),
|
|
468
|
+
"orders_by_user": OrdersByUserLoader()
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
## Best Practices
|
|
474
|
+
|
|
475
|
+
### REST APIs
|
|
476
|
+
|
|
477
|
+
1. **Consistent Naming**: Use plural nouns for collections (`/users`, not `/user`)
|
|
478
|
+
2. **Stateless**: Each request contains all necessary information
|
|
479
|
+
3. **Use HTTP Status Codes Correctly**: 2xx success, 4xx client errors, 5xx server errors
|
|
480
|
+
4. **Version Your API**: Plan for breaking changes from day one
|
|
481
|
+
5. **Pagination**: Always paginate large collections
|
|
482
|
+
6. **Rate Limiting**: Protect your API with rate limits
|
|
483
|
+
7. **Documentation**: Use OpenAPI/Swagger for interactive docs
|
|
484
|
+
|
|
485
|
+
### GraphQL APIs
|
|
486
|
+
|
|
487
|
+
1. **Schema First**: Design schema before writing resolvers
|
|
488
|
+
2. **Avoid N+1**: Use DataLoaders for efficient data fetching
|
|
489
|
+
3. **Input Validation**: Validate at schema and resolver levels
|
|
490
|
+
4. **Error Handling**: Return structured errors in mutation payloads
|
|
491
|
+
5. **Pagination**: Use cursor-based pagination (Relay spec)
|
|
492
|
+
6. **Deprecation**: Use `@deprecated` directive for gradual migration
|
|
493
|
+
7. **Monitoring**: Track query complexity and execution time
|
|
494
|
+
|
|
495
|
+
## Common Pitfalls
|
|
496
|
+
|
|
497
|
+
- **Over-fetching/Under-fetching (REST)**: Fixed in GraphQL but requires DataLoaders
|
|
498
|
+
- **Breaking Changes**: Version APIs or use deprecation strategies
|
|
499
|
+
- **Inconsistent Error Formats**: Standardize error responses
|
|
500
|
+
- **Missing Rate Limits**: APIs without limits are vulnerable to abuse
|
|
501
|
+
- **Poor Documentation**: Undocumented APIs frustrate developers
|
|
502
|
+
- **Ignoring HTTP Semantics**: POST for idempotent operations breaks expectations
|
|
503
|
+
- **Tight Coupling**: API structure shouldn't mirror database schema
|
|
504
|
+
|
|
505
|
+
## Resources
|
|
506
|
+
|
|
507
|
+
- **references/rest-best-practices.md**: Comprehensive REST API design guide
|
|
508
|
+
- **references/graphql-schema-design.md**: GraphQL schema patterns and anti-patterns
|
|
509
|
+
- **references/api-versioning-strategies.md**: Versioning approaches and migration paths
|
|
510
|
+
- **assets/rest-api-template.py**: FastAPI REST API template
|
|
511
|
+
- **assets/graphql-schema-template.graphql**: Complete GraphQL schema example
|
|
512
|
+
- **assets/api-design-checklist.md**: Pre-implementation review checklist
|
|
513
|
+
- **scripts/openapi-generator.py**: Generate OpenAPI specs from code
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-versioning
|
|
3
|
+
description: "Manage API versioning and evolution with URL/header/query strategies, deprecation workflows, breaking change classification, sunset headers, and consumer-driven contract testing. Use when designing versioning strategy, deprecating endpoints, or evolving API contracts."
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# API Versioning & Evolution
|
|
8
|
+
|
|
9
|
+
APIs are contracts with consumers. Breaking that contract destroys trust. This skill covers how to version, evolve, and deprecate APIs without breaking clients.
|
|
10
|
+
|
|
11
|
+
## Stack-Specific References
|
|
12
|
+
|
|
13
|
+
After reading the methodology below, read the reference matching your surface's framework:
|
|
14
|
+
|
|
15
|
+
| Framework | Reference |
|
|
16
|
+
|-----------|-----------|
|
|
17
|
+
| TypeScript / Node.js | `references/typescript.md` |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Versioning Strategies
|
|
22
|
+
|
|
23
|
+
| Strategy | Example | Pros | Cons |
|
|
24
|
+
|----------|---------|------|------|
|
|
25
|
+
| **URL path** | `/api/v2/models` | Obvious, cacheable, easy routing | URL represents resource not version; copies endpoints |
|
|
26
|
+
| **Header** | `API-Version: 2` | Clean URLs, content negotiation | Hidden from browser, harder to test |
|
|
27
|
+
| **Query param** | `/api/models?version=2` | Easy to test, no routing changes | Pollutes query string, cache key complexity |
|
|
28
|
+
| **Accept header** | `Accept: application/vnd.api.v2+json` | Proper content negotiation | Verbose, often misunderstood |
|
|
29
|
+
|
|
30
|
+
### Recommendation
|
|
31
|
+
|
|
32
|
+
Use **URL path versioning** for public APIs (simplicity and discoverability). Use **header versioning** for internal/partner APIs (cleaner resource model).
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Default Version Behavior
|
|
37
|
+
|
|
38
|
+
| Strategy | Behavior | When to Use |
|
|
39
|
+
|----------|----------|-------------|
|
|
40
|
+
| **Default to latest** | Unversioned requests get the newest version | Internal APIs with controlled consumers |
|
|
41
|
+
| **Default to oldest supported** | Unversioned requests get V1 | Public APIs (avoid surprise breakage) |
|
|
42
|
+
| **Require explicit version** | Return 400 if no version specified | Strict APIs where ambiguity is unacceptable |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Breaking vs Non-Breaking Changes
|
|
47
|
+
|
|
48
|
+
### Non-Breaking (Safe to Ship)
|
|
49
|
+
|
|
50
|
+
| Change | Example | Why It Is Safe |
|
|
51
|
+
|--------|---------|---------------|
|
|
52
|
+
| Add optional field to response | `"avatar_url": "..."` added | Clients ignore unknown fields |
|
|
53
|
+
| Add optional query parameter | `?sort=name` now supported | Existing queries still work |
|
|
54
|
+
| Add new endpoint | `POST /api/v1/webhooks` | Does not affect existing endpoints |
|
|
55
|
+
| Widen accepted input types | Field accepts `string | number` | Existing valid inputs remain valid |
|
|
56
|
+
| Add optional request field | `"metadata": {}` now accepted | Existing requests without it still work |
|
|
57
|
+
| Relax validation | Max length 100 → 200 | Previously valid inputs still valid |
|
|
58
|
+
|
|
59
|
+
### Breaking (Requires New Version)
|
|
60
|
+
|
|
61
|
+
| Change | Example | Why It Breaks |
|
|
62
|
+
|--------|---------|---------------|
|
|
63
|
+
| Remove field from response | `price_per_token` removed | Clients reading this field break |
|
|
64
|
+
| Rename field | `price_per_token` → `pricing` | Clients reading old name break |
|
|
65
|
+
| Change field type | `price` from number to object | Parsing breaks |
|
|
66
|
+
| Remove endpoint | `DELETE /api/v1/legacy` | Clients calling it get 404 |
|
|
67
|
+
| Add required request field | `"region"` now required | Existing requests missing it fail |
|
|
68
|
+
| Tighten validation | Max length 200 → 100 | Previously valid inputs rejected |
|
|
69
|
+
| Change error response format | Different error shape | Client error handling breaks |
|
|
70
|
+
| Change authentication scheme | Bearer token → API key | Auth headers break |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Additive-Only API Policy
|
|
75
|
+
|
|
76
|
+
The safest evolution strategy: never remove or rename, only add.
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
V1 response:
|
|
80
|
+
{ id, name, price_per_token }
|
|
81
|
+
|
|
82
|
+
V1.1 response (additive — no new version needed):
|
|
83
|
+
{ id, name, price_per_token, pricing: { input, output, currency, unit } }
|
|
84
|
+
|
|
85
|
+
Clients reading price_per_token still work.
|
|
86
|
+
New clients use pricing object.
|
|
87
|
+
Remove price_per_token only in V2.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Sunset Headers and Deprecation Workflow
|
|
93
|
+
|
|
94
|
+
### Sunset Header (RFC 8594)
|
|
95
|
+
|
|
96
|
+
Every deprecated endpoint/version must include these headers:
|
|
97
|
+
- `Deprecation: true`
|
|
98
|
+
- `Sunset: <HTTP date>` — when this version will stop working
|
|
99
|
+
- `Link: <migration-url>; rel="sunset"`
|
|
100
|
+
|
|
101
|
+
### Deprecation Timeline
|
|
102
|
+
|
|
103
|
+
| Phase | Duration | Actions |
|
|
104
|
+
|-------|----------|---------|
|
|
105
|
+
| **Announce** | T-6 months | Add `Deprecation: true` header, publish migration guide |
|
|
106
|
+
| **Warn** | T-3 months | Add `Sunset` header with date, email consumers |
|
|
107
|
+
| **Monitor** | T-1 month | Track usage, notify active consumers directly |
|
|
108
|
+
| **Sunset** | T-0 | Return 410 Gone with migration link |
|
|
109
|
+
| **Remove** | T+3 months | Remove code (keep tests to prevent regression) |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Consumer-Driven Contract Testing
|
|
114
|
+
|
|
115
|
+
Consumers define the contract they depend on. The provider runs these contracts in CI.
|
|
116
|
+
|
|
117
|
+
**Concept:**
|
|
118
|
+
1. Each API consumer writes contract tests specifying fields they depend on
|
|
119
|
+
2. Provider runs ALL consumer contracts in CI before deploy
|
|
120
|
+
3. If a consumer contract breaks, the deploy is blocked
|
|
121
|
+
4. Adding new fields never breaks contracts (consumers ignore unknown fields)
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Changelog Automation
|
|
126
|
+
|
|
127
|
+
### Conventional Commits for API Changes
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
feat(api): add /api/v1/webhooks endpoint
|
|
131
|
+
fix(api): correct pagination cursor encoding in /api/v1/models
|
|
132
|
+
deprecate(api): mark /api/v1/legacy/search as deprecated
|
|
133
|
+
breaking(api): remove price_per_token field from /api/v2/models response
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Migration Guides
|
|
139
|
+
|
|
140
|
+
Every version bump must include a migration guide:
|
|
141
|
+
|
|
142
|
+
1. **Timeline** — deprecation date, sunset date, removal date
|
|
143
|
+
2. **Breaking changes** — before/after for each changed field or endpoint
|
|
144
|
+
3. **Migration steps** — numbered steps to update client code
|
|
145
|
+
4. **Testing instructions** — how to verify migration works
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Anti-Patterns
|
|
150
|
+
|
|
151
|
+
| Anti-Pattern | Correct Approach |
|
|
152
|
+
|-------------|------------------|
|
|
153
|
+
| Increment version for every change | Version only on breaking changes |
|
|
154
|
+
| Remove old version without notice | Follow deprecation timeline (6+ months) |
|
|
155
|
+
| Different versioning per endpoint | Consistent strategy across the entire API |
|
|
156
|
+
| Version in the response body only | Use URL path or headers — visible and consistent |
|
|
157
|
+
| No default version behavior | Define and document the default |
|
|
158
|
+
| Breaking change without migration guide | Every breaking change needs a guide |
|
|
159
|
+
| No consumer notification | Email, changelog, and headers all used together |
|
|
160
|
+
|
|
161
|
+
## References
|
|
162
|
+
|
|
163
|
+
- [RFC 8594: Sunset Header](https://tools.ietf.org/html/rfc8594)
|
|
164
|
+
- [Stripe API Versioning](https://stripe.com/docs/api/versioning)
|
|
165
|
+
- [Microsoft REST API Guidelines: Versioning](https://github.com/microsoft/api-guidelines)
|
|
166
|
+
- [Pact Contract Testing](https://docs.pact.io/)
|