@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,660 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-testing
|
|
3
|
+
context: fork
|
|
4
|
+
description: Create automated UI tests using Playwright for Streamlit and web applications. Use when writing end-to-end tests, automating UI testing, or testing new features.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# UI Testing Skill
|
|
8
|
+
|
|
9
|
+
## Trigger
|
|
10
|
+
- User requests "create UI tests for..."
|
|
11
|
+
- User requests "write end-to-end tests..."
|
|
12
|
+
- User requests "automate testing for..."
|
|
13
|
+
- Testing new Streamlit pages or features
|
|
14
|
+
|
|
15
|
+
## Workflow Steps
|
|
16
|
+
|
|
17
|
+
### Step 1: Analyze Target Application
|
|
18
|
+
```markdown
|
|
19
|
+
Examine the application to understand:
|
|
20
|
+
1. Key user workflows to test
|
|
21
|
+
2. Critical UI components
|
|
22
|
+
3. Form inputs and validations
|
|
23
|
+
4. Navigation flows
|
|
24
|
+
5. Data-dependent features
|
|
25
|
+
|
|
26
|
+
Questions to answer:
|
|
27
|
+
- What are the critical paths users take?
|
|
28
|
+
- What data needs to be mocked?
|
|
29
|
+
- Are there authentication requirements?
|
|
30
|
+
- What assertions validate success?
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Step 2: Plan Test Structure
|
|
34
|
+
```markdown
|
|
35
|
+
Create test plan outline:
|
|
36
|
+
|
|
37
|
+
## Test Suite: [Feature Name]
|
|
38
|
+
|
|
39
|
+
### Happy Path Tests
|
|
40
|
+
- [ ] Test basic functionality works
|
|
41
|
+
- [ ] Test all form inputs accept valid data
|
|
42
|
+
- [ ] Test navigation between pages
|
|
43
|
+
- [ ] Test data displays correctly
|
|
44
|
+
|
|
45
|
+
### Error Handling Tests
|
|
46
|
+
- [ ] Test form validation errors
|
|
47
|
+
- [ ] Test API error handling
|
|
48
|
+
- [ ] Test empty state displays
|
|
49
|
+
- [ ] Test loading state displays
|
|
50
|
+
|
|
51
|
+
### Edge Cases
|
|
52
|
+
- [ ] Test with minimum input
|
|
53
|
+
- [ ] Test with maximum input
|
|
54
|
+
- [ ] Test special characters
|
|
55
|
+
- [ ] Test concurrent actions
|
|
56
|
+
|
|
57
|
+
### Accessibility Tests
|
|
58
|
+
- [ ] Test keyboard navigation
|
|
59
|
+
- [ ] Test focus management
|
|
60
|
+
- [ ] Test screen reader compatibility
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Step 3: Set Up Test Environment
|
|
64
|
+
```python
|
|
65
|
+
# tests/conftest.py
|
|
66
|
+
import pytest
|
|
67
|
+
from playwright.sync_api import Page, expect
|
|
68
|
+
|
|
69
|
+
# Base URL configuration
|
|
70
|
+
BASE_URL = "http://localhost:8501" # Streamlit default
|
|
71
|
+
|
|
72
|
+
@pytest.fixture(scope="session")
|
|
73
|
+
def browser_context_args(browser_context_args):
|
|
74
|
+
"""Configure browser context."""
|
|
75
|
+
return {
|
|
76
|
+
**browser_context_args,
|
|
77
|
+
"viewport": {"width": 1280, "height": 720},
|
|
78
|
+
"base_url": BASE_URL,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@pytest.fixture
|
|
82
|
+
def app_page(page: Page):
|
|
83
|
+
"""Navigate to app and wait for load."""
|
|
84
|
+
page.goto("/")
|
|
85
|
+
# Wait for Streamlit to initialize
|
|
86
|
+
page.wait_for_selector("[data-testid='stAppViewContainer']")
|
|
87
|
+
return page
|
|
88
|
+
|
|
89
|
+
@pytest.fixture
|
|
90
|
+
def mock_api(page: Page):
|
|
91
|
+
"""Mock API responses for isolated testing."""
|
|
92
|
+
def setup_mocks():
|
|
93
|
+
page.route("**/api/data", lambda route: route.fulfill(
|
|
94
|
+
status=200,
|
|
95
|
+
content_type="application/json",
|
|
96
|
+
body='{"items": [], "total": 0}'
|
|
97
|
+
))
|
|
98
|
+
setup_mocks()
|
|
99
|
+
return page
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Step 4: Create Page Objects
|
|
103
|
+
```python
|
|
104
|
+
# tests/pages/dashboard_page.py
|
|
105
|
+
from playwright.sync_api import Page, expect
|
|
106
|
+
|
|
107
|
+
class DashboardPage:
|
|
108
|
+
"""Page object for Dashboard."""
|
|
109
|
+
|
|
110
|
+
URL = "/dashboard"
|
|
111
|
+
|
|
112
|
+
def __init__(self, page: Page):
|
|
113
|
+
self.page = page
|
|
114
|
+
# Define locators
|
|
115
|
+
self.title = page.get_by_role("heading", level=1)
|
|
116
|
+
self.metric_cards = page.get_by_test_id("metric-card")
|
|
117
|
+
self.date_filter = page.get_by_label("Date Range")
|
|
118
|
+
self.refresh_btn = page.get_by_role("button", name="Refresh")
|
|
119
|
+
self.chart = page.locator(".js-plotly-plot")
|
|
120
|
+
self.loading = page.get_by_test_id("loading-spinner")
|
|
121
|
+
|
|
122
|
+
def navigate(self):
|
|
123
|
+
"""Navigate to dashboard."""
|
|
124
|
+
self.page.goto(self.URL)
|
|
125
|
+
self.wait_for_load()
|
|
126
|
+
|
|
127
|
+
def wait_for_load(self):
|
|
128
|
+
"""Wait for dashboard to fully load."""
|
|
129
|
+
expect(self.loading).to_be_hidden()
|
|
130
|
+
expect(self.title).to_be_visible()
|
|
131
|
+
|
|
132
|
+
def select_date_range(self, option: str):
|
|
133
|
+
"""Select date range from filter."""
|
|
134
|
+
self.date_filter.click()
|
|
135
|
+
self.page.get_by_role("option", name=option).click()
|
|
136
|
+
self.wait_for_load()
|
|
137
|
+
|
|
138
|
+
def refresh_data(self):
|
|
139
|
+
"""Click refresh and wait for update."""
|
|
140
|
+
self.refresh_btn.click()
|
|
141
|
+
self.wait_for_load()
|
|
142
|
+
|
|
143
|
+
def get_metric_count(self) -> int:
|
|
144
|
+
"""Get number of metric cards displayed."""
|
|
145
|
+
return self.metric_cards.count()
|
|
146
|
+
|
|
147
|
+
def assert_chart_visible(self):
|
|
148
|
+
"""Verify chart is rendered."""
|
|
149
|
+
expect(self.chart).to_be_visible()
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Step 5: Write Tests
|
|
153
|
+
```python
|
|
154
|
+
# tests/test_dashboard.py
|
|
155
|
+
import pytest
|
|
156
|
+
from playwright.sync_api import Page, expect
|
|
157
|
+
from pages.dashboard_page import DashboardPage
|
|
158
|
+
|
|
159
|
+
class TestDashboard:
|
|
160
|
+
"""Dashboard feature tests."""
|
|
161
|
+
|
|
162
|
+
@pytest.fixture(autouse=True)
|
|
163
|
+
def setup(self, app_page: Page):
|
|
164
|
+
"""Set up test fixtures."""
|
|
165
|
+
self.page = app_page
|
|
166
|
+
self.dashboard = DashboardPage(app_page)
|
|
167
|
+
self.dashboard.navigate()
|
|
168
|
+
|
|
169
|
+
# Happy Path Tests
|
|
170
|
+
def test_dashboard_loads_successfully(self):
|
|
171
|
+
"""Verify dashboard loads with expected elements."""
|
|
172
|
+
expect(self.dashboard.title).to_have_text("Network Dashboard")
|
|
173
|
+
assert self.dashboard.get_metric_count() >= 4
|
|
174
|
+
self.dashboard.assert_chart_visible()
|
|
175
|
+
|
|
176
|
+
def test_date_filter_updates_data(self):
|
|
177
|
+
"""Verify date filter changes displayed data."""
|
|
178
|
+
self.dashboard.select_date_range("Last 7 Days")
|
|
179
|
+
expect(self.page.get_by_text("Last 7 Days")).to_be_visible()
|
|
180
|
+
|
|
181
|
+
def test_refresh_button_reloads_data(self):
|
|
182
|
+
"""Verify refresh button updates the data."""
|
|
183
|
+
self.dashboard.refresh_data()
|
|
184
|
+
# Chart should still be visible after refresh
|
|
185
|
+
self.dashboard.assert_chart_visible()
|
|
186
|
+
|
|
187
|
+
# Accessibility Tests
|
|
188
|
+
def test_keyboard_navigation(self):
|
|
189
|
+
"""Verify all interactive elements are keyboard accessible."""
|
|
190
|
+
# Focus on first interactive element
|
|
191
|
+
self.page.keyboard.press("Tab")
|
|
192
|
+
|
|
193
|
+
# Navigate through elements
|
|
194
|
+
for _ in range(5):
|
|
195
|
+
focused = self.page.evaluate("document.activeElement.tagName")
|
|
196
|
+
assert focused in ["BUTTON", "A", "INPUT", "SELECT"]
|
|
197
|
+
self.page.keyboard.press("Tab")
|
|
198
|
+
|
|
199
|
+
def test_focus_visible_on_buttons(self):
|
|
200
|
+
"""Verify focus indicators are visible on buttons."""
|
|
201
|
+
self.dashboard.refresh_btn.focus()
|
|
202
|
+
# Check that button has focus styling
|
|
203
|
+
assert self.dashboard.refresh_btn.evaluate(
|
|
204
|
+
"el => window.getComputedStyle(el, ':focus').outline !== 'none'"
|
|
205
|
+
)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Step 6: Add Streamlit-Specific Tests
|
|
209
|
+
```python
|
|
210
|
+
# tests/test_streamlit_components.py
|
|
211
|
+
from playwright.sync_api import Page, expect
|
|
212
|
+
|
|
213
|
+
class TestStreamlitForm:
|
|
214
|
+
"""Tests for Streamlit form components."""
|
|
215
|
+
|
|
216
|
+
def test_text_input_accepts_value(self, page: Page):
|
|
217
|
+
"""Test Streamlit text input."""
|
|
218
|
+
page.goto("/form")
|
|
219
|
+
|
|
220
|
+
input_field = page.get_by_label("Your Name")
|
|
221
|
+
input_field.fill("Test User")
|
|
222
|
+
|
|
223
|
+
expect(input_field).to_have_value("Test User")
|
|
224
|
+
|
|
225
|
+
def test_selectbox_selection(self, page: Page):
|
|
226
|
+
"""Test Streamlit selectbox."""
|
|
227
|
+
page.goto("/form")
|
|
228
|
+
|
|
229
|
+
# Click selectbox to open
|
|
230
|
+
page.get_by_label("Choose Option").click()
|
|
231
|
+
|
|
232
|
+
# Select option
|
|
233
|
+
page.get_by_role("option", name="Option B").click()
|
|
234
|
+
|
|
235
|
+
# Verify selection persisted
|
|
236
|
+
expect(page.get_by_text("Selected: Option B")).to_be_visible()
|
|
237
|
+
|
|
238
|
+
def test_form_submission(self, page: Page):
|
|
239
|
+
"""Test complete form submission."""
|
|
240
|
+
page.goto("/form")
|
|
241
|
+
|
|
242
|
+
# Fill form
|
|
243
|
+
page.get_by_label("Name").fill("Test User")
|
|
244
|
+
page.get_by_label("Email").fill("test@example.com")
|
|
245
|
+
|
|
246
|
+
# Submit
|
|
247
|
+
page.get_by_role("button", name="Submit").click()
|
|
248
|
+
|
|
249
|
+
# Verify success message
|
|
250
|
+
expect(page.get_by_text("Form submitted successfully")).to_be_visible()
|
|
251
|
+
|
|
252
|
+
def test_file_upload(self, page: Page):
|
|
253
|
+
"""Test file upload component."""
|
|
254
|
+
page.goto("/upload")
|
|
255
|
+
|
|
256
|
+
# Upload file
|
|
257
|
+
page.get_by_label("Upload CSV").set_input_files("tests/fixtures/test.csv")
|
|
258
|
+
|
|
259
|
+
# Verify file processed
|
|
260
|
+
expect(page.get_by_text("File uploaded: test.csv")).to_be_visible()
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Step 7: Run Tests and Generate Report
|
|
264
|
+
```bash
|
|
265
|
+
# Run all tests
|
|
266
|
+
pytest tests/ -v
|
|
267
|
+
|
|
268
|
+
# Run with HTML report
|
|
269
|
+
pytest tests/ --html=report.html --self-contained-html
|
|
270
|
+
|
|
271
|
+
# Run with coverage
|
|
272
|
+
pytest tests/ --cov=src --cov-report=html
|
|
273
|
+
|
|
274
|
+
# Run specific test file
|
|
275
|
+
pytest tests/test_dashboard.py -v
|
|
276
|
+
|
|
277
|
+
# Run tests matching pattern
|
|
278
|
+
pytest tests/ -k "dashboard" -v
|
|
279
|
+
|
|
280
|
+
# Run with tracing for debugging
|
|
281
|
+
pytest tests/ --tracing=on
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Output Format
|
|
285
|
+
|
|
286
|
+
```markdown
|
|
287
|
+
## UI Test Results
|
|
288
|
+
|
|
289
|
+
### Test Suite: [Feature Name]
|
|
290
|
+
|
|
291
|
+
#### Tests Created
|
|
292
|
+
- `test_feature_loads_successfully` ✓
|
|
293
|
+
- `test_form_validation_errors` ✓
|
|
294
|
+
- `test_keyboard_navigation` ✓
|
|
295
|
+
|
|
296
|
+
#### Coverage
|
|
297
|
+
- Pages tested: 3
|
|
298
|
+
- Components tested: 12
|
|
299
|
+
- User flows covered: 5
|
|
300
|
+
|
|
301
|
+
#### Files Generated
|
|
302
|
+
- `tests/test_[feature].py`
|
|
303
|
+
- `tests/pages/[feature]_page.py`
|
|
304
|
+
- `tests/conftest.py` (if new)
|
|
305
|
+
|
|
306
|
+
#### Run Command
|
|
307
|
+
```bash
|
|
308
|
+
pytest tests/test_[feature].py -v
|
|
309
|
+
```
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Best Practices
|
|
313
|
+
|
|
314
|
+
1. **Use Page Objects**: Abstract page interactions into reusable classes
|
|
315
|
+
2. **Prefer Role-Based Locators**: Use `get_by_role()` for resilience
|
|
316
|
+
3. **Avoid Hard Waits**: Use `expect()` auto-retry assertions
|
|
317
|
+
4. **Test Accessibility**: Include keyboard and screen reader tests
|
|
318
|
+
5. **Mock External APIs**: Isolate tests from external dependencies
|
|
319
|
+
6. **Keep Tests Independent**: No test should depend on another
|
|
320
|
+
7. **Use Descriptive Names**: Test names should explain what they verify
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Regression Test Templates
|
|
325
|
+
|
|
326
|
+
> Appended from qa-regression: reusable Playwright regression test patterns.
|
|
327
|
+
|
|
328
|
+
# QA Regression Testing
|
|
329
|
+
|
|
330
|
+
Build and run automated regression tests using Playwright. Each test is a reusable skill that can be composed into full test suites.
|
|
331
|
+
|
|
332
|
+
## Setup
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
npm init -y
|
|
336
|
+
npm install playwright @playwright/test
|
|
337
|
+
npx playwright install
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## Test Structure
|
|
341
|
+
|
|
342
|
+
Create tests in `tests/` folder:
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
tests/
|
|
346
|
+
├── auth/
|
|
347
|
+
│ ├── login.spec.ts
|
|
348
|
+
│ └── logout.spec.ts
|
|
349
|
+
├── dashboard/
|
|
350
|
+
│ └── load.spec.ts
|
|
351
|
+
├── users/
|
|
352
|
+
│ ├── create.spec.ts
|
|
353
|
+
│ └── delete.spec.ts
|
|
354
|
+
└── regression.spec.ts # Full suite
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## Common Test Skills
|
|
358
|
+
|
|
359
|
+
### Login Test
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
// tests/auth/login.spec.ts
|
|
363
|
+
import { test, expect } from '@playwright/test';
|
|
364
|
+
|
|
365
|
+
test.describe('Login Flow', () => {
|
|
366
|
+
test('should login with valid credentials', async ({ page }) => {
|
|
367
|
+
await page.goto('/login');
|
|
368
|
+
|
|
369
|
+
await page.fill('[data-testid="email"]', process.env.TEST_EMAIL!);
|
|
370
|
+
await page.fill('[data-testid="password"]', process.env.TEST_PASSWORD!);
|
|
371
|
+
await page.click('[data-testid="submit"]');
|
|
372
|
+
|
|
373
|
+
// Verify redirect to dashboard
|
|
374
|
+
await expect(page).toHaveURL(/dashboard/);
|
|
375
|
+
await expect(page.locator('[data-testid="user-menu"]')).toBeVisible();
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
test('should show error for invalid credentials', async ({ page }) => {
|
|
379
|
+
await page.goto('/login');
|
|
380
|
+
|
|
381
|
+
await page.fill('[data-testid="email"]', 'wrong@example.com');
|
|
382
|
+
await page.fill('[data-testid="password"]', 'wrongpassword');
|
|
383
|
+
await page.click('[data-testid="submit"]');
|
|
384
|
+
|
|
385
|
+
await expect(page.locator('[data-testid="error-message"]')).toBeVisible();
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### Dashboard Load Test
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
// tests/dashboard/load.spec.ts
|
|
394
|
+
import { test, expect } from '@playwright/test';
|
|
395
|
+
import { login } from '../helpers/auth';
|
|
396
|
+
|
|
397
|
+
test.describe('Dashboard', () => {
|
|
398
|
+
test.beforeEach(async ({ page }) => {
|
|
399
|
+
await login(page);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test('should load dashboard within 3 seconds', async ({ page }) => {
|
|
403
|
+
const start = Date.now();
|
|
404
|
+
await page.goto('/dashboard');
|
|
405
|
+
await page.waitForSelector('[data-testid="dashboard-content"]');
|
|
406
|
+
const loadTime = Date.now() - start;
|
|
407
|
+
|
|
408
|
+
expect(loadTime).toBeLessThan(3000);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
test('should display all widgets', async ({ page }) => {
|
|
412
|
+
await page.goto('/dashboard');
|
|
413
|
+
|
|
414
|
+
await expect(page.locator('[data-testid="stats-widget"]')).toBeVisible();
|
|
415
|
+
await expect(page.locator('[data-testid="chart-widget"]')).toBeVisible();
|
|
416
|
+
await expect(page.locator('[data-testid="activity-widget"]')).toBeVisible();
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
test('should refresh data on button click', async ({ page }) => {
|
|
420
|
+
await page.goto('/dashboard');
|
|
421
|
+
|
|
422
|
+
const initialValue = await page.locator('[data-testid="last-updated"]').textContent();
|
|
423
|
+
await page.click('[data-testid="refresh-button"]');
|
|
424
|
+
await page.waitForTimeout(1000);
|
|
425
|
+
const newValue = await page.locator('[data-testid="last-updated"]').textContent();
|
|
426
|
+
|
|
427
|
+
expect(newValue).not.toBe(initialValue);
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Create User Test
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
// tests/users/create.spec.ts
|
|
436
|
+
import { test, expect } from '@playwright/test';
|
|
437
|
+
import { login } from '../helpers/auth';
|
|
438
|
+
import { generateTestUser, deleteTestUser } from '../helpers/users';
|
|
439
|
+
|
|
440
|
+
test.describe('User Creation', () => {
|
|
441
|
+
let testUser: { email: string; name: string };
|
|
442
|
+
|
|
443
|
+
test.beforeEach(async ({ page }) => {
|
|
444
|
+
await login(page);
|
|
445
|
+
testUser = generateTestUser();
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
test.afterEach(async () => {
|
|
449
|
+
// Cleanup
|
|
450
|
+
await deleteTestUser(testUser.email);
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
test('should create new user successfully', async ({ page }) => {
|
|
454
|
+
await page.goto('/users/new');
|
|
455
|
+
|
|
456
|
+
await page.fill('[data-testid="user-name"]', testUser.name);
|
|
457
|
+
await page.fill('[data-testid="user-email"]', testUser.email);
|
|
458
|
+
await page.selectOption('[data-testid="user-role"]', 'member');
|
|
459
|
+
await page.click('[data-testid="create-user-btn"]');
|
|
460
|
+
|
|
461
|
+
// Verify success
|
|
462
|
+
await expect(page.locator('[data-testid="success-toast"]')).toBeVisible();
|
|
463
|
+
await expect(page).toHaveURL(/users/);
|
|
464
|
+
|
|
465
|
+
// Verify user appears in list
|
|
466
|
+
await expect(page.locator(`text=${testUser.email}`)).toBeVisible();
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
test('should validate required fields', async ({ page }) => {
|
|
470
|
+
await page.goto('/users/new');
|
|
471
|
+
await page.click('[data-testid="create-user-btn"]');
|
|
472
|
+
|
|
473
|
+
await expect(page.locator('[data-testid="name-error"]')).toBeVisible();
|
|
474
|
+
await expect(page.locator('[data-testid="email-error"]')).toBeVisible();
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
## Shared Helpers
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
// tests/helpers/auth.ts
|
|
483
|
+
import { Page } from '@playwright/test';
|
|
484
|
+
|
|
485
|
+
export async function login(page: Page) {
|
|
486
|
+
await page.goto('/login');
|
|
487
|
+
await page.fill('[data-testid="email"]', process.env.TEST_EMAIL!);
|
|
488
|
+
await page.fill('[data-testid="password"]', process.env.TEST_PASSWORD!);
|
|
489
|
+
await page.click('[data-testid="submit"]');
|
|
490
|
+
await page.waitForURL(/dashboard/);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export async function logout(page: Page) {
|
|
494
|
+
await page.click('[data-testid="user-menu"]');
|
|
495
|
+
await page.click('[data-testid="logout"]');
|
|
496
|
+
await page.waitForURL(/login/);
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
```typescript
|
|
501
|
+
// tests/helpers/users.ts
|
|
502
|
+
export function generateTestUser() {
|
|
503
|
+
const id = Date.now();
|
|
504
|
+
return {
|
|
505
|
+
name: `Test User ${id}`,
|
|
506
|
+
email: `test-${id}@example.com`,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
export async function deleteTestUser(email: string) {
|
|
511
|
+
// API call to cleanup test user
|
|
512
|
+
await fetch(`${process.env.API_URL}/admin/users`, {
|
|
513
|
+
method: 'DELETE',
|
|
514
|
+
headers: {
|
|
515
|
+
'Authorization': `Bearer ${process.env.ADMIN_TOKEN}`,
|
|
516
|
+
'Content-Type': 'application/json',
|
|
517
|
+
},
|
|
518
|
+
body: JSON.stringify({ email }),
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
## Full Regression Suite
|
|
524
|
+
|
|
525
|
+
```typescript
|
|
526
|
+
// tests/regression.spec.ts
|
|
527
|
+
import { test } from '@playwright/test';
|
|
528
|
+
|
|
529
|
+
// Import all test suites
|
|
530
|
+
import './auth/login.spec';
|
|
531
|
+
import './auth/logout.spec';
|
|
532
|
+
import './dashboard/load.spec';
|
|
533
|
+
import './users/create.spec';
|
|
534
|
+
import './users/delete.spec';
|
|
535
|
+
|
|
536
|
+
test.describe('Full Regression Suite', () => {
|
|
537
|
+
// Tests run in order defined above
|
|
538
|
+
});
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## Playwright Config
|
|
542
|
+
|
|
543
|
+
```typescript
|
|
544
|
+
// playwright.config.ts
|
|
545
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
546
|
+
|
|
547
|
+
export default defineConfig({
|
|
548
|
+
testDir: './tests',
|
|
549
|
+
fullyParallel: true,
|
|
550
|
+
forbidOnly: !!process.env.CI,
|
|
551
|
+
retries: process.env.CI ? 2 : 0,
|
|
552
|
+
workers: process.env.CI ? 1 : undefined,
|
|
553
|
+
reporter: [
|
|
554
|
+
['html'],
|
|
555
|
+
['json', { outputFile: 'test-results.json' }],
|
|
556
|
+
],
|
|
557
|
+
use: {
|
|
558
|
+
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
|
559
|
+
trace: 'on-first-retry',
|
|
560
|
+
screenshot: 'only-on-failure',
|
|
561
|
+
},
|
|
562
|
+
projects: [
|
|
563
|
+
{
|
|
564
|
+
name: 'chromium',
|
|
565
|
+
use: { ...devices['Desktop Chrome'] },
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
name: 'firefox',
|
|
569
|
+
use: { ...devices['Desktop Firefox'] },
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
name: 'webkit',
|
|
573
|
+
use: { ...devices['Desktop Safari'] },
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
});
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
## Running Tests
|
|
580
|
+
|
|
581
|
+
```bash
|
|
582
|
+
# Run all tests
|
|
583
|
+
npx playwright test
|
|
584
|
+
|
|
585
|
+
# Run specific test file
|
|
586
|
+
npx playwright test tests/auth/login.spec.ts
|
|
587
|
+
|
|
588
|
+
# Run tests with UI
|
|
589
|
+
npx playwright test --ui
|
|
590
|
+
|
|
591
|
+
# Run in headed mode (see browser)
|
|
592
|
+
npx playwright test --headed
|
|
593
|
+
|
|
594
|
+
# Generate report
|
|
595
|
+
npx playwright show-report
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
## CI Integration
|
|
599
|
+
|
|
600
|
+
```yaml
|
|
601
|
+
# .github/workflows/regression.yml
|
|
602
|
+
name: Regression Tests
|
|
603
|
+
context: fork
|
|
604
|
+
|
|
605
|
+
on:
|
|
606
|
+
push:
|
|
607
|
+
branches: [main]
|
|
608
|
+
pull_request:
|
|
609
|
+
branches: [main]
|
|
610
|
+
schedule:
|
|
611
|
+
- cron: '0 6 * * *' # Daily at 6 AM
|
|
612
|
+
|
|
613
|
+
jobs:
|
|
614
|
+
test:
|
|
615
|
+
runs-on: ubuntu-latest
|
|
616
|
+
steps:
|
|
617
|
+
- uses: actions/checkout@v4
|
|
618
|
+
- uses: actions/setup-node@v4
|
|
619
|
+
with:
|
|
620
|
+
node-version: 20
|
|
621
|
+
|
|
622
|
+
- name: Install dependencies
|
|
623
|
+
run: npm ci
|
|
624
|
+
|
|
625
|
+
- name: Install Playwright
|
|
626
|
+
run: npx playwright install --with-deps
|
|
627
|
+
|
|
628
|
+
- name: Run tests
|
|
629
|
+
run: npx playwright test
|
|
630
|
+
env:
|
|
631
|
+
BASE_URL: ${{ secrets.STAGING_URL }}
|
|
632
|
+
TEST_EMAIL: ${{ secrets.TEST_EMAIL }}
|
|
633
|
+
TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
634
|
+
|
|
635
|
+
- uses: actions/upload-artifact@v4
|
|
636
|
+
if: always()
|
|
637
|
+
with:
|
|
638
|
+
name: playwright-report
|
|
639
|
+
path: playwright-report/
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
## Best Practices
|
|
643
|
+
|
|
644
|
+
1. **Use data-testid attributes** - More stable than CSS selectors
|
|
645
|
+
2. **Clean up test data** - Always delete what you create
|
|
646
|
+
3. **Avoid hardcoded waits** - Use `waitForSelector` instead of `waitForTimeout`
|
|
647
|
+
4. **Run in parallel** - Faster feedback on CI
|
|
648
|
+
5. **Screenshot on failure** - Easier debugging
|
|
649
|
+
6. **Environment variables** - Never commit credentials
|
|
650
|
+
|
|
651
|
+
## Quick Commands
|
|
652
|
+
|
|
653
|
+
| Task | Command |
|
|
654
|
+
|------|---------|
|
|
655
|
+
| Run all | `npx playwright test` |
|
|
656
|
+
| Run one file | `npx playwright test login.spec.ts` |
|
|
657
|
+
| Debug mode | `npx playwright test --debug` |
|
|
658
|
+
| UI mode | `npx playwright test --ui` |
|
|
659
|
+
| Update snapshots | `npx playwright test --update-snapshots` |
|
|
660
|
+
|