claude-autopm 2.8.1 → 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 -529
- package/bin/autopm.js +2 -0
- package/bin/commands/plugin.js +395 -0
- package/bin/commands/team.js +184 -10
- package/install/install.js +223 -4
- package/lib/plugins/PluginManager.js +1328 -0
- package/lib/plugins/PluginManager.old.js +400 -0
- package/package.json +5 -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/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/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/gemini-api-expert.md +880 -0
- package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -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/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/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/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/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/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/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/bigquery-expert.md +24 -15
- package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/cosmosdb-expert.md +22 -15
- package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/mongodb-expert.md +24 -15
- package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/postgresql-expert.md +23 -15
- package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/redis-expert.md +29 -7
- 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/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/github-operations-specialist.md +1 -1
- 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/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/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/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/e2e-test-engineer.md +219 -0
- package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/react-frontend-engineer.md +176 -0
- package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/tailwindcss-expert.md +251 -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/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/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/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/github/workflow-create.md +42 -0
- package/packages/plugin-pm/package.json +57 -0
- package/packages/plugin-pm/plugin.json +503 -0
- package/packages/plugin-testing/README.md +401 -0
- package/{autopm/.claude/agents/testing → packages/plugin-testing/agents}/frontend-testing-engineer.md +373 -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
- package/scripts/publish-plugins.sh +166 -0
- package/autopm/.claude/agents/data/airflow-orchestration-expert.md +0 -52
- package/autopm/.claude/agents/data/kedro-pipeline-expert.md +0 -50
- package/autopm/.claude/agents/integration/message-queue-engineer.md +0 -794
- package/autopm/.claude/commands/ai/langgraph-workflow.md +0 -65
- package/autopm/.claude/commands/ai/openai-chat.md +0 -65
- package/autopm/.claude/commands/playwright/test-scaffold.md +0 -38
- package/autopm/.claude/commands/python/api-scaffold.md +0 -50
- package/autopm/.claude/commands/python/docs-query.md +0 -48
- package/autopm/.claude/commands/testing/prime.md +0 -314
- package/autopm/.claude/commands/testing/run.md +0 -125
- package/autopm/.claude/commands/ui/bootstrap-scaffold.md +0 -65
- package/autopm/.claude/rules/database-management-strategy.md +0 -17
- package/autopm/.claude/rules/database-pipeline.md +0 -94
- package/autopm/.claude/rules/ux-design-rules.md +0 -209
- package/autopm/.claude/rules/visual-testing.md +0 -223
- package/autopm/.claude/scripts/azure/README.md +0 -192
- package/autopm/.claude/scripts/azure/active-work.js +0 -524
- package/autopm/.claude/scripts/azure/active-work.sh +0 -20
- package/autopm/.claude/scripts/azure/blocked.js +0 -520
- package/autopm/.claude/scripts/azure/blocked.sh +0 -20
- package/autopm/.claude/scripts/azure/daily.js +0 -533
- package/autopm/.claude/scripts/azure/daily.sh +0 -20
- package/autopm/.claude/scripts/azure/dashboard.js +0 -970
- package/autopm/.claude/scripts/azure/dashboard.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-list.js +0 -254
- package/autopm/.claude/scripts/azure/feature-list.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-show.js +0 -7
- package/autopm/.claude/scripts/azure/feature-show.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-status.js +0 -604
- package/autopm/.claude/scripts/azure/feature-status.sh +0 -20
- package/autopm/.claude/scripts/azure/help.js +0 -342
- package/autopm/.claude/scripts/azure/help.sh +0 -20
- package/autopm/.claude/scripts/azure/next-task.js +0 -508
- package/autopm/.claude/scripts/azure/next-task.sh +0 -20
- package/autopm/.claude/scripts/azure/search.js +0 -469
- package/autopm/.claude/scripts/azure/search.sh +0 -20
- package/autopm/.claude/scripts/azure/setup.js +0 -745
- package/autopm/.claude/scripts/azure/setup.sh +0 -20
- package/autopm/.claude/scripts/azure/sprint-report.js +0 -1012
- package/autopm/.claude/scripts/azure/sprint-report.sh +0 -20
- package/autopm/.claude/scripts/azure/sync.js +0 -563
- package/autopm/.claude/scripts/azure/sync.sh +0 -20
- package/autopm/.claude/scripts/azure/us-list.js +0 -210
- package/autopm/.claude/scripts/azure/us-list.sh +0 -20
- package/autopm/.claude/scripts/azure/us-status.js +0 -238
- package/autopm/.claude/scripts/azure/us-status.sh +0 -20
- package/autopm/.claude/scripts/azure/validate.js +0 -626
- package/autopm/.claude/scripts/azure/validate.sh +0 -20
- package/autopm/.claude/scripts/azure/wrapper-template.sh +0 -20
- package/autopm/.claude/scripts/github/dependency-tracker.js +0 -554
- package/autopm/.claude/scripts/github/dependency-validator.js +0 -545
- package/autopm/.claude/scripts/github/dependency-visualizer.js +0 -477
- package/bin/node/azure-feature-show.js +0 -7
- /package/{autopm/.claude/agents/cloud → packages/plugin-ai/agents}/gemini-api-expert.md +0 -0
- /package/{autopm/.claude/agents/data → packages/plugin-ai/agents}/langgraph-workflow-expert.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-ai/agents}/openai-python-expert.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/README.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/aws-cloud-architect.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/azure-cloud-architect.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/gcp-cloud-architect.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/gcp-cloud-functions-engineer.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/kubernetes-orchestrator.md +0 -0
- /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/terraform-infrastructure-expert.md +0 -0
- /package/{autopm/.claude/commands/cloud → packages/plugin-cloud/commands}/infra-deploy.md +0 -0
- /package/{autopm/.claude/commands/kubernetes/deploy.md → packages/plugin-cloud/commands/k8s-deploy.md} +0 -0
- /package/{autopm/.claude/commands/infrastructure → packages/plugin-cloud/commands}/ssh-security.md +0 -0
- /package/{autopm/.claude/commands/infrastructure → packages/plugin-cloud/commands}/traefik-setup.md +0 -0
- /package/{autopm/.claude → packages/plugin-cloud}/rules/infrastructure-pipeline.md +0 -0
- /package/{autopm/.claude → packages/plugin-core}/agents/core/agent-manager.md +0 -0
- /package/{autopm/.claude → packages/plugin-core}/agents/core/code-analyzer.md +0 -0
- /package/{autopm/.claude → packages/plugin-core}/agents/core/file-analyzer.md +0 -0
- /package/{autopm/.claude → packages/plugin-core}/agents/core/test-runner.md +0 -0
- /package/{autopm/.claude → packages/plugin-core}/rules/ai-integration-patterns.md +0 -0
- /package/{autopm/.claude → packages/plugin-core}/rules/performance-guidelines.md +0 -0
- /package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/README.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/README.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/azure-devops-specialist.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/docker-containerization-expert.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/mcp-context-manager.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/observability-engineer.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/ssh-operations-expert.md +0 -0
- /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/traefik-proxy-expert.md +0 -0
- /package/{autopm/.claude/commands/github → packages/plugin-devops/commands}/workflow-create.md +0 -0
- /package/{autopm/.claude → packages/plugin-devops}/rules/ci-cd-kubernetes-strategy.md +0 -0
- /package/{autopm/.claude → packages/plugin-devops}/rules/devops-troubleshooting-playbook.md +0 -0
- /package/{autopm/.claude → packages/plugin-devops}/rules/docker-first-development.md +0 -0
- /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/README.md +0 -0
- /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/nats-messaging-expert.md +0 -0
- /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/react-ui-expert.md +0 -0
- /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/ux-design-expert.md +0 -0
- /package/{autopm/.claude/commands/react → packages/plugin-frameworks/commands}/app-scaffold.md +0 -0
- /package/{autopm/.claude/commands/ui → packages/plugin-frameworks/commands}/tailwind-system.md +0 -0
- /package/{autopm/.claude → packages/plugin-frameworks}/rules/ui-development-standards.md +0 -0
- /package/{autopm/.claude → packages/plugin-frameworks}/rules/ui-framework-rules.md +0 -0
- /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/README.md +0 -0
- /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/bash-scripting-expert.md +0 -0
- /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/javascript-frontend-engineer.md +0 -0
- /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/nodejs-backend-engineer.md +0 -0
- /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/python-backend-engineer.md +0 -0
- /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/python-backend-expert.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/COMMANDS.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/COMMAND_MAPPING.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/INTEGRATION_FIX.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/README.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/active-work.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/aliases.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/blocked-items.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/clean.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/docs-query.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-decompose.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-list.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-new.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-show.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-start.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/fix-integration-example.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/help.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/import-us.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/init.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/next-task.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/search.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/sprint-status.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/standup.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/sync-all.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-analyze.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-close.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-edit.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-list.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-new.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-reopen.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-show.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-start.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-status.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-sync.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-edit.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-list.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-new.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-parse.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-show.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-status.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/validate.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/commands/azure/work-item-sync.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/blocked.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/clean.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context-create.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context-prime.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context-update.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-close.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-decompose.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-edit.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-list.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-merge.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-oneshot.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-refresh.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-show.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-split.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-start.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-status.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-sync-modular.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-sync-original.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-sync.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/help.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/import.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/in-progress.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/init.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-analyze.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-close.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-edit.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-reopen.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-show.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-start.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-status.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-sync.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/next.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-edit.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-list.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-new.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-parse.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-status.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/search.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/standup.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/status.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/sync.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/test-reference-update.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/validate.md +0 -0
- /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/what-next.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/analytics.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/blocked.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/blocked.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/clean.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context-create.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context-prime.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context-update.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-close.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-edit.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-list.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-list.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-show.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-show.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-split.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-start/epic-start.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-start/epic-start.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-status.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-status.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/README.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/create-epic-issue.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/create-task-issues.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/update-epic-file.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/update-references.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/help.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/help.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/in-progress.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/in-progress.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/init.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/init.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-close.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-edit.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-show.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-start.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/format-comment.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/gather-updates.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/post-comment.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/preflight-validation.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/update-frontmatter.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/lib/README.md +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/lib/epic-discovery.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/lib/logger.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/next.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/next.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/optimize.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/pr-create.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/pr-list.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-list.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-list.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-new.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-parse.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-status.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-status.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/release.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/search.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/search.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/standup.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/standup.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/status.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/status.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/sync-batch.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/sync.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/template-list.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/template-new.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/validate.js +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/validate.sh +0 -0
- /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/what-next.js +0 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Production Bash Script - Context7 Best Practices
|
|
4
|
+
#
|
|
5
|
+
# Demonstrates production-ready Bash patterns from Context7:
|
|
6
|
+
# - Proper error handling (set -euo pipefail)
|
|
7
|
+
# - Logging functions
|
|
8
|
+
# - Cleanup handlers
|
|
9
|
+
# - Function documentation
|
|
10
|
+
# - Input validation
|
|
11
|
+
# - Single instance enforcement
|
|
12
|
+
#
|
|
13
|
+
# Source: /bobbyiliev/introduction-to-bash-scripting (385 snippets, trust 10.0)
|
|
14
|
+
|
|
15
|
+
# Context7 Pattern 1: Strict Error Handling (MANDATORY)
|
|
16
|
+
# ✅ CORRECT: Always use these settings for production scripts
|
|
17
|
+
set -e # Exit on error
|
|
18
|
+
set -u # Exit on undefined variable
|
|
19
|
+
set -o pipefail # Exit on pipe failure
|
|
20
|
+
|
|
21
|
+
# Enable debug mode if DEBUG environment variable is set
|
|
22
|
+
[[ "${DEBUG:-0}" == "1" ]] && set -x
|
|
23
|
+
|
|
24
|
+
# Context7 Pattern 2: Script Metadata
|
|
25
|
+
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
26
|
+
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
|
|
27
|
+
readonly SCRIPT_VERSION="1.0.0"
|
|
28
|
+
readonly LOG_FILE="${LOG_FILE:-/tmp/${SCRIPT_NAME%.sh}.log}"
|
|
29
|
+
readonly PID_FILE="/tmp/${SCRIPT_NAME%.sh}.pid"
|
|
30
|
+
|
|
31
|
+
# Color codes for terminal output
|
|
32
|
+
readonly RED='\033[0;31m'
|
|
33
|
+
readonly GREEN='\033[0;32m'
|
|
34
|
+
readonly YELLOW='\033[1;33m'
|
|
35
|
+
readonly BLUE='\033[0;34m'
|
|
36
|
+
readonly NC='\033[0m' # No Color
|
|
37
|
+
|
|
38
|
+
# Context7 Pattern 3: Logging Functions
|
|
39
|
+
#######################################
|
|
40
|
+
# Description: Log message with timestamp
|
|
41
|
+
# Globals: LOG_FILE
|
|
42
|
+
# Arguments: $@ - Message to log
|
|
43
|
+
# Outputs: Writes to stdout and log file
|
|
44
|
+
# Returns: 0
|
|
45
|
+
#######################################
|
|
46
|
+
log() {
|
|
47
|
+
local message="[$(date +'%Y-%m-%d %H:%M:%S')] $*"
|
|
48
|
+
echo "$message" | tee -a "${LOG_FILE}"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#######################################
|
|
52
|
+
# Description: Log error message
|
|
53
|
+
# Globals: LOG_FILE, RED, NC
|
|
54
|
+
# Arguments: $@ - Error message
|
|
55
|
+
# Outputs: Writes to stderr and log file
|
|
56
|
+
# Returns: 0
|
|
57
|
+
#######################################
|
|
58
|
+
log_error() {
|
|
59
|
+
local message="[ERROR] $*"
|
|
60
|
+
echo -e "${RED}${message}${NC}" >&2
|
|
61
|
+
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ${message}" >> "${LOG_FILE}"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#######################################
|
|
65
|
+
# Description: Log success message
|
|
66
|
+
# Globals: LOG_FILE, GREEN, NC
|
|
67
|
+
# Arguments: $@ - Success message
|
|
68
|
+
# Outputs: Writes to stdout and log file
|
|
69
|
+
# Returns: 0
|
|
70
|
+
#######################################
|
|
71
|
+
log_success() {
|
|
72
|
+
local message="[SUCCESS] $*"
|
|
73
|
+
echo -e "${GREEN}${message}${NC}"
|
|
74
|
+
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ${message}" >> "${LOG_FILE}"
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#######################################
|
|
78
|
+
# Description: Log warning message
|
|
79
|
+
# Globals: LOG_FILE, YELLOW, NC
|
|
80
|
+
# Arguments: $@ - Warning message
|
|
81
|
+
# Outputs: Writes to stdout and log file
|
|
82
|
+
# Returns: 0
|
|
83
|
+
#######################################
|
|
84
|
+
log_warning() {
|
|
85
|
+
local message="[WARNING] $*"
|
|
86
|
+
echo -e "${YELLOW}${message}${NC}"
|
|
87
|
+
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ${message}" >> "${LOG_FILE}"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
#######################################
|
|
91
|
+
# Description: Log info message
|
|
92
|
+
# Globals: LOG_FILE, BLUE, NC
|
|
93
|
+
# Arguments: $@ - Info message
|
|
94
|
+
# Outputs: Writes to stdout and log file
|
|
95
|
+
# Returns: 0
|
|
96
|
+
#######################################
|
|
97
|
+
log_info() {
|
|
98
|
+
local message="[INFO] $*"
|
|
99
|
+
echo -e "${BLUE}${message}${NC}"
|
|
100
|
+
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ${message}" >> "${LOG_FILE}"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Context7 Pattern 4: Error Handler with Cleanup
|
|
104
|
+
#######################################
|
|
105
|
+
# Description: Handle errors and exit gracefully
|
|
106
|
+
# Globals: LOG_FILE
|
|
107
|
+
# Arguments: $1 - Exit code, $2 - Line number
|
|
108
|
+
# Outputs: Error message
|
|
109
|
+
# Returns: Exits with provided code
|
|
110
|
+
#######################################
|
|
111
|
+
error_handler() {
|
|
112
|
+
local exit_code=$1
|
|
113
|
+
local line_number=$2
|
|
114
|
+
log_error "Command failed with exit code ${exit_code} at line ${line_number}"
|
|
115
|
+
cleanup
|
|
116
|
+
exit "${exit_code}"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
#######################################
|
|
120
|
+
# Description: Cleanup resources before exit
|
|
121
|
+
# Globals: PID_FILE
|
|
122
|
+
# Arguments: None
|
|
123
|
+
# Outputs: Cleanup messages
|
|
124
|
+
# Returns: 0
|
|
125
|
+
#######################################
|
|
126
|
+
cleanup() {
|
|
127
|
+
local exit_code=$?
|
|
128
|
+
log "Cleaning up resources..."
|
|
129
|
+
|
|
130
|
+
# Remove PID file
|
|
131
|
+
if [[ -f "${PID_FILE}" ]]; then
|
|
132
|
+
rm -f "${PID_FILE}"
|
|
133
|
+
log "Removed PID file"
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Kill background jobs
|
|
137
|
+
if jobs -p | grep -q .; then
|
|
138
|
+
log "Killing background jobs..."
|
|
139
|
+
jobs -p | xargs -r kill 2>/dev/null || true
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
# Additional cleanup tasks
|
|
143
|
+
if [[ -d "${TEMP_DIR:-}" ]]; then
|
|
144
|
+
log "Removing temporary directory: ${TEMP_DIR}"
|
|
145
|
+
rm -rf "${TEMP_DIR}"
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
log "Cleanup completed"
|
|
149
|
+
return "${exit_code}"
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Context7 Pattern 5: Register Handlers
|
|
153
|
+
trap 'error_handler $? $LINENO' ERR
|
|
154
|
+
trap cleanup EXIT INT TERM
|
|
155
|
+
|
|
156
|
+
# Context7 Pattern 6: Single Instance Enforcement
|
|
157
|
+
#######################################
|
|
158
|
+
# Description: Ensure only one instance of script runs
|
|
159
|
+
# Globals: PID_FILE, SCRIPT_NAME
|
|
160
|
+
# Arguments: None
|
|
161
|
+
# Outputs: Error if instance already running
|
|
162
|
+
# Returns: 0 if successful, 1 if instance exists
|
|
163
|
+
#######################################
|
|
164
|
+
check_single_instance() {
|
|
165
|
+
if [[ -f "${PID_FILE}" ]]; then
|
|
166
|
+
local old_pid
|
|
167
|
+
old_pid=$(cat "${PID_FILE}")
|
|
168
|
+
|
|
169
|
+
# Check if process is still running
|
|
170
|
+
if kill -0 "${old_pid}" 2>/dev/null; then
|
|
171
|
+
log_error "Another instance is already running (PID: ${old_pid})"
|
|
172
|
+
return 1
|
|
173
|
+
else
|
|
174
|
+
log_warning "Removing stale PID file"
|
|
175
|
+
rm -f "${PID_FILE}"
|
|
176
|
+
fi
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
# Write current PID
|
|
180
|
+
echo $$ > "${PID_FILE}"
|
|
181
|
+
log "Created PID file: ${PID_FILE}"
|
|
182
|
+
return 0
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# Context7 Pattern 7: Input Validation
|
|
186
|
+
#######################################
|
|
187
|
+
# Description: Validate input against pattern
|
|
188
|
+
# Globals: None
|
|
189
|
+
# Arguments:
|
|
190
|
+
# $1 - Input to validate
|
|
191
|
+
# $2 - Regex pattern
|
|
192
|
+
# $3 - Error message
|
|
193
|
+
# Outputs: Error message if validation fails
|
|
194
|
+
# Returns: 0 if valid, 1 if invalid
|
|
195
|
+
#######################################
|
|
196
|
+
validate_input() {
|
|
197
|
+
local input=$1
|
|
198
|
+
local pattern=$2
|
|
199
|
+
local error_msg=$3
|
|
200
|
+
|
|
201
|
+
if [[ ! "${input}" =~ ${pattern} ]]; then
|
|
202
|
+
log_error "${error_msg}"
|
|
203
|
+
return 1
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
log "Input validation passed: ${input}"
|
|
207
|
+
return 0
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# Context7 Pattern 8: Dependency Checking
|
|
211
|
+
#######################################
|
|
212
|
+
# Description: Check required commands are available
|
|
213
|
+
# Globals: None
|
|
214
|
+
# Arguments: None
|
|
215
|
+
# Outputs: List of missing dependencies
|
|
216
|
+
# Returns: 0 if all found, 1 if any missing
|
|
217
|
+
#######################################
|
|
218
|
+
check_dependencies() {
|
|
219
|
+
local deps=("git" "curl" "jq")
|
|
220
|
+
local missing=()
|
|
221
|
+
|
|
222
|
+
log "Checking dependencies..."
|
|
223
|
+
|
|
224
|
+
for cmd in "${deps[@]}"; do
|
|
225
|
+
if ! command -v "${cmd}" &> /dev/null; then
|
|
226
|
+
missing+=("${cmd}")
|
|
227
|
+
fi
|
|
228
|
+
done
|
|
229
|
+
|
|
230
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
231
|
+
log_error "Missing dependencies: ${missing[*]}"
|
|
232
|
+
log_error "Please install missing commands and try again"
|
|
233
|
+
return 1
|
|
234
|
+
fi
|
|
235
|
+
|
|
236
|
+
log_success "All dependencies found"
|
|
237
|
+
return 0
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
# Context7 Pattern 9: Configuration Management
|
|
241
|
+
#######################################
|
|
242
|
+
# Description: Load configuration from file
|
|
243
|
+
# Globals: CONFIG_FILE
|
|
244
|
+
# Arguments: $1 - Config file path (optional)
|
|
245
|
+
# Outputs: Configuration values
|
|
246
|
+
# Returns: 0 if successful, 1 if file not found
|
|
247
|
+
#######################################
|
|
248
|
+
load_config() {
|
|
249
|
+
local config_file="${1:-${CONFIG_FILE:-config.env}}"
|
|
250
|
+
|
|
251
|
+
if [[ ! -f "${config_file}" ]]; then
|
|
252
|
+
log_warning "Config file not found: ${config_file}"
|
|
253
|
+
log "Using default configuration"
|
|
254
|
+
return 0
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
log "Loading configuration from: ${config_file}"
|
|
258
|
+
|
|
259
|
+
# Source config file safely
|
|
260
|
+
set +u # Temporarily disable undefined variable check
|
|
261
|
+
# shellcheck source=/dev/null
|
|
262
|
+
source "${config_file}"
|
|
263
|
+
set -u
|
|
264
|
+
|
|
265
|
+
log_success "Configuration loaded"
|
|
266
|
+
return 0
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
# Context7 Pattern 10: Retry Logic
|
|
270
|
+
#######################################
|
|
271
|
+
# Description: Retry command with exponential backoff
|
|
272
|
+
# Globals: None
|
|
273
|
+
# Arguments:
|
|
274
|
+
# $1 - Max attempts
|
|
275
|
+
# $2 - Base delay in seconds
|
|
276
|
+
# ${@:3} - Command to execute
|
|
277
|
+
# Outputs: Command output
|
|
278
|
+
# Returns: 0 if successful, 1 if all attempts failed
|
|
279
|
+
#######################################
|
|
280
|
+
retry_with_backoff() {
|
|
281
|
+
local max_attempts=$1
|
|
282
|
+
local base_delay=$2
|
|
283
|
+
shift 2
|
|
284
|
+
local command=("$@")
|
|
285
|
+
|
|
286
|
+
local attempt=1
|
|
287
|
+
while [[ ${attempt} -le ${max_attempts} ]]; do
|
|
288
|
+
log "Attempt ${attempt}/${max_attempts}: ${command[*]}"
|
|
289
|
+
|
|
290
|
+
if "${command[@]}"; then
|
|
291
|
+
log_success "Command succeeded on attempt ${attempt}"
|
|
292
|
+
return 0
|
|
293
|
+
fi
|
|
294
|
+
|
|
295
|
+
if [[ ${attempt} -lt ${max_attempts} ]]; then
|
|
296
|
+
local delay=$((base_delay * attempt))
|
|
297
|
+
log_warning "Command failed, retrying in ${delay} seconds..."
|
|
298
|
+
sleep "${delay}"
|
|
299
|
+
fi
|
|
300
|
+
|
|
301
|
+
((attempt++))
|
|
302
|
+
done
|
|
303
|
+
|
|
304
|
+
log_error "Command failed after ${max_attempts} attempts"
|
|
305
|
+
return 1
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
# Example Business Logic Functions
|
|
309
|
+
|
|
310
|
+
#######################################
|
|
311
|
+
# Description: Process data file
|
|
312
|
+
# Globals: TEMP_DIR
|
|
313
|
+
# Arguments: $1 - Input file path
|
|
314
|
+
# Outputs: Processing results
|
|
315
|
+
# Returns: 0 if successful, 1 on error
|
|
316
|
+
#######################################
|
|
317
|
+
process_data() {
|
|
318
|
+
local input_file=$1
|
|
319
|
+
local output_file="${TEMP_DIR}/processed_$(basename "${input_file}")"
|
|
320
|
+
|
|
321
|
+
log_info "Processing data file: ${input_file}"
|
|
322
|
+
|
|
323
|
+
# Validate input file exists
|
|
324
|
+
if [[ ! -f "${input_file}" ]]; then
|
|
325
|
+
log_error "Input file not found: ${input_file}"
|
|
326
|
+
return 1
|
|
327
|
+
fi
|
|
328
|
+
|
|
329
|
+
# Example processing (count lines, remove empty lines, sort)
|
|
330
|
+
local line_count
|
|
331
|
+
line_count=$(wc -l < "${input_file}")
|
|
332
|
+
log "Input file has ${line_count} lines"
|
|
333
|
+
|
|
334
|
+
# Process file
|
|
335
|
+
grep -v "^$" "${input_file}" | sort -u > "${output_file}"
|
|
336
|
+
|
|
337
|
+
local processed_count
|
|
338
|
+
processed_count=$(wc -l < "${output_file}")
|
|
339
|
+
log_success "Processed ${processed_count} unique non-empty lines"
|
|
340
|
+
log "Output file: ${output_file}"
|
|
341
|
+
|
|
342
|
+
return 0
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
#######################################
|
|
346
|
+
# Description: Deploy application
|
|
347
|
+
# Globals: None
|
|
348
|
+
# Arguments: $1 - Environment (dev/staging/prod)
|
|
349
|
+
# Outputs: Deployment status
|
|
350
|
+
# Returns: 0 if successful, 1 on error
|
|
351
|
+
#######################################
|
|
352
|
+
deploy_application() {
|
|
353
|
+
local environment=$1
|
|
354
|
+
|
|
355
|
+
log_info "Starting deployment to ${environment}"
|
|
356
|
+
|
|
357
|
+
# Validate environment
|
|
358
|
+
validate_input "${environment}" "^(dev|staging|prod)$" \
|
|
359
|
+
"Invalid environment. Must be: dev, staging, or prod" || return 1
|
|
360
|
+
|
|
361
|
+
# Backup current version
|
|
362
|
+
log "Creating backup..."
|
|
363
|
+
mkdir -p "${TEMP_DIR}/backup"
|
|
364
|
+
|
|
365
|
+
# Simulate deployment steps
|
|
366
|
+
local steps=("pull_code" "run_tests" "build" "deploy")
|
|
367
|
+
|
|
368
|
+
for step in "${steps[@]}"; do
|
|
369
|
+
log "Executing step: ${step}"
|
|
370
|
+
sleep 1 # Simulate work
|
|
371
|
+
|
|
372
|
+
# Random failure for demonstration (20% chance)
|
|
373
|
+
if [[ $((RANDOM % 5)) -eq 0 && "${step}" == "build" ]]; then
|
|
374
|
+
log_error "Step failed: ${step}"
|
|
375
|
+
return 1
|
|
376
|
+
fi
|
|
377
|
+
|
|
378
|
+
log_success "Step completed: ${step}"
|
|
379
|
+
done
|
|
380
|
+
|
|
381
|
+
log_success "Deployment to ${environment} completed successfully"
|
|
382
|
+
return 0
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
# Main Function
|
|
386
|
+
#######################################
|
|
387
|
+
# Description: Main entry point
|
|
388
|
+
# Globals: All script globals
|
|
389
|
+
# Arguments: $@ - Command line arguments
|
|
390
|
+
# Outputs: Script execution results
|
|
391
|
+
# Returns: 0 if successful, 1 on error
|
|
392
|
+
#######################################
|
|
393
|
+
main() {
|
|
394
|
+
log "Starting ${SCRIPT_NAME} v${SCRIPT_VERSION}"
|
|
395
|
+
log "Log file: ${LOG_FILE}"
|
|
396
|
+
|
|
397
|
+
# Check for single instance
|
|
398
|
+
check_single_instance || exit 1
|
|
399
|
+
|
|
400
|
+
# Check dependencies
|
|
401
|
+
check_dependencies || exit 1
|
|
402
|
+
|
|
403
|
+
# Load configuration
|
|
404
|
+
load_config
|
|
405
|
+
|
|
406
|
+
# Create temporary directory
|
|
407
|
+
TEMP_DIR=$(mktemp -d)
|
|
408
|
+
log "Created temporary directory: ${TEMP_DIR}"
|
|
409
|
+
|
|
410
|
+
# Parse command line arguments
|
|
411
|
+
local environment="${1:-dev}"
|
|
412
|
+
|
|
413
|
+
# Example: Process data file
|
|
414
|
+
if [[ -f "/tmp/test-data.txt" ]]; then
|
|
415
|
+
process_data "/tmp/test-data.txt" || true
|
|
416
|
+
else
|
|
417
|
+
# Create test data
|
|
418
|
+
echo -e "line1\nline2\n\nline3\nline2" > "/tmp/test-data.txt"
|
|
419
|
+
process_data "/tmp/test-data.txt"
|
|
420
|
+
fi
|
|
421
|
+
|
|
422
|
+
# Example: Deploy with retry
|
|
423
|
+
log_info "Deploying application..."
|
|
424
|
+
if ! retry_with_backoff 3 2 deploy_application "${environment}"; then
|
|
425
|
+
log_error "Deployment failed after retries"
|
|
426
|
+
exit 1
|
|
427
|
+
fi
|
|
428
|
+
|
|
429
|
+
log_success "Script completed successfully"
|
|
430
|
+
return 0
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
# Usage information
|
|
434
|
+
#######################################
|
|
435
|
+
# Description: Display usage information
|
|
436
|
+
# Globals: SCRIPT_NAME, SCRIPT_VERSION
|
|
437
|
+
# Arguments: None
|
|
438
|
+
# Outputs: Usage text
|
|
439
|
+
# Returns: 0
|
|
440
|
+
#######################################
|
|
441
|
+
usage() {
|
|
442
|
+
cat << EOF
|
|
443
|
+
Usage: ${SCRIPT_NAME} [OPTIONS] [ENVIRONMENT]
|
|
444
|
+
|
|
445
|
+
Production-ready Bash script demonstrating Context7 best practices.
|
|
446
|
+
|
|
447
|
+
ARGUMENTS:
|
|
448
|
+
ENVIRONMENT Target environment (dev|staging|prod) [default: dev]
|
|
449
|
+
|
|
450
|
+
OPTIONS:
|
|
451
|
+
-h, --help Show this help message
|
|
452
|
+
-v, --version Show script version
|
|
453
|
+
--debug Enable debug mode (set -x)
|
|
454
|
+
|
|
455
|
+
EXAMPLES:
|
|
456
|
+
${SCRIPT_NAME} dev
|
|
457
|
+
${SCRIPT_NAME} prod
|
|
458
|
+
DEBUG=1 ${SCRIPT_NAME} staging
|
|
459
|
+
|
|
460
|
+
ENVIRONMENT VARIABLES:
|
|
461
|
+
DEBUG Enable debug mode (0 or 1)
|
|
462
|
+
LOG_FILE Custom log file path
|
|
463
|
+
CONFIG_FILE Custom config file path
|
|
464
|
+
|
|
465
|
+
FILES:
|
|
466
|
+
${LOG_FILE} Log file
|
|
467
|
+
${PID_FILE} PID file (single instance)
|
|
468
|
+
|
|
469
|
+
EOF
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
# Command line argument parsing
|
|
473
|
+
if [[ "${1:-}" =~ ^(-h|--help)$ ]]; then
|
|
474
|
+
usage
|
|
475
|
+
exit 0
|
|
476
|
+
fi
|
|
477
|
+
|
|
478
|
+
if [[ "${1:-}" =~ ^(-v|--version)$ ]]; then
|
|
479
|
+
echo "${SCRIPT_VERSION}"
|
|
480
|
+
exit 0
|
|
481
|
+
fi
|
|
482
|
+
|
|
483
|
+
# Execute main function if script is run directly (not sourced)
|
|
484
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
485
|
+
main "$@"
|
|
486
|
+
fi
|
|
487
|
+
|
|
488
|
+
# Context7 Best Practices Summary
|
|
489
|
+
cat << 'EOF'
|
|
490
|
+
|
|
491
|
+
Context7 Verified Best Practices Applied:
|
|
492
|
+
==========================================
|
|
493
|
+
1. ✅ set -euo pipefail (strict error handling)
|
|
494
|
+
2. ✅ Comprehensive logging functions (log, log_error, log_success, etc.)
|
|
495
|
+
3. ✅ Error handler with line number reporting
|
|
496
|
+
4. ✅ Cleanup function with trap handlers (EXIT, INT, TERM, ERR)
|
|
497
|
+
5. ✅ Single instance enforcement (PID file)
|
|
498
|
+
6. ✅ Input validation with regex patterns
|
|
499
|
+
7. ✅ Dependency checking before execution
|
|
500
|
+
8. ✅ Configuration file loading
|
|
501
|
+
9. ✅ Retry logic with exponential backoff
|
|
502
|
+
10. ✅ Comprehensive function documentation (Google style)
|
|
503
|
+
11. ✅ Color-coded terminal output
|
|
504
|
+
12. ✅ Temporary directory management
|
|
505
|
+
13. ✅ Usage documentation
|
|
506
|
+
14. ✅ Version information
|
|
507
|
+
15. ✅ Debug mode support
|
|
508
|
+
|
|
509
|
+
Source:
|
|
510
|
+
- /bobbyiliev/introduction-to-bash-scripting (385 snippets, trust 10.0)
|
|
511
|
+
|
|
512
|
+
Production-Ready Features:
|
|
513
|
+
- Safe error handling prevents cascading failures
|
|
514
|
+
- Logging provides audit trail
|
|
515
|
+
- Single instance prevents race conditions
|
|
516
|
+
- Retry logic handles transient failures
|
|
517
|
+
- Cleanup ensures no resource leaks
|
|
518
|
+
- Comprehensive documentation aids maintenance
|
|
519
|
+
|
|
520
|
+
EOF
|