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,160 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# BigQuery cost analysis and optimization checker
|
|
3
|
+
# Usage: ./bigquery-cost-analyze.sh [project-id] [dataset]
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
PROJECT_ID="${1:-}"
|
|
8
|
+
DATASET="${2:-}"
|
|
9
|
+
|
|
10
|
+
if [ -z "$PROJECT_ID" ]; then
|
|
11
|
+
echo "Usage: $0 <project-id> [dataset]"
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
echo "💰 Analyzing BigQuery costs and optimization opportunities..."
|
|
16
|
+
echo "Project: $PROJECT_ID"
|
|
17
|
+
if [ -n "$DATASET" ]; then
|
|
18
|
+
echo "Dataset: $DATASET"
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# Check if bq CLI is installed
|
|
22
|
+
if ! command -v bq &> /dev/null; then
|
|
23
|
+
echo "❌ bq CLI not found. Please install Google Cloud SDK."
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Get storage costs
|
|
28
|
+
echo ""
|
|
29
|
+
echo "📊 Storage Analysis:"
|
|
30
|
+
if [ -n "$DATASET" ]; then
|
|
31
|
+
QUERY="
|
|
32
|
+
SELECT
|
|
33
|
+
table_schema as dataset,
|
|
34
|
+
table_name,
|
|
35
|
+
ROUND(total_logical_bytes / POW(10, 9), 2) as logical_gb,
|
|
36
|
+
ROUND(total_physical_bytes / POW(10, 9), 2) as physical_gb,
|
|
37
|
+
ROUND(long_term_logical_bytes / POW(10, 9), 2) as long_term_gb,
|
|
38
|
+
CASE
|
|
39
|
+
WHEN total_rows > 0 THEN ROUND(total_physical_bytes / total_rows, 2)
|
|
40
|
+
ELSE 0
|
|
41
|
+
END as bytes_per_row
|
|
42
|
+
FROM \`region-us\`.INFORMATION_SCHEMA.TABLE_STORAGE
|
|
43
|
+
WHERE table_schema = '$DATASET'
|
|
44
|
+
ORDER BY total_physical_bytes DESC
|
|
45
|
+
LIMIT 10;
|
|
46
|
+
"
|
|
47
|
+
else
|
|
48
|
+
QUERY="
|
|
49
|
+
SELECT
|
|
50
|
+
table_schema as dataset,
|
|
51
|
+
SUM(total_physical_bytes) / POW(10, 9) as total_physical_gb,
|
|
52
|
+
SUM(long_term_physical_bytes) / POW(10, 9) as long_term_gb
|
|
53
|
+
FROM \`region-us\`.INFORMATION_SCHEMA.TABLE_STORAGE
|
|
54
|
+
GROUP BY table_schema
|
|
55
|
+
ORDER BY total_physical_gb DESC
|
|
56
|
+
LIMIT 10;
|
|
57
|
+
"
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
bq query --use_legacy_sql=false --format=prettyjson "$QUERY" 2>/dev/null | head -50
|
|
61
|
+
|
|
62
|
+
# Check for partitioning and clustering
|
|
63
|
+
echo ""
|
|
64
|
+
echo "🗂️ Partitioning and Clustering Status:"
|
|
65
|
+
if [ -n "$DATASET" ]; then
|
|
66
|
+
PARTITION_QUERY="
|
|
67
|
+
SELECT
|
|
68
|
+
table_name,
|
|
69
|
+
CASE
|
|
70
|
+
WHEN is_partitioning_column = 'YES' THEN 'Partitioned'
|
|
71
|
+
ELSE 'Not Partitioned'
|
|
72
|
+
END as partition_status,
|
|
73
|
+
CASE
|
|
74
|
+
WHEN clustering_ordinal_position IS NOT NULL THEN 'Clustered'
|
|
75
|
+
ELSE 'Not Clustered'
|
|
76
|
+
END as cluster_status
|
|
77
|
+
FROM \`$PROJECT_ID.$DATASET.INFORMATION_SCHEMA.COLUMNS\`
|
|
78
|
+
WHERE table_name NOT LIKE '%INFORMATION_SCHEMA%'
|
|
79
|
+
GROUP BY table_name, partition_status, cluster_status
|
|
80
|
+
ORDER BY table_name;
|
|
81
|
+
"
|
|
82
|
+
bq query --use_legacy_sql=false --format=prettyjson "$PARTITION_QUERY" 2>/dev/null | head -50
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# Check recent query costs
|
|
86
|
+
echo ""
|
|
87
|
+
echo "💸 Most Expensive Queries (Last 7 Days):"
|
|
88
|
+
EXPENSIVE_QUERY="
|
|
89
|
+
SELECT
|
|
90
|
+
user_email,
|
|
91
|
+
query,
|
|
92
|
+
ROUND(total_bytes_processed / POW(10, 9), 2) as gb_processed,
|
|
93
|
+
ROUND(total_slot_ms / 1000, 2) as slot_seconds,
|
|
94
|
+
TIMESTAMP_DIFF(end_time, start_time, MILLISECOND) as duration_ms
|
|
95
|
+
FROM \`$PROJECT_ID.region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT\`
|
|
96
|
+
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
|
|
97
|
+
AND job_type = 'QUERY'
|
|
98
|
+
AND state = 'DONE'
|
|
99
|
+
AND total_bytes_processed > 0
|
|
100
|
+
ORDER BY total_bytes_processed DESC
|
|
101
|
+
LIMIT 5;
|
|
102
|
+
"
|
|
103
|
+
bq query --use_legacy_sql=false --format=prettyjson "$EXPENSIVE_QUERY" 2>/dev/null | head -100
|
|
104
|
+
|
|
105
|
+
echo ""
|
|
106
|
+
echo "📋 Best practices from Context7 (/websites/cloud_google-bigquery):"
|
|
107
|
+
echo ""
|
|
108
|
+
echo "🗂️ Partitioning:"
|
|
109
|
+
echo " ✓ Partition tables by DATE or TIMESTAMP for time-series data"
|
|
110
|
+
echo " ✓ Use PARTITION BY DATE(timestamp_column) for daily partitions"
|
|
111
|
+
echo " ✓ Set partition_expiration_days to automatically remove old data"
|
|
112
|
+
echo " ✓ Use require_partition_filter=TRUE to enforce partition filtering"
|
|
113
|
+
echo ""
|
|
114
|
+
echo "Example:"
|
|
115
|
+
echo " CREATE TABLE dataset.events ("
|
|
116
|
+
echo " event_id INT64,"
|
|
117
|
+
echo " event_timestamp TIMESTAMP"
|
|
118
|
+
echo " )"
|
|
119
|
+
echo " PARTITION BY DATE(event_timestamp)"
|
|
120
|
+
echo " OPTIONS (partition_expiration_days=365);"
|
|
121
|
+
echo ""
|
|
122
|
+
echo "🎯 Clustering:"
|
|
123
|
+
echo " ✓ Cluster by columns frequently used in WHERE and GROUP BY"
|
|
124
|
+
echo " ✓ Order clustering columns by cardinality (low to high)"
|
|
125
|
+
echo " ✓ Up to 4 clustering columns supported"
|
|
126
|
+
echo " ✓ Clustering improves query performance and reduces costs"
|
|
127
|
+
echo ""
|
|
128
|
+
echo "Example:"
|
|
129
|
+
echo " CREATE TABLE dataset.events ("
|
|
130
|
+
echo " event_timestamp TIMESTAMP,"
|
|
131
|
+
echo " user_id STRING,"
|
|
132
|
+
echo " event_type STRING"
|
|
133
|
+
echo " )"
|
|
134
|
+
echo " PARTITION BY DATE(event_timestamp)"
|
|
135
|
+
echo " CLUSTER BY user_id, event_type;"
|
|
136
|
+
echo ""
|
|
137
|
+
echo "💰 Cost Optimization:"
|
|
138
|
+
echo " ✓ Use _PARTITIONTIME for partition pruning in WHERE clauses"
|
|
139
|
+
echo " ✓ Avoid SELECT * - specify only needed columns"
|
|
140
|
+
echo " ✓ Use LIMIT for exploratory queries"
|
|
141
|
+
echo " ✓ Preview data with table preview (free)"
|
|
142
|
+
echo " ✓ Use materialized views for repeated aggregations"
|
|
143
|
+
echo " ✓ Monitor INFORMATION_SCHEMA.TABLE_STORAGE for storage costs"
|
|
144
|
+
echo " ✓ Long-term storage (90+ days) is 50% cheaper"
|
|
145
|
+
echo ""
|
|
146
|
+
echo "🚀 Query Optimization:"
|
|
147
|
+
echo " ✓ Place _PARTITIONTIME on left side of comparisons"
|
|
148
|
+
echo " ✓ Use constant expressions for partition pruning"
|
|
149
|
+
echo " ✓ Combine filters with AND for multiple partition columns"
|
|
150
|
+
echo " ✓ Use ORDER BY + LIMIT for search queries on partitioned tables"
|
|
151
|
+
echo ""
|
|
152
|
+
echo "Example optimized query:"
|
|
153
|
+
echo " SELECT event_type, COUNT(*) as total"
|
|
154
|
+
echo " FROM dataset.events"
|
|
155
|
+
echo " WHERE DATE(event_timestamp) BETWEEN '2024-01-01' AND '2024-01-31'"
|
|
156
|
+
echo " AND user_id = 'user123'"
|
|
157
|
+
echo " GROUP BY event_type;"
|
|
158
|
+
|
|
159
|
+
echo ""
|
|
160
|
+
echo "✅ BigQuery cost analysis complete"
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Azure Cosmos DB RU/s optimization and partition analysis
|
|
3
|
+
# Usage: ./cosmosdb-ru-optimize.sh [resource-group] [account-name] [database] [container]
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
RESOURCE_GROUP="${1:-}"
|
|
8
|
+
ACCOUNT_NAME="${2:-}"
|
|
9
|
+
DATABASE="${3:-}"
|
|
10
|
+
CONTAINER="${4:-}"
|
|
11
|
+
|
|
12
|
+
if [ -z "$RESOURCE_GROUP" ] || [ -z "$ACCOUNT_NAME" ] || [ -z "$DATABASE" ] || [ -z "$CONTAINER" ]; then
|
|
13
|
+
echo "Usage: $0 <resource-group> <account-name> <database> <container>"
|
|
14
|
+
exit 1
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo "🔍 Analyzing Azure Cosmos DB RU/s and partition distribution..."
|
|
18
|
+
echo "Resource Group: $RESOURCE_GROUP"
|
|
19
|
+
echo "Account: $ACCOUNT_NAME"
|
|
20
|
+
echo "Database: $DATABASE"
|
|
21
|
+
echo "Container: $CONTAINER"
|
|
22
|
+
|
|
23
|
+
# Check if az CLI is installed
|
|
24
|
+
if ! command -v az &> /dev/null; then
|
|
25
|
+
echo "❌ Azure CLI not found. Please install Azure CLI."
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# Get current throughput
|
|
30
|
+
echo ""
|
|
31
|
+
echo "📊 Current Throughput Configuration:"
|
|
32
|
+
az cosmosdb sql container throughput show \
|
|
33
|
+
--resource-group "$RESOURCE_GROUP" \
|
|
34
|
+
--account-name "$ACCOUNT_NAME" \
|
|
35
|
+
--database-name "$DATABASE" \
|
|
36
|
+
--name "$CONTAINER" \
|
|
37
|
+
--query "{throughput: resource.throughput, autoscale: resource.autoscaleSettings}" \
|
|
38
|
+
--output table 2>/dev/null || echo " ℹ️ Using database-level shared throughput"
|
|
39
|
+
|
|
40
|
+
# Get container properties
|
|
41
|
+
echo ""
|
|
42
|
+
echo "🗂️ Container Properties:"
|
|
43
|
+
az cosmosdb sql container show \
|
|
44
|
+
--resource-group "$RESOURCE_GROUP" \
|
|
45
|
+
--account-name "$ACCOUNT_NAME" \
|
|
46
|
+
--database-name "$DATABASE" \
|
|
47
|
+
--name "$CONTAINER" \
|
|
48
|
+
--query "{partitionKey: resource.partitionKey.paths[0], ttl: resource.defaultTtl, indexingPolicy: resource.indexingPolicy.indexingMode}" \
|
|
49
|
+
--output table
|
|
50
|
+
|
|
51
|
+
# Check for partition distribution (requires connection)
|
|
52
|
+
echo ""
|
|
53
|
+
echo "⚖️ Partition Distribution Analysis:"
|
|
54
|
+
echo " ℹ️ Use Azure Portal Metrics or Application Insights for detailed partition metrics"
|
|
55
|
+
echo " 📊 Recommended checks:"
|
|
56
|
+
echo " - Normalized RU Consumption (should be balanced across partitions)"
|
|
57
|
+
echo " - Storage per partition (should be evenly distributed)"
|
|
58
|
+
echo " - Hot partition detection (> 50% RU consumption on single partition)"
|
|
59
|
+
|
|
60
|
+
# Get consistency level
|
|
61
|
+
echo ""
|
|
62
|
+
echo "🎯 Consistency Level:"
|
|
63
|
+
az cosmosdb show \
|
|
64
|
+
--resource-group "$RESOURCE_GROUP" \
|
|
65
|
+
--name "$ACCOUNT_NAME" \
|
|
66
|
+
--query "consistencyPolicy.defaultConsistencyLevel" \
|
|
67
|
+
--output tsv
|
|
68
|
+
|
|
69
|
+
echo ""
|
|
70
|
+
echo "📋 Best practices from Context7 (/websites/learn_microsoft-en-us-azure-cosmos-db):"
|
|
71
|
+
echo ""
|
|
72
|
+
echo "🔑 Partition Key Selection:"
|
|
73
|
+
echo " ✓ Choose high-cardinality partition key (many distinct values)"
|
|
74
|
+
echo " ✓ Distribute read and write operations evenly"
|
|
75
|
+
echo " ✓ Avoid hot partitions (single partition handling most traffic)"
|
|
76
|
+
echo " ✓ Common patterns:"
|
|
77
|
+
echo " - User ID for user-centric applications"
|
|
78
|
+
echo " - Tenant ID for multi-tenant applications"
|
|
79
|
+
echo " - Date + ID composite for time-series data"
|
|
80
|
+
echo ""
|
|
81
|
+
echo "⚖️ Consistency Levels (by use case):"
|
|
82
|
+
echo " • Strong: Financial transactions, inventory systems"
|
|
83
|
+
echo " • Bounded Staleness: Social media feeds, leaderboards"
|
|
84
|
+
echo " • Session: Shopping carts, user preferences (MOST COMMON)"
|
|
85
|
+
echo " • Consistent Prefix: Live scores, news feeds"
|
|
86
|
+
echo " • Eventual: Analytics, telemetry, logs"
|
|
87
|
+
echo ""
|
|
88
|
+
echo "💰 RU/s Optimization:"
|
|
89
|
+
echo " ✓ Use autoscale for unpredictable workloads"
|
|
90
|
+
echo " ✓ Use manual throughput for consistent workloads"
|
|
91
|
+
echo " ✓ Monitor normalized RU consumption (should be 70-85%)"
|
|
92
|
+
echo " ✓ Distribute throughput evenly across partitions"
|
|
93
|
+
echo ""
|
|
94
|
+
echo "Example: Evenly distribute RU/s across partitions:"
|
|
95
|
+
echo " az cosmosdb sql container redistribute-partition-throughput \\"
|
|
96
|
+
echo " --resource-group '$RESOURCE_GROUP' \\"
|
|
97
|
+
echo " --account-name '$ACCOUNT_NAME' \\"
|
|
98
|
+
echo " --database-name '$DATABASE' \\"
|
|
99
|
+
echo " --name '$CONTAINER' \\"
|
|
100
|
+
echo " --evenly-distribute"
|
|
101
|
+
echo ""
|
|
102
|
+
echo "🕒 TTL (Time-to-Live):"
|
|
103
|
+
echo " ✓ Set defaultTtl for automatic data expiration"
|
|
104
|
+
echo " ✓ Per-item TTL for granular control"
|
|
105
|
+
echo " ✓ Reduces storage costs and improves query performance"
|
|
106
|
+
echo ""
|
|
107
|
+
echo "Example: Enable TTL on container:"
|
|
108
|
+
echo " az cosmosdb sql container update \\"
|
|
109
|
+
echo " --resource-group '$RESOURCE_GROUP' \\"
|
|
110
|
+
echo " --account-name '$ACCOUNT_NAME' \\"
|
|
111
|
+
echo " --database-name '$DATABASE' \\"
|
|
112
|
+
echo " --name '$CONTAINER' \\"
|
|
113
|
+
echo " --ttl 86400 # 24 hours"
|
|
114
|
+
echo ""
|
|
115
|
+
echo "📊 Query Optimization:"
|
|
116
|
+
echo " ✓ Include partition key in WHERE clause when possible"
|
|
117
|
+
echo " ✓ Use composite indexes for multi-property queries"
|
|
118
|
+
echo " ✓ Limit result set size with TOP"
|
|
119
|
+
echo " ✓ Use OFFSET/LIMIT for pagination"
|
|
120
|
+
echo " ✓ Avoid cross-partition queries when possible"
|
|
121
|
+
echo ""
|
|
122
|
+
echo "Example optimized query:"
|
|
123
|
+
echo " SELECT * FROM c"
|
|
124
|
+
echo " WHERE c.userId = 'user123' -- Partition key"
|
|
125
|
+
echo " AND c.timestamp > '2024-01-01'"
|
|
126
|
+
echo " ORDER BY c.timestamp DESC"
|
|
127
|
+
echo " OFFSET 0 LIMIT 20"
|
|
128
|
+
echo ""
|
|
129
|
+
echo "🌍 Global Distribution:"
|
|
130
|
+
echo " ✓ Enable multi-region writes for low latency globally"
|
|
131
|
+
echo " ✓ Use Session consistency for global applications"
|
|
132
|
+
echo " ✓ Configure read regions based on user distribution"
|
|
133
|
+
echo " ✓ Monitor cross-region replication lag"
|
|
134
|
+
echo ""
|
|
135
|
+
echo "💡 Cost Optimization Tips:"
|
|
136
|
+
echo " 1. Right-size RU/s based on actual usage (monitor normalized RU consumption)"
|
|
137
|
+
echo " 2. Use shared database throughput for small containers"
|
|
138
|
+
echo " 3. Implement TTL to automatically remove old data"
|
|
139
|
+
echo " 4. Use serverless for development/test environments"
|
|
140
|
+
echo " 5. Archive cold data to Azure Blob Storage"
|
|
141
|
+
echo " 6. Optimize indexing policy (exclude unused properties)"
|
|
142
|
+
|
|
143
|
+
# Check if container uses composite indexes
|
|
144
|
+
echo ""
|
|
145
|
+
echo "🔍 Checking Indexing Policy:"
|
|
146
|
+
az cosmosdb sql container show \
|
|
147
|
+
--resource-group "$RESOURCE_GROUP" \
|
|
148
|
+
--account-name "$ACCOUNT_NAME" \
|
|
149
|
+
--database-name "$DATABASE" \
|
|
150
|
+
--name "$CONTAINER" \
|
|
151
|
+
--query "resource.indexingPolicy" \
|
|
152
|
+
--output json 2>/dev/null | head -30
|
|
153
|
+
|
|
154
|
+
echo ""
|
|
155
|
+
echo "✅ Cosmos DB RU/s optimization analysis complete"
|
|
156
|
+
echo ""
|
|
157
|
+
echo "📌 Next Steps:"
|
|
158
|
+
echo " 1. Review partition distribution in Azure Portal Metrics"
|
|
159
|
+
echo " 2. Check for hot partitions (> 50% normalized RU consumption)"
|
|
160
|
+
echo " 3. Verify consistency level matches application requirements"
|
|
161
|
+
echo " 4. Implement TTL if not already configured"
|
|
162
|
+
echo " 5. Consider autoscale for variable workloads"
|
|
163
|
+
echo " 6. Monitor query RU charges and optimize high-cost queries"
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# MongoDB sharded collection index consistency check
|
|
3
|
+
# Usage: ./mongodb-shard-check.sh [database] [collection]
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
DB_NAME="${1:-test}"
|
|
8
|
+
COLLECTION="${2:-users}"
|
|
9
|
+
|
|
10
|
+
echo "🔍 Checking MongoDB sharded collection index consistency..."
|
|
11
|
+
echo "Database: $DB_NAME"
|
|
12
|
+
echo "Collection: $COLLECTION"
|
|
13
|
+
|
|
14
|
+
# Create temporary JavaScript file for aggregation pipeline
|
|
15
|
+
TEMP_JS=$(mktemp)
|
|
16
|
+
cat > "$TEMP_JS" << 'EOJS'
|
|
17
|
+
const pipeline = [
|
|
18
|
+
// Get indexes and the shards that they belong to
|
|
19
|
+
{$indexStats: {}},
|
|
20
|
+
// Attach a list of all shards which reported indexes
|
|
21
|
+
{$group: {_id: null, indexDoc: {$push: "$$ROOT"}, allShards: {$addToSet: "$shard"}}},
|
|
22
|
+
// Unwind the generated array back
|
|
23
|
+
{$unwind: "$indexDoc"},
|
|
24
|
+
// Group by index name
|
|
25
|
+
{
|
|
26
|
+
$group: {
|
|
27
|
+
"_id": "$indexDoc.name",
|
|
28
|
+
"shards": {$push: "$indexDoc.shard"},
|
|
29
|
+
"specs": {$push: {$objectToArray: {$ifNull: ["$indexDoc.spec", {}]}}},
|
|
30
|
+
"allShards": {$first: "$allShards"}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
// Compute which indexes are not present on all shards
|
|
34
|
+
{
|
|
35
|
+
$project: {
|
|
36
|
+
missingFromShards: {$setDifference: ["$allShards", "$shards"]},
|
|
37
|
+
inconsistentProperties: {
|
|
38
|
+
$setDifference: [
|
|
39
|
+
{$reduce: {
|
|
40
|
+
input: "$specs",
|
|
41
|
+
initialValue: {$arrayElemAt: ["$specs", 0]},
|
|
42
|
+
in: {$setUnion: ["$$value", "$$this"]}}},
|
|
43
|
+
{$reduce: {
|
|
44
|
+
input: "$specs",
|
|
45
|
+
initialValue: {$arrayElemAt: ["$specs", 0]},
|
|
46
|
+
in: {$setIntersection: ["$$value", "$$this"]}}}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
// Only return inconsistencies
|
|
52
|
+
{
|
|
53
|
+
$match: {
|
|
54
|
+
$expr: {$or: [
|
|
55
|
+
{$gt: [{$size: "$missingFromShards"}, 0]},
|
|
56
|
+
{$gt: [{$size: "$inconsistentProperties"}, 0]}
|
|
57
|
+
]}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
// Output relevant fields
|
|
61
|
+
{$project: {_id: 0, indexName: "$$ROOT._id", inconsistentProperties: 1, missingFromShards: 1}}
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
const result = db.getSiblingDB("$DB_NAME").getCollection("$COLLECTION").aggregate(pipeline);
|
|
65
|
+
|
|
66
|
+
print("\n📊 Index Inconsistency Report:");
|
|
67
|
+
print("================================\n");
|
|
68
|
+
|
|
69
|
+
let found = false;
|
|
70
|
+
result.forEach(doc => {
|
|
71
|
+
found = true;
|
|
72
|
+
print("Index: " + doc.indexName);
|
|
73
|
+
if (doc.missingFromShards && doc.missingFromShards.length > 0) {
|
|
74
|
+
print(" ⚠️ Missing from shards: " + doc.missingFromShards.join(", "));
|
|
75
|
+
}
|
|
76
|
+
if (doc.inconsistentProperties && doc.inconsistentProperties.length > 0) {
|
|
77
|
+
print(" ⚠️ Inconsistent properties detected");
|
|
78
|
+
}
|
|
79
|
+
print("");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (!found) {
|
|
83
|
+
print("✅ No index inconsistencies found - all indexes are consistent across shards\n");
|
|
84
|
+
}
|
|
85
|
+
EOJS
|
|
86
|
+
|
|
87
|
+
# Replace variables in the JavaScript file
|
|
88
|
+
sed -i '' "s/\$DB_NAME/$DB_NAME/g" "$TEMP_JS"
|
|
89
|
+
sed -i '' "s/\$COLLECTION/$COLLECTION/g" "$TEMP_JS"
|
|
90
|
+
|
|
91
|
+
# Execute the aggregation
|
|
92
|
+
mongosh --quiet --file "$TEMP_JS"
|
|
93
|
+
|
|
94
|
+
# Cleanup
|
|
95
|
+
rm "$TEMP_JS"
|
|
96
|
+
|
|
97
|
+
echo ""
|
|
98
|
+
echo "📊 Checking shard distribution..."
|
|
99
|
+
mongosh --quiet --eval "
|
|
100
|
+
db.getSiblingDB('$DB_NAME').getCollection('$COLLECTION').aggregate([
|
|
101
|
+
{\$collStats:{}},
|
|
102
|
+
{\$group: {_id: '\$ns', shard_list: {\$addToSet: '\$shard'}}}
|
|
103
|
+
]).forEach(doc => {
|
|
104
|
+
print('Collection: ' + doc._id);
|
|
105
|
+
print('Shards: ' + doc.shard_list.join(', '));
|
|
106
|
+
});
|
|
107
|
+
"
|
|
108
|
+
|
|
109
|
+
echo ""
|
|
110
|
+
echo "📋 Best practices from Context7 (/mongodb/docs):"
|
|
111
|
+
echo " ✓ Compound indexes should match query filter order"
|
|
112
|
+
echo " ✓ Use \$indexStats to detect inconsistencies in sharded collections"
|
|
113
|
+
echo " ✓ Verify indexes exist on all shards for sharded collections"
|
|
114
|
+
echo " ✓ Use aggregation pipelines for complex queries"
|
|
115
|
+
echo " ✓ Monitor index usage with explain('executionStats')"
|
|
116
|
+
echo " ✓ Create indexes on frequently queried fields"
|
|
117
|
+
echo " ✓ Avoid creating too many indexes (impacts write performance)"
|
|
118
|
+
|
|
119
|
+
echo ""
|
|
120
|
+
echo "✅ MongoDB shard check complete"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PostgreSQL index analysis and optimization
|
|
3
|
+
# Usage: ./postgres-index-analyze.sh [database-name]
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
DB_NAME="${1:-postgres}"
|
|
8
|
+
|
|
9
|
+
echo "🔍 Analyzing PostgreSQL indexes for database: $DB_NAME"
|
|
10
|
+
|
|
11
|
+
# Check for unused indexes
|
|
12
|
+
echo ""
|
|
13
|
+
echo "📊 Checking for unused indexes..."
|
|
14
|
+
psql -d "$DB_NAME" -c "
|
|
15
|
+
SELECT
|
|
16
|
+
schemaname,
|
|
17
|
+
tablename,
|
|
18
|
+
indexname,
|
|
19
|
+
idx_scan as scans,
|
|
20
|
+
pg_size_pretty(pg_relation_size(indexrelid)) as size
|
|
21
|
+
FROM pg_stat_user_indexes
|
|
22
|
+
WHERE idx_scan = 0 AND schemaname = 'public'
|
|
23
|
+
ORDER BY pg_relation_size(indexrelid) DESC
|
|
24
|
+
LIMIT 10;
|
|
25
|
+
"
|
|
26
|
+
|
|
27
|
+
# Check index hit ratio
|
|
28
|
+
echo ""
|
|
29
|
+
echo "📈 Checking index hit ratio..."
|
|
30
|
+
psql -d "$DB_NAME" -c "
|
|
31
|
+
SELECT
|
|
32
|
+
sum(idx_blks_hit) - sum(idx_blks_read) as idx_hit,
|
|
33
|
+
sum(idx_blks_hit) + sum(idx_blks_read) as idx_read,
|
|
34
|
+
CASE WHEN (sum(idx_blks_hit) + sum(idx_blks_read)) = 0 THEN 0
|
|
35
|
+
ELSE round(100.0 * sum(idx_blks_hit) / (sum(idx_blks_hit) + sum(idx_blks_read)), 2)
|
|
36
|
+
END as hit_ratio
|
|
37
|
+
FROM pg_statio_user_indexes;
|
|
38
|
+
"
|
|
39
|
+
|
|
40
|
+
# Show largest tables without indexes
|
|
41
|
+
echo ""
|
|
42
|
+
echo "⚠️ Large tables without indexes..."
|
|
43
|
+
psql -d "$DB_NAME" -c "
|
|
44
|
+
SELECT
|
|
45
|
+
schemaname,
|
|
46
|
+
tablename,
|
|
47
|
+
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as total_size,
|
|
48
|
+
n_tup_ins + n_tup_upd + n_tup_del as modifications
|
|
49
|
+
FROM pg_stat_user_tables
|
|
50
|
+
WHERE schemaname = 'public'
|
|
51
|
+
AND tablename NOT IN (
|
|
52
|
+
SELECT DISTINCT tablename
|
|
53
|
+
FROM pg_indexes
|
|
54
|
+
WHERE schemaname = 'public'
|
|
55
|
+
)
|
|
56
|
+
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
|
|
57
|
+
LIMIT 10;
|
|
58
|
+
"
|
|
59
|
+
|
|
60
|
+
# Check for missing indexes on foreign keys
|
|
61
|
+
echo ""
|
|
62
|
+
echo "🔑 Checking for missing indexes on foreign keys..."
|
|
63
|
+
psql -d "$DB_NAME" -c "
|
|
64
|
+
SELECT
|
|
65
|
+
tc.table_schema,
|
|
66
|
+
tc.table_name,
|
|
67
|
+
kcu.column_name,
|
|
68
|
+
pg_size_pretty(pg_total_relation_size(tc.table_schema||'.'||tc.table_name)) as table_size
|
|
69
|
+
FROM information_schema.table_constraints tc
|
|
70
|
+
JOIN information_schema.key_column_usage kcu
|
|
71
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
72
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
73
|
+
AND NOT EXISTS (
|
|
74
|
+
SELECT 1
|
|
75
|
+
FROM pg_indexes
|
|
76
|
+
WHERE schemaname = tc.table_schema
|
|
77
|
+
AND tablename = tc.table_name
|
|
78
|
+
AND indexdef LIKE '%'||kcu.column_name||'%'
|
|
79
|
+
)
|
|
80
|
+
ORDER BY pg_total_relation_size(tc.table_schema||'.'||tc.table_name) DESC
|
|
81
|
+
LIMIT 10;
|
|
82
|
+
"
|
|
83
|
+
|
|
84
|
+
echo ""
|
|
85
|
+
echo "📋 Best practices from Context7 (/websites/postgresql):"
|
|
86
|
+
echo " ✓ B-tree indexes for equality and range queries"
|
|
87
|
+
echo " ✓ Partial indexes for filtered queries (WHERE clause)"
|
|
88
|
+
echo " ✓ Covering indexes with INCLUDE clause (avoid heap lookups)"
|
|
89
|
+
echo " ✓ CREATE INDEX CONCURRENTLY to avoid table locks"
|
|
90
|
+
echo " ✓ Use EXPLAIN ANALYZE to verify index usage"
|
|
91
|
+
echo " ✓ Monitor pg_stat_user_indexes for index effectiveness"
|
|
92
|
+
echo " ✓ Drop unused indexes to reduce write overhead"
|
|
93
|
+
|
|
94
|
+
echo ""
|
|
95
|
+
echo "✅ PostgreSQL index analysis complete"
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Redis cache statistics and performance analysis
|
|
3
|
+
# Usage: ./redis-cache-stats.sh [host] [port]
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
REDIS_HOST="${1:-localhost}"
|
|
8
|
+
REDIS_PORT="${2:-6379}"
|
|
9
|
+
|
|
10
|
+
echo "📊 Analyzing Redis cache performance..."
|
|
11
|
+
echo "Host: $REDIS_HOST:$REDIS_PORT"
|
|
12
|
+
|
|
13
|
+
# Check connection
|
|
14
|
+
if ! redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" PING > /dev/null 2>&1; then
|
|
15
|
+
echo "❌ Cannot connect to Redis at $REDIS_HOST:$REDIS_PORT"
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Get memory stats
|
|
20
|
+
echo ""
|
|
21
|
+
echo "💾 Memory Statistics:"
|
|
22
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" INFO memory | grep -E "used_memory_human|used_memory_peak_human|mem_fragmentation_ratio|maxmemory_policy"
|
|
23
|
+
|
|
24
|
+
# Get keyspace stats
|
|
25
|
+
echo ""
|
|
26
|
+
echo "🔑 Keyspace Statistics:"
|
|
27
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" INFO keyspace
|
|
28
|
+
|
|
29
|
+
# Get hit/miss ratio
|
|
30
|
+
echo ""
|
|
31
|
+
echo "🎯 Cache Hit/Miss Ratio:"
|
|
32
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" INFO stats | grep -E "keyspace_hits|keyspace_misses" | while read -r line; do
|
|
33
|
+
echo " $line"
|
|
34
|
+
done
|
|
35
|
+
|
|
36
|
+
# Calculate hit rate
|
|
37
|
+
HITS=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" INFO stats | grep "keyspace_hits:" | cut -d: -f2 | tr -d '\r')
|
|
38
|
+
MISSES=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" INFO stats | grep "keyspace_misses:" | cut -d: -f2 | tr -d '\r')
|
|
39
|
+
|
|
40
|
+
if [ -n "$HITS" ] && [ -n "$MISSES" ]; then
|
|
41
|
+
TOTAL=$((HITS + MISSES))
|
|
42
|
+
if [ "$TOTAL" -gt 0 ]; then
|
|
43
|
+
HIT_RATE=$(awk "BEGIN {printf \"%.2f\", ($HITS / $TOTAL) * 100}")
|
|
44
|
+
echo " Hit Rate: $HIT_RATE%"
|
|
45
|
+
|
|
46
|
+
if (( $(echo "$HIT_RATE < 80" | bc -l) )); then
|
|
47
|
+
echo " ⚠️ Hit rate below 80% - consider reviewing cache strategy"
|
|
48
|
+
else
|
|
49
|
+
echo " ✅ Hit rate is healthy (>80%)"
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Check persistence configuration
|
|
55
|
+
echo ""
|
|
56
|
+
echo "💿 Persistence Configuration:"
|
|
57
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" CONFIG GET save | tail -1
|
|
58
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" CONFIG GET appendonly | tail -1
|
|
59
|
+
|
|
60
|
+
# Check for slow log entries
|
|
61
|
+
echo ""
|
|
62
|
+
echo "🐌 Recent Slow Log Entries:"
|
|
63
|
+
SLOW_COUNT=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" SLOWLOG LEN)
|
|
64
|
+
if [ "$SLOW_COUNT" -gt 0 ]; then
|
|
65
|
+
echo " Found $SLOW_COUNT slow log entries"
|
|
66
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" SLOWLOG GET 5
|
|
67
|
+
else
|
|
68
|
+
echo " ✅ No slow log entries"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Check connected clients
|
|
72
|
+
echo ""
|
|
73
|
+
echo "👥 Connected Clients:"
|
|
74
|
+
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" INFO clients | grep "connected_clients:"
|
|
75
|
+
|
|
76
|
+
# Sample key distribution by data type
|
|
77
|
+
echo ""
|
|
78
|
+
echo "📦 Key Distribution by Type:"
|
|
79
|
+
for type in string list set zset hash stream; do
|
|
80
|
+
count=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" --scan --pattern "*" | \
|
|
81
|
+
xargs -I{} redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" TYPE {} | \
|
|
82
|
+
grep -c "^$type$" || echo "0")
|
|
83
|
+
if [ "$count" -gt 0 ]; then
|
|
84
|
+
echo " $type: $count"
|
|
85
|
+
fi
|
|
86
|
+
done
|
|
87
|
+
|
|
88
|
+
echo ""
|
|
89
|
+
echo "📋 Best practices from Context7 (/websites/redis_io):"
|
|
90
|
+
echo " ✓ Client-side caching with placeholder pattern for race condition prevention"
|
|
91
|
+
echo " ✓ Use appropriate data structures:"
|
|
92
|
+
echo " - Hash: For objects with multiple fields"
|
|
93
|
+
echo " - Set: For unique collections, membership tests"
|
|
94
|
+
echo " - Sorted Set: For ranked/scored data, leaderboards"
|
|
95
|
+
echo " - List: For queues, stacks, recent items"
|
|
96
|
+
echo " - String: For simple key-value, counters"
|
|
97
|
+
echo " ✓ Configure persistence: AOF for durability, RDB for snapshots"
|
|
98
|
+
echo " ✓ Set expiration (TTL) on cached items"
|
|
99
|
+
echo " ✓ Monitor memory usage and implement eviction policies"
|
|
100
|
+
echo " ✓ Use pipelining for multiple commands"
|
|
101
|
+
echo " ✓ Avoid KEYS in production (use SCAN instead)"
|
|
102
|
+
echo " ✓ Target cache hit rate > 80%"
|
|
103
|
+
|
|
104
|
+
echo ""
|
|
105
|
+
echo "💡 Cache Strategy Recommendations:"
|
|
106
|
+
if [ -n "$HIT_RATE" ]; then
|
|
107
|
+
if (( $(echo "$HIT_RATE < 80" | bc -l) )); then
|
|
108
|
+
echo " 1. Review TTL settings - may be too short"
|
|
109
|
+
echo " 2. Analyze cache miss patterns"
|
|
110
|
+
echo " 3. Consider warming cache on startup"
|
|
111
|
+
echo " 4. Implement write-through caching where appropriate"
|
|
112
|
+
fi
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
MEMORY_POLICY=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" CONFIG GET maxmemory-policy | tail -1)
|
|
116
|
+
if [ "$MEMORY_POLICY" = "noeviction" ]; then
|
|
117
|
+
echo " ⚠️ Eviction policy is 'noeviction' - consider using LRU or LFU"
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
echo ""
|
|
121
|
+
echo "✅ Redis cache analysis complete"
|