@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,367 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-client-patterns
|
|
3
|
+
description: Typed API client patterns for consuming REST APIs and tRPC. Use for typed fetch wrappers, zod response validation, API client factory, auth injection, TanStack Query (useQuery, useMutation, infinite queries, optimistic updates), tRPC end-to-end types, error handling with discriminated unions, OpenAPI client codegen, or pagination envelopes. Complements backend-development (server side) with client-side consumption patterns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# API Client Patterns Skill
|
|
7
|
+
|
|
8
|
+
Typed, maintainable API clients — from simple fetch wrappers to full TanStack Query integration and tRPC.
|
|
9
|
+
|
|
10
|
+
## 1. Typed Fetch Wrapper with Zod Validation
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
// lib/api/fetcher.ts
|
|
14
|
+
import { z } from 'zod'
|
|
15
|
+
|
|
16
|
+
export type ApiError = { type: 'network'; message: string }
|
|
17
|
+
| { type: 'validation'; issues: z.ZodIssue[] }
|
|
18
|
+
| { type: 'http'; status: number; body: unknown }
|
|
19
|
+
|
|
20
|
+
export type ApiResult<T> = { ok: true; data: T } | { ok: false; error: ApiError }
|
|
21
|
+
|
|
22
|
+
async function fetchJson<T>(
|
|
23
|
+
url: string,
|
|
24
|
+
schema: z.ZodSchema<T>,
|
|
25
|
+
init?: RequestInit,
|
|
26
|
+
): Promise<ApiResult<T>> {
|
|
27
|
+
let response: Response
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
response = await fetch(url, { ...init, headers: { 'Content-Type': 'application/json', ...init?.headers } })
|
|
31
|
+
} catch (e) {
|
|
32
|
+
return { ok: false, error: { type: 'network', message: String(e) } }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
return { ok: false, error: { type: 'http', status: response.status, body: await response.json().catch(() => null) } }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const raw = await response.json()
|
|
40
|
+
const parsed = schema.safeParse(raw)
|
|
41
|
+
|
|
42
|
+
if (!parsed.success) {
|
|
43
|
+
return { ok: false, error: { type: 'validation', issues: parsed.error.issues } }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return { ok: true, data: parsed.data }
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 2. API Client Factory Pattern
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
// lib/api/client.ts
|
|
54
|
+
import { z } from 'zod'
|
|
55
|
+
|
|
56
|
+
function createApiClient(baseUrl: string, getAuth: () => string | null) {
|
|
57
|
+
async function request<T>(
|
|
58
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',
|
|
59
|
+
path: string,
|
|
60
|
+
schema: z.ZodSchema<T>,
|
|
61
|
+
body?: unknown,
|
|
62
|
+
) {
|
|
63
|
+
const token = getAuth()
|
|
64
|
+
return fetchJson(`${baseUrl}${path}`, schema, {
|
|
65
|
+
method,
|
|
66
|
+
headers: { ...(token ? { Authorization: `Bearer ${token}` } : {}) },
|
|
67
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
get: <T>(path: string, schema: z.ZodSchema<T>) => request('GET', path, schema),
|
|
73
|
+
post: <T>(path: string, schema: z.ZodSchema<T>, body: unknown) => request('POST', path, schema, body),
|
|
74
|
+
put: <T>(path: string, schema: z.ZodSchema<T>, body: unknown) => request('PUT', path, schema, body),
|
|
75
|
+
patch: <T>(path: string, schema: z.ZodSchema<T>, body: unknown) => request('PATCH', path, schema, body),
|
|
76
|
+
delete: <T>(path: string, schema: z.ZodSchema<T>) => request('DELETE', path, schema),
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Usage
|
|
81
|
+
import { getAccessToken } from '@/lib/auth'
|
|
82
|
+
export const api = createApiClient(process.env.NEXT_PUBLIC_API_URL!, getAccessToken)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 3. Response Contracts — Pagination and Error Envelopes
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
// lib/api/schemas.ts — reusable response shapes
|
|
89
|
+
import { z } from 'zod'
|
|
90
|
+
|
|
91
|
+
export const paginatedSchema = <T extends z.ZodTypeAny>(itemSchema: T) =>
|
|
92
|
+
z.object({
|
|
93
|
+
data: z.array(itemSchema),
|
|
94
|
+
total: z.number(),
|
|
95
|
+
page: z.number(),
|
|
96
|
+
per_page: z.number(),
|
|
97
|
+
has_next: z.boolean(),
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
export const apiErrorSchema = z.object({
|
|
101
|
+
code: z.string(),
|
|
102
|
+
message: z.string(),
|
|
103
|
+
details: z.record(z.string()).optional(),
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
// Domain schemas
|
|
107
|
+
export const userSchema = z.object({
|
|
108
|
+
id: z.string().uuid(),
|
|
109
|
+
name: z.string(),
|
|
110
|
+
email: z.string().email(),
|
|
111
|
+
role: z.enum(['admin', 'user', 'viewer']),
|
|
112
|
+
createdAt: z.coerce.date(),
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
export type User = z.infer<typeof userSchema>
|
|
116
|
+
export const paginatedUsersSchema = paginatedSchema(userSchema)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 4. TanStack Query Integration
|
|
120
|
+
|
|
121
|
+
### Setup (`QueryClientProvider`)
|
|
122
|
+
```tsx
|
|
123
|
+
// app/providers.tsx
|
|
124
|
+
'use client'
|
|
125
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
126
|
+
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
|
|
127
|
+
import { useState } from 'react'
|
|
128
|
+
|
|
129
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
130
|
+
const [queryClient] = useState(() => new QueryClient({
|
|
131
|
+
defaultOptions: {
|
|
132
|
+
queries: { staleTime: 60_000, retry: 1 },
|
|
133
|
+
},
|
|
134
|
+
}))
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
<QueryClientProvider client={queryClient}>
|
|
138
|
+
{children}
|
|
139
|
+
<ReactQueryDevtools initialIsOpen={false} />
|
|
140
|
+
</QueryClientProvider>
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### `useQuery` — Fetching
|
|
146
|
+
```tsx
|
|
147
|
+
import { useQuery } from '@tanstack/react-query'
|
|
148
|
+
import { api } from '@/lib/api/client'
|
|
149
|
+
import { paginatedUsersSchema } from '@/lib/api/schemas'
|
|
150
|
+
|
|
151
|
+
// Query key factory — centralized, type-safe
|
|
152
|
+
export const userKeys = {
|
|
153
|
+
all: ['users'] as const,
|
|
154
|
+
lists: () => [...userKeys.all, 'list'] as const,
|
|
155
|
+
list: (filters: UserFilters) => [...userKeys.lists(), filters] as const,
|
|
156
|
+
detail: (id: string) => [...userKeys.all, 'detail', id] as const,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function useUsers(filters: UserFilters) {
|
|
160
|
+
return useQuery({
|
|
161
|
+
queryKey: userKeys.list(filters),
|
|
162
|
+
queryFn: async () => {
|
|
163
|
+
const params = new URLSearchParams(filters as Record<string, string>)
|
|
164
|
+
const result = await api.get(`/users?${params}`, paginatedUsersSchema)
|
|
165
|
+
if (!result.ok) throw new Error(result.error.message ?? 'Failed to fetch users')
|
|
166
|
+
return result.data
|
|
167
|
+
},
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### `useMutation` — Creating/Updating
|
|
173
|
+
```tsx
|
|
174
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query'
|
|
175
|
+
import { toast } from 'sonner'
|
|
176
|
+
|
|
177
|
+
export function useCreateUser() {
|
|
178
|
+
const queryClient = useQueryClient()
|
|
179
|
+
|
|
180
|
+
return useMutation({
|
|
181
|
+
mutationFn: async (body: CreateUserInput) => {
|
|
182
|
+
const result = await api.post('/users', userSchema, body)
|
|
183
|
+
if (!result.ok) throw new Error('Failed to create user')
|
|
184
|
+
return result.data
|
|
185
|
+
},
|
|
186
|
+
onSuccess: () => {
|
|
187
|
+
// Invalidate all user list queries
|
|
188
|
+
queryClient.invalidateQueries({ queryKey: userKeys.lists() })
|
|
189
|
+
toast.success('User created successfully')
|
|
190
|
+
},
|
|
191
|
+
onError: (error) => {
|
|
192
|
+
toast.error(error.message)
|
|
193
|
+
},
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Optimistic Updates
|
|
199
|
+
```tsx
|
|
200
|
+
export function useUpdateUser(id: string) {
|
|
201
|
+
const queryClient = useQueryClient()
|
|
202
|
+
|
|
203
|
+
return useMutation({
|
|
204
|
+
mutationFn: (patch: Partial<User>) => api.patch(`/users/${id}`, userSchema, patch),
|
|
205
|
+
|
|
206
|
+
onMutate: async (patch) => {
|
|
207
|
+
await queryClient.cancelQueries({ queryKey: userKeys.detail(id) })
|
|
208
|
+
const previous = queryClient.getQueryData(userKeys.detail(id))
|
|
209
|
+
queryClient.setQueryData(userKeys.detail(id), (old: User) => ({ ...old, ...patch }))
|
|
210
|
+
return { previous } // Return context for rollback
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
onError: (_err, _vars, context) => {
|
|
214
|
+
// Rollback to previous value
|
|
215
|
+
queryClient.setQueryData(userKeys.detail(id), context?.previous)
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
onSettled: () => {
|
|
219
|
+
queryClient.invalidateQueries({ queryKey: userKeys.detail(id) })
|
|
220
|
+
},
|
|
221
|
+
})
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Infinite Queries — Pagination
|
|
226
|
+
```tsx
|
|
227
|
+
import { useInfiniteQuery } from '@tanstack/react-query'
|
|
228
|
+
|
|
229
|
+
export function useInfiniteUsers() {
|
|
230
|
+
return useInfiniteQuery({
|
|
231
|
+
queryKey: userKeys.lists(),
|
|
232
|
+
queryFn: ({ pageParam = 1 }) =>
|
|
233
|
+
api.get(`/users?page=${pageParam}&per_page=20`, paginatedUsersSchema)
|
|
234
|
+
.then(r => { if (!r.ok) throw new Error('Fetch failed'); return r.data }),
|
|
235
|
+
initialPageParam: 1,
|
|
236
|
+
getNextPageParam: (lastPage) =>
|
|
237
|
+
lastPage.has_next ? lastPage.page + 1 : undefined,
|
|
238
|
+
})
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Usage
|
|
242
|
+
const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useInfiniteUsers()
|
|
243
|
+
const users = data?.pages.flatMap(p => p.data) ?? []
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 5. tRPC — End-to-End Type Safety
|
|
247
|
+
|
|
248
|
+
```ts
|
|
249
|
+
// server/router.ts (Next.js App Router example)
|
|
250
|
+
import { initTRPC } from '@trpc/server'
|
|
251
|
+
import { z } from 'zod'
|
|
252
|
+
|
|
253
|
+
const t = initTRPC.create()
|
|
254
|
+
const router = t.router
|
|
255
|
+
const publicProcedure = t.procedure
|
|
256
|
+
|
|
257
|
+
export const appRouter = router({
|
|
258
|
+
users: router({
|
|
259
|
+
list: publicProcedure
|
|
260
|
+
.input(z.object({ page: z.number().default(1) }))
|
|
261
|
+
.query(({ input }) => getUsersPaginated(input.page)),
|
|
262
|
+
|
|
263
|
+
create: publicProcedure
|
|
264
|
+
.input(z.object({ name: z.string(), email: z.string().email() }))
|
|
265
|
+
.mutation(({ input }) => createUser(input)),
|
|
266
|
+
}),
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
export type AppRouter = typeof appRouter
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```tsx
|
|
273
|
+
// Client usage — fully typed, no schemas needed client-side
|
|
274
|
+
const { data } = api.users.list.useQuery({ page: 1 })
|
|
275
|
+
const createUser = api.users.create.useMutation({
|
|
276
|
+
onSuccess: () => utils.users.list.invalidate(),
|
|
277
|
+
})
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## 6. Error Handling — Discriminated Unions
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
// Typed error display in components
|
|
284
|
+
function UserListView() {
|
|
285
|
+
const { data, error, status } = useUsers({})
|
|
286
|
+
|
|
287
|
+
if (status === 'pending') return <Skeleton />
|
|
288
|
+
|
|
289
|
+
if (status === 'error') {
|
|
290
|
+
// error is typed as Error from React Query
|
|
291
|
+
return <ErrorAlert message={error.message} />
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return <UserTable data={data.data} />
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```ts
|
|
299
|
+
// Custom error classes for better discrimination
|
|
300
|
+
export class ApiValidationError extends Error {
|
|
301
|
+
constructor(public issues: z.ZodIssue[]) {
|
|
302
|
+
super('Validation failed')
|
|
303
|
+
this.name = 'ApiValidationError'
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export class ApiHttpError extends Error {
|
|
308
|
+
constructor(public status: number, public body: unknown) {
|
|
309
|
+
super(`HTTP ${status}`)
|
|
310
|
+
this.name = 'ApiHttpError'
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## 7. OpenAPI Client Codegen
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
# Install openapi-typescript-codegen
|
|
319
|
+
pnpm add -D openapi-typescript-codegen
|
|
320
|
+
|
|
321
|
+
# Generate client from OpenAPI spec
|
|
322
|
+
npx openapi-typescript-codegen \
|
|
323
|
+
--input https://api.example.com/openapi.json \
|
|
324
|
+
--output src/lib/api/generated \
|
|
325
|
+
--client axios # or fetch
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Or use `@hey-api/openapi-ts` for modern output:
|
|
329
|
+
```bash
|
|
330
|
+
pnpm add -D @hey-api/openapi-ts
|
|
331
|
+
npx @hey-api/openapi-ts -i openapi.json -o src/lib/api/generated -c fetch
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**When to use codegen**: When an OpenAPI spec exists and is maintained. When building typed wrappers over a third-party API. Wrap generated clients in your factory pattern — don't expose them directly.
|
|
335
|
+
|
|
336
|
+
## 8. Retry Logic
|
|
337
|
+
|
|
338
|
+
```ts
|
|
339
|
+
async function fetchWithRetry<T>(
|
|
340
|
+
fn: () => Promise<ApiResult<T>>,
|
|
341
|
+
maxRetries = 3,
|
|
342
|
+
backoffMs = 300,
|
|
343
|
+
): Promise<ApiResult<T>> {
|
|
344
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
345
|
+
const result = await fn()
|
|
346
|
+
if (result.ok) return result
|
|
347
|
+
if (result.error.type === 'http' && result.error.status < 500) return result // Don't retry 4xx
|
|
348
|
+
if (attempt < maxRetries - 1) await new Promise(r => setTimeout(r, backoffMs * 2 ** attempt))
|
|
349
|
+
}
|
|
350
|
+
return fn()
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
TanStack Query handles retries with `retry` option — use that for query/mutation retries instead of manual loops.
|
|
355
|
+
|
|
356
|
+
## 9. Checklist
|
|
357
|
+
|
|
358
|
+
- [ ] All API responses validated with Zod schemas
|
|
359
|
+
- [ ] Typed `ApiResult<T>` discriminated union for every fetch
|
|
360
|
+
- [ ] API client factory with auth injection, not per-call token access
|
|
361
|
+
- [ ] Query keys use factory pattern (`userKeys.list(filters)`)
|
|
362
|
+
- [ ] `useMutation` invalidates related queries `onSuccess`
|
|
363
|
+
- [ ] Optimistic updates roll back on error via `onError` context
|
|
364
|
+
- [ ] Infinite queries use `getNextPageParam` from server response
|
|
365
|
+
- [ ] tRPC used when full-stack TypeScript with no codegen needed
|
|
366
|
+
- [ ] Retry limited to 5xx errors, not 4xx
|
|
367
|
+
- [ ] Error states displayed to user — not silently swallowed
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-design
|
|
3
|
+
context: fork
|
|
4
|
+
description: Design application architecture and system diagrams with layered patterns, Mermaid C4 diagrams, SQL Server data platform, and on-premise deployment considerations.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Architecture Design
|
|
8
|
+
|
|
9
|
+
> **Project Context** — Read `project-config.md` in the repo root for brand tokens, shared-library paths, and deployment targets.
|
|
10
|
+
|
|
11
|
+
## When to Use
|
|
12
|
+
|
|
13
|
+
Invoke this skill when:
|
|
14
|
+
- Designing a new application or feature
|
|
15
|
+
- Creating architecture documentation for stakeholders
|
|
16
|
+
- Planning system integrations (Streamlit + FastAPI + SQL Server)
|
|
17
|
+
- Evaluating architectural trade-offs
|
|
18
|
+
- Creating C4 diagrams for project systems
|
|
19
|
+
- Reviewing NFRs (scalability, performance, security)
|
|
20
|
+
- Planning on-premise or air-gapped deployments
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Steps
|
|
25
|
+
|
|
26
|
+
### Step 1: Clarify Scope
|
|
27
|
+
|
|
28
|
+
Before designing, answer:
|
|
29
|
+
1. What system or feature is being designed?
|
|
30
|
+
2. Who are the users? (internal dashboards, external APIs, batch jobs)
|
|
31
|
+
3. What are the data sources? (SQL Server tables, APIs, files)
|
|
32
|
+
4. What are the deployment constraints? (on-premise, air-gapped, VPN)
|
|
33
|
+
5. What NFRs matter most? (latency, throughput, availability)
|
|
34
|
+
|
|
35
|
+
### Step 2: Define Layered Architecture
|
|
36
|
+
|
|
37
|
+
Applications follow a consistent layered pattern:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Pages → Components → Services → Repository → Adapter → Database
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```mermaid
|
|
44
|
+
graph TB
|
|
45
|
+
subgraph "Presentation Layer"
|
|
46
|
+
UI[Streamlit Pages]
|
|
47
|
+
Components[UI Components]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
subgraph "Business Logic"
|
|
51
|
+
Services[Service Layer]
|
|
52
|
+
Models[Pydantic Models]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
subgraph "Data Access"
|
|
56
|
+
Repo[Repository]
|
|
57
|
+
Adapter[Database Adapter]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
subgraph "Infrastructure"
|
|
61
|
+
DB[(SQL Server)]
|
|
62
|
+
LLM[Ollama LLM]
|
|
63
|
+
Cache[Cache Layer]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
UI --> Components
|
|
67
|
+
Components --> Services
|
|
68
|
+
Services --> Models
|
|
69
|
+
Services --> Repo
|
|
70
|
+
Repo --> Adapter
|
|
71
|
+
Adapter --> DB
|
|
72
|
+
Services --> LLM
|
|
73
|
+
Services --> Cache
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### Component Responsibilities
|
|
77
|
+
|
|
78
|
+
| Component | Responsibility | Key Patterns |
|
|
79
|
+
|-----------|---------------|--------------|
|
|
80
|
+
| Pages | User interface, routing | `apply_page_config`, `render_header` |
|
|
81
|
+
| Components | Reusable UI elements | Streamlit widgets, Plotly charts |
|
|
82
|
+
| Services | Business logic, orchestration | Caching, validation, transformations |
|
|
83
|
+
| Repository | Data access facade | Query abstraction, `queries.yaml` |
|
|
84
|
+
| Adapter | Database communication | Parameterized queries, connection pooling |
|
|
85
|
+
|
|
86
|
+
### Step 3: Design File Structure
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
src/
|
|
90
|
+
├── pages/
|
|
91
|
+
│ └── {page}.py # Streamlit page
|
|
92
|
+
├── components/
|
|
93
|
+
│ ├── shared_header.py # Fixed header navigation
|
|
94
|
+
│ ├── kpi_cards.py # KPI card components
|
|
95
|
+
│ └── {component}.py # Feature-specific components
|
|
96
|
+
├── services/
|
|
97
|
+
│ ├── cached_repository.py # Multi-user cached data
|
|
98
|
+
│ └── {service}.py # Business logic
|
|
99
|
+
├── models/
|
|
100
|
+
│ └── {model}.py # Pydantic models
|
|
101
|
+
├── ingestion_config/
|
|
102
|
+
│ ├── data_sources.py # DB configuration
|
|
103
|
+
│ └── queries.yaml # Externalized SQL queries
|
|
104
|
+
├── styles/
|
|
105
|
+
│ └── theme.css # Brand theming CSS
|
|
106
|
+
└── utils/
|
|
107
|
+
├── dev_mode.py # Query transparency
|
|
108
|
+
└── paths.py # Path management
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Step 4: Create C4 Diagrams
|
|
112
|
+
|
|
113
|
+
#### System Context Diagram
|
|
114
|
+
|
|
115
|
+
```mermaid
|
|
116
|
+
C4Context
|
|
117
|
+
title System Context - Application
|
|
118
|
+
|
|
119
|
+
Person(user, "User", "Internal staff member")
|
|
120
|
+
System(app, "Application", "Streamlit dashboard + FastAPI backend")
|
|
121
|
+
System_Ext(sqlserver, "SQL Server", "Enterprise database")
|
|
122
|
+
System_Ext(ollama, "Ollama", "Local LLM inference")
|
|
123
|
+
|
|
124
|
+
Rel(user, app, "Uses", "HTTPS")
|
|
125
|
+
Rel(app, sqlserver, "Queries", "pyodbc/ODBC")
|
|
126
|
+
Rel(app, ollama, "Infers", "HTTP/REST")
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
#### Container Diagram
|
|
130
|
+
|
|
131
|
+
```mermaid
|
|
132
|
+
C4Container
|
|
133
|
+
title Container Diagram - Application
|
|
134
|
+
|
|
135
|
+
Container(streamlit, "Streamlit Frontend", "Python/Streamlit", "Dashboard UI with brand theming")
|
|
136
|
+
Container(fastapi, "FastAPI Backend", "Python/FastAPI", "REST API layer")
|
|
137
|
+
ContainerDb(sqlserver, "SQL Server", "MSSQL", "Application tables")
|
|
138
|
+
Container(ollama, "Ollama", "Go", "Local LLM models")
|
|
139
|
+
Container(cache, "Cache Layer", "st.cache / Redis", "Data and resource caching")
|
|
140
|
+
|
|
141
|
+
Rel(streamlit, fastapi, "API calls", "HTTP/JSON")
|
|
142
|
+
Rel(fastapi, sqlserver, "Queries", "pyodbc")
|
|
143
|
+
Rel(fastapi, ollama, "LLM requests", "HTTP")
|
|
144
|
+
Rel(streamlit, cache, "Cached reads")
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Step 5: Define NFRs
|
|
148
|
+
|
|
149
|
+
| Aspect | Approach | Project Specifics |
|
|
150
|
+
|--------|----------|-------------------|
|
|
151
|
+
| **Scalability** | Pagination, lazy loading | Application tables |
|
|
152
|
+
| **Performance** | Caching with TTL, query optimization | 15-min TTL for dashboards |
|
|
153
|
+
| **Security** | Parameterized queries, input validation | Windows Auth, regulatory compliance |
|
|
154
|
+
| **Maintainability** | Clear separation, type hints | Shared UI / data libraries |
|
|
155
|
+
| **Availability** | Error handling, graceful degradation | Air-gapped: no external dependencies |
|
|
156
|
+
| **Observability** | Loguru structured logging | On-premise log aggregation |
|
|
157
|
+
|
|
158
|
+
### Step 6: Document Design Decisions
|
|
159
|
+
|
|
160
|
+
| Decision | Options Considered | Choice | Rationale |
|
|
161
|
+
|----------|-------------------|--------|-----------|
|
|
162
|
+
| Frontend framework | React, Streamlit, Dash | Streamlit | Rapid development, Python-native, team expertise |
|
|
163
|
+
| Database access | ORM, raw SQL, repository | Repository + raw SQL | Performance control, query externalization |
|
|
164
|
+
| Caching | Redis, Memcached, st.cache | st.cache + optional Redis | Simple for Streamlit, Redis for FastAPI |
|
|
165
|
+
| LLM provider | OpenAI, Azure, Ollama | Ollama | Air-gapped requirement, data sovereignty |
|
|
166
|
+
| Deployment | Cloud, hybrid, on-premise | On-premise | Security requirements, existing infrastructure |
|
|
167
|
+
|
|
168
|
+
### Step 7: Identify Risks
|
|
169
|
+
|
|
170
|
+
| Risk | Impact | Likelihood | Mitigation |
|
|
171
|
+
|------|--------|------------|------------|
|
|
172
|
+
| SQL Server performance degradation | High | Medium | Query optimization, caching, pagination |
|
|
173
|
+
| Air-gapped dependency issues | Medium | Low | Vendor packages, local mirrors |
|
|
174
|
+
| Single point of failure (no HA) | High | Low | Graceful degradation, health checks |
|
|
175
|
+
| Data freshness vs cache staleness | Medium | Medium | Configurable TTL, cache invalidation |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Patterns and Examples
|
|
180
|
+
|
|
181
|
+
### Architecture Decision Record (ADR) Template
|
|
182
|
+
|
|
183
|
+
```markdown
|
|
184
|
+
# ADR-001: [Decision Title]
|
|
185
|
+
|
|
186
|
+
## Status: Accepted
|
|
187
|
+
|
|
188
|
+
## Context
|
|
189
|
+
[What is the problem or situation requiring a decision?]
|
|
190
|
+
|
|
191
|
+
## Decision
|
|
192
|
+
[What was decided and why]
|
|
193
|
+
|
|
194
|
+
## Consequences
|
|
195
|
+
### Positive
|
|
196
|
+
- [Benefit 1]
|
|
197
|
+
|
|
198
|
+
### Negative
|
|
199
|
+
- [Trade-off 1]
|
|
200
|
+
|
|
201
|
+
### Neutral
|
|
202
|
+
- [Observation]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Integration Pattern: Streamlit + FastAPI
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
# Streamlit page calling FastAPI backend
|
|
209
|
+
import requests
|
|
210
|
+
|
|
211
|
+
BACKEND_URL = "http://localhost:8000"
|
|
212
|
+
|
|
213
|
+
def fetch_records(status: str = None, page: int = 1):
|
|
214
|
+
params = {"page": page}
|
|
215
|
+
if status:
|
|
216
|
+
params["status"] = status
|
|
217
|
+
response = requests.get(f"{BACKEND_URL}/records", params=params)
|
|
218
|
+
response.raise_for_status()
|
|
219
|
+
return response.json()
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Checklist
|
|
225
|
+
|
|
226
|
+
- [ ] System context diagram created (C4 Level 1)
|
|
227
|
+
- [ ] Container diagram created (C4 Level 2)
|
|
228
|
+
- [ ] Component responsibilities defined
|
|
229
|
+
- [ ] File structure planned
|
|
230
|
+
- [ ] NFRs documented with project-specific values
|
|
231
|
+
- [ ] Design decisions recorded with rationale
|
|
232
|
+
- [ ] Risks identified and mitigations planned
|
|
233
|
+
- [ ] Deployment strategy defined (on-premise/air-gapped)
|
|
234
|
+
- [ ] Integration patterns documented (Streamlit ↔ FastAPI ↔ SQL Server)
|
|
235
|
+
- [ ] Handoff ready: can create implementation plan from this design
|
|
236
|
+
|
|
237
|
+
## Related Resources
|
|
238
|
+
|
|
239
|
+
| Resource | Path |
|
|
240
|
+
|----------|------|
|
|
241
|
+
| Architect agent | `agents/architect.agent.md` |
|
|
242
|
+
| FastAPI dev skill | `skills/coding/fastapi-dev/SKILL.md` |
|
|
243
|
+
| Streamlit dev skill | `skills/frontend/streamlit-dev/SKILL.md` |
|
|
244
|
+
| SQL expert skill | `skills/coding/sql/SKILL.md` |
|