@caddis/cli 0.1.0 → 0.2.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 +29 -16
- package/bundles/antigravity-plugin-extras/plugin.json +5 -0
- package/bundles/antigravity-plugin-extras/skills/_registry.md +154 -0
- package/bundles/antigravity-plugin-extras/skills/agent-md-refactor/SKILL.md +356 -0
- package/bundles/antigravity-plugin-extras/skills/agent-orchestration/SKILL.md +517 -0
- package/bundles/antigravity-plugin-extras/skills/algorithmic-art/SKILL.md +293 -0
- package/bundles/antigravity-plugin-extras/skills/anchor-review/SKILL.md +135 -0
- package/bundles/antigravity-plugin-extras/skills/api-client-patterns/SKILL.md +367 -0
- package/bundles/antigravity-plugin-extras/skills/architecture-design/SKILL.md +244 -0
- package/bundles/antigravity-plugin-extras/skills/architecture-diagram/SKILL.md +156 -0
- package/bundles/antigravity-plugin-extras/skills/architecture-document/SKILL.md +321 -0
- package/bundles/antigravity-plugin-extras/skills/artifacts-builder/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/artifacts-builder/SKILL.md +74 -0
- package/bundles/antigravity-plugin-extras/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/bundles/antigravity-plugin-extras/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/bundles/antigravity-plugin-extras/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/bundles/antigravity-plugin-extras/skills/ascii-art/SKILL.md +144 -0
- package/bundles/antigravity-plugin-extras/skills/asking-questions/SKILL.md +81 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/SKILL.md +118 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/cross-service/credential-management.md +450 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/browser/README.md +363 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/code-interpreter/README.md +232 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/gateway/README.md +100 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/gateway/deploy-template.sh +117 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/gateway/deployment-strategies.md +416 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/gateway/troubleshooting-guide.md +384 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/gateway/validate-deployment.sh +186 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/identity/README.md +186 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/memory/README.md +253 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/observability/README.md +517 -0
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/services/runtime/README.md +215 -0
- package/bundles/antigravity-plugin-extras/skills/aws-cdk-development/SKILL.md +279 -0
- package/bundles/antigravity-plugin-extras/skills/aws-cdk-development/references/cdk-patterns.md +431 -0
- package/bundles/antigravity-plugin-extras/skills/aws-cdk-development/scripts/validate-stack.sh +240 -0
- package/bundles/antigravity-plugin-extras/skills/aws-cost-operations/SKILL.md +318 -0
- package/bundles/antigravity-plugin-extras/skills/aws-cost-operations/references/cloudwatch-alarms.md +567 -0
- package/bundles/antigravity-plugin-extras/skills/aws-cost-operations/references/operations-patterns.md +394 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/SKILL.md +758 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/references/deployment-best-practices.md +830 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/references/eda-patterns.md +1002 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/references/observability-best-practices.md +770 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/references/performance-optimization.md +671 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/references/security-best-practices.md +625 -0
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/references/serverless-patterns.md +838 -0
- package/bundles/antigravity-plugin-extras/skills/backend-to-frontend-handoff/SKILL.md +139 -0
- package/bundles/antigravity-plugin-extras/skills/banner-design/SKILL.md +188 -0
- package/bundles/antigravity-plugin-extras/skills/brand-design/SKILL.md +298 -0
- package/bundles/antigravity-plugin-extras/skills/brand-guidelines/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/brand-guidelines/SKILL.md +118 -0
- package/bundles/antigravity-plugin-extras/skills/brand-voice/SKILL.md +93 -0
- package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/SKILL.md +392 -0
- package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/references/agent-patterns.md +461 -0
- package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/references/examples.md +188 -0
- package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/references/state-patterns.md +360 -0
- package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/references/troubleshooting.md +362 -0
- package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/SKILL.md +266 -0
- package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/references/examples.md +115 -0
- package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/references/oauth-setup.md +338 -0
- package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/references/troubleshooting.md +317 -0
- package/bundles/antigravity-plugin-extras/skills/caching-patterns/SKILL.md +385 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/SKILL.md +91 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/changelog-generator/SKILL.md +105 -0
- package/bundles/antigravity-plugin-extras/skills/code-explainer/SKILL.md +91 -0
- package/bundles/antigravity-plugin-extras/skills/competitive-ads-extractor/SKILL.md +294 -0
- package/bundles/antigravity-plugin-extras/skills/component-testing/SKILL.md +310 -0
- package/bundles/antigravity-plugin-extras/skills/content-research-writer/SKILL.md +539 -0
- package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +51 -0
- package/bundles/antigravity-plugin-extras/skills/data-analysis/SKILL.md +111 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/README.md +248 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/SKILL.md +203 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/adapter.py.template +44 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/api-router.py.template +43 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/contract-test.py.template +384 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/display-dto.py.template +39 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/frontend-service.ts.template +46 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/frontend-types.ts.template +38 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/ingestion-model.py.template +42 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/mapping-doc.md.template +46 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/normalizer.py.template +48 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/prompts/extract_requirements.md +36 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/prompts/extract_ui_demand.md +35 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/prompts/reconcile_mapping.md +66 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/assets/query-catalog.md.template +62 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/references/consumer-driven-contracts.md +131 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/references/drift-check-catalog.md +305 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/references/layer-responsibilities.md +333 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/discover_connections.py +170 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/discover_sources.py +161 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/drift_check.py +171 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/extract_schema.py +1363 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/generate_gap_report.py +81 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/generate_mapping_doc.py +294 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/ts_dto_compare.py +214 -0
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/scripts/validate_lineage.py +51 -0
- package/bundles/antigravity-plugin-extras/skills/data-loader/SKILL.md +753 -0
- package/bundles/antigravity-plugin-extras/skills/data-validation/SKILL.md +220 -0
- package/bundles/antigravity-plugin-extras/skills/db-testing/SKILL.md +117 -0
- package/bundles/antigravity-plugin-extras/skills/deploy-local/SKILL.md +259 -0
- package/bundles/antigravity-plugin-extras/skills/design-md/SKILL.md +167 -0
- package/bundles/antigravity-plugin-extras/skills/design-system-tokens/SKILL.md +240 -0
- package/bundles/antigravity-plugin-extras/skills/design-system-tokens/references/DESIGN-SYSTEM-TEMPLATE.md +577 -0
- package/bundles/antigravity-plugin-extras/skills/developer-growth-analysis/SKILL.md +323 -0
- package/bundles/antigravity-plugin-extras/skills/doc-coauthoring/SKILL.md +378 -0
- package/bundles/antigravity-plugin-extras/skills/documentation-analyzer/SKILL.md +78 -0
- package/bundles/antigravity-plugin-extras/skills/domain-name-brainstormer/SKILL.md +213 -0
- package/bundles/antigravity-plugin-extras/skills/enterprise-dashboard-aesthetic-system/SKILL.md +120 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/SKILL.md +193 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/references/element-types.md +497 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/references/excalidraw-schema.md +356 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/references/reliable-diagrams.md +115 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/scripts/README.md +60 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/scripts/add-arrow.py +354 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/scripts/add-icon-to-diagram.py +412 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/scripts/split-excalidraw-library.py +183 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/business-flow-swimlane-template.excalidraw +334 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/class-diagram-template.excalidraw +558 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/data-flow-diagram-template.excalidraw +279 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/er-diagram-template.excalidraw +662 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/flowchart-template.excalidraw +179 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/mindmap-template.excalidraw +244 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/relationship-template.excalidraw +145 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/reliable-flowchart.excalidraw +1 -0
- package/bundles/antigravity-plugin-extras/skills/excalidraw/templates/sequence-diagram-template.excalidraw +509 -0
- package/bundles/antigravity-plugin-extras/skills/file-organizer/SKILL.md +434 -0
- package/bundles/antigravity-plugin-extras/skills/game-changing-features/README.md +221 -0
- package/bundles/antigravity-plugin-extras/skills/game-changing-features/SKILL.md +265 -0
- package/bundles/antigravity-plugin-extras/skills/github-issues/SKILL.md +359 -0
- package/bundles/antigravity-plugin-extras/skills/github-issues/references/templates.md +90 -0
- package/bundles/antigravity-plugin-extras/skills/golden-nuggets/SKILL.md +192 -0
- package/bundles/antigravity-plugin-extras/skills/humanizer/SKILL.md +194 -0
- package/bundles/antigravity-plugin-extras/skills/image-enhancer/SKILL.md +100 -0
- package/bundles/antigravity-plugin-extras/skills/intent-writer/SKILL.md +201 -0
- package/bundles/antigravity-plugin-extras/skills/internal-comms/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/internal-comms/SKILL.md +124 -0
- package/bundles/antigravity-plugin-extras/skills/internal-comms/examples/3p-updates.md +47 -0
- package/bundles/antigravity-plugin-extras/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/bundles/antigravity-plugin-extras/skills/internal-comms/examples/faq-answers.md +30 -0
- package/bundles/antigravity-plugin-extras/skills/internal-comms/examples/general-comms.md +16 -0
- package/bundles/antigravity-plugin-extras/skills/invoice-organizer/SKILL.md +447 -0
- package/bundles/antigravity-plugin-extras/skills/jira-issues/SKILL.md +182 -0
- package/bundles/antigravity-plugin-extras/skills/job-application/SKILL.md +188 -0
- package/bundles/antigravity-plugin-extras/skills/lead-research-assistant/SKILL.md +200 -0
- package/bundles/antigravity-plugin-extras/skills/llm-application-dev/SKILL.md +217 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/SKILL.md +100 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/references/evaluation.md +602 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/references/mcp_best_practices.md +915 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/references/node_mcp_server.md +916 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/references/python_mcp_server.md +752 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/scripts/connections.py +151 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/bundles/antigravity-plugin-extras/skills/meeting-insights-analyzer/SKILL.md +328 -0
- package/bundles/antigravity-plugin-extras/skills/monorepo/SKILL.md +267 -0
- package/bundles/antigravity-plugin-extras/skills/naming-analyzer/SKILL.md +376 -0
- package/bundles/antigravity-plugin-extras/skills/nextjs-app-router/SKILL.md +271 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/AUTHENTICATION.md +154 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/SKILL.md +270 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/references/api_reference.md +309 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/references/troubleshooting.md +376 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/references/usage_patterns.md +338 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/__init__.py +81 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/ask_question.py +256 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/auth_manager.py +358 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_session.py +255 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_utils.py +107 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/cleanup_manager.py +302 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/config.py +44 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/notebook_manager.py +410 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/run.py +102 -0
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/setup_environment.py +204 -0
- package/bundles/antigravity-plugin-extras/skills/observability/SKILL.md +371 -0
- package/bundles/antigravity-plugin-extras/skills/onboard-project/SKILL.md +192 -0
- package/bundles/antigravity-plugin-extras/skills/performance-testing/SKILL.md +226 -0
- package/bundles/antigravity-plugin-extras/skills/pipeline-state/SKILL.md +208 -0
- package/bundles/antigravity-plugin-extras/skills/plantuml/SKILL.md +228 -0
- package/bundles/antigravity-plugin-extras/skills/popular-web-designs/SKILL.md +142 -0
- package/bundles/antigravity-plugin-extras/skills/popular-web-designs/templates/linear.app.md +196 -0
- package/bundles/antigravity-plugin-extras/skills/popular-web-designs/templates/stripe.md +214 -0
- package/bundles/antigravity-plugin-extras/skills/popular-web-designs/templates/vercel.md +218 -0
- package/bundles/antigravity-plugin-extras/skills/prd-to-code/SKILL.md +127 -0
- package/bundles/antigravity-plugin-extras/skills/raffle-winner-picker/SKILL.md +159 -0
- package/bundles/antigravity-plugin-extras/skills/react-useeffect/README.md +320 -0
- package/bundles/antigravity-plugin-extras/skills/react-useeffect/SKILL.md +53 -0
- package/bundles/antigravity-plugin-extras/skills/react-useeffect/alternatives.md +258 -0
- package/bundles/antigravity-plugin-extras/skills/react-useeffect/anti-patterns.md +290 -0
- package/bundles/antigravity-plugin-extras/skills/receiving-code-review/SKILL.md +213 -0
- package/bundles/antigravity-plugin-extras/skills/relay/SKILL.md +246 -0
- package/bundles/antigravity-plugin-extras/skills/requesting-code-review/SKILL.md +105 -0
- package/bundles/antigravity-plugin-extras/skills/requesting-code-review/code-reviewer.md +146 -0
- package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/SKILL.md +350 -0
- package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/references/pwa-checklist.md +226 -0
- package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/references/touch-and-interaction.md +265 -0
- package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/references/transformation-catalogue.md +326 -0
- package/bundles/antigravity-plugin-extras/skills/schema-migration/SKILL.md +275 -0
- package/bundles/antigravity-plugin-extras/skills/setup-project-ai/SKILL.md +120 -0
- package/bundles/antigravity-plugin-extras/skills/shadcn-radix/SKILL.md +330 -0
- package/bundles/antigravity-plugin-extras/skills/sketch/SKILL.md +104 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/SKILL.md +646 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/color_palettes.py +302 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/easing.py +230 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/frame_composer.py +469 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/gif_builder.py +246 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/typography.py +357 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/validators.py +264 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/visual_effects.py +494 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/requirements.txt +4 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/bounce.py +106 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/explode.py +331 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/fade.py +329 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/flip.py +291 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/morph.py +329 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/move.py +293 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/pulse.py +268 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/shake.py +127 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/slide.py +291 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/spin.py +269 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/wiggle.py +300 -0
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/zoom.py +312 -0
- package/bundles/antigravity-plugin-extras/skills/slides/SKILL.md +38 -0
- package/bundles/antigravity-plugin-extras/skills/state-tracking/SKILL.md +131 -0
- package/bundles/antigravity-plugin-extras/skills/streamlit-dev/SKILL.md +268 -0
- package/bundles/antigravity-plugin-extras/skills/svg-create/SKILL.md +251 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/SKILL.md +59 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/theme-showcase.pdf +0 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/desert-rose.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/golden-hour.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/bundles/antigravity-plugin-extras/skills/ui-styling-patterns/LICENSE.txt +202 -0
- package/bundles/antigravity-plugin-extras/skills/ui-styling-patterns/SKILL.md +320 -0
- package/bundles/antigravity-plugin-extras/skills/ui-testing/SKILL.md +660 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/SKILL.md +660 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/_sync_all.py +414 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/app-interface.csv +31 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/charts.csv +26 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/colors.csv +162 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/design.csv +1776 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/draft.csv +1779 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/google-fonts.csv +1924 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/icons.csv +106 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/landing.csv +35 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/products.csv +162 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/react-performance.csv +45 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/styles.csv +85 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/typography.csv +74 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/ui-reasoning.csv +162 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/data/ux-guidelines.csv +100 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/scripts/core.py +247 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/scripts/design_system.py +1067 -0
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/scripts/search.py +114 -0
- package/bundles/antigravity-plugin-extras/skills/understand-anything/SKILL.md +140 -0
- package/bundles/antigravity-plugin-extras/skills/understand-anything/references/commands.md +252 -0
- package/bundles/antigravity-plugin-extras/skills/understand-anything/references/graph-schema.md +116 -0
- package/bundles/antigravity-plugin-extras/skills/understand-anything/references/pipeline.md +331 -0
- package/bundles/antigravity-plugin-extras/skills/update-readme/SKILL.md +74 -0
- package/bundles/antigravity-plugin-extras/skills/verification-loop/SKILL.md +209 -0
- package/bundles/antigravity-plugin-extras/skills/video-downloader/SKILL.md +107 -0
- package/bundles/antigravity-plugin-extras/skills/webapp-development/SKILL.md +288 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/SKILL.md +339 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/agents/agent-interface.md +175 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/html.md +384 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/nlp-keywords.md +127 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/palettes.md +149 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/python.md +249 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/react.md +427 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/shapes.md +135 -0
- package/bundles/antigravity-plugin-extras/skills/word-cloud/references/stopwords.md +115 -0
- package/bundles/antigravity-plugin-extras/skills/youtube-transcript/SKILL.md +416 -0
- package/bundles/manifest.json +2 -1
- package/dist/cli.js +166 -37
- package/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Sub-prompt: Extract UI Demand
|
|
2
|
+
|
|
3
|
+
Use this prompt to extract data demand from existing frontend components (JSX, TSX, HTML, Vue templates).
|
|
4
|
+
Paste the component source after the divider, then run this prompt.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are extracting data field demand from a frontend component or page.
|
|
9
|
+
|
|
10
|
+
For each field, prop, variable, or binding that renders or filters data, produce a JSON entry:
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"display_label": "Text shown to the user (from label, column header, tooltip, etc.)",
|
|
15
|
+
"prop_or_key": "The prop name or object key used in code (e.g. row.customerId)",
|
|
16
|
+
"component": "Component or page file name",
|
|
17
|
+
"context": "table-column | kpi-card | chart-axis | filter | export | badge | detail-panel | other",
|
|
18
|
+
"inferred_type": "string | number | boolean | date | list | enum | unknown",
|
|
19
|
+
"nullable_in_ui": "true if the UI renders a fallback (e.g. '—', 'N/A') for missing values",
|
|
20
|
+
"current_source": "Where does the value come from? (mock constant, API call, prop, store, hardcoded)",
|
|
21
|
+
"backed": "true | false | unknown — is this connected to a real API or DB?",
|
|
22
|
+
"notes": "Anything suspicious: hardcoded data, TODO comments, demo-only flags"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Rules:
|
|
27
|
+
- Include EVERY rendered field, even if it appears backed by mock data.
|
|
28
|
+
- Mark `backed: false` when value is a hardcoded string, imported mock constant, or demo fixture.
|
|
29
|
+
- Mark `backed: unknown` when you cannot determine the source from the component alone.
|
|
30
|
+
- Do not skip fields because they seem obvious — completeness is required.
|
|
31
|
+
- Output a JSON array of demand objects, followed by a `## Mock/Unbacked Fields` section listing fields that are NOT currently connected to real data.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
COMPONENT SOURCE:
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Sub-prompt: Reconcile Mapping
|
|
2
|
+
|
|
3
|
+
Use this prompt to map source columns → normalizer transforms → DisplayDTO fields.
|
|
4
|
+
Provide the source column list and requirements list, then run this prompt.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are reconciling data source capabilities against product requirements and UI demand.
|
|
9
|
+
|
|
10
|
+
## Inputs
|
|
11
|
+
|
|
12
|
+
You will receive:
|
|
13
|
+
1. `SOURCE_COLUMNS` — columns from the ingestion model or DB schema
|
|
14
|
+
2. `REQUIREMENTS` — field requirements extracted from docs or tickets
|
|
15
|
+
3. `UI_DEMAND` — fields extracted from frontend components
|
|
16
|
+
4. `EXISTING_CONTRACT` — existing `.contracts/*.contract.json` (if any)
|
|
17
|
+
|
|
18
|
+
## Task
|
|
19
|
+
|
|
20
|
+
For each DisplayDTO field that should exist (derived from requirements + UI demand):
|
|
21
|
+
|
|
22
|
+
1. Find the best matching source column(s).
|
|
23
|
+
2. Determine what adapter and normalizer transform is needed.
|
|
24
|
+
3. Assign a status:
|
|
25
|
+
|
|
26
|
+
| Status | Assign when |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `contract-backed` | Source column maps cleanly; transform is deterministic; test exists |
|
|
29
|
+
| `partially-backed` | Derives from nullable embedded payload; may degrade to blocked at runtime |
|
|
30
|
+
| `blocked` | Required column is always NULL in prod, or formula is undefined |
|
|
31
|
+
| `required-unplaced` | Frontend/requirements demand it; no source column found |
|
|
32
|
+
| `source-capability-only` | Source has it; no requirement or UI demand |
|
|
33
|
+
| `mockup-only` | In UI mockup only; no backend path |
|
|
34
|
+
| `deferred` | Explicitly out of scope |
|
|
35
|
+
|
|
36
|
+
4. Output one JSON entry per DisplayDTO field:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"field_key": "camelCase DTO key",
|
|
41
|
+
"source_column": "column_name (or null if required-unplaced)",
|
|
42
|
+
"adapter": "scalar | csv | embedded_json | embedded_markdown | embedded_text | none",
|
|
43
|
+
"transform": "Description of normalizer logic (e.g. 'split CSV, preserve quoted commas')",
|
|
44
|
+
"status": "contract-backed | partially-backed | ...",
|
|
45
|
+
"null_handling": "What the normalizer returns when source is NULL",
|
|
46
|
+
"type": "Python type annotation for DisplayDTO",
|
|
47
|
+
"fe_type": "TypeScript type for frontend",
|
|
48
|
+
"notes": "Any caveats, edge cases, or open questions"
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Output format
|
|
53
|
+
|
|
54
|
+
1. JSON array of mapping entries (one per DisplayDTO field).
|
|
55
|
+
2. `## Gaps` — fields that are `required-unplaced` or `blocked`, with recommended next action.
|
|
56
|
+
3. `## Orphans` — source columns that are `source-capability-only`, listed for product review.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
SOURCE_COLUMNS:
|
|
61
|
+
|
|
62
|
+
REQUIREMENTS:
|
|
63
|
+
|
|
64
|
+
UI_DEMAND:
|
|
65
|
+
|
|
66
|
+
EXISTING_CONTRACT:
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Query Catalog — {FeatureName}
|
|
2
|
+
# Generated: {date}
|
|
3
|
+
# Target: {DB server / environment}
|
|
4
|
+
# Schema: {schema} (default: dbo)
|
|
5
|
+
#
|
|
6
|
+
# PURPOSE: Every SQL query that populates a DB-backed UI field is listed here.
|
|
7
|
+
# Queries use named bind parameters and are bounded — safe to run during data analysis.
|
|
8
|
+
# Substitute {schema} → dbo (or your override) before executing.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## {EntityName} — {repository_module}.fetch_{entity}_list
|
|
13
|
+
|
|
14
|
+
**UI fields populated:** `fieldA`, `fieldB`, `fieldC`, `embeddedStatus`
|
|
15
|
+
**Called by:** `{EntityService}.get_list` → `normalize_{entity}` → `{EntityResponse}`
|
|
16
|
+
**Paging:** OFFSET + FETCH, max {MAX_PAGE} rows
|
|
17
|
+
|
|
18
|
+
```sql
|
|
19
|
+
-- List query — paged, optional filter
|
|
20
|
+
-- Parameters:
|
|
21
|
+
-- :filter_value VARCHAR optional WHERE filter (pass NULL to skip)
|
|
22
|
+
-- :offset INT OFFSET rows (0-based)
|
|
23
|
+
-- :page_size INT rows per page (max {MAX_PAGE})
|
|
24
|
+
SELECT
|
|
25
|
+
t.primary_key_col AS primary_key,
|
|
26
|
+
t.display_col_a AS field_a,
|
|
27
|
+
t.display_col_b AS field_b,
|
|
28
|
+
t.embedded_col AS embedded_col -- NVARCHAR(MAX): see derived fields below
|
|
29
|
+
FROM {schema}.{SourceTable} AS t
|
|
30
|
+
WHERE (:filter_value IS NULL OR t.filter_col = :filter_value)
|
|
31
|
+
ORDER BY t.created_at DESC
|
|
32
|
+
OFFSET :offset ROWS FETCH NEXT :page_size ROWS ONLY;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Derived fields from `embedded_col` (extracted by normalizer, not in SQL):**
|
|
36
|
+
|
|
37
|
+
| UI field | Payload path | Adapter | Null behaviour |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| `embeddedStatus` | NULL check on `embedded_col` | n/a | `blocked` |
|
|
40
|
+
| `derivedField1` | `embedded_col → json_key` | `embedded_json_adapter` | `[]` |
|
|
41
|
+
| `derivedField2` | `embedded_col → ## Section Header` | `embedded_markdown_adapter` | `None` |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## {EntityName} — {repository_module}.fetch_{entity}_by_id
|
|
46
|
+
|
|
47
|
+
**UI fields populated:** same as list + detail-only fields
|
|
48
|
+
**Called by:** `{EntityService}.get_by_id` → `normalize_{entity}` → `{EntityResponse}`
|
|
49
|
+
|
|
50
|
+
```sql
|
|
51
|
+
-- Single-row lookup by primary key
|
|
52
|
+
-- Parameters:
|
|
53
|
+
-- :record_id VARCHAR primary key value
|
|
54
|
+
SELECT
|
|
55
|
+
t.primary_key_col AS primary_key,
|
|
56
|
+
t.display_col_a AS field_a,
|
|
57
|
+
t.display_col_b AS field_b,
|
|
58
|
+
t.detail_only_col AS detail_field,
|
|
59
|
+
t.embedded_col AS embedded_col
|
|
60
|
+
FROM {schema}.{SourceTable} AS t
|
|
61
|
+
WHERE t.primary_key_col = :record_id;
|
|
62
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Consumer-Driven Contracts
|
|
2
|
+
|
|
3
|
+
Reference summary of the Consumer-Driven Contracts pattern for data pipeline alignment.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Origin
|
|
8
|
+
|
|
9
|
+
**Consumer-Driven Contracts** (Ian Robinson, Martin Fowler — 2006) is a pattern for managing service integration where the **consumer** declares what it needs from a provider, and the provider validates that it satisfies all consumer expectations.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Core Principles
|
|
14
|
+
|
|
15
|
+
### 1. Contracts Are Code, Not Docs
|
|
16
|
+
|
|
17
|
+
Documentation drifts. Contract **tests** are the source of truth.
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
❌ "The API returns these fields" (in a wiki page)
|
|
21
|
+
✅ test_api_returns_expected_fields() (in the test suite)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 2. Consumer Declares Needs
|
|
25
|
+
|
|
26
|
+
The frontend (consumer) declares which fields it needs. The backend (provider) validates it serves them. This inverts the usual direction — instead of the backend dictating "here's what I send", the frontend says "here's what I need."
|
|
27
|
+
|
|
28
|
+
In practice: TypeScript interfaces define the contract. Python DTOs validate they provide those fields.
|
|
29
|
+
|
|
30
|
+
### 3. Additive Evolution
|
|
31
|
+
|
|
32
|
+
Schema changes are additive — add optional fields with defaults. Never remove or rename a field without coordinating with all consumers.
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
# ✅ Safe evolution: new optional field with default
|
|
36
|
+
class MetricsResponse(BaseModel):
|
|
37
|
+
nps: float
|
|
38
|
+
responses: int
|
|
39
|
+
# New field — existing consumers ignore it, new consumers use it
|
|
40
|
+
trend_direction: str = Field(default="stable", alias="trendDirection")
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 4. Just Enough Validation
|
|
44
|
+
|
|
45
|
+
Validate what matters at each layer:
|
|
46
|
+
|
|
47
|
+
| Layer | Validates |
|
|
48
|
+
|-------|-----------|
|
|
49
|
+
| Ingestion Model | "Does the raw data have the expected shape?" |
|
|
50
|
+
| Display DTO | "Does the API output have the exact contracted shape?" |
|
|
51
|
+
| Contract Test | "Do all layers agree on the same shape?" |
|
|
52
|
+
|
|
53
|
+
Don't over-validate at every layer. The ingestion model can be lenient (`extra="allow"`). The display DTO must be strict (`extra="forbid"`).
|
|
54
|
+
|
|
55
|
+
### 5. Fail Fast, Fail Loud
|
|
56
|
+
|
|
57
|
+
When a contract violation is detected, it should be an error — not a warning, not a log line.
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# ❌ Silent handling
|
|
61
|
+
try:
|
|
62
|
+
dto = MyDTO.model_validate(data)
|
|
63
|
+
except ValidationError:
|
|
64
|
+
return {} # Silent failure — consumer gets empty data
|
|
65
|
+
|
|
66
|
+
# ✅ Fail loud
|
|
67
|
+
dto = MyDTO.model_validate(data) # Raises ValidationError with details
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## How This Maps to Our Pipeline
|
|
73
|
+
|
|
74
|
+
| CDC Concept | Our Implementation |
|
|
75
|
+
|-------------|-------------------|
|
|
76
|
+
| Consumer | Frontend TypeScript types + service functions |
|
|
77
|
+
| Provider | Backend display DTO + API router |
|
|
78
|
+
| Contract | Contract tests in `tests/unit/test_contract_*.py` |
|
|
79
|
+
| Contract verification | `pytest` (local) → CI pipeline (when available) |
|
|
80
|
+
| Golden sample | `tests/fixtures/payloads/{source}/sample.json` |
|
|
81
|
+
| Schema evolution | Additive fields with defaults, never `extra="ignore"` |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Golden Sample Pattern
|
|
86
|
+
|
|
87
|
+
A **golden sample** is a curated, representative payload from the source that serves as the reference for all contract tests.
|
|
88
|
+
|
|
89
|
+
### Properties of a Good Golden Sample
|
|
90
|
+
|
|
91
|
+
1. **Complete**: Contains all known keys, including optional ones
|
|
92
|
+
2. **Representative**: Values are realistic (not all null or placeholder)
|
|
93
|
+
3. **Sanitized**: No PII, credentials, or sensitive data
|
|
94
|
+
4. **Versioned**: Old samples renamed (not deleted) when schema changes
|
|
95
|
+
5. **Committed**: Checked into version control, not generated at test time
|
|
96
|
+
|
|
97
|
+
### How to Create One
|
|
98
|
+
|
|
99
|
+
1. Copy a real payload from the source (API response, JSON file, DB query result)
|
|
100
|
+
2. Sanitize: replace real names, emails, IDs with realistic fakes
|
|
101
|
+
3. Save to `tests/fixtures/payloads/{source_name}/sample.json`
|
|
102
|
+
4. Commit with a descriptive message: `test: add golden sample for {source_name}`
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Postel's Law and Its Limits
|
|
107
|
+
|
|
108
|
+
> "Be conservative in what you send, liberal in what you accept."
|
|
109
|
+
> — *Jon Postel, RFC 761 (1980)*
|
|
110
|
+
|
|
111
|
+
This works for **ingestion models** (accept broad input to avoid brittle failures on new keys).
|
|
112
|
+
|
|
113
|
+
It does NOT work for **display DTOs** at the API boundary. Display DTOs must be explicit:
|
|
114
|
+
|
|
115
|
+
- **Conservative in what you send**: Only send fields the consumer declared it needs
|
|
116
|
+
- **Explicit about what you accept**: `extra="forbid"` — don't silently drop or add fields
|
|
117
|
+
|
|
118
|
+
The failure mode of Postel's Law at API boundaries: the backend silently drops a field (`extra="ignore"`), the frontend silently renders `undefined`, and nobody notices until a stakeholder asks "why is this blank?"
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## When to Use CDC vs. Other Patterns
|
|
123
|
+
|
|
124
|
+
| Pattern | Best For |
|
|
125
|
+
|---------|----------|
|
|
126
|
+
| Consumer-Driven Contracts | Frontend ↔ Backend in same team/repo |
|
|
127
|
+
| Provider Contracts (Pact) | Microservices across teams |
|
|
128
|
+
| Schema Registry (Avro/Protobuf) | Event streaming (Kafka, EventBridge) |
|
|
129
|
+
| OpenAPI / Swagger | Public APIs with external consumers |
|
|
130
|
+
|
|
131
|
+
For most internal dashboards and applications, Consumer-Driven Contracts with golden sample tests is the right level of formality.
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# Drift Check Catalog
|
|
2
|
+
|
|
3
|
+
Complete reference of contract drift types, detection methods, and fix patterns.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Drift Types
|
|
8
|
+
|
|
9
|
+
### D1 — Payload Key Not in Ingestion Model
|
|
10
|
+
|
|
11
|
+
**What**: A key exists in the source payload but has no corresponding field in the ingestion model — at **any nesting depth**, not just top-level.
|
|
12
|
+
|
|
13
|
+
**Risk**: New data from the source is silently ignored. If the ingestion model uses `extra="ignore"`, this is invisible.
|
|
14
|
+
|
|
15
|
+
**Detection — flat (top-level only)**:
|
|
16
|
+
```python
|
|
17
|
+
payload_keys = set(payload.keys())
|
|
18
|
+
model_aliases = {
|
|
19
|
+
info.alias or name for name, info in IngestionModel.model_fields.items()
|
|
20
|
+
}
|
|
21
|
+
uncovered = payload_keys - model_aliases
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Detection — recursive (recommended)**:
|
|
25
|
+
```python
|
|
26
|
+
from contract_test_helpers import _collect_dropped_keys
|
|
27
|
+
|
|
28
|
+
dropped = _collect_dropped_keys(payload, IngestionModel)
|
|
29
|
+
# Returns dot-path list: ["surveys.broadband.newField", "metadata.x"]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The recursive variant (`_collect_dropped_keys` in the contract-test template) walks nested dicts and lists-of-dicts, comparing keys against model field aliases at every depth. It also respects the `KNOWN_EXCLUDED_KEYS` allow-list (see D12).
|
|
33
|
+
|
|
34
|
+
**Fix**: Add the missing field to the ingestion model with the correct type.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### D2 — Ingestion Field Not in Display DTO
|
|
39
|
+
|
|
40
|
+
**What**: The ingestion model has a field that doesn't map to any display DTO field. The normalizer silently drops it.
|
|
41
|
+
|
|
42
|
+
**Risk**: Data is fetched and validated but never reaches the API consumer. If intentional, it should be documented.
|
|
43
|
+
|
|
44
|
+
**Detection — flat (top-level only)**:
|
|
45
|
+
```python
|
|
46
|
+
ingestion_fields = set(IngestionModel.model_fields.keys())
|
|
47
|
+
dto_fields = set(DisplayDTO.model_fields.keys())
|
|
48
|
+
dropped = ingestion_fields - dto_fields # Approximate — normalizer may rename
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Detection — recursive (recommended)**:
|
|
52
|
+
```python
|
|
53
|
+
from contract_test_helpers import _collect_dropped_keys
|
|
54
|
+
|
|
55
|
+
dropped = _collect_dropped_keys(payload, DisplayDTO)
|
|
56
|
+
# Returns dot-path list at every nesting level
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Fix**: Either add the field to the display DTO, or add the key to `KNOWN_EXCLUDED_KEYS` (see D12) with a ticket reference explaining why it's excluded.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
### D3 — Display DTO Uses `extra="ignore"`
|
|
64
|
+
|
|
65
|
+
**What**: The display DTO silently drops unknown fields during validation.
|
|
66
|
+
|
|
67
|
+
**Risk**: When the source adds new keys, they pass through ingestion but vanish at the DTO layer. This causes data loss bugs that are nearly impossible to debug because no error is raised.
|
|
68
|
+
|
|
69
|
+
**Detection**:
|
|
70
|
+
```python
|
|
71
|
+
config = DisplayDTO.model_config
|
|
72
|
+
assert config.get("extra") != "ignore", "Display DTO must not use extra='ignore'"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Fix**: Change to `extra="forbid"` (strict) or `extra="allow"` (migration period).
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### D4 — DTO Alias Mismatch with TypeScript
|
|
80
|
+
|
|
81
|
+
**What**: A DTO field alias (the camelCase name sent over the API) doesn't match the corresponding TypeScript interface property name.
|
|
82
|
+
|
|
83
|
+
**Risk**: Frontend receives the data but accesses it with the wrong key → `undefined` values, silent display bugs.
|
|
84
|
+
|
|
85
|
+
**Detection**:
|
|
86
|
+
```python
|
|
87
|
+
# Extract DTO aliases
|
|
88
|
+
dto_aliases = {
|
|
89
|
+
info.alias or name for name, info in DisplayDTO.model_fields.items()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Extract TypeScript property names (parse the .ts file)
|
|
93
|
+
ts_props = extract_ts_interface_properties("frontend/src/types/source.ts")
|
|
94
|
+
|
|
95
|
+
# Compare
|
|
96
|
+
missing_in_ts = dto_aliases - ts_props
|
|
97
|
+
extra_in_ts = ts_props - dto_aliases
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Fix**: Update the TypeScript interface to match DTO aliases exactly.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### D5 — DTO Type Mismatch with TypeScript
|
|
105
|
+
|
|
106
|
+
**What**: A DTO field type doesn't correspond to the TypeScript type.
|
|
107
|
+
|
|
108
|
+
**Risk**: Runtime type errors, NaN from treating strings as numbers, etc.
|
|
109
|
+
|
|
110
|
+
**Detection**: Compare using the type mapping table:
|
|
111
|
+
|
|
112
|
+
| Python | TypeScript |
|
|
113
|
+
|--------|-----------|
|
|
114
|
+
| `str` | `string` |
|
|
115
|
+
| `int`, `float` | `number` |
|
|
116
|
+
| `bool` | `boolean` |
|
|
117
|
+
| `list[T]` | `T[]` |
|
|
118
|
+
| `dict[str, T]` | `Record<string, T>` |
|
|
119
|
+
| `Optional[T]` | `T \| null` |
|
|
120
|
+
|
|
121
|
+
**Fix**: Update the TypeScript type to match.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### D6 — API Router Missing `response_model`
|
|
126
|
+
|
|
127
|
+
**What**: FastAPI endpoint doesn't specify `response_model=DtoName`.
|
|
128
|
+
|
|
129
|
+
**Risk**: FastAPI won't validate the response shape. If the service returns a dict with wrong keys, the API sends it as-is.
|
|
130
|
+
|
|
131
|
+
**Detection**:
|
|
132
|
+
```python
|
|
133
|
+
# Check router decorators
|
|
134
|
+
# @router.get("/", response_model=DtoName) ← must be present
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Fix**: Add `response_model=DtoName` to the endpoint decorator.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### D7 — Mapping Doc Stale
|
|
142
|
+
|
|
143
|
+
**What**: A data mapping document (e.g., `ui-json-data-mapping.md`) claims a UI element reads from `data.foo.bar`, but the code actually reads from `data.baz.qux`.
|
|
144
|
+
|
|
145
|
+
**Risk**: Document misleads developers, causes incorrect debugging assumptions.
|
|
146
|
+
|
|
147
|
+
**Detection**: Compare doc field paths against actual code references. This is a manual review item — scripts can't reliably parse prose mapping docs.
|
|
148
|
+
|
|
149
|
+
**Fix**: Regenerate the mapping doc from the contract tests and DTO definitions.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
### D8 — Golden Sample Missing or Stale
|
|
154
|
+
|
|
155
|
+
**What**: No `tests/fixtures/payloads/source/sample.json` exists, or it's from an old schema version.
|
|
156
|
+
|
|
157
|
+
**Risk**: Contract tests run against outdated data, pass despite real drift.
|
|
158
|
+
|
|
159
|
+
**Detection**:
|
|
160
|
+
```python
|
|
161
|
+
sample_path = Path("tests/fixtures/payloads/source/sample.json")
|
|
162
|
+
assert sample_path.exists(), "Golden sample missing"
|
|
163
|
+
|
|
164
|
+
# Optionally check freshness
|
|
165
|
+
payload = json.loads(sample_path.read_text())
|
|
166
|
+
# Compare key count against actual source
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Fix**: Copy a real payload from the source, sanitize PII, save as golden sample.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### D9 — Frontend Service Return Type Wrong
|
|
174
|
+
|
|
175
|
+
**What**: The frontend service function's return type doesn't match the TypeScript interface.
|
|
176
|
+
|
|
177
|
+
**Risk**: TypeScript compiler may not catch it if the return type is `any` or a superset.
|
|
178
|
+
|
|
179
|
+
**Detection**:
|
|
180
|
+
```typescript
|
|
181
|
+
// Check that the service function's return type matches the interface
|
|
182
|
+
export async function getData(): Promise<CorrectType> { ... }
|
|
183
|
+
// ^^^^^^^^^^^^ must match
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Fix**: Update the return type annotation.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
### D10 — Normalizer Produces Wrong Shape
|
|
191
|
+
|
|
192
|
+
**What**: The normalizer function's output doesn't match the display DTO fields.
|
|
193
|
+
|
|
194
|
+
**Risk**: Runtime `ValidationError` when the DTO tries to validate the normalizer output.
|
|
195
|
+
|
|
196
|
+
**Detection**: Unit test — pass a valid ingestion model through the normalizer and validate the result against the DTO.
|
|
197
|
+
|
|
198
|
+
**Fix**: Update the normalizer to produce all required DTO fields.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
### D11 — Drift Test Mode Mismatch
|
|
203
|
+
|
|
204
|
+
**What**: The drift test uses hard assertions (`assert dropped == []`) while the upstream schema is still evolving, OR uses soft warnings (`warnings.warn`) after the schema has been frozen.
|
|
205
|
+
|
|
206
|
+
**Risk**:
|
|
207
|
+
- Hard asserts during evolution: CI breaks on every upstream change → drift tests get skipped or deleted.
|
|
208
|
+
- Soft warnings after freeze: Regressions slip through because CI never fails.
|
|
209
|
+
|
|
210
|
+
**Detection**:
|
|
211
|
+
```python
|
|
212
|
+
# Check freeze resolution precedence in the contract test file:
|
|
213
|
+
# 1) CONTRACT_SCHEMA_FROZEN env var
|
|
214
|
+
# 2) _contract_state.json marker
|
|
215
|
+
# 3) CI fallback (CI=true + sample exists)
|
|
216
|
+
import os
|
|
217
|
+
schema_frozen = resolve_schema_frozen()
|
|
218
|
+
|
|
219
|
+
# If the upstream schema is frozen, SCHEMA_FROZEN should be True
|
|
220
|
+
# If the upstream schema is still evolving, SCHEMA_FROZEN should be False
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Modes**:
|
|
224
|
+
|
|
225
|
+
| Schema state | `SCHEMA_FROZEN` | Drift detection behaviour |
|
|
226
|
+
|---|---|---|
|
|
227
|
+
| Evolving daily | `False` | `warnings.warn()` — CI passes, drift is visible in test output |
|
|
228
|
+
| Stabilised / frozen | `True` | `assert` — CI blocks, any untyped key is a failure |
|
|
229
|
+
|
|
230
|
+
**Fix**: Prefer explicit CI override (`CONTRACT_SCHEMA_FROZEN=1`) once the upstream schema is stable. If explicit env is missing, maintain `_contract_state.json` (`{"schema_frozen": true}`) to avoid ambiguous mode selection.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
### D12 — Missing Exclusion Allow-List Entry
|
|
235
|
+
|
|
236
|
+
**What**: A JSON key is intentionally NOT typed in the DTO (deprecated, experimental, frontend-only metadata) but has no entry in `KNOWN_EXCLUDED_KEYS`, so it triggers noisy drift warnings.
|
|
237
|
+
|
|
238
|
+
**Risk**: Drift reports become cluttered with known intentional gaps. Teams learn to ignore warnings, defeating the purpose of drift detection.
|
|
239
|
+
|
|
240
|
+
**Detection**:
|
|
241
|
+
```python
|
|
242
|
+
from fnmatch import fnmatch
|
|
243
|
+
|
|
244
|
+
# KNOWN_EXCLUDED_KEYS uses dot-path globs (fnmatch syntax)
|
|
245
|
+
KNOWN_EXCLUDED_KEYS: dict[str, set[str]] = {
|
|
246
|
+
"root.section.*": {"experimental_field"}, # TICKET-123
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# A key is excluded if its full dot-path matches a pattern AND
|
|
250
|
+
# the leaf key name is in the exclusion set for that pattern.
|
|
251
|
+
is_excluded = any(
|
|
252
|
+
fnmatch(full_path, pattern) and key in excl
|
|
253
|
+
for pattern, excl in KNOWN_EXCLUDED_KEYS.items()
|
|
254
|
+
)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Rules**:
|
|
258
|
+
- Every entry MUST have a ticket reference or justification comment
|
|
259
|
+
- Review the list periodically — remove entries once the key is typed or removed upstream
|
|
260
|
+
- Use dot-path + fnmatch globs: `"surveys.*"` matches `surveys.broadband`, `surveys.mobile`, etc.
|
|
261
|
+
- If a key appears in many paths, use a broad glob; if it's specific, use the exact path
|
|
262
|
+
|
|
263
|
+
**Fix**: Add the intentionally excluded key to `KNOWN_EXCLUDED_KEYS` in the contract test file with a justification.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Drift Check Execution Order
|
|
268
|
+
|
|
269
|
+
Run checks in this order for the most useful output:
|
|
270
|
+
|
|
271
|
+
1. **D8** — Golden sample exists?
|
|
272
|
+
2. **D1** — Payload keys covered by ingestion model? (recursive)
|
|
273
|
+
3. **D3** — DTO `extra` config safe?
|
|
274
|
+
4. **D2** — Ingestion fields mapped to DTO? (recursive)
|
|
275
|
+
5. **D10** — Normalizer produces valid DTO?
|
|
276
|
+
6. **D11** — Schema frozen flag matches upstream state?
|
|
277
|
+
7. **D12** — Exclusion allow-list entries all have justifications?
|
|
278
|
+
8. **D4** — DTO aliases match TypeScript?
|
|
279
|
+
9. **D5** — DTO types match TypeScript?
|
|
280
|
+
10. **D6** — Router has `response_model`?
|
|
281
|
+
11. **D9** — Frontend service return type correct?
|
|
282
|
+
12. **D7** — Mapping doc current?
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Drift Report Format
|
|
287
|
+
|
|
288
|
+
When reporting drift, use this format:
|
|
289
|
+
|
|
290
|
+
```markdown
|
|
291
|
+
## Drift Report — {{source_name}}
|
|
292
|
+
|
|
293
|
+
| Check | Status | Details |
|
|
294
|
+
|-------|--------|---------|
|
|
295
|
+
| D1 — Payload Coverage | ✅ PASS | 42/42 keys covered |
|
|
296
|
+
| D2 — DTO Coverage | ❌ FAIL | `byPlay` in ingestion, not in DTO |
|
|
297
|
+
| D3 — DTO Extra Config | ✅ PASS | `extra="forbid"` |
|
|
298
|
+
| D4 — TS Alias Match | ❌ FAIL | DTO alias `npsDeltas`, TS has `nps_deltas` |
|
|
299
|
+
| ... | ... | ... |
|
|
300
|
+
|
|
301
|
+
### Fixes Required
|
|
302
|
+
|
|
303
|
+
1. **D2 — `byPlay` not in DTO**: Add `by_play: dict = Field(alias="byPlay")` to `NpsMonthlyResponse`
|
|
304
|
+
2. **D4 — `npsDeltas` alias**: Rename TS property from `nps_deltas` to `npsDeltas`
|
|
305
|
+
```
|