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,768 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testing-standards
|
|
3
|
+
priority: high
|
|
4
|
+
tags:
|
|
5
|
+
- testing
|
|
6
|
+
- tdd
|
|
7
|
+
- quality
|
|
8
|
+
- coverage
|
|
9
|
+
appliesTo:
|
|
10
|
+
- commands
|
|
11
|
+
- agents
|
|
12
|
+
enforcesOn:
|
|
13
|
+
- python-backend-engineer
|
|
14
|
+
- python-backend-expert
|
|
15
|
+
- nodejs-backend-engineer
|
|
16
|
+
- javascript-frontend-engineer
|
|
17
|
+
- bash-scripting-expert
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Testing Standards Rule
|
|
21
|
+
|
|
22
|
+
**MANDATORY**: All code MUST follow Test-Driven Development (TDD) methodology with comprehensive test coverage.
|
|
23
|
+
|
|
24
|
+
## Purpose
|
|
25
|
+
|
|
26
|
+
Ensure reliable, maintainable code through:
|
|
27
|
+
- Test-First Development (TDD)
|
|
28
|
+
- Comprehensive test coverage (>80%)
|
|
29
|
+
- Multiple test layers (unit, integration, E2E)
|
|
30
|
+
- Language-specific testing best practices
|
|
31
|
+
- Automated test execution
|
|
32
|
+
|
|
33
|
+
## Test-Driven Development (TDD) Workflow
|
|
34
|
+
|
|
35
|
+
### Red-Green-Refactor Cycle (MANDATORY)
|
|
36
|
+
|
|
37
|
+
**1. RED - Write Failing Test First**
|
|
38
|
+
```
|
|
39
|
+
Write a test that fails ❌
|
|
40
|
+
↓
|
|
41
|
+
Verify the test fails for the right reason
|
|
42
|
+
↓
|
|
43
|
+
Commit the failing test
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**2. GREEN - Make it Pass**
|
|
47
|
+
```
|
|
48
|
+
Write minimal code to pass the test ✅
|
|
49
|
+
↓
|
|
50
|
+
Run tests and verify all pass
|
|
51
|
+
↓
|
|
52
|
+
Commit the passing code
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**3. REFACTOR - Improve Code**
|
|
56
|
+
```
|
|
57
|
+
Improve code quality 🔄
|
|
58
|
+
↓
|
|
59
|
+
Ensure all tests still pass
|
|
60
|
+
↓
|
|
61
|
+
Commit the refactoring
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### TDD Principles
|
|
65
|
+
|
|
66
|
+
- **Test-First**: Always write test before implementation
|
|
67
|
+
- **One Test at a Time**: Focus on single functionality
|
|
68
|
+
- **Minimal Code**: Write only enough code to pass
|
|
69
|
+
- **Refactor Safely**: Improve with test safety net
|
|
70
|
+
- **Fast Feedback**: Run tests continuously
|
|
71
|
+
|
|
72
|
+
## Language-Specific Testing Standards
|
|
73
|
+
|
|
74
|
+
### Python Testing (pytest)
|
|
75
|
+
|
|
76
|
+
**Test Structure:**
|
|
77
|
+
```python
|
|
78
|
+
# tests/test_user_service.py
|
|
79
|
+
import pytest
|
|
80
|
+
from app.services.user_service import UserService
|
|
81
|
+
from app.models.user import User
|
|
82
|
+
|
|
83
|
+
class TestUserService:
|
|
84
|
+
"""Test suite for UserService."""
|
|
85
|
+
|
|
86
|
+
# TDD Step 1: RED - Write failing test first
|
|
87
|
+
@pytest.mark.asyncio
|
|
88
|
+
async def test_create_user_success(self, user_service, db_session):
|
|
89
|
+
"""
|
|
90
|
+
GIVEN valid user data
|
|
91
|
+
WHEN creating a new user
|
|
92
|
+
THEN user is created and returned with ID
|
|
93
|
+
"""
|
|
94
|
+
# Arrange
|
|
95
|
+
user_data = {
|
|
96
|
+
"email": "test@example.com",
|
|
97
|
+
"username": "testuser",
|
|
98
|
+
"password": "securepass123"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# Act
|
|
102
|
+
user = await user_service.create_user(user_data)
|
|
103
|
+
|
|
104
|
+
# Assert
|
|
105
|
+
assert user.id is not None
|
|
106
|
+
assert user.email == "test@example.com"
|
|
107
|
+
assert user.username == "testuser"
|
|
108
|
+
assert user.password != "securepass123" # Should be hashed
|
|
109
|
+
|
|
110
|
+
@pytest.mark.asyncio
|
|
111
|
+
async def test_create_user_duplicate_email(self, user_service, db_session):
|
|
112
|
+
"""
|
|
113
|
+
GIVEN existing user with email
|
|
114
|
+
WHEN creating user with same email
|
|
115
|
+
THEN raises ValueError
|
|
116
|
+
"""
|
|
117
|
+
# Arrange
|
|
118
|
+
existing_user = {"email": "test@example.com", "username": "user1"}
|
|
119
|
+
await user_service.create_user(existing_user)
|
|
120
|
+
|
|
121
|
+
# Act & Assert
|
|
122
|
+
with pytest.raises(ValueError, match="Email already exists"):
|
|
123
|
+
await user_service.create_user({
|
|
124
|
+
"email": "test@example.com",
|
|
125
|
+
"username": "user2"
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
# Fixtures for test setup
|
|
129
|
+
@pytest.fixture
|
|
130
|
+
async def user_service(db_session):
|
|
131
|
+
"""Create UserService instance with test database."""
|
|
132
|
+
return UserService(db_session)
|
|
133
|
+
|
|
134
|
+
@pytest.fixture
|
|
135
|
+
async def db_session():
|
|
136
|
+
"""Create test database session."""
|
|
137
|
+
# Setup
|
|
138
|
+
async with async_session_maker() as session:
|
|
139
|
+
yield session
|
|
140
|
+
# Teardown
|
|
141
|
+
await session.rollback()
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**pytest Configuration:**
|
|
145
|
+
```toml
|
|
146
|
+
# pyproject.toml
|
|
147
|
+
[tool.pytest.ini_options]
|
|
148
|
+
testpaths = ["tests"]
|
|
149
|
+
python_files = "test_*.py"
|
|
150
|
+
python_classes = "Test*"
|
|
151
|
+
python_functions = "test_*"
|
|
152
|
+
addopts = [
|
|
153
|
+
"--cov=app",
|
|
154
|
+
"--cov-report=html",
|
|
155
|
+
"--cov-report=term-missing",
|
|
156
|
+
"--cov-fail-under=80",
|
|
157
|
+
"-v",
|
|
158
|
+
"--tb=short",
|
|
159
|
+
"--strict-markers",
|
|
160
|
+
"--asyncio-mode=auto"
|
|
161
|
+
]
|
|
162
|
+
markers = [
|
|
163
|
+
"unit: Unit tests",
|
|
164
|
+
"integration: Integration tests",
|
|
165
|
+
"e2e: End-to-end tests",
|
|
166
|
+
"slow: Slow running tests"
|
|
167
|
+
]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Coverage Requirements:**
|
|
171
|
+
- **Minimum**: 80% overall coverage
|
|
172
|
+
- **Critical paths**: 100% coverage
|
|
173
|
+
- **Branch coverage**: Enabled
|
|
174
|
+
- **Report**: HTML + Terminal
|
|
175
|
+
|
|
176
|
+
### JavaScript/TypeScript Testing (Jest/Vitest)
|
|
177
|
+
|
|
178
|
+
**Test Structure:**
|
|
179
|
+
```typescript
|
|
180
|
+
// tests/user.service.test.ts
|
|
181
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
182
|
+
import { UserService } from '@/services/user.service';
|
|
183
|
+
import { User } from '@/models/user.model';
|
|
184
|
+
|
|
185
|
+
describe('UserService', () => {
|
|
186
|
+
let userService: UserService;
|
|
187
|
+
let mockRepository: any;
|
|
188
|
+
|
|
189
|
+
beforeEach(() => {
|
|
190
|
+
// Setup fresh mocks for each test
|
|
191
|
+
mockRepository = {
|
|
192
|
+
findById: vi.fn(),
|
|
193
|
+
create: vi.fn(),
|
|
194
|
+
update: vi.fn(),
|
|
195
|
+
delete: vi.fn(),
|
|
196
|
+
};
|
|
197
|
+
userService = new UserService(mockRepository);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// TDD Step 1: RED - Write failing test
|
|
201
|
+
describe('createUser', () => {
|
|
202
|
+
it('should create user with hashed password', async () => {
|
|
203
|
+
// Arrange
|
|
204
|
+
const userData = {
|
|
205
|
+
email: 'test@example.com',
|
|
206
|
+
username: 'testuser',
|
|
207
|
+
password: 'securepass123',
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const expectedUser = {
|
|
211
|
+
id: 1,
|
|
212
|
+
email: userData.email,
|
|
213
|
+
username: userData.username,
|
|
214
|
+
password: 'hashed_password',
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
mockRepository.create.mockResolvedValue(expectedUser);
|
|
218
|
+
|
|
219
|
+
// Act
|
|
220
|
+
const result = await userService.createUser(userData);
|
|
221
|
+
|
|
222
|
+
// Assert
|
|
223
|
+
expect(result.id).toBeDefined();
|
|
224
|
+
expect(result.email).toBe(userData.email);
|
|
225
|
+
expect(result.password).not.toBe(userData.password);
|
|
226
|
+
expect(mockRepository.create).toHaveBeenCalledTimes(1);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('should throw error for duplicate email', async () => {
|
|
230
|
+
// Arrange
|
|
231
|
+
const userData = { email: 'test@example.com', username: 'user' };
|
|
232
|
+
mockRepository.create.mockRejectedValue(
|
|
233
|
+
new Error('Email already exists')
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
// Act & Assert
|
|
237
|
+
await expect(userService.createUser(userData)).rejects.toThrow(
|
|
238
|
+
'Email already exists'
|
|
239
|
+
);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// Integration test example
|
|
244
|
+
describe('Integration: User workflow', () => {
|
|
245
|
+
it('should complete full user lifecycle', async () => {
|
|
246
|
+
// Create → Read → Update → Delete
|
|
247
|
+
const user = await userService.createUser({ /* data */ });
|
|
248
|
+
const found = await userService.findById(user.id);
|
|
249
|
+
const updated = await userService.update(user.id, { /* updates */ });
|
|
250
|
+
await userService.delete(user.id);
|
|
251
|
+
|
|
252
|
+
expect(found).toBeDefined();
|
|
253
|
+
expect(updated.email).toBe(/* expected */);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Jest/Vitest Configuration:**
|
|
260
|
+
```typescript
|
|
261
|
+
// vitest.config.ts
|
|
262
|
+
import { defineConfig } from 'vitest/config';
|
|
263
|
+
|
|
264
|
+
export default defineConfig({
|
|
265
|
+
test: {
|
|
266
|
+
globals: true,
|
|
267
|
+
environment: 'node',
|
|
268
|
+
coverage: {
|
|
269
|
+
provider: 'v8',
|
|
270
|
+
reporter: ['text', 'html', 'lcov'],
|
|
271
|
+
exclude: [
|
|
272
|
+
'node_modules/',
|
|
273
|
+
'tests/',
|
|
274
|
+
'**/*.test.ts',
|
|
275
|
+
'**/*.spec.ts',
|
|
276
|
+
],
|
|
277
|
+
statements: 80,
|
|
278
|
+
branches: 80,
|
|
279
|
+
functions: 80,
|
|
280
|
+
lines: 80,
|
|
281
|
+
},
|
|
282
|
+
include: ['tests/**/*.test.ts'],
|
|
283
|
+
setupFiles: ['./tests/setup.ts'],
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Node.js API Testing (Supertest)
|
|
289
|
+
|
|
290
|
+
**API Test Structure:**
|
|
291
|
+
```typescript
|
|
292
|
+
// tests/api/users.test.ts
|
|
293
|
+
import request from 'supertest';
|
|
294
|
+
import { app } from '@/app';
|
|
295
|
+
import { setupTestDB, cleanupTestDB } from './helpers/db';
|
|
296
|
+
|
|
297
|
+
describe('User API', () => {
|
|
298
|
+
beforeAll(async () => {
|
|
299
|
+
await setupTestDB();
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
afterAll(async () => {
|
|
303
|
+
await cleanupTestDB();
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
describe('POST /api/users', () => {
|
|
307
|
+
it('should create new user', async () => {
|
|
308
|
+
const response = await request(app)
|
|
309
|
+
.post('/api/users')
|
|
310
|
+
.send({
|
|
311
|
+
email: 'test@example.com',
|
|
312
|
+
username: 'testuser',
|
|
313
|
+
password: 'password123',
|
|
314
|
+
})
|
|
315
|
+
.expect(201);
|
|
316
|
+
|
|
317
|
+
expect(response.body).toHaveProperty('id');
|
|
318
|
+
expect(response.body.email).toBe('test@example.com');
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('should return 400 for invalid email', async () => {
|
|
322
|
+
await request(app)
|
|
323
|
+
.post('/api/users')
|
|
324
|
+
.send({
|
|
325
|
+
email: 'invalid-email',
|
|
326
|
+
username: 'testuser',
|
|
327
|
+
})
|
|
328
|
+
.expect(400);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('should return 409 for duplicate email', async () => {
|
|
332
|
+
// First request succeeds
|
|
333
|
+
await request(app)
|
|
334
|
+
.post('/api/users')
|
|
335
|
+
.send({ email: 'test@example.com', username: 'user1' })
|
|
336
|
+
.expect(201);
|
|
337
|
+
|
|
338
|
+
// Second request fails
|
|
339
|
+
await request(app)
|
|
340
|
+
.post('/api/users')
|
|
341
|
+
.send({ email: 'test@example.com', username: 'user2' })
|
|
342
|
+
.expect(409);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
describe('GET /api/users/:id', () => {
|
|
347
|
+
it('should return user by id', async () => {
|
|
348
|
+
// Create user first
|
|
349
|
+
const createResponse = await request(app)
|
|
350
|
+
.post('/api/users')
|
|
351
|
+
.send({ email: 'get@example.com', username: 'getuser' });
|
|
352
|
+
|
|
353
|
+
const userId = createResponse.body.id;
|
|
354
|
+
|
|
355
|
+
// Get user
|
|
356
|
+
const response = await request(app)
|
|
357
|
+
.get(`/api/users/${userId}`)
|
|
358
|
+
.expect(200);
|
|
359
|
+
|
|
360
|
+
expect(response.body.id).toBe(userId);
|
|
361
|
+
expect(response.body.email).toBe('get@example.com');
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
it('should return 404 for non-existent user', async () => {
|
|
365
|
+
await request(app)
|
|
366
|
+
.get('/api/users/99999')
|
|
367
|
+
.expect(404);
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Bash Script Testing (bats)
|
|
374
|
+
|
|
375
|
+
**Test Structure:**
|
|
376
|
+
```bash
|
|
377
|
+
#!/usr/bin/env bats
|
|
378
|
+
# tests/deploy.bats
|
|
379
|
+
|
|
380
|
+
setup() {
|
|
381
|
+
# Test setup
|
|
382
|
+
export TEST_DIR="$(mktemp -d)"
|
|
383
|
+
source ./scripts/deploy.sh
|
|
384
|
+
|
|
385
|
+
# Mock functions
|
|
386
|
+
git() {
|
|
387
|
+
echo "git $*" >> "$TEST_DIR/git.log"
|
|
388
|
+
return 0
|
|
389
|
+
}
|
|
390
|
+
export -f git
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
teardown() {
|
|
394
|
+
# Cleanup
|
|
395
|
+
rm -rf "$TEST_DIR"
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
@test "validate_environment accepts valid env" {
|
|
399
|
+
run validate_environment "production"
|
|
400
|
+
[ "$status" -eq 0 ]
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
@test "validate_environment rejects invalid env" {
|
|
404
|
+
run validate_environment "invalid"
|
|
405
|
+
[ "$status" -eq 1 ]
|
|
406
|
+
[[ "$output" =~ "Invalid environment" ]]
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
@test "check_dependencies finds all required commands" {
|
|
410
|
+
# Mock command availability
|
|
411
|
+
function command() {
|
|
412
|
+
case "$2" in
|
|
413
|
+
git|docker|curl) return 0 ;;
|
|
414
|
+
*) return 1 ;;
|
|
415
|
+
esac
|
|
416
|
+
}
|
|
417
|
+
export -f command
|
|
418
|
+
|
|
419
|
+
run check_dependencies
|
|
420
|
+
[ "$status" -eq 0 ]
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
@test "deploy creates backup before deployment" {
|
|
424
|
+
run deploy "staging"
|
|
425
|
+
|
|
426
|
+
[ "$status" -eq 0 ]
|
|
427
|
+
[ -f "$TEST_DIR/backup.tar.gz" ]
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
@test "rollback restores previous version on failure" {
|
|
431
|
+
# Simulate deployment failure
|
|
432
|
+
function deploy_new_version() {
|
|
433
|
+
return 1
|
|
434
|
+
}
|
|
435
|
+
export -f deploy_new_version
|
|
436
|
+
|
|
437
|
+
run main "production"
|
|
438
|
+
|
|
439
|
+
[ "$status" -eq 1 ]
|
|
440
|
+
[[ "$output" =~ "Rolling back" ]]
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
**bats Configuration:**
|
|
445
|
+
```bash
|
|
446
|
+
# tests/test_helper.bash
|
|
447
|
+
# Common test utilities
|
|
448
|
+
|
|
449
|
+
load '/usr/local/lib/bats-support/load.bash'
|
|
450
|
+
load '/usr/local/lib/bats-assert/load.bash'
|
|
451
|
+
|
|
452
|
+
# Setup test environment
|
|
453
|
+
setup_test_env() {
|
|
454
|
+
export TEST_DIR="$(mktemp -d)"
|
|
455
|
+
export LOG_FILE="$TEST_DIR/test.log"
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
# Cleanup test environment
|
|
459
|
+
cleanup_test_env() {
|
|
460
|
+
rm -rf "$TEST_DIR"
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
# Assert file exists
|
|
464
|
+
assert_file_exists() {
|
|
465
|
+
[ -f "$1" ] || fail "File does not exist: $1"
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
# Assert command succeeds
|
|
469
|
+
assert_success() {
|
|
470
|
+
run "$@"
|
|
471
|
+
assert_equal "$status" 0
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
## Test Categories
|
|
476
|
+
|
|
477
|
+
### Unit Tests
|
|
478
|
+
|
|
479
|
+
**Characteristics:**
|
|
480
|
+
- Test single function/method
|
|
481
|
+
- No external dependencies
|
|
482
|
+
- Fast execution (<100ms per test)
|
|
483
|
+
- Mock all I/O operations
|
|
484
|
+
- High coverage (>90%)
|
|
485
|
+
|
|
486
|
+
**What to Test:**
|
|
487
|
+
- Business logic
|
|
488
|
+
- Data transformations
|
|
489
|
+
- Validation logic
|
|
490
|
+
- Error handling
|
|
491
|
+
- Edge cases
|
|
492
|
+
|
|
493
|
+
### Integration Tests
|
|
494
|
+
|
|
495
|
+
**Characteristics:**
|
|
496
|
+
- Test component interactions
|
|
497
|
+
- Real database connections
|
|
498
|
+
- API calls to external services
|
|
499
|
+
- Moderate execution time (<5s per test)
|
|
500
|
+
- Medium coverage (>70%)
|
|
501
|
+
|
|
502
|
+
**What to Test:**
|
|
503
|
+
- Database operations
|
|
504
|
+
- API endpoints
|
|
505
|
+
- Service integrations
|
|
506
|
+
- Authentication flows
|
|
507
|
+
- Authorization logic
|
|
508
|
+
|
|
509
|
+
### End-to-End (E2E) Tests
|
|
510
|
+
|
|
511
|
+
**Characteristics:**
|
|
512
|
+
- Test complete workflows
|
|
513
|
+
- Real infrastructure
|
|
514
|
+
- User-facing scenarios
|
|
515
|
+
- Slow execution (<30s per test)
|
|
516
|
+
- Lower coverage (~20 critical paths)
|
|
517
|
+
|
|
518
|
+
**What to Test:**
|
|
519
|
+
- User registration flow
|
|
520
|
+
- Login/logout workflow
|
|
521
|
+
- Critical business processes
|
|
522
|
+
- Payment workflows
|
|
523
|
+
- Data migration scenarios
|
|
524
|
+
|
|
525
|
+
## Test Naming Conventions
|
|
526
|
+
|
|
527
|
+
### Python (pytest)
|
|
528
|
+
```python
|
|
529
|
+
def test_<function>_<scenario>_<expected_result>():
|
|
530
|
+
"""
|
|
531
|
+
GIVEN <context>
|
|
532
|
+
WHEN <action>
|
|
533
|
+
THEN <expected_outcome>
|
|
534
|
+
"""
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
**Examples:**
|
|
538
|
+
- `test_create_user_with_valid_data_returns_user_with_id()`
|
|
539
|
+
- `test_update_user_with_invalid_email_raises_value_error()`
|
|
540
|
+
- `test_delete_user_that_does_not_exist_raises_not_found_error()`
|
|
541
|
+
|
|
542
|
+
### JavaScript/TypeScript (Jest/Vitest)
|
|
543
|
+
```typescript
|
|
544
|
+
describe('<Component/Function>', () => {
|
|
545
|
+
it('should <expected behavior> when <condition>', () => {
|
|
546
|
+
// Test
|
|
547
|
+
});
|
|
548
|
+
});
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
**Examples:**
|
|
552
|
+
- `it('should return user when valid ID provided')`
|
|
553
|
+
- `it('should throw error when email already exists')`
|
|
554
|
+
- `it('should hash password before storing')`
|
|
555
|
+
|
|
556
|
+
### Bash (bats)
|
|
557
|
+
```bash
|
|
558
|
+
@test "<command> <scenario> <expected result>" {
|
|
559
|
+
# Test
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**Examples:**
|
|
564
|
+
- `@test "validate_input accepts valid email"`
|
|
565
|
+
- `@test "deploy fails with exit code 1 on error"`
|
|
566
|
+
- `@test "cleanup removes all temp files"`
|
|
567
|
+
|
|
568
|
+
## Coverage Requirements
|
|
569
|
+
|
|
570
|
+
### Minimum Thresholds
|
|
571
|
+
|
|
572
|
+
```yaml
|
|
573
|
+
coverage:
|
|
574
|
+
statements: 80
|
|
575
|
+
branches: 80
|
|
576
|
+
functions: 80
|
|
577
|
+
lines: 80
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
### Critical Paths (100% Coverage Required)
|
|
581
|
+
|
|
582
|
+
- Authentication and authorization
|
|
583
|
+
- Payment processing
|
|
584
|
+
- Data validation
|
|
585
|
+
- Security-sensitive operations
|
|
586
|
+
- Data persistence
|
|
587
|
+
- Error handling
|
|
588
|
+
|
|
589
|
+
### Excluded from Coverage
|
|
590
|
+
|
|
591
|
+
- Generated code
|
|
592
|
+
- Configuration files
|
|
593
|
+
- Test fixtures
|
|
594
|
+
- Third-party code
|
|
595
|
+
- Deprecated code
|
|
596
|
+
|
|
597
|
+
## Test Execution
|
|
598
|
+
|
|
599
|
+
### Local Development
|
|
600
|
+
|
|
601
|
+
```bash
|
|
602
|
+
# Python
|
|
603
|
+
pytest # Run all tests
|
|
604
|
+
pytest -v # Verbose output
|
|
605
|
+
pytest -k "test_user" # Run specific tests
|
|
606
|
+
pytest --cov # With coverage
|
|
607
|
+
pytest -m unit # Run only unit tests
|
|
608
|
+
|
|
609
|
+
# JavaScript/TypeScript
|
|
610
|
+
npm test # Run all tests
|
|
611
|
+
npm run test:watch # Watch mode
|
|
612
|
+
npm run test:coverage # With coverage
|
|
613
|
+
npm run test:unit # Unit tests only
|
|
614
|
+
|
|
615
|
+
# Bash
|
|
616
|
+
bats tests/ # Run all tests
|
|
617
|
+
bats tests/deploy.bats # Specific file
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
### CI/CD Pipeline
|
|
621
|
+
|
|
622
|
+
```yaml
|
|
623
|
+
# .github/workflows/test.yml
|
|
624
|
+
name: Tests
|
|
625
|
+
|
|
626
|
+
on: [push, pull_request]
|
|
627
|
+
|
|
628
|
+
jobs:
|
|
629
|
+
test:
|
|
630
|
+
runs-on: ubuntu-latest
|
|
631
|
+
|
|
632
|
+
steps:
|
|
633
|
+
- uses: actions/checkout@v3
|
|
634
|
+
|
|
635
|
+
- name: Run tests
|
|
636
|
+
run: |
|
|
637
|
+
npm install
|
|
638
|
+
npm run test:coverage
|
|
639
|
+
|
|
640
|
+
- name: Upload coverage
|
|
641
|
+
uses: codecov/codecov-action@v3
|
|
642
|
+
with:
|
|
643
|
+
file: ./coverage/lcov.info
|
|
644
|
+
|
|
645
|
+
- name: Check coverage threshold
|
|
646
|
+
run: |
|
|
647
|
+
if [ $(cat coverage/coverage-summary.json | jq '.total.statements.pct') -lt 80 ]; then
|
|
648
|
+
echo "Coverage below 80%"
|
|
649
|
+
exit 1
|
|
650
|
+
fi
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
## Continuous Testing
|
|
654
|
+
|
|
655
|
+
### Watch Mode
|
|
656
|
+
- Run tests automatically on file changes
|
|
657
|
+
- Immediate feedback during development
|
|
658
|
+
- Faster red-green-refactor cycles
|
|
659
|
+
|
|
660
|
+
### Pre-commit Hooks
|
|
661
|
+
```bash
|
|
662
|
+
# .husky/pre-commit
|
|
663
|
+
#!/bin/sh
|
|
664
|
+
npm run test:staged # Run tests for staged files only
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
### Pre-push Hooks
|
|
668
|
+
```bash
|
|
669
|
+
# .husky/pre-push
|
|
670
|
+
#!/bin/sh
|
|
671
|
+
npm run test:all # Run full test suite
|
|
672
|
+
npm run test:coverage # Verify coverage
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
## Test Data Management
|
|
676
|
+
|
|
677
|
+
### Fixtures
|
|
678
|
+
- Use factories for test data creation
|
|
679
|
+
- Keep fixtures minimal and focused
|
|
680
|
+
- Use realistic but safe test data
|
|
681
|
+
- Reset state between tests
|
|
682
|
+
|
|
683
|
+
### Mocking
|
|
684
|
+
- Mock external services
|
|
685
|
+
- Mock slow operations
|
|
686
|
+
- Mock non-deterministic behavior
|
|
687
|
+
- Keep mocks simple and maintainable
|
|
688
|
+
|
|
689
|
+
### Test Databases
|
|
690
|
+
- Use separate test database
|
|
691
|
+
- Reset before each test suite
|
|
692
|
+
- Seed with minimal data
|
|
693
|
+
- Clean up after tests
|
|
694
|
+
|
|
695
|
+
## Performance Targets
|
|
696
|
+
|
|
697
|
+
### Test Execution Speed
|
|
698
|
+
|
|
699
|
+
```
|
|
700
|
+
Unit tests: < 100ms per test
|
|
701
|
+
Integration tests: < 5s per test
|
|
702
|
+
E2E tests: < 30s per test
|
|
703
|
+
Full suite: < 5 minutes
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### Optimization Strategies
|
|
707
|
+
|
|
708
|
+
- Parallelize test execution
|
|
709
|
+
- Use test database transactions
|
|
710
|
+
- Mock slow external services
|
|
711
|
+
- Cache test dependencies
|
|
712
|
+
- Run fast tests first
|
|
713
|
+
|
|
714
|
+
## Enforcement
|
|
715
|
+
|
|
716
|
+
### Blocked Actions
|
|
717
|
+
|
|
718
|
+
- **Cannot merge**: If tests fail
|
|
719
|
+
- **Cannot deploy**: If coverage below threshold
|
|
720
|
+
- **Cannot commit**: If test syntax invalid (pre-commit hook)
|
|
721
|
+
|
|
722
|
+
### Quality Gates
|
|
723
|
+
|
|
724
|
+
```yaml
|
|
725
|
+
gates:
|
|
726
|
+
- name: Tests
|
|
727
|
+
condition: all_pass
|
|
728
|
+
required: true
|
|
729
|
+
|
|
730
|
+
- name: Coverage
|
|
731
|
+
condition: ">= 80%"
|
|
732
|
+
required: true
|
|
733
|
+
|
|
734
|
+
- name: Performance
|
|
735
|
+
condition: "< 5 minutes"
|
|
736
|
+
required: true
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
## Monitoring
|
|
740
|
+
|
|
741
|
+
### Metrics
|
|
742
|
+
|
|
743
|
+
- Test count (should grow with codebase)
|
|
744
|
+
- Test execution time (should stay under threshold)
|
|
745
|
+
- Test flakiness rate (should be <1%)
|
|
746
|
+
- Coverage percentage (should be >80%)
|
|
747
|
+
|
|
748
|
+
### Reports
|
|
749
|
+
|
|
750
|
+
- Daily: Test execution summary
|
|
751
|
+
- Weekly: Coverage trends
|
|
752
|
+
- Monthly: Flaky test analysis
|
|
753
|
+
- Quarterly: Test suite health review
|
|
754
|
+
|
|
755
|
+
## References
|
|
756
|
+
|
|
757
|
+
- Python: [pytest Documentation](https://docs.pytest.org/)
|
|
758
|
+
- JavaScript: [Jest](https://jestjs.io/), [Vitest](https://vitest.dev/)
|
|
759
|
+
- Node.js: [Supertest](https://github.com/visionmedia/supertest)
|
|
760
|
+
- Bash: [bats](https://github.com/bats-core/bats-core)
|
|
761
|
+
- TDD: [Test-Driven Development](https://martinfowler.com/bliki/TestDrivenDevelopment.html)
|
|
762
|
+
|
|
763
|
+
---
|
|
764
|
+
|
|
765
|
+
**Enforcement Level**: MANDATORY
|
|
766
|
+
**Review Frequency**: Every commit
|
|
767
|
+
**Last Updated**: 2025-01-15
|
|
768
|
+
**TDD Required**: ✅ Red-Green-Refactor cycle mandatory for all code
|