claude-autopm 2.8.2 → 2.8.3
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/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,581 @@
|
|
|
1
|
+
# Test Coverage Requirements Rule
|
|
2
|
+
|
|
3
|
+
**Rule Name**: test-coverage-requirements
|
|
4
|
+
**Priority**: High
|
|
5
|
+
**Applies To**: commands, agents
|
|
6
|
+
**Enforces On**: frontend-testing-engineer
|
|
7
|
+
|
|
8
|
+
## Description
|
|
9
|
+
|
|
10
|
+
Test coverage thresholds and quality metrics enforcement. This rule defines mandatory coverage requirements for all code changes and ensures coverage metrics meet industry standards based on Context7-verified best practices.
|
|
11
|
+
|
|
12
|
+
## Context7 Documentation Sources
|
|
13
|
+
|
|
14
|
+
**MANDATORY:** Coverage requirements based on these Context7 sources:
|
|
15
|
+
|
|
16
|
+
- `/vitest-dev/vitest` - Coverage configuration and thresholds
|
|
17
|
+
- `/testing-library/testing-library-docs` - Test quality metrics
|
|
18
|
+
- `/istanbul/istanbuljs` - Coverage reporting standards
|
|
19
|
+
- `/c8/c8` - V8 coverage provider patterns
|
|
20
|
+
|
|
21
|
+
## Coverage Thresholds
|
|
22
|
+
|
|
23
|
+
### Global Thresholds (MANDATORY)
|
|
24
|
+
|
|
25
|
+
**All new code must meet these minimum thresholds:**
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
// vitest.config.js or jest.config.js
|
|
29
|
+
export default {
|
|
30
|
+
test: {
|
|
31
|
+
coverage: {
|
|
32
|
+
provider: 'v8', // or 'istanbul'
|
|
33
|
+
|
|
34
|
+
// MANDATORY minimum thresholds
|
|
35
|
+
thresholds: {
|
|
36
|
+
lines: 80, // 80% of lines must be covered
|
|
37
|
+
functions: 80, // 80% of functions must be tested
|
|
38
|
+
branches: 75, // 75% of branches must be covered
|
|
39
|
+
statements: 80 // 80% of statements must be executed
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
// Fail tests if thresholds not met
|
|
43
|
+
reporter: ['text', 'json', 'html', 'lcov'],
|
|
44
|
+
|
|
45
|
+
// Include only source code
|
|
46
|
+
include: ['src/**/*.{js,jsx,ts,tsx}'],
|
|
47
|
+
|
|
48
|
+
// Exclude non-testable code
|
|
49
|
+
exclude: [
|
|
50
|
+
'node_modules/',
|
|
51
|
+
'test/',
|
|
52
|
+
'**/*.config.js',
|
|
53
|
+
'**/*.spec.js',
|
|
54
|
+
'**/*.test.js',
|
|
55
|
+
'src/main.{js,ts}',
|
|
56
|
+
'src/index.{js,ts}',
|
|
57
|
+
'src/**/*.d.ts'
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Per-Directory Thresholds (RECOMMENDED)
|
|
65
|
+
|
|
66
|
+
**Critical directories require higher coverage:**
|
|
67
|
+
|
|
68
|
+
```javascript
|
|
69
|
+
// Higher thresholds for critical code
|
|
70
|
+
coverage: {
|
|
71
|
+
thresholds: {
|
|
72
|
+
// Global minimum
|
|
73
|
+
global: {
|
|
74
|
+
lines: 80,
|
|
75
|
+
functions: 80,
|
|
76
|
+
branches: 75,
|
|
77
|
+
statements: 80
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
// Critical business logic - higher standards
|
|
81
|
+
'./src/services/': {
|
|
82
|
+
lines: 90,
|
|
83
|
+
functions: 90,
|
|
84
|
+
branches: 85,
|
|
85
|
+
statements: 90
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// UI components - focus on user interactions
|
|
89
|
+
'./src/components/': {
|
|
90
|
+
lines: 85,
|
|
91
|
+
functions: 85,
|
|
92
|
+
branches: 80,
|
|
93
|
+
statements: 85
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
// Utilities - comprehensive coverage
|
|
97
|
+
'./src/utils/': {
|
|
98
|
+
lines: 95,
|
|
99
|
+
functions: 95,
|
|
100
|
+
branches: 90,
|
|
101
|
+
statements: 95
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Coverage Quality Standards
|
|
108
|
+
|
|
109
|
+
### Lines vs. Branches
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
Understanding Coverage Metrics:
|
|
113
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
114
|
+
|
|
115
|
+
📊 Line Coverage: Were all lines executed?
|
|
116
|
+
- ✅ Good indicator of basic coverage
|
|
117
|
+
- ❌ Doesn't ensure all paths tested
|
|
118
|
+
|
|
119
|
+
📊 Branch Coverage: Were all code paths tested?
|
|
120
|
+
- ✅ Tests if/else, switch, ternary operators
|
|
121
|
+
- ✅ Better indicator of thorough testing
|
|
122
|
+
- ⚠️ More important than line coverage
|
|
123
|
+
|
|
124
|
+
📊 Function Coverage: Were all functions called?
|
|
125
|
+
- ✅ Ensures no dead code
|
|
126
|
+
- ✅ Validates all exports are used
|
|
127
|
+
|
|
128
|
+
📊 Statement Coverage: Were all statements executed?
|
|
129
|
+
- ✅ Similar to line coverage
|
|
130
|
+
- ✅ More granular (multiple statements per line)
|
|
131
|
+
|
|
132
|
+
💡 Priority: Branch > Functions > Lines > Statements
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Example: Why Branch Coverage Matters
|
|
136
|
+
|
|
137
|
+
```javascript
|
|
138
|
+
// Function with 100% line coverage but poor branch coverage
|
|
139
|
+
function processUser(user) {
|
|
140
|
+
if (user.isActive) {
|
|
141
|
+
return user.name; // Line covered ✓
|
|
142
|
+
} else {
|
|
143
|
+
return 'Inactive'; // Line NOT covered ✗
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ❌ INSUFFICIENT: Only 50% branch coverage
|
|
148
|
+
test('returns name for active user', () => {
|
|
149
|
+
expect(processUser({ isActive: true, name: 'John' })).toBe('John');
|
|
150
|
+
// Only tests the 'if' branch, not 'else'
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// ✅ CORRECT: 100% branch coverage
|
|
154
|
+
test('returns name for active user', () => {
|
|
155
|
+
expect(processUser({ isActive: true, name: 'John' })).toBe('John');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test('returns "Inactive" for inactive user', () => {
|
|
159
|
+
expect(processUser({ isActive: false, name: 'John' })).toBe('Inactive');
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Mandatory Coverage Checks
|
|
164
|
+
|
|
165
|
+
### Pre-Commit Hook (MANDATORY)
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
#!/bin/bash
|
|
169
|
+
# .git/hooks/pre-commit
|
|
170
|
+
|
|
171
|
+
# Run tests with coverage
|
|
172
|
+
npm run test:coverage > /dev/null 2>&1
|
|
173
|
+
|
|
174
|
+
# Extract coverage percentage
|
|
175
|
+
COVERAGE=$(node -e "
|
|
176
|
+
const data = require('./coverage/coverage-summary.json');
|
|
177
|
+
console.log(data.total.lines.pct);
|
|
178
|
+
")
|
|
179
|
+
|
|
180
|
+
# Check threshold
|
|
181
|
+
THRESHOLD=80
|
|
182
|
+
|
|
183
|
+
if (( $(echo "$COVERAGE < $THRESHOLD" | bc -l) )); then
|
|
184
|
+
echo "❌ Coverage $COVERAGE% is below $THRESHOLD% threshold"
|
|
185
|
+
echo " Run 'npm run test:coverage' for details"
|
|
186
|
+
exit 1
|
|
187
|
+
fi
|
|
188
|
+
|
|
189
|
+
echo "✅ Coverage: $COVERAGE%"
|
|
190
|
+
exit 0
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Pull Request Check (MANDATORY)
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
# .github/workflows/coverage.yml
|
|
197
|
+
name: Coverage Check
|
|
198
|
+
|
|
199
|
+
on:
|
|
200
|
+
pull_request:
|
|
201
|
+
branches: [main, develop]
|
|
202
|
+
|
|
203
|
+
jobs:
|
|
204
|
+
coverage:
|
|
205
|
+
runs-on: ubuntu-latest
|
|
206
|
+
|
|
207
|
+
steps:
|
|
208
|
+
- uses: actions/checkout@v3
|
|
209
|
+
|
|
210
|
+
- name: Setup Node.js
|
|
211
|
+
uses: actions/setup-node@v3
|
|
212
|
+
with:
|
|
213
|
+
node-version: '18'
|
|
214
|
+
|
|
215
|
+
- name: Install dependencies
|
|
216
|
+
run: npm ci
|
|
217
|
+
|
|
218
|
+
- name: Run tests with coverage
|
|
219
|
+
run: npm run test:coverage
|
|
220
|
+
|
|
221
|
+
- name: Check coverage threshold
|
|
222
|
+
run: |
|
|
223
|
+
LINES=$(node -e "console.log(require('./coverage/coverage-summary.json').total.lines.pct)")
|
|
224
|
+
BRANCHES=$(node -e "console.log(require('./coverage/coverage-summary.json').total.branches.pct)")
|
|
225
|
+
|
|
226
|
+
echo "Lines: $LINES%"
|
|
227
|
+
echo "Branches: $BRANCHES%"
|
|
228
|
+
|
|
229
|
+
if (( $(echo "$LINES < 80" | bc -l) )); then
|
|
230
|
+
echo "❌ Line coverage below 80%"
|
|
231
|
+
exit 1
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
if (( $(echo "$BRANCHES < 75" | bc -l) )); then
|
|
235
|
+
echo "❌ Branch coverage below 75%"
|
|
236
|
+
exit 1
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
- name: Upload coverage to Codecov
|
|
240
|
+
uses: codecov/codecov-action@v3
|
|
241
|
+
with:
|
|
242
|
+
files: ./coverage/lcov.info
|
|
243
|
+
fail_ci_if_error: true
|
|
244
|
+
|
|
245
|
+
- name: Comment PR with coverage
|
|
246
|
+
uses: romeovs/lcov-reporter-action@v0.3.1
|
|
247
|
+
with:
|
|
248
|
+
lcov-file: ./coverage/lcov.info
|
|
249
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
250
|
+
filter-changed-files: true
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Coverage Exceptions
|
|
254
|
+
|
|
255
|
+
### When to Exclude Code
|
|
256
|
+
|
|
257
|
+
**Legitimate exclusions (must be documented):**
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
260
|
+
// ✅ CORRECT: Exclude defensive error handling for impossible cases
|
|
261
|
+
function processData(data) {
|
|
262
|
+
/* istanbul ignore next */
|
|
263
|
+
if (!data) {
|
|
264
|
+
throw new Error('Data is required'); // Can't happen in practice
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return data.map(item => item.value);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ✅ CORRECT: Exclude debug-only code
|
|
271
|
+
function debugLog(message) {
|
|
272
|
+
/* istanbul ignore if */
|
|
273
|
+
if (process.env.NODE_ENV === 'development') {
|
|
274
|
+
console.log(message); // Not covered in test environment
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ✅ CORRECT: Exclude type guards that TypeScript ensures
|
|
279
|
+
function isString(value: unknown): value is string {
|
|
280
|
+
/* istanbul ignore next */
|
|
281
|
+
return typeof value === 'string'; // TypeScript handles this
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Invalid exclusions (not allowed):**
|
|
286
|
+
|
|
287
|
+
```javascript
|
|
288
|
+
// ❌ WRONG: Excluding untested business logic
|
|
289
|
+
function calculateDiscount(price, user) {
|
|
290
|
+
/* istanbul ignore next */
|
|
291
|
+
if (user.isPremium) {
|
|
292
|
+
return price * 0.8; // Should be tested!
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return price;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ❌ WRONG: Excluding error handling
|
|
299
|
+
async function fetchUser(id) {
|
|
300
|
+
try {
|
|
301
|
+
return await api.getUser(id);
|
|
302
|
+
} catch (error) {
|
|
303
|
+
/* istanbul ignore next */
|
|
304
|
+
throw new Error('Failed to fetch user'); // Should be tested!
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
## Coverage Reporting Standards
|
|
310
|
+
|
|
311
|
+
### Required Reports (MANDATORY)
|
|
312
|
+
|
|
313
|
+
```javascript
|
|
314
|
+
coverage: {
|
|
315
|
+
reporter: [
|
|
316
|
+
'text', // Terminal output (for developers)
|
|
317
|
+
'text-summary',// Quick summary
|
|
318
|
+
'json', // Machine-readable (for CI)
|
|
319
|
+
'json-summary',// Quick machine-readable
|
|
320
|
+
'html', // Visual report (for deep dive)
|
|
321
|
+
'lcov' // For coverage services (Codecov, Coveralls)
|
|
322
|
+
],
|
|
323
|
+
|
|
324
|
+
// Report directory
|
|
325
|
+
reportsDirectory: './coverage',
|
|
326
|
+
|
|
327
|
+
// Always clean before new run
|
|
328
|
+
clean: true
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Coverage Trend Tracking
|
|
333
|
+
|
|
334
|
+
```javascript
|
|
335
|
+
// scripts/track-coverage.js
|
|
336
|
+
import { readFileSync, writeFileSync } from 'fs';
|
|
337
|
+
|
|
338
|
+
const summary = JSON.parse(
|
|
339
|
+
readFileSync('./coverage/coverage-summary.json', 'utf-8')
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
const trend = {
|
|
343
|
+
date: new Date().toISOString(),
|
|
344
|
+
lines: summary.total.lines.pct,
|
|
345
|
+
branches: summary.total.branches.pct,
|
|
346
|
+
functions: summary.total.functions.pct,
|
|
347
|
+
statements: summary.total.statements.pct
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// Append to history
|
|
351
|
+
const history = JSON.parse(
|
|
352
|
+
readFileSync('./coverage/history.json', 'utf-8')
|
|
353
|
+
);
|
|
354
|
+
history.push(trend);
|
|
355
|
+
|
|
356
|
+
writeFileSync(
|
|
357
|
+
'./coverage/history.json',
|
|
358
|
+
JSON.stringify(history, null, 2)
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
// Check if coverage decreased
|
|
362
|
+
const previous = history[history.length - 2];
|
|
363
|
+
if (previous && trend.lines < previous.lines) {
|
|
364
|
+
console.error(`❌ Coverage decreased from ${previous.lines}% to ${trend.lines}%`);
|
|
365
|
+
process.exit(1);
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
## Coverage for Different Code Types
|
|
370
|
+
|
|
371
|
+
### Components (85% minimum)
|
|
372
|
+
|
|
373
|
+
```javascript
|
|
374
|
+
// ✅ REQUIRED: Test all component states
|
|
375
|
+
describe('LoadingButton', () => {
|
|
376
|
+
test('shows button text when not loading', () => {
|
|
377
|
+
render(<LoadingButton>Submit</LoadingButton>);
|
|
378
|
+
expect(screen.getByRole('button', { name: 'Submit' })).toBeInTheDocument();
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
test('shows spinner when loading', () => {
|
|
382
|
+
render(<LoadingButton loading>Submit</LoadingButton>);
|
|
383
|
+
expect(screen.getByRole('status')).toBeInTheDocument();
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
test('is disabled when loading', () => {
|
|
387
|
+
render(<LoadingButton loading>Submit</LoadingButton>);
|
|
388
|
+
expect(screen.getByRole('button')).toBeDisabled();
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test('is disabled when disabled prop is true', () => {
|
|
392
|
+
render(<LoadingButton disabled>Submit</LoadingButton>);
|
|
393
|
+
expect(screen.getByRole('button')).toBeDisabled();
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
test('calls onClick when clicked', async () => {
|
|
397
|
+
const onClick = vi.fn();
|
|
398
|
+
render(<LoadingButton onClick={onClick}>Submit</LoadingButton>);
|
|
399
|
+
|
|
400
|
+
await userEvent.click(screen.getByRole('button'));
|
|
401
|
+
|
|
402
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Services/API (90% minimum)
|
|
408
|
+
|
|
409
|
+
```javascript
|
|
410
|
+
// ✅ REQUIRED: Test all API methods and error cases
|
|
411
|
+
describe('UserService', () => {
|
|
412
|
+
test('fetches user by ID', async () => {
|
|
413
|
+
const user = await UserService.getUser(1);
|
|
414
|
+
expect(user).toEqual({ id: 1, name: 'Test User' });
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
test('creates new user', async () => {
|
|
418
|
+
const newUser = await UserService.createUser({ name: 'John' });
|
|
419
|
+
expect(newUser).toHaveProperty('id');
|
|
420
|
+
expect(newUser.name).toBe('John');
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
test('updates existing user', async () => {
|
|
424
|
+
const updated = await UserService.updateUser(1, { name: 'Jane' });
|
|
425
|
+
expect(updated.name).toBe('Jane');
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
test('deletes user', async () => {
|
|
429
|
+
await expect(UserService.deleteUser(1)).resolves.toBeUndefined();
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
test('handles network errors', async () => {
|
|
433
|
+
server.use(
|
|
434
|
+
rest.get('/api/user/:id', (req, res, ctx) => {
|
|
435
|
+
return res(ctx.status(500));
|
|
436
|
+
})
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
await expect(UserService.getUser(1)).rejects.toThrow('Network error');
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
test('handles validation errors', async () => {
|
|
443
|
+
await expect(
|
|
444
|
+
UserService.createUser({ name: '' })
|
|
445
|
+
).rejects.toThrow('Name is required');
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### Utilities (95% minimum)
|
|
451
|
+
|
|
452
|
+
```javascript
|
|
453
|
+
// ✅ REQUIRED: Test all utility functions and edge cases
|
|
454
|
+
describe('formatCurrency', () => {
|
|
455
|
+
test('formats positive numbers', () => {
|
|
456
|
+
expect(formatCurrency(1234.56)).toBe('$1,234.56');
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
test('formats zero', () => {
|
|
460
|
+
expect(formatCurrency(0)).toBe('$0.00');
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
test('formats negative numbers', () => {
|
|
464
|
+
expect(formatCurrency(-1234.56)).toBe('-$1,234.56');
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
test('rounds to 2 decimal places', () => {
|
|
468
|
+
expect(formatCurrency(1234.567)).toBe('$1,234.57');
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test('handles very large numbers', () => {
|
|
472
|
+
expect(formatCurrency(1234567890.12)).toBe('$1,234,567,890.12');
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
test('handles very small numbers', () => {
|
|
476
|
+
expect(formatCurrency(0.01)).toBe('$0.01');
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
test('throws error for invalid input', () => {
|
|
480
|
+
expect(() => formatCurrency('invalid')).toThrow('Invalid number');
|
|
481
|
+
expect(() => formatCurrency(NaN)).toThrow('Invalid number');
|
|
482
|
+
expect(() => formatCurrency(null)).toThrow('Invalid number');
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
## Mutation Testing (RECOMMENDED)
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
# Install Stryker mutation testing
|
|
491
|
+
npm install -D @stryker-mutator/core @stryker-mutator/vitest-runner
|
|
492
|
+
|
|
493
|
+
# stryker.config.json
|
|
494
|
+
{
|
|
495
|
+
"testRunner": "vitest",
|
|
496
|
+
"coverageAnalysis": "perTest",
|
|
497
|
+
"mutate": [
|
|
498
|
+
"src/**/*.{js,jsx,ts,tsx}",
|
|
499
|
+
"!src/**/*.{spec,test}.{js,jsx,ts,tsx}"
|
|
500
|
+
],
|
|
501
|
+
"thresholds": {
|
|
502
|
+
"high": 80,
|
|
503
|
+
"low": 60,
|
|
504
|
+
"break": 50
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
# Run mutation testing
|
|
509
|
+
npx stryker run
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
**Why Mutation Testing:**
|
|
513
|
+
- Validates test quality, not just coverage
|
|
514
|
+
- Finds weak tests that don't catch bugs
|
|
515
|
+
- Mutates code and checks if tests fail
|
|
516
|
+
- Higher mutation score = better tests
|
|
517
|
+
|
|
518
|
+
## Enforcement Checklist
|
|
519
|
+
|
|
520
|
+
Before merging code, verify:
|
|
521
|
+
|
|
522
|
+
- [ ] Overall coverage meets 80% minimum
|
|
523
|
+
- [ ] Branch coverage meets 75% minimum
|
|
524
|
+
- [ ] No decrease in coverage from previous commit
|
|
525
|
+
- [ ] All new files have corresponding tests
|
|
526
|
+
- [ ] Coverage report generated and reviewed
|
|
527
|
+
- [ ] Critical paths have 90%+ coverage
|
|
528
|
+
- [ ] Error handling is tested
|
|
529
|
+
- [ ] Edge cases are covered
|
|
530
|
+
- [ ] Coverage exclusions are documented
|
|
531
|
+
- [ ] CI/CD coverage check passes
|
|
532
|
+
|
|
533
|
+
## Validation Commands
|
|
534
|
+
|
|
535
|
+
```bash
|
|
536
|
+
# Generate coverage report
|
|
537
|
+
npm run test:coverage
|
|
538
|
+
|
|
539
|
+
# Check coverage thresholds (fails if below)
|
|
540
|
+
npm run test:coverage -- --reporter=json
|
|
541
|
+
|
|
542
|
+
# View detailed HTML report
|
|
543
|
+
open coverage/index.html
|
|
544
|
+
|
|
545
|
+
# Track coverage trend
|
|
546
|
+
node scripts/track-coverage.js
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
## Coverage Improvement Strategies
|
|
550
|
+
|
|
551
|
+
### Identify Low Coverage Areas
|
|
552
|
+
|
|
553
|
+
```bash
|
|
554
|
+
# Find files with < 80% coverage
|
|
555
|
+
node -e "
|
|
556
|
+
const data = require('./coverage/coverage-summary.json');
|
|
557
|
+
Object.entries(data)
|
|
558
|
+
.filter(([file, d]) => d.lines.pct < 80 && file !== 'total')
|
|
559
|
+
.forEach(([file, d]) => console.log(\`\${file}: \${d.lines.pct}%\`));
|
|
560
|
+
"
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### Prioritize High-Impact Tests
|
|
564
|
+
|
|
565
|
+
1. **Critical Business Logic** (highest priority)
|
|
566
|
+
2. **Error Handling** (prevents crashes)
|
|
567
|
+
3. **Edge Cases** (prevents bugs)
|
|
568
|
+
4. **Happy Path** (ensures core functionality)
|
|
569
|
+
|
|
570
|
+
## Related Rules
|
|
571
|
+
|
|
572
|
+
- `testing-standards` - Test quality and patterns
|
|
573
|
+
- `code-quality-standards` - General code quality
|
|
574
|
+
- `ci-cd-requirements` - CI/CD integration rules
|
|
575
|
+
|
|
576
|
+
## Support
|
|
577
|
+
|
|
578
|
+
For coverage questions:
|
|
579
|
+
- Review Context7 documentation for coverage tools
|
|
580
|
+
- Run `/test:coverage` command for detailed analysis
|
|
581
|
+
- Consult frontend-testing-engineer agent
|