claude-autopm 2.8.2 → 2.8.4
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 +399 -637
- package/install/install.js +15 -5
- package/package.json +2 -1
- package/packages/plugin-ai/LICENSE +21 -0
- package/packages/plugin-ai/README.md +316 -0
- package/packages/plugin-ai/agents/anthropic-claude-expert.md +579 -0
- package/packages/plugin-ai/agents/azure-openai-expert.md +1411 -0
- package/packages/plugin-ai/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-ai/agents/google-a2a-expert.md +1445 -0
- package/packages/plugin-ai/agents/huggingface-expert.md +2131 -0
- package/packages/plugin-ai/agents/langchain-expert.md +1427 -0
- package/packages/plugin-ai/agents/langgraph-workflow-expert.md +520 -0
- package/packages/plugin-ai/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-ai/commands/a2a-setup.md +886 -0
- package/packages/plugin-ai/commands/ai-model-deployment.md +481 -0
- package/packages/plugin-ai/commands/anthropic-optimize.md +793 -0
- package/packages/plugin-ai/commands/huggingface-deploy.md +789 -0
- package/packages/plugin-ai/commands/langchain-optimize.md +807 -0
- package/packages/plugin-ai/commands/llm-optimize.md +348 -0
- package/packages/plugin-ai/commands/openai-optimize.md +863 -0
- package/packages/plugin-ai/commands/rag-optimize.md +841 -0
- package/packages/plugin-ai/commands/rag-setup-scaffold.md +382 -0
- package/packages/plugin-ai/package.json +66 -0
- package/packages/plugin-ai/plugin.json +519 -0
- package/packages/plugin-ai/rules/ai-model-standards.md +449 -0
- package/packages/plugin-ai/rules/prompt-engineering-standards.md +509 -0
- package/packages/plugin-ai/scripts/examples/huggingface-inference-example.py +145 -0
- package/packages/plugin-ai/scripts/examples/langchain-rag-example.py +366 -0
- package/packages/plugin-ai/scripts/examples/mlflow-tracking-example.py +224 -0
- package/packages/plugin-ai/scripts/examples/openai-chat-example.py +425 -0
- package/packages/plugin-cloud/README.md +268 -0
- package/packages/plugin-cloud/agents/README.md +55 -0
- package/packages/plugin-cloud/agents/aws-cloud-architect.md +521 -0
- package/packages/plugin-cloud/agents/azure-cloud-architect.md +436 -0
- package/packages/plugin-cloud/agents/gcp-cloud-architect.md +385 -0
- package/packages/plugin-cloud/agents/gcp-cloud-functions-engineer.md +306 -0
- package/packages/plugin-cloud/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-cloud/agents/kubernetes-orchestrator.md +566 -0
- package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-cloud/agents/terraform-infrastructure-expert.md +454 -0
- package/packages/plugin-cloud/commands/cloud-cost-optimize.md +243 -0
- package/packages/plugin-cloud/commands/cloud-validate.md +196 -0
- package/packages/plugin-cloud/commands/infra-deploy.md +38 -0
- package/packages/plugin-cloud/commands/k8s-deploy.md +37 -0
- package/packages/plugin-cloud/commands/ssh-security.md +65 -0
- package/packages/plugin-cloud/commands/traefik-setup.md +65 -0
- package/packages/plugin-cloud/hooks/pre-cloud-deploy.js +456 -0
- package/packages/plugin-cloud/package.json +64 -0
- package/packages/plugin-cloud/plugin.json +338 -0
- package/packages/plugin-cloud/rules/cloud-security-compliance.md +313 -0
- package/packages/plugin-cloud/rules/infrastructure-pipeline.md +128 -0
- package/packages/plugin-cloud/scripts/examples/aws-validate.sh +30 -0
- package/packages/plugin-cloud/scripts/examples/azure-setup.sh +33 -0
- package/packages/plugin-cloud/scripts/examples/gcp-setup.sh +39 -0
- package/packages/plugin-cloud/scripts/examples/k8s-validate.sh +40 -0
- package/packages/plugin-cloud/scripts/examples/terraform-init.sh +26 -0
- package/packages/plugin-core/README.md +274 -0
- package/packages/plugin-core/agents/core/agent-manager.md +296 -0
- package/packages/plugin-core/agents/core/code-analyzer.md +131 -0
- package/packages/plugin-core/agents/core/file-analyzer.md +162 -0
- package/packages/plugin-core/agents/core/test-runner.md +200 -0
- package/packages/plugin-core/commands/code-rabbit.md +128 -0
- package/packages/plugin-core/commands/prompt.md +9 -0
- package/packages/plugin-core/commands/re-init.md +9 -0
- package/packages/plugin-core/hooks/context7-reminder.md +29 -0
- package/packages/plugin-core/hooks/enforce-agents.js +125 -0
- package/packages/plugin-core/hooks/enforce-agents.sh +35 -0
- package/packages/plugin-core/hooks/pre-agent-context7.js +224 -0
- package/packages/plugin-core/hooks/pre-command-context7.js +229 -0
- package/packages/plugin-core/hooks/strict-enforce-agents.sh +39 -0
- package/packages/plugin-core/hooks/test-hook.sh +21 -0
- package/packages/plugin-core/hooks/unified-context7-enforcement.sh +38 -0
- package/packages/plugin-core/package.json +45 -0
- package/packages/plugin-core/plugin.json +387 -0
- package/packages/plugin-core/rules/agent-coordination.md +549 -0
- package/packages/plugin-core/rules/agent-mandatory.md +170 -0
- package/packages/plugin-core/rules/ai-integration-patterns.md +219 -0
- package/packages/plugin-core/rules/command-pipelines.md +208 -0
- package/packages/plugin-core/rules/context-optimization.md +176 -0
- package/packages/plugin-core/rules/context7-enforcement.md +327 -0
- package/packages/plugin-core/rules/datetime.md +122 -0
- package/packages/plugin-core/rules/definition-of-done.md +272 -0
- package/packages/plugin-core/rules/development-environments.md +19 -0
- package/packages/plugin-core/rules/development-workflow.md +198 -0
- package/packages/plugin-core/rules/framework-path-rules.md +180 -0
- package/packages/plugin-core/rules/frontmatter-operations.md +64 -0
- package/packages/plugin-core/rules/git-strategy.md +237 -0
- package/packages/plugin-core/rules/golden-rules.md +181 -0
- package/packages/plugin-core/rules/naming-conventions.md +111 -0
- package/packages/plugin-core/rules/no-pr-workflow.md +183 -0
- package/packages/plugin-core/rules/performance-guidelines.md +403 -0
- package/packages/plugin-core/rules/pipeline-mandatory.md +109 -0
- package/packages/plugin-core/rules/security-checklist.md +318 -0
- package/packages/plugin-core/rules/standard-patterns.md +197 -0
- package/packages/plugin-core/rules/strip-frontmatter.md +85 -0
- package/packages/plugin-core/rules/tdd.enforcement.md +103 -0
- package/packages/plugin-core/rules/use-ast-grep.md +113 -0
- package/packages/plugin-core/scripts/lib/datetime-utils.sh +254 -0
- package/packages/plugin-core/scripts/lib/frontmatter-utils.sh +294 -0
- package/packages/plugin-core/scripts/lib/github-utils.sh +221 -0
- package/packages/plugin-core/scripts/lib/logging-utils.sh +199 -0
- package/packages/plugin-core/scripts/lib/validation-utils.sh +339 -0
- package/packages/plugin-core/scripts/mcp/add.sh +7 -0
- package/packages/plugin-core/scripts/mcp/disable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/enable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/list.sh +7 -0
- package/packages/plugin-core/scripts/mcp/sync.sh +8 -0
- package/packages/plugin-data/README.md +315 -0
- package/packages/plugin-data/agents/airflow-orchestration-expert.md +158 -0
- package/packages/plugin-data/agents/kedro-pipeline-expert.md +304 -0
- package/packages/plugin-data/agents/langgraph-workflow-expert.md +530 -0
- package/packages/plugin-data/commands/airflow-dag-scaffold.md +413 -0
- package/packages/plugin-data/commands/kafka-pipeline-scaffold.md +503 -0
- package/packages/plugin-data/package.json +66 -0
- package/packages/plugin-data/plugin.json +294 -0
- package/packages/plugin-data/rules/data-quality-standards.md +373 -0
- package/packages/plugin-data/rules/etl-pipeline-standards.md +255 -0
- package/packages/plugin-data/scripts/examples/airflow-dag-example.py +245 -0
- package/packages/plugin-data/scripts/examples/dbt-transform-example.sql +238 -0
- package/packages/plugin-data/scripts/examples/kafka-streaming-example.py +257 -0
- package/packages/plugin-data/scripts/examples/pandas-etl-example.py +332 -0
- package/packages/plugin-databases/README.md +330 -0
- package/packages/plugin-databases/agents/README.md +50 -0
- package/packages/plugin-databases/agents/bigquery-expert.md +401 -0
- package/packages/plugin-databases/agents/cosmosdb-expert.md +375 -0
- package/packages/plugin-databases/agents/mongodb-expert.md +407 -0
- package/packages/plugin-databases/agents/postgresql-expert.md +329 -0
- package/packages/plugin-databases/agents/redis-expert.md +74 -0
- package/packages/plugin-databases/commands/db-optimize.md +612 -0
- package/packages/plugin-databases/package.json +60 -0
- package/packages/plugin-databases/plugin.json +237 -0
- package/packages/plugin-databases/rules/database-management-strategy.md +146 -0
- package/packages/plugin-databases/rules/database-pipeline.md +316 -0
- package/packages/plugin-databases/scripts/examples/bigquery-cost-analyze.sh +160 -0
- package/packages/plugin-databases/scripts/examples/cosmosdb-ru-optimize.sh +163 -0
- package/packages/plugin-databases/scripts/examples/mongodb-shard-check.sh +120 -0
- package/packages/plugin-databases/scripts/examples/postgres-index-analyze.sh +95 -0
- package/packages/plugin-databases/scripts/examples/redis-cache-stats.sh +121 -0
- package/packages/plugin-devops/README.md +367 -0
- package/packages/plugin-devops/agents/README.md +52 -0
- package/packages/plugin-devops/agents/azure-devops-specialist.md +308 -0
- package/packages/plugin-devops/agents/docker-containerization-expert.md +298 -0
- package/packages/plugin-devops/agents/github-operations-specialist.md +335 -0
- package/packages/plugin-devops/agents/mcp-context-manager.md +319 -0
- package/packages/plugin-devops/agents/observability-engineer.md +574 -0
- package/packages/plugin-devops/agents/ssh-operations-expert.md +1093 -0
- package/packages/plugin-devops/agents/traefik-proxy-expert.md +444 -0
- package/packages/plugin-devops/commands/ci-pipeline-create.md +581 -0
- package/packages/plugin-devops/commands/docker-optimize.md +493 -0
- package/packages/plugin-devops/commands/workflow-create.md +42 -0
- package/packages/plugin-devops/hooks/pre-docker-build.js +472 -0
- package/packages/plugin-devops/package.json +61 -0
- package/packages/plugin-devops/plugin.json +302 -0
- package/packages/plugin-devops/rules/ci-cd-kubernetes-strategy.md +25 -0
- package/packages/plugin-devops/rules/devops-troubleshooting-playbook.md +450 -0
- package/packages/plugin-devops/rules/docker-first-development.md +404 -0
- package/packages/plugin-devops/rules/github-operations.md +92 -0
- package/packages/plugin-devops/scripts/examples/docker-build-multistage.sh +43 -0
- package/packages/plugin-devops/scripts/examples/docker-compose-validate.sh +74 -0
- package/packages/plugin-devops/scripts/examples/github-workflow-validate.sh +48 -0
- package/packages/plugin-devops/scripts/examples/prometheus-health-check.sh +58 -0
- package/packages/plugin-devops/scripts/examples/ssh-key-setup.sh +74 -0
- package/packages/plugin-frameworks/README.md +309 -0
- package/packages/plugin-frameworks/agents/README.md +64 -0
- package/packages/plugin-frameworks/agents/e2e-test-engineer.md +579 -0
- package/packages/plugin-frameworks/agents/nats-messaging-expert.md +254 -0
- package/packages/plugin-frameworks/agents/react-frontend-engineer.md +393 -0
- package/packages/plugin-frameworks/agents/react-ui-expert.md +226 -0
- package/packages/plugin-frameworks/agents/tailwindcss-expert.md +1021 -0
- package/packages/plugin-frameworks/agents/ux-design-expert.md +244 -0
- package/packages/plugin-frameworks/commands/app-scaffold.md +50 -0
- package/packages/plugin-frameworks/commands/nextjs-optimize.md +692 -0
- package/packages/plugin-frameworks/commands/react-optimize.md +583 -0
- package/packages/plugin-frameworks/commands/tailwind-system.md +64 -0
- package/packages/plugin-frameworks/package.json +59 -0
- package/packages/plugin-frameworks/plugin.json +224 -0
- package/packages/plugin-frameworks/rules/performance-guidelines.md +403 -0
- package/packages/plugin-frameworks/rules/ui-development-standards.md +281 -0
- package/packages/plugin-frameworks/rules/ui-framework-rules.md +151 -0
- package/packages/plugin-frameworks/scripts/examples/react-component-perf.sh +34 -0
- package/packages/plugin-frameworks/scripts/examples/tailwind-optimize.sh +44 -0
- package/packages/plugin-frameworks/scripts/examples/vue-composition-check.sh +41 -0
- package/packages/plugin-languages/README.md +333 -0
- package/packages/plugin-languages/agents/README.md +50 -0
- package/packages/plugin-languages/agents/bash-scripting-expert.md +541 -0
- package/packages/plugin-languages/agents/javascript-frontend-engineer.md +197 -0
- package/packages/plugin-languages/agents/nodejs-backend-engineer.md +226 -0
- package/packages/plugin-languages/agents/python-backend-engineer.md +214 -0
- package/packages/plugin-languages/agents/python-backend-expert.md +289 -0
- package/packages/plugin-languages/commands/javascript-optimize.md +636 -0
- package/packages/plugin-languages/commands/nodejs-api-scaffold.md +341 -0
- package/packages/plugin-languages/commands/nodejs-optimize.md +689 -0
- package/packages/plugin-languages/commands/python-api-scaffold.md +261 -0
- package/packages/plugin-languages/commands/python-optimize.md +593 -0
- package/packages/plugin-languages/package.json +65 -0
- package/packages/plugin-languages/plugin.json +265 -0
- package/packages/plugin-languages/rules/code-quality-standards.md +496 -0
- package/packages/plugin-languages/rules/testing-standards.md +768 -0
- package/packages/plugin-languages/scripts/examples/bash-production-script.sh +520 -0
- package/packages/plugin-languages/scripts/examples/javascript-es6-patterns.js +291 -0
- package/packages/plugin-languages/scripts/examples/nodejs-async-iteration.js +360 -0
- package/packages/plugin-languages/scripts/examples/python-async-patterns.py +289 -0
- package/packages/plugin-languages/scripts/examples/typescript-patterns.ts +432 -0
- package/packages/plugin-ml/README.md +430 -0
- package/packages/plugin-ml/agents/automl-expert.md +326 -0
- package/packages/plugin-ml/agents/computer-vision-expert.md +550 -0
- package/packages/plugin-ml/agents/gradient-boosting-expert.md +455 -0
- package/packages/plugin-ml/agents/neural-network-architect.md +1228 -0
- package/packages/plugin-ml/agents/nlp-transformer-expert.md +584 -0
- package/packages/plugin-ml/agents/pytorch-expert.md +412 -0
- package/packages/plugin-ml/agents/reinforcement-learning-expert.md +2088 -0
- package/packages/plugin-ml/agents/scikit-learn-expert.md +228 -0
- package/packages/plugin-ml/agents/tensorflow-keras-expert.md +509 -0
- package/packages/plugin-ml/agents/time-series-expert.md +303 -0
- package/packages/plugin-ml/commands/ml-automl.md +572 -0
- package/packages/plugin-ml/commands/ml-train-optimize.md +657 -0
- package/packages/plugin-ml/package.json +52 -0
- package/packages/plugin-ml/plugin.json +338 -0
- package/packages/plugin-pm/README.md +368 -0
- package/packages/plugin-pm/claudeautopm-plugin-pm-2.0.0.tgz +0 -0
- package/packages/plugin-pm/commands/azure/COMMANDS.md +107 -0
- package/packages/plugin-pm/commands/azure/COMMAND_MAPPING.md +252 -0
- package/packages/plugin-pm/commands/azure/INTEGRATION_FIX.md +103 -0
- package/packages/plugin-pm/commands/azure/README.md +246 -0
- package/packages/plugin-pm/commands/azure/active-work.md +198 -0
- package/packages/plugin-pm/commands/azure/aliases.md +143 -0
- package/packages/plugin-pm/commands/azure/blocked-items.md +287 -0
- package/packages/plugin-pm/commands/azure/clean.md +93 -0
- package/packages/plugin-pm/commands/azure/docs-query.md +48 -0
- package/packages/plugin-pm/commands/azure/feature-decompose.md +380 -0
- package/packages/plugin-pm/commands/azure/feature-list.md +61 -0
- package/packages/plugin-pm/commands/azure/feature-new.md +115 -0
- package/packages/plugin-pm/commands/azure/feature-show.md +205 -0
- package/packages/plugin-pm/commands/azure/feature-start.md +130 -0
- package/packages/plugin-pm/commands/azure/fix-integration-example.md +93 -0
- package/packages/plugin-pm/commands/azure/help.md +150 -0
- package/packages/plugin-pm/commands/azure/import-us.md +269 -0
- package/packages/plugin-pm/commands/azure/init.md +211 -0
- package/packages/plugin-pm/commands/azure/next-task.md +262 -0
- package/packages/plugin-pm/commands/azure/search.md +160 -0
- package/packages/plugin-pm/commands/azure/sprint-status.md +235 -0
- package/packages/plugin-pm/commands/azure/standup.md +260 -0
- package/packages/plugin-pm/commands/azure/sync-all.md +99 -0
- package/packages/plugin-pm/commands/azure/task-analyze.md +186 -0
- package/packages/plugin-pm/commands/azure/task-close.md +329 -0
- package/packages/plugin-pm/commands/azure/task-edit.md +145 -0
- package/packages/plugin-pm/commands/azure/task-list.md +263 -0
- package/packages/plugin-pm/commands/azure/task-new.md +84 -0
- package/packages/plugin-pm/commands/azure/task-reopen.md +79 -0
- package/packages/plugin-pm/commands/azure/task-show.md +126 -0
- package/packages/plugin-pm/commands/azure/task-start.md +301 -0
- package/packages/plugin-pm/commands/azure/task-status.md +65 -0
- package/packages/plugin-pm/commands/azure/task-sync.md +67 -0
- package/packages/plugin-pm/commands/azure/us-edit.md +164 -0
- package/packages/plugin-pm/commands/azure/us-list.md +202 -0
- package/packages/plugin-pm/commands/azure/us-new.md +265 -0
- package/packages/plugin-pm/commands/azure/us-parse.md +253 -0
- package/packages/plugin-pm/commands/azure/us-show.md +188 -0
- package/packages/plugin-pm/commands/azure/us-status.md +320 -0
- package/packages/plugin-pm/commands/azure/validate.md +86 -0
- package/packages/plugin-pm/commands/azure/work-item-sync.md +47 -0
- package/packages/plugin-pm/commands/blocked.md +28 -0
- package/packages/plugin-pm/commands/clean.md +119 -0
- package/packages/plugin-pm/commands/context-create.md +136 -0
- package/packages/plugin-pm/commands/context-prime.md +170 -0
- package/packages/plugin-pm/commands/context-update.md +292 -0
- package/packages/plugin-pm/commands/context.md +28 -0
- package/packages/plugin-pm/commands/epic-close.md +86 -0
- package/packages/plugin-pm/commands/epic-decompose.md +370 -0
- package/packages/plugin-pm/commands/epic-edit.md +83 -0
- package/packages/plugin-pm/commands/epic-list.md +30 -0
- package/packages/plugin-pm/commands/epic-merge.md +222 -0
- package/packages/plugin-pm/commands/epic-oneshot.md +119 -0
- package/packages/plugin-pm/commands/epic-refresh.md +119 -0
- package/packages/plugin-pm/commands/epic-show.md +28 -0
- package/packages/plugin-pm/commands/epic-split.md +120 -0
- package/packages/plugin-pm/commands/epic-start.md +195 -0
- package/packages/plugin-pm/commands/epic-status.md +28 -0
- package/packages/plugin-pm/commands/epic-sync-modular.md +338 -0
- package/packages/plugin-pm/commands/epic-sync-original.md +473 -0
- package/packages/plugin-pm/commands/epic-sync.md +486 -0
- package/packages/plugin-pm/commands/github/workflow-create.md +42 -0
- package/packages/plugin-pm/commands/help.md +28 -0
- package/packages/plugin-pm/commands/import.md +115 -0
- package/packages/plugin-pm/commands/in-progress.md +28 -0
- package/packages/plugin-pm/commands/init.md +28 -0
- package/packages/plugin-pm/commands/issue-analyze.md +202 -0
- package/packages/plugin-pm/commands/issue-close.md +119 -0
- package/packages/plugin-pm/commands/issue-edit.md +93 -0
- package/packages/plugin-pm/commands/issue-reopen.md +87 -0
- package/packages/plugin-pm/commands/issue-show.md +41 -0
- package/packages/plugin-pm/commands/issue-start.md +234 -0
- package/packages/plugin-pm/commands/issue-status.md +95 -0
- package/packages/plugin-pm/commands/issue-sync.md +411 -0
- package/packages/plugin-pm/commands/next.md +28 -0
- package/packages/plugin-pm/commands/prd-edit.md +82 -0
- package/packages/plugin-pm/commands/prd-list.md +28 -0
- package/packages/plugin-pm/commands/prd-new.md +55 -0
- package/packages/plugin-pm/commands/prd-parse.md +42 -0
- package/packages/plugin-pm/commands/prd-status.md +28 -0
- package/packages/plugin-pm/commands/search.md +28 -0
- package/packages/plugin-pm/commands/standup.md +28 -0
- package/packages/plugin-pm/commands/status.md +28 -0
- package/packages/plugin-pm/commands/sync.md +99 -0
- package/packages/plugin-pm/commands/test-reference-update.md +151 -0
- package/packages/plugin-pm/commands/validate.md +28 -0
- package/packages/plugin-pm/commands/what-next.md +28 -0
- package/packages/plugin-pm/package.json +57 -0
- package/packages/plugin-pm/plugin.json +503 -0
- package/packages/plugin-pm/scripts/pm/analytics.js +425 -0
- package/packages/plugin-pm/scripts/pm/blocked.js +164 -0
- package/packages/plugin-pm/scripts/pm/blocked.sh +78 -0
- package/packages/plugin-pm/scripts/pm/clean.js +464 -0
- package/packages/plugin-pm/scripts/pm/context-create.js +216 -0
- package/packages/plugin-pm/scripts/pm/context-prime.js +335 -0
- package/packages/plugin-pm/scripts/pm/context-update.js +344 -0
- package/packages/plugin-pm/scripts/pm/context.js +338 -0
- package/packages/plugin-pm/scripts/pm/epic-close.js +347 -0
- package/packages/plugin-pm/scripts/pm/epic-edit.js +382 -0
- package/packages/plugin-pm/scripts/pm/epic-list.js +273 -0
- package/packages/plugin-pm/scripts/pm/epic-list.sh +109 -0
- package/packages/plugin-pm/scripts/pm/epic-show.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-show.sh +105 -0
- package/packages/plugin-pm/scripts/pm/epic-split.js +522 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.js +183 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.sh +94 -0
- package/packages/plugin-pm/scripts/pm/epic-status.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-status.sh +104 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/README.md +208 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-epic-issue.sh +77 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-task-issues.sh +86 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-epic-file.sh +79 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-references.sh +89 -0
- package/packages/plugin-pm/scripts/pm/epic-sync.sh +137 -0
- package/packages/plugin-pm/scripts/pm/help.js +92 -0
- package/packages/plugin-pm/scripts/pm/help.sh +90 -0
- package/packages/plugin-pm/scripts/pm/in-progress.js +178 -0
- package/packages/plugin-pm/scripts/pm/in-progress.sh +93 -0
- package/packages/plugin-pm/scripts/pm/init.js +321 -0
- package/packages/plugin-pm/scripts/pm/init.sh +178 -0
- package/packages/plugin-pm/scripts/pm/issue-close.js +232 -0
- package/packages/plugin-pm/scripts/pm/issue-edit.js +310 -0
- package/packages/plugin-pm/scripts/pm/issue-show.js +272 -0
- package/packages/plugin-pm/scripts/pm/issue-start.js +181 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/format-comment.sh +468 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/gather-updates.sh +460 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/post-comment.sh +330 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/preflight-validation.sh +348 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/update-frontmatter.sh +387 -0
- package/packages/plugin-pm/scripts/pm/lib/README.md +85 -0
- package/packages/plugin-pm/scripts/pm/lib/epic-discovery.js +119 -0
- package/packages/plugin-pm/scripts/pm/lib/logger.js +78 -0
- package/packages/plugin-pm/scripts/pm/next.js +189 -0
- package/packages/plugin-pm/scripts/pm/next.sh +72 -0
- package/packages/plugin-pm/scripts/pm/optimize.js +407 -0
- package/packages/plugin-pm/scripts/pm/pr-create.js +337 -0
- package/packages/plugin-pm/scripts/pm/pr-list.js +257 -0
- package/packages/plugin-pm/scripts/pm/prd-list.js +242 -0
- package/packages/plugin-pm/scripts/pm/prd-list.sh +103 -0
- package/packages/plugin-pm/scripts/pm/prd-new.js +684 -0
- package/packages/plugin-pm/scripts/pm/prd-parse.js +547 -0
- package/packages/plugin-pm/scripts/pm/prd-status.js +152 -0
- package/packages/plugin-pm/scripts/pm/prd-status.sh +63 -0
- package/packages/plugin-pm/scripts/pm/release.js +460 -0
- package/packages/plugin-pm/scripts/pm/search.js +192 -0
- package/packages/plugin-pm/scripts/pm/search.sh +89 -0
- package/packages/plugin-pm/scripts/pm/standup.js +362 -0
- package/packages/plugin-pm/scripts/pm/standup.sh +95 -0
- package/packages/plugin-pm/scripts/pm/status.js +148 -0
- package/packages/plugin-pm/scripts/pm/status.sh +59 -0
- package/packages/plugin-pm/scripts/pm/sync-batch.js +337 -0
- package/packages/plugin-pm/scripts/pm/sync.js +343 -0
- package/packages/plugin-pm/scripts/pm/template-list.js +141 -0
- package/packages/plugin-pm/scripts/pm/template-new.js +366 -0
- package/packages/plugin-pm/scripts/pm/validate.js +274 -0
- package/packages/plugin-pm/scripts/pm/validate.sh +106 -0
- package/packages/plugin-pm/scripts/pm/what-next.js +660 -0
- package/packages/plugin-testing/README.md +401 -0
- package/packages/plugin-testing/agents/frontend-testing-engineer.md +768 -0
- package/packages/plugin-testing/commands/jest-optimize.md +800 -0
- package/packages/plugin-testing/commands/playwright-optimize.md +887 -0
- package/packages/plugin-testing/commands/test-coverage.md +512 -0
- package/packages/plugin-testing/commands/test-performance.md +1041 -0
- package/packages/plugin-testing/commands/test-setup.md +414 -0
- package/packages/plugin-testing/package.json +40 -0
- package/packages/plugin-testing/plugin.json +197 -0
- package/packages/plugin-testing/rules/test-coverage-requirements.md +581 -0
- package/packages/plugin-testing/rules/testing-standards.md +529 -0
- package/packages/plugin-testing/scripts/examples/react-testing-example.test.jsx +460 -0
- package/packages/plugin-testing/scripts/examples/vitest-config-example.js +352 -0
- package/packages/plugin-testing/scripts/examples/vue-testing-example.test.js +586 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# ETL Pipeline Standards
|
|
2
|
+
|
|
3
|
+
**Priority:** HIGH
|
|
4
|
+
**Applies To:** commands, agents
|
|
5
|
+
**Enforces On:** airflow-orchestration-expert, kedro-pipeline-expert
|
|
6
|
+
|
|
7
|
+
ETL/ELT pipeline best practices with Context7-verified patterns from Airflow, Kedro, dbt, and pandas.
|
|
8
|
+
|
|
9
|
+
## Context7 Documentation Requirements
|
|
10
|
+
|
|
11
|
+
**MANDATORY**: Query Context7 before implementing ETL pipelines for framework-specific patterns.
|
|
12
|
+
|
|
13
|
+
## Core ETL Principles
|
|
14
|
+
|
|
15
|
+
### 1. Idempotency
|
|
16
|
+
|
|
17
|
+
**Rule:** All ETL operations must be idempotent - safe to re-run multiple times.
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
# ✅ CORRECT: Idempotent load using upsert
|
|
21
|
+
def load_to_warehouse(df: pd.DataFrame, table: str):
|
|
22
|
+
"""
|
|
23
|
+
Idempotent load using MERGE/UPSERT.
|
|
24
|
+
|
|
25
|
+
Context7 Pattern: Prevents duplicates on retry
|
|
26
|
+
"""
|
|
27
|
+
# Use MERGE/UPSERT instead of INSERT
|
|
28
|
+
connection.execute(f"""
|
|
29
|
+
MERGE INTO {table} AS target
|
|
30
|
+
USING temp_table AS source
|
|
31
|
+
ON target.id = source.id
|
|
32
|
+
WHEN MATCHED THEN UPDATE SET ...
|
|
33
|
+
WHEN NOT MATCHED THEN INSERT ...
|
|
34
|
+
""")
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. Incremental Processing
|
|
38
|
+
|
|
39
|
+
**Rule:** Process only new/changed data when possible.
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
# ✅ CORRECT: Incremental extraction
|
|
43
|
+
@task
|
|
44
|
+
def extract_incremental(last_run_timestamp: str) -> Dict:
|
|
45
|
+
"""
|
|
46
|
+
Extract only new records since last run.
|
|
47
|
+
|
|
48
|
+
Context7 Pattern (Airflow): TaskFlow with state tracking
|
|
49
|
+
"""
|
|
50
|
+
query = f"""
|
|
51
|
+
SELECT * FROM source_table
|
|
52
|
+
WHERE updated_at > '{last_run_timestamp}'
|
|
53
|
+
"""
|
|
54
|
+
data = execute_query(query)
|
|
55
|
+
return {"data": data, "timestamp": datetime.utcnow().isoformat()}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 3. Error Handling and Retries
|
|
59
|
+
|
|
60
|
+
**Rule:** Implement proper error handling with exponential backoff.
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
# ✅ CORRECT: Airflow retry configuration
|
|
64
|
+
default_args = {
|
|
65
|
+
"retries": 3,
|
|
66
|
+
"retry_delay": timedelta(minutes=5),
|
|
67
|
+
"retry_exponential_backoff": True,
|
|
68
|
+
"max_retry_delay": timedelta(hours=1),
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 4. Data Lineage Tracking
|
|
73
|
+
|
|
74
|
+
**Rule:** Track data provenance and transformations.
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
# ✅ CORRECT: Kedro pipeline with clear lineage
|
|
78
|
+
def create_pipeline(**kwargs) -> Pipeline:
|
|
79
|
+
return pipeline([
|
|
80
|
+
node(
|
|
81
|
+
func=extract_raw_data,
|
|
82
|
+
inputs=None,
|
|
83
|
+
outputs="raw_data", # Clear lineage
|
|
84
|
+
name="extract",
|
|
85
|
+
),
|
|
86
|
+
node(
|
|
87
|
+
func=transform_data,
|
|
88
|
+
inputs="raw_data",
|
|
89
|
+
outputs="transformed_data", # Tracks transformation
|
|
90
|
+
name="transform",
|
|
91
|
+
),
|
|
92
|
+
node(
|
|
93
|
+
func=load_data,
|
|
94
|
+
inputs="transformed_data",
|
|
95
|
+
outputs=None,
|
|
96
|
+
name="load",
|
|
97
|
+
),
|
|
98
|
+
])
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 5. Monitoring and Logging
|
|
102
|
+
|
|
103
|
+
**Rule:** Log all stages with metrics and timing.
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
import logging
|
|
107
|
+
import time
|
|
108
|
+
|
|
109
|
+
logger = logging.getLogger(__name__)
|
|
110
|
+
|
|
111
|
+
def etl_stage_wrapper(func):
|
|
112
|
+
"""Decorator for ETL stage logging."""
|
|
113
|
+
def wrapper(*args, **kwargs):
|
|
114
|
+
start_time = time.time()
|
|
115
|
+
logger.info(f"Starting {func.__name__}")
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
result = func(*args, **kwargs)
|
|
119
|
+
duration = time.time() - start_time
|
|
120
|
+
|
|
121
|
+
logger.info(
|
|
122
|
+
f"Completed {func.__name__} in {duration:.2f}s"
|
|
123
|
+
)
|
|
124
|
+
return result
|
|
125
|
+
|
|
126
|
+
except Exception as e:
|
|
127
|
+
logger.error(f"Failed {func.__name__}: {e}")
|
|
128
|
+
raise
|
|
129
|
+
|
|
130
|
+
return wrapper
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Pipeline Patterns
|
|
134
|
+
|
|
135
|
+
### Extract Phase
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
@task
|
|
139
|
+
def extract_from_api(endpoint: str) -> Dict:
|
|
140
|
+
"""
|
|
141
|
+
Extract data from API with retry logic.
|
|
142
|
+
|
|
143
|
+
Context7 Pattern: Robust extraction
|
|
144
|
+
"""
|
|
145
|
+
max_retries = 3
|
|
146
|
+
for attempt in range(max_retries):
|
|
147
|
+
try:
|
|
148
|
+
response = requests.get(endpoint, timeout=30)
|
|
149
|
+
response.raise_for_status()
|
|
150
|
+
return response.json()
|
|
151
|
+
except RequestException as e:
|
|
152
|
+
if attempt == max_retries - 1:
|
|
153
|
+
raise
|
|
154
|
+
time.sleep(2 ** attempt) # Exponential backoff
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Transform Phase
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
def transform_data(df: pd.DataFrame) -> pd.DataFrame:
|
|
161
|
+
"""
|
|
162
|
+
Transform data with Context7 pandas patterns.
|
|
163
|
+
|
|
164
|
+
Context7 Pattern: Vectorized operations
|
|
165
|
+
"""
|
|
166
|
+
# ✅ CORRECT: Vectorization over apply
|
|
167
|
+
df["total"] = df["quantity"] * df["price"]
|
|
168
|
+
|
|
169
|
+
# ✅ CORRECT: GroupBy aggregations
|
|
170
|
+
aggregated = df.groupby("customer_id").agg({
|
|
171
|
+
"total": ["sum", "mean", "count"],
|
|
172
|
+
"order_date": "max"
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
# ✅ CORRECT: Efficient merging
|
|
176
|
+
result = df.merge(
|
|
177
|
+
customers,
|
|
178
|
+
on="customer_id",
|
|
179
|
+
how="left",
|
|
180
|
+
validate="many_to_one"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
return result
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Load Phase
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
def load_to_warehouse(
|
|
190
|
+
df: pd.DataFrame,
|
|
191
|
+
table: str,
|
|
192
|
+
mode: str = "append"
|
|
193
|
+
):
|
|
194
|
+
"""
|
|
195
|
+
Load data to warehouse with proper handling.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
df: Data to load
|
|
199
|
+
table: Target table
|
|
200
|
+
mode: 'append' or 'replace'
|
|
201
|
+
"""
|
|
202
|
+
# Validate before loading
|
|
203
|
+
assert len(df) > 0, "Empty DataFrame"
|
|
204
|
+
assert not df.isnull().all().any(), "Column with all nulls"
|
|
205
|
+
|
|
206
|
+
# Load with transaction
|
|
207
|
+
with engine.begin() as conn:
|
|
208
|
+
df.to_sql(
|
|
209
|
+
table,
|
|
210
|
+
conn,
|
|
211
|
+
if_exists=mode,
|
|
212
|
+
index=False,
|
|
213
|
+
method="multi", # Batch inserts
|
|
214
|
+
chunksize=1000
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
logger.info(f"Loaded {len(df)} rows to {table}")
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Testing Standards
|
|
221
|
+
|
|
222
|
+
```python
|
|
223
|
+
def test_etl_pipeline():
|
|
224
|
+
"""Test ETL pipeline end-to-end."""
|
|
225
|
+
# Arrange: Setup test data
|
|
226
|
+
test_data = create_test_data()
|
|
227
|
+
|
|
228
|
+
# Act: Run pipeline
|
|
229
|
+
result = run_pipeline(test_data)
|
|
230
|
+
|
|
231
|
+
# Assert: Validate results
|
|
232
|
+
assert len(result) == expected_count
|
|
233
|
+
assert result["total"].sum() == expected_total
|
|
234
|
+
assert not result.isnull().any().any()
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Enforcement Checklist
|
|
238
|
+
|
|
239
|
+
- [ ] Context7 documentation queried
|
|
240
|
+
- [ ] Idempotent operations
|
|
241
|
+
- [ ] Incremental processing where applicable
|
|
242
|
+
- [ ] Error handling with retries
|
|
243
|
+
- [ ] Data validation at each stage
|
|
244
|
+
- [ ] Lineage tracking
|
|
245
|
+
- [ ] Monitoring and logging
|
|
246
|
+
- [ ] Tests cover all stages
|
|
247
|
+
- [ ] Documentation complete
|
|
248
|
+
|
|
249
|
+
## Related Resources
|
|
250
|
+
|
|
251
|
+
- Rule: `data-quality-standards.md`
|
|
252
|
+
- Command: `airflow-dag-scaffold.md`
|
|
253
|
+
- Command: `kafka-pipeline-scaffold.md`
|
|
254
|
+
- Script: `airflow-dag-example.py`
|
|
255
|
+
- Script: `pandas-etl-example.py`
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Airflow DAG Example - Context7 Best Practices
|
|
4
|
+
|
|
5
|
+
Demonstrates production-ready Airflow patterns from Context7:
|
|
6
|
+
- TaskFlow API with @task decorators
|
|
7
|
+
- Task dependencies with bitshift operators
|
|
8
|
+
- Sensors for external dependencies
|
|
9
|
+
- Error handling and retries
|
|
10
|
+
- TaskGroups for organization
|
|
11
|
+
|
|
12
|
+
Source: /apache/airflow (5,854 snippets, trust 9.1)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from datetime import datetime, timedelta
|
|
16
|
+
from typing import Dict, List
|
|
17
|
+
|
|
18
|
+
from airflow.decorators import dag, task
|
|
19
|
+
from airflow.operators.python import PythonOperator
|
|
20
|
+
from airflow.sensors.external_task import ExternalTaskSensor
|
|
21
|
+
from airflow.utils.task_group import TaskGroup
|
|
22
|
+
|
|
23
|
+
# ✅ CORRECT: Proper default arguments with error handling
|
|
24
|
+
default_args = {
|
|
25
|
+
"owner": "data_team",
|
|
26
|
+
"depends_on_past": False,
|
|
27
|
+
"email": ["alerts@example.com"],
|
|
28
|
+
"email_on_failure": True,
|
|
29
|
+
"email_on_retry": False,
|
|
30
|
+
"retries": 3,
|
|
31
|
+
"retry_delay": timedelta(minutes=5),
|
|
32
|
+
"retry_exponential_backoff": True,
|
|
33
|
+
"max_retry_delay": timedelta(hours=1),
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dag(
|
|
38
|
+
dag_id="example_etl_pipeline",
|
|
39
|
+
default_args=default_args,
|
|
40
|
+
description="Production ETL pipeline with Context7 patterns",
|
|
41
|
+
schedule_interval="@daily",
|
|
42
|
+
start_date=datetime(2025, 1, 1),
|
|
43
|
+
catchup=False,
|
|
44
|
+
tags=["example", "etl", "context7"],
|
|
45
|
+
)
|
|
46
|
+
def example_etl_pipeline():
|
|
47
|
+
"""
|
|
48
|
+
Example ETL pipeline demonstrating Context7 patterns.
|
|
49
|
+
|
|
50
|
+
Stages:
|
|
51
|
+
1. Wait for upstream dependencies (sensors)
|
|
52
|
+
2. Extract data from multiple sources (parallel)
|
|
53
|
+
3. Transform and validate data
|
|
54
|
+
4. Load to warehouse
|
|
55
|
+
5. Send notifications
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
# ===================================================================
|
|
59
|
+
# DEPENDENCY CHECKS
|
|
60
|
+
# ===================================================================
|
|
61
|
+
|
|
62
|
+
# ✅ CORRECT: ExternalTaskSensor for upstream DAG dependency
|
|
63
|
+
wait_for_upstream = ExternalTaskSensor(
|
|
64
|
+
task_id="wait_for_upstream_dag",
|
|
65
|
+
external_dag_id="upstream_data_collection",
|
|
66
|
+
external_task_id="final_task",
|
|
67
|
+
allowed_states=["success"],
|
|
68
|
+
failed_states=["failed", "skipped"],
|
|
69
|
+
timeout=3600,
|
|
70
|
+
poke_interval=300,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# ===================================================================
|
|
74
|
+
# EXTRACTION PHASE (PARALLEL)
|
|
75
|
+
# ===================================================================
|
|
76
|
+
|
|
77
|
+
@task
|
|
78
|
+
def extract_from_database() -> Dict:
|
|
79
|
+
"""
|
|
80
|
+
Extract data from database.
|
|
81
|
+
|
|
82
|
+
Context7 Pattern: TaskFlow with @task decorator
|
|
83
|
+
Returns data dict for XCom passing
|
|
84
|
+
"""
|
|
85
|
+
print("Extracting from database...")
|
|
86
|
+
|
|
87
|
+
# Simulated extraction
|
|
88
|
+
data = {
|
|
89
|
+
"source": "database",
|
|
90
|
+
"records": list(range(100)),
|
|
91
|
+
"count": 100,
|
|
92
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
print(f"✓ Extracted {data['count']} records from database")
|
|
96
|
+
return data
|
|
97
|
+
|
|
98
|
+
@task
|
|
99
|
+
def extract_from_api() -> Dict:
|
|
100
|
+
"""
|
|
101
|
+
Extract data from external API.
|
|
102
|
+
|
|
103
|
+
Context7 Pattern: Parallel extraction with independent @task
|
|
104
|
+
"""
|
|
105
|
+
print("Extracting from API...")
|
|
106
|
+
|
|
107
|
+
# Simulated API call
|
|
108
|
+
data = {
|
|
109
|
+
"source": "api",
|
|
110
|
+
"records": list(range(100, 150)),
|
|
111
|
+
"count": 50,
|
|
112
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
print(f"✓ Extracted {data['count']} records from API")
|
|
116
|
+
return data
|
|
117
|
+
|
|
118
|
+
# ===================================================================
|
|
119
|
+
# TRANSFORMATION PHASE
|
|
120
|
+
# ===================================================================
|
|
121
|
+
|
|
122
|
+
@task
|
|
123
|
+
def transform_and_combine(db_data: Dict, api_data: Dict) -> Dict:
|
|
124
|
+
"""
|
|
125
|
+
Transform and combine data from multiple sources.
|
|
126
|
+
|
|
127
|
+
Context7 Pattern: TaskFlow automatically handles XCom passing
|
|
128
|
+
Parameters match upstream task outputs
|
|
129
|
+
"""
|
|
130
|
+
print("Transforming and combining data...")
|
|
131
|
+
|
|
132
|
+
combined_records = db_data["records"] + api_data["records"]
|
|
133
|
+
total_count = db_data["count"] + api_data["count"]
|
|
134
|
+
|
|
135
|
+
# Apply transformations
|
|
136
|
+
transformed = {
|
|
137
|
+
"records": [x * 2 for x in combined_records], # Example transformation
|
|
138
|
+
"count": total_count,
|
|
139
|
+
"sources": [db_data["source"], api_data["source"]],
|
|
140
|
+
"transformation": "doubled values",
|
|
141
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
print(f"✓ Transformed {transformed['count']} total records")
|
|
145
|
+
return transformed
|
|
146
|
+
|
|
147
|
+
@task
|
|
148
|
+
def validate_data(data: Dict) -> Dict:
|
|
149
|
+
"""
|
|
150
|
+
Validate transformed data quality.
|
|
151
|
+
|
|
152
|
+
Context7 Pattern: Data quality checks in pipeline
|
|
153
|
+
"""
|
|
154
|
+
print("Validating data quality...")
|
|
155
|
+
|
|
156
|
+
# Validation checks
|
|
157
|
+
assert data["count"] > 0, "No records to validate"
|
|
158
|
+
assert len(data["records"]) == data["count"], "Record count mismatch"
|
|
159
|
+
assert all(isinstance(x, int) for x in data["records"]), "Invalid record types"
|
|
160
|
+
|
|
161
|
+
print(f"✓ Validation passed for {data['count']} records")
|
|
162
|
+
return data
|
|
163
|
+
|
|
164
|
+
# ===================================================================
|
|
165
|
+
# LOADING PHASE
|
|
166
|
+
# ===================================================================
|
|
167
|
+
|
|
168
|
+
@task
|
|
169
|
+
def load_to_warehouse(data: Dict) -> Dict:
|
|
170
|
+
"""
|
|
171
|
+
Load validated data to data warehouse.
|
|
172
|
+
|
|
173
|
+
Context7 Pattern: Final load task with success confirmation
|
|
174
|
+
"""
|
|
175
|
+
print(f"Loading {data['count']} records to warehouse...")
|
|
176
|
+
|
|
177
|
+
# Simulated load operation
|
|
178
|
+
loaded_data = {
|
|
179
|
+
**data,
|
|
180
|
+
"loaded_at": datetime.utcnow().isoformat(),
|
|
181
|
+
"status": "success",
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
print(f"✓ Successfully loaded {data['count']} records")
|
|
185
|
+
return loaded_data
|
|
186
|
+
|
|
187
|
+
@task
|
|
188
|
+
def send_success_notification(data: Dict) -> None:
|
|
189
|
+
"""
|
|
190
|
+
Send notification on pipeline success.
|
|
191
|
+
|
|
192
|
+
Context7 Pattern: Notification task for monitoring
|
|
193
|
+
"""
|
|
194
|
+
message = (
|
|
195
|
+
f"ETL Pipeline completed successfully:\n"
|
|
196
|
+
f"- Records processed: {data['count']}\n"
|
|
197
|
+
f"- Sources: {', '.join(data['sources'])}\n"
|
|
198
|
+
f"- Loaded at: {data['loaded_at']}"
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
print(f"📧 Notification: {message}")
|
|
202
|
+
# In production: send email, Slack message, etc.
|
|
203
|
+
|
|
204
|
+
# ===================================================================
|
|
205
|
+
# DAG STRUCTURE WITH CONTEXT7 PATTERNS
|
|
206
|
+
# ===================================================================
|
|
207
|
+
|
|
208
|
+
# Context7 Pattern: Sensor before extraction
|
|
209
|
+
sensor_task = wait_for_upstream
|
|
210
|
+
|
|
211
|
+
# Context7 Pattern: Parallel extraction (TaskFlow resolves automatically)
|
|
212
|
+
db_data = extract_from_database()
|
|
213
|
+
api_data = extract_from_api()
|
|
214
|
+
|
|
215
|
+
# Context7 Pattern: Pass multiple inputs to transformation
|
|
216
|
+
transformed = transform_and_combine(db_data, api_data)
|
|
217
|
+
|
|
218
|
+
# Context7 Pattern: Sequential validation and loading
|
|
219
|
+
validated = validate_data(transformed)
|
|
220
|
+
loaded = load_to_warehouse(validated)
|
|
221
|
+
notify = send_success_notification(loaded)
|
|
222
|
+
|
|
223
|
+
# Context7 Pattern: Bitshift operator for explicit dependencies
|
|
224
|
+
sensor_task >> [db_data, api_data]
|
|
225
|
+
loaded >> notify
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# Instantiate DAG
|
|
229
|
+
dag_instance = example_etl_pipeline()
|
|
230
|
+
|
|
231
|
+
if __name__ == "__main__":
|
|
232
|
+
print("Airflow DAG Example - Context7 Best Practices")
|
|
233
|
+
print("=" * 60)
|
|
234
|
+
print("")
|
|
235
|
+
print("Context7 Patterns Demonstrated:")
|
|
236
|
+
print("1. ✅ TaskFlow API with @task decorators")
|
|
237
|
+
print("2. ✅ Parallel extraction from multiple sources")
|
|
238
|
+
print("3. ✅ ExternalTaskSensor for upstream dependencies")
|
|
239
|
+
print("4. ✅ Automatic XCom passing between tasks")
|
|
240
|
+
print("5. ✅ Bitshift operators for dependencies (>>, <<)")
|
|
241
|
+
print("6. ✅ Error handling with retries and exponential backoff")
|
|
242
|
+
print("7. ✅ Data validation in pipeline")
|
|
243
|
+
print("8. ✅ Notification on completion")
|
|
244
|
+
print("")
|
|
245
|
+
print("Source: /apache/airflow (5,854 snippets, trust 9.1)")
|