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,291 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* JavaScript ES6 Patterns - Context7 Best Practices
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates modern ES6 patterns from Airbnb JavaScript Style Guide:
|
|
6
|
+
* - Default parameters
|
|
7
|
+
* - Object property shorthand
|
|
8
|
+
* - Object method shorthand
|
|
9
|
+
* - Spread syntax for copying
|
|
10
|
+
* - Destructuring
|
|
11
|
+
* - Arrow functions
|
|
12
|
+
*
|
|
13
|
+
* Source: /airbnb/javascript (221 snippets, trust 8.1)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// Context7 Pattern 1: Default Parameters
|
|
17
|
+
function handleThings(opts = {}) {
|
|
18
|
+
// ✅ CORRECT: Use default parameters instead of opts = opts || {}
|
|
19
|
+
const {
|
|
20
|
+
retries = 3,
|
|
21
|
+
timeout = 5000,
|
|
22
|
+
debug = false,
|
|
23
|
+
} = opts;
|
|
24
|
+
|
|
25
|
+
if (debug) {
|
|
26
|
+
console.log(`Retries: ${retries}, Timeout: ${timeout}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return { retries, timeout, debug };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Example usage
|
|
33
|
+
console.log('Pattern 1: Default Parameters');
|
|
34
|
+
console.log(handleThings());
|
|
35
|
+
console.log(handleThings({ retries: 5, debug: true }));
|
|
36
|
+
|
|
37
|
+
// Context7 Pattern 2: Object Property Shorthand
|
|
38
|
+
const lukeSkywalker = 'Luke Skywalker';
|
|
39
|
+
const age = 25;
|
|
40
|
+
const planet = 'Tatooine';
|
|
41
|
+
|
|
42
|
+
// ✅ CORRECT: Object property shorthand
|
|
43
|
+
const obj = {
|
|
44
|
+
lukeSkywalker, // instead of lukeSkywalker: lukeSkywalker
|
|
45
|
+
age,
|
|
46
|
+
planet,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
console.log('\nPattern 2: Object Property Shorthand');
|
|
50
|
+
console.log(obj);
|
|
51
|
+
|
|
52
|
+
// Context7 Pattern 3: Object Method Shorthand
|
|
53
|
+
const atom = {
|
|
54
|
+
value: 1,
|
|
55
|
+
|
|
56
|
+
// ✅ CORRECT: Object method shorthand
|
|
57
|
+
addValue(value) {
|
|
58
|
+
return atom.value + value;
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
// Works with async too
|
|
62
|
+
async fetchValue() {
|
|
63
|
+
return Promise.resolve(this.value);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
console.log('\nPattern 3: Object Method Shorthand');
|
|
68
|
+
console.log(atom.addValue(5));
|
|
69
|
+
|
|
70
|
+
// Context7 Pattern 4: Spread Syntax for Copying
|
|
71
|
+
const original = { a: 1, b: 2 };
|
|
72
|
+
|
|
73
|
+
// ✅ CORRECT: Use spread for shallow copy
|
|
74
|
+
const copy = { ...original, c: 3 };
|
|
75
|
+
|
|
76
|
+
// Also works for arrays
|
|
77
|
+
const arr1 = [1, 2, 3];
|
|
78
|
+
const arr2 = [...arr1, 4, 5];
|
|
79
|
+
|
|
80
|
+
console.log('\nPattern 4: Spread Syntax');
|
|
81
|
+
console.log('Object copy:', copy);
|
|
82
|
+
console.log('Array copy:', arr2);
|
|
83
|
+
|
|
84
|
+
// Context7 Pattern 5: Destructuring
|
|
85
|
+
const user = {
|
|
86
|
+
firstName: 'John',
|
|
87
|
+
lastName: 'Doe',
|
|
88
|
+
email: 'john@example.com',
|
|
89
|
+
address: {
|
|
90
|
+
city: 'New York',
|
|
91
|
+
country: 'USA',
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// ✅ CORRECT: Use destructuring
|
|
96
|
+
const { firstName, lastName, address: { city } } = user;
|
|
97
|
+
|
|
98
|
+
// Array destructuring
|
|
99
|
+
const numbers = [1, 2, 3, 4, 5];
|
|
100
|
+
const [first, second, ...rest] = numbers;
|
|
101
|
+
|
|
102
|
+
console.log('\nPattern 5: Destructuring');
|
|
103
|
+
console.log(`Name: ${firstName} ${lastName}, City: ${city}`);
|
|
104
|
+
console.log(`First: ${first}, Second: ${second}, Rest: ${rest}`);
|
|
105
|
+
|
|
106
|
+
// Context7 Pattern 6: Arrow Functions
|
|
107
|
+
const items = [1, 2, 3, 4, 5];
|
|
108
|
+
|
|
109
|
+
// ✅ CORRECT: Use arrow functions for simple callbacks
|
|
110
|
+
const doubled = items.map(x => x * 2);
|
|
111
|
+
const evens = items.filter(x => x % 2 === 0);
|
|
112
|
+
const sum = items.reduce((acc, x) => acc + x, 0);
|
|
113
|
+
|
|
114
|
+
console.log('\nPattern 6: Arrow Functions');
|
|
115
|
+
console.log('Doubled:', doubled);
|
|
116
|
+
console.log('Evens:', evens);
|
|
117
|
+
console.log('Sum:', sum);
|
|
118
|
+
|
|
119
|
+
// Advanced ES6 Patterns
|
|
120
|
+
|
|
121
|
+
// Pattern 7: Template Literals
|
|
122
|
+
const buildGreeting = (name, time) => {
|
|
123
|
+
// ✅ CORRECT: Use template literals instead of string concatenation
|
|
124
|
+
return `Good ${time}, ${name}!`;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
console.log('\nPattern 7: Template Literals');
|
|
128
|
+
console.log(buildGreeting('Alice', 'morning'));
|
|
129
|
+
|
|
130
|
+
// Pattern 8: Enhanced Object Literals
|
|
131
|
+
const getUser = (firstName, lastName, age) => ({
|
|
132
|
+
// Property shorthand
|
|
133
|
+
firstName,
|
|
134
|
+
lastName,
|
|
135
|
+
age,
|
|
136
|
+
|
|
137
|
+
// Method shorthand
|
|
138
|
+
getFullName() {
|
|
139
|
+
return `${this.firstName} ${this.lastName}`;
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// Computed property names
|
|
143
|
+
[`is${age >= 18 ? 'Adult' : 'Minor'}`]: true,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
console.log('\nPattern 8: Enhanced Object Literals');
|
|
147
|
+
const alice = getUser('Alice', 'Smith', 25);
|
|
148
|
+
console.log(alice);
|
|
149
|
+
console.log(alice.getFullName());
|
|
150
|
+
|
|
151
|
+
// Pattern 9: Async/Await (Modern Promise Handling)
|
|
152
|
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
153
|
+
|
|
154
|
+
const fetchData = async (url) => {
|
|
155
|
+
try {
|
|
156
|
+
// Simulate API call
|
|
157
|
+
await delay(100);
|
|
158
|
+
return { url, data: 'sample data' };
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error('Error fetching data:', error);
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const processMultipleRequests = async (urls) => {
|
|
166
|
+
// ✅ CORRECT: Use Promise.all for parallel requests
|
|
167
|
+
const results = await Promise.all(urls.map(url => fetchData(url)));
|
|
168
|
+
return results;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// Pattern 10: Optional Chaining & Nullish Coalescing
|
|
172
|
+
const getUserEmail = (user) => {
|
|
173
|
+
// ✅ CORRECT: Use optional chaining
|
|
174
|
+
return user?.profile?.email ?? 'no-email@example.com';
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
console.log('\nPattern 10: Optional Chaining & Nullish Coalescing');
|
|
178
|
+
console.log(getUserEmail({ profile: { email: 'user@example.com' } }));
|
|
179
|
+
console.log(getUserEmail({}));
|
|
180
|
+
console.log(getUserEmail(null));
|
|
181
|
+
|
|
182
|
+
// Real-World Example: API Client
|
|
183
|
+
class ApiClient {
|
|
184
|
+
constructor(baseURL, options = {}) {
|
|
185
|
+
this.baseURL = baseURL;
|
|
186
|
+
// Destructuring with defaults
|
|
187
|
+
const {
|
|
188
|
+
timeout = 5000,
|
|
189
|
+
retries = 3,
|
|
190
|
+
headers = {},
|
|
191
|
+
} = options;
|
|
192
|
+
|
|
193
|
+
// Object shorthand
|
|
194
|
+
this.config = {
|
|
195
|
+
timeout,
|
|
196
|
+
retries,
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
...headers, // Spread existing headers
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async get(endpoint, params = {}) {
|
|
205
|
+
// Template literal for URL
|
|
206
|
+
const url = `${this.baseURL}/${endpoint}`;
|
|
207
|
+
|
|
208
|
+
// Destructuring from config
|
|
209
|
+
const { timeout, retries } = this.config;
|
|
210
|
+
|
|
211
|
+
for (let attempt = 0; attempt < retries; attempt++) {
|
|
212
|
+
try {
|
|
213
|
+
await delay(100); // Simulate request
|
|
214
|
+
return {
|
|
215
|
+
status: 200,
|
|
216
|
+
data: { endpoint, params },
|
|
217
|
+
};
|
|
218
|
+
} catch (error) {
|
|
219
|
+
if (attempt === retries - 1) throw error;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
async post(endpoint, data) {
|
|
225
|
+
// Object method shorthand
|
|
226
|
+
return this.makeRequest('POST', endpoint, data);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async makeRequest(method, endpoint, data) {
|
|
230
|
+
// Arrow function in method
|
|
231
|
+
const processResponse = (response) => ({
|
|
232
|
+
...response,
|
|
233
|
+
timestamp: Date.now(),
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await delay(100);
|
|
237
|
+
const response = {
|
|
238
|
+
status: 200,
|
|
239
|
+
data,
|
|
240
|
+
method,
|
|
241
|
+
endpoint,
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
return processResponse(response);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Static method with arrow function
|
|
248
|
+
static create = (baseURL, options) => new ApiClient(baseURL, options);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Usage
|
|
252
|
+
(async () => {
|
|
253
|
+
console.log('\nReal-World Example: API Client');
|
|
254
|
+
|
|
255
|
+
// Create client with defaults
|
|
256
|
+
const client = ApiClient.create('https://api.example.com', {
|
|
257
|
+
timeout: 3000,
|
|
258
|
+
headers: { 'X-API-Key': 'secret' },
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
// Use async/await
|
|
262
|
+
const response = await client.get('users', { page: 1 });
|
|
263
|
+
console.log('GET response:', response);
|
|
264
|
+
|
|
265
|
+
const postResponse = await client.post('users', {
|
|
266
|
+
name: 'Alice',
|
|
267
|
+
email: 'alice@example.com',
|
|
268
|
+
});
|
|
269
|
+
console.log('POST response:', postResponse);
|
|
270
|
+
})();
|
|
271
|
+
|
|
272
|
+
// Context7 Best Practices Summary
|
|
273
|
+
console.log(`
|
|
274
|
+
Context7 Verified Best Practices Applied:
|
|
275
|
+
==========================================
|
|
276
|
+
1. ✅ Default parameters instead of || operator
|
|
277
|
+
2. ✅ Object property shorthand ({ name } not { name: name })
|
|
278
|
+
3. ✅ Object method shorthand (method() {} not method: function() {})
|
|
279
|
+
4. ✅ Spread syntax for copying ({ ...obj } and [...arr])
|
|
280
|
+
5. ✅ Destructuring for cleaner code
|
|
281
|
+
6. ✅ Arrow functions for callbacks
|
|
282
|
+
7. ✅ Template literals for strings
|
|
283
|
+
8. ✅ Enhanced object literals
|
|
284
|
+
9. ✅ Async/await for promises
|
|
285
|
+
10. ✅ Optional chaining & nullish coalescing
|
|
286
|
+
|
|
287
|
+
Source:
|
|
288
|
+
- /airbnb/javascript (221 snippets, trust 8.1)
|
|
289
|
+
|
|
290
|
+
All patterns follow Airbnb JavaScript Style Guide
|
|
291
|
+
`);
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Node.js Async Iteration Patterns - Context7 Best Practices
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates modern Node.js async patterns:
|
|
6
|
+
* - for await...of with Symbol.asyncIterator
|
|
7
|
+
* - AbortSignal for cancellation
|
|
8
|
+
* - Mixed approach (event + await) for performance
|
|
9
|
+
* - Stream processing with async iterators
|
|
10
|
+
*
|
|
11
|
+
* Source: /nodejs/node (8,761 snippets, trust 9.1)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { createReadStream } from 'node:fs';
|
|
15
|
+
import { writeFile, readFile } from 'node:fs/promises';
|
|
16
|
+
import * as readline from 'node:readline';
|
|
17
|
+
import { once, on } from 'node:events';
|
|
18
|
+
import { EventEmitter } from 'node:events';
|
|
19
|
+
import { Readable } from 'node:stream';
|
|
20
|
+
|
|
21
|
+
// Context7 Pattern 1: for await...of with Symbol.asyncIterator
|
|
22
|
+
async function processLineByLine(filePath) {
|
|
23
|
+
console.log('Pattern 1: Async Line-by-Line Processing');
|
|
24
|
+
|
|
25
|
+
const rl = readline.createInterface({
|
|
26
|
+
input: createReadStream(filePath),
|
|
27
|
+
crlfDelay: Infinity,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// ✅ CORRECT: Use for await...of for async iteration
|
|
31
|
+
let lineCount = 0;
|
|
32
|
+
for await (const line of rl) {
|
|
33
|
+
// Each line is processed sequentially
|
|
34
|
+
lineCount++;
|
|
35
|
+
if (lineCount <= 3) {
|
|
36
|
+
console.log(` Line ${lineCount}: ${line.substring(0, 50)}...`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
console.log(` Total lines: ${lineCount}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Context7 Pattern 2: Mixed Approach for Better Performance
|
|
44
|
+
async function processLinesMixed(filePath) {
|
|
45
|
+
console.log('\nPattern 2: Mixed Approach (Event + Await)');
|
|
46
|
+
|
|
47
|
+
const rl = readline.createInterface({
|
|
48
|
+
input: createReadStream(filePath),
|
|
49
|
+
crlfDelay: Infinity,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
let lineCount = 0;
|
|
53
|
+
|
|
54
|
+
// ✅ CORRECT: Use event handler for better performance
|
|
55
|
+
rl.on('line', (line) => {
|
|
56
|
+
lineCount++;
|
|
57
|
+
// Process line synchronously
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Wait for 'close' event
|
|
61
|
+
await once(rl, 'close');
|
|
62
|
+
|
|
63
|
+
console.log(` Processed ${lineCount} lines (mixed approach)`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Context7 Pattern 3: AbortSignal for Cancellation
|
|
67
|
+
async function fetchWithTimeout(url, timeout = 5000) {
|
|
68
|
+
console.log('\nPattern 3: AbortSignal for Request Cancellation');
|
|
69
|
+
|
|
70
|
+
// ✅ CORRECT: Use AbortController for cancellation
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const { signal } = controller;
|
|
73
|
+
|
|
74
|
+
const timeoutId = setTimeout(() => {
|
|
75
|
+
console.log(' Aborting request due to timeout');
|
|
76
|
+
controller.abort();
|
|
77
|
+
}, timeout);
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
// Simulate fetch with signal
|
|
81
|
+
await new Promise((resolve, reject) => {
|
|
82
|
+
const timer = setTimeout(resolve, 1000);
|
|
83
|
+
|
|
84
|
+
signal.addEventListener('abort', () => {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
reject(new Error('Request aborted'));
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
console.log(` Request completed successfully`);
|
|
91
|
+
return { status: 200, data: 'success' };
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (error.name === 'AbortError' || error.message === 'Request aborted') {
|
|
94
|
+
console.log(' Request was cancelled');
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
throw error;
|
|
98
|
+
} finally {
|
|
99
|
+
clearTimeout(timeoutId);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Context7 Pattern 4: AbortSignal with Event Iteration
|
|
104
|
+
async function watchEventsWithCancellation(emitter, eventName, timeout = 5000) {
|
|
105
|
+
console.log('\nPattern 4: Event Iteration with AbortSignal');
|
|
106
|
+
|
|
107
|
+
const ac = new AbortController();
|
|
108
|
+
const { signal } = ac;
|
|
109
|
+
|
|
110
|
+
// Cancel after timeout
|
|
111
|
+
setTimeout(() => {
|
|
112
|
+
console.log(' Cancelling event watching');
|
|
113
|
+
ac.abort();
|
|
114
|
+
}, timeout);
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
// ✅ CORRECT: Use AbortSignal with event iteration
|
|
118
|
+
let eventCount = 0;
|
|
119
|
+
for await (const event of on(emitter, eventName, { signal })) {
|
|
120
|
+
eventCount++;
|
|
121
|
+
console.log(` Event ${eventCount}: ${JSON.stringify(event)}`);
|
|
122
|
+
|
|
123
|
+
if (eventCount >= 3) {
|
|
124
|
+
ac.abort();
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
console.log(` Processed ${eventCount} events`);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (error.name === 'AbortError') {
|
|
132
|
+
console.log(' Event watching cancelled');
|
|
133
|
+
} else {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Context7 Pattern 5: Custom Async Iterator with Symbol.asyncIterator
|
|
140
|
+
class AsyncNumberGenerator {
|
|
141
|
+
constructor(max = 10) {
|
|
142
|
+
this.max = max;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ✅ CORRECT: Implement Symbol.asyncIterator
|
|
146
|
+
async *[Symbol.asyncIterator]() {
|
|
147
|
+
for (let i = 1; i <= this.max; i++) {
|
|
148
|
+
// Simulate async operation
|
|
149
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
150
|
+
yield i;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function useCustomAsyncIterator() {
|
|
156
|
+
console.log('\nPattern 5: Custom Async Iterator');
|
|
157
|
+
|
|
158
|
+
const generator = new AsyncNumberGenerator(5);
|
|
159
|
+
|
|
160
|
+
let sum = 0;
|
|
161
|
+
for await (const num of generator) {
|
|
162
|
+
sum += num;
|
|
163
|
+
console.log(` Generated: ${num}, Sum: ${sum}`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
console.log(` Final sum: ${sum}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Context7 Pattern 6: Stream Processing with Async Iteration
|
|
170
|
+
async function processStream() {
|
|
171
|
+
console.log('\nPattern 6: Stream Processing');
|
|
172
|
+
|
|
173
|
+
// Create readable stream
|
|
174
|
+
const readable = Readable.from(async function* () {
|
|
175
|
+
for (let i = 0; i < 5; i++) {
|
|
176
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
177
|
+
yield `chunk-${i}`;
|
|
178
|
+
}
|
|
179
|
+
}());
|
|
180
|
+
|
|
181
|
+
// ✅ CORRECT: Process stream with for await...of
|
|
182
|
+
let chunkCount = 0;
|
|
183
|
+
for await (const chunk of readable) {
|
|
184
|
+
chunkCount++;
|
|
185
|
+
console.log(` Chunk ${chunkCount}: ${chunk}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
console.log(` Processed ${chunkCount} chunks`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Real-World Example: Log File Processor
|
|
192
|
+
class LogProcessor {
|
|
193
|
+
constructor(logFilePath) {
|
|
194
|
+
this.logFilePath = logFilePath;
|
|
195
|
+
this.stats = {
|
|
196
|
+
totalLines: 0,
|
|
197
|
+
errors: 0,
|
|
198
|
+
warnings: 0,
|
|
199
|
+
info: 0,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async *processLogs() {
|
|
204
|
+
const rl = readline.createInterface({
|
|
205
|
+
input: createReadStream(this.logFilePath),
|
|
206
|
+
crlfDelay: Infinity,
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// ✅ Async iteration with Symbol.asyncIterator
|
|
210
|
+
for await (const line of rl) {
|
|
211
|
+
this.stats.totalLines++;
|
|
212
|
+
|
|
213
|
+
const logEntry = this.parseLine(line);
|
|
214
|
+
if (logEntry) {
|
|
215
|
+
yield logEntry;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
parseLine(line) {
|
|
221
|
+
this.stats.totalLines++;
|
|
222
|
+
|
|
223
|
+
if (line.includes('ERROR')) {
|
|
224
|
+
this.stats.errors++;
|
|
225
|
+
return { level: 'ERROR', line };
|
|
226
|
+
} else if (line.includes('WARNING')) {
|
|
227
|
+
this.stats.warnings++;
|
|
228
|
+
return { level: 'WARNING', line };
|
|
229
|
+
} else if (line.includes('INFO')) {
|
|
230
|
+
this.stats.info++;
|
|
231
|
+
return { level: 'INFO', line };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async analyzeWithTimeout(timeoutMs = 10000) {
|
|
238
|
+
const ac = new AbortController();
|
|
239
|
+
const { signal } = ac;
|
|
240
|
+
|
|
241
|
+
// Set timeout
|
|
242
|
+
const timeoutId = setTimeout(() => ac.abort(), timeoutMs);
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
const results = [];
|
|
246
|
+
|
|
247
|
+
// ✅ Use AbortSignal with async iteration
|
|
248
|
+
for await (const entry of this.processLogs()) {
|
|
249
|
+
if (signal.aborted) {
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
results.push(entry);
|
|
254
|
+
|
|
255
|
+
if (results.length >= 10) {
|
|
256
|
+
break; // Process only first 10 for demo
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
clearTimeout(timeoutId);
|
|
261
|
+
return { results, stats: this.stats };
|
|
262
|
+
} catch (error) {
|
|
263
|
+
clearTimeout(timeoutId);
|
|
264
|
+
if (signal.aborted) {
|
|
265
|
+
console.log('Analysis cancelled due to timeout');
|
|
266
|
+
}
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Main Demo
|
|
273
|
+
async function main() {
|
|
274
|
+
console.log('Node.js Async Iteration Patterns - Context7 Best Practices');
|
|
275
|
+
console.log('='.repeat(60));
|
|
276
|
+
|
|
277
|
+
// Create test file
|
|
278
|
+
const testFile = '/tmp/test-nodejs-async.txt';
|
|
279
|
+
await writeFile(testFile, `Line 1: INFO - Application started
|
|
280
|
+
Line 2: WARNING - High memory usage
|
|
281
|
+
Line 3: ERROR - Database connection failed
|
|
282
|
+
Line 4: INFO - Retrying connection
|
|
283
|
+
Line 5: INFO - Connection established
|
|
284
|
+
Line 6: WARNING - Slow query detected
|
|
285
|
+
Line 7: INFO - Processing request
|
|
286
|
+
Line 8: ERROR - Invalid input
|
|
287
|
+
Line 9: INFO - Request completed
|
|
288
|
+
Line 10: INFO - Application running`);
|
|
289
|
+
|
|
290
|
+
try {
|
|
291
|
+
// Pattern 1: Basic async iteration
|
|
292
|
+
await processLineByLine(testFile);
|
|
293
|
+
|
|
294
|
+
// Pattern 2: Mixed approach
|
|
295
|
+
await processLinesMixed(testFile);
|
|
296
|
+
|
|
297
|
+
// Pattern 3: AbortSignal for timeout
|
|
298
|
+
await fetchWithTimeout('https://example.com/api', 5000);
|
|
299
|
+
|
|
300
|
+
// Pattern 4: Event iteration with cancellation
|
|
301
|
+
const emitter = new EventEmitter();
|
|
302
|
+
const watchPromise = watchEventsWithCancellation(emitter, 'data', 2000);
|
|
303
|
+
|
|
304
|
+
// Emit some events
|
|
305
|
+
setTimeout(() => emitter.emit('data', { value: 1 }), 100);
|
|
306
|
+
setTimeout(() => emitter.emit('data', { value: 2 }), 200);
|
|
307
|
+
setTimeout(() => emitter.emit('data', { value: 3 }), 300);
|
|
308
|
+
setTimeout(() => emitter.emit('data', { value: 4 }), 400);
|
|
309
|
+
|
|
310
|
+
await watchPromise;
|
|
311
|
+
|
|
312
|
+
// Pattern 5: Custom async iterator
|
|
313
|
+
await useCustomAsyncIterator();
|
|
314
|
+
|
|
315
|
+
// Pattern 6: Stream processing
|
|
316
|
+
await processStream();
|
|
317
|
+
|
|
318
|
+
// Real-world example
|
|
319
|
+
console.log('\nReal-World Example: Log Processor');
|
|
320
|
+
console.log('-'.repeat(60));
|
|
321
|
+
const processor = new LogProcessor(testFile);
|
|
322
|
+
const analysis = await processor.analyzeWithTimeout(5000);
|
|
323
|
+
|
|
324
|
+
console.log('Analysis Results:');
|
|
325
|
+
console.log(` Total entries: ${analysis.results.length}`);
|
|
326
|
+
console.log('Statistics:');
|
|
327
|
+
console.log(` Total lines: ${analysis.stats.totalLines}`);
|
|
328
|
+
console.log(` Errors: ${analysis.stats.errors}`);
|
|
329
|
+
console.log(` Warnings: ${analysis.stats.warnings}`);
|
|
330
|
+
console.log(` Info: ${analysis.stats.info}`);
|
|
331
|
+
|
|
332
|
+
} catch (error) {
|
|
333
|
+
console.error('Error in demo:', error);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
console.log(`
|
|
337
|
+
Context7 Verified Best Practices Applied:
|
|
338
|
+
==========================================
|
|
339
|
+
1. ✅ for await...of for async iteration
|
|
340
|
+
2. ✅ Mixed approach (event + await once) for performance
|
|
341
|
+
3. ✅ AbortSignal for request cancellation
|
|
342
|
+
4. ✅ AbortSignal with event iteration (on + signal)
|
|
343
|
+
5. ✅ Symbol.asyncIterator for custom iterators
|
|
344
|
+
6. ✅ Stream processing with async iteration
|
|
345
|
+
7. ✅ Proper error handling and cleanup
|
|
346
|
+
8. ✅ Real-world log processing example
|
|
347
|
+
|
|
348
|
+
Source:
|
|
349
|
+
- /nodejs/node (8,761 snippets, trust 9.1)
|
|
350
|
+
|
|
351
|
+
Key Performance Benefits:
|
|
352
|
+
- Event handling faster than async iteration for simple tasks
|
|
353
|
+
- AbortSignal enables graceful cancellation
|
|
354
|
+
- Symbol.asyncIterator provides standard interface
|
|
355
|
+
- Streams enable memory-efficient processing
|
|
356
|
+
`);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Run the demo
|
|
360
|
+
main().catch(console.error);
|