claude-autopm 2.8.2 → 2.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +399 -637
- package/package.json +2 -1
- package/packages/plugin-ai/LICENSE +21 -0
- package/packages/plugin-ai/README.md +316 -0
- package/packages/plugin-ai/agents/anthropic-claude-expert.md +579 -0
- package/packages/plugin-ai/agents/azure-openai-expert.md +1411 -0
- package/packages/plugin-ai/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-ai/agents/google-a2a-expert.md +1445 -0
- package/packages/plugin-ai/agents/huggingface-expert.md +2131 -0
- package/packages/plugin-ai/agents/langchain-expert.md +1427 -0
- package/packages/plugin-ai/agents/langgraph-workflow-expert.md +520 -0
- package/packages/plugin-ai/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-ai/commands/a2a-setup.md +886 -0
- package/packages/plugin-ai/commands/ai-model-deployment.md +481 -0
- package/packages/plugin-ai/commands/anthropic-optimize.md +793 -0
- package/packages/plugin-ai/commands/huggingface-deploy.md +789 -0
- package/packages/plugin-ai/commands/langchain-optimize.md +807 -0
- package/packages/plugin-ai/commands/llm-optimize.md +348 -0
- package/packages/plugin-ai/commands/openai-optimize.md +863 -0
- package/packages/plugin-ai/commands/rag-optimize.md +841 -0
- package/packages/plugin-ai/commands/rag-setup-scaffold.md +382 -0
- package/packages/plugin-ai/package.json +66 -0
- package/packages/plugin-ai/plugin.json +519 -0
- package/packages/plugin-ai/rules/ai-model-standards.md +449 -0
- package/packages/plugin-ai/rules/prompt-engineering-standards.md +509 -0
- package/packages/plugin-ai/scripts/examples/huggingface-inference-example.py +145 -0
- package/packages/plugin-ai/scripts/examples/langchain-rag-example.py +366 -0
- package/packages/plugin-ai/scripts/examples/mlflow-tracking-example.py +224 -0
- package/packages/plugin-ai/scripts/examples/openai-chat-example.py +425 -0
- package/packages/plugin-cloud/README.md +268 -0
- package/packages/plugin-cloud/agents/README.md +55 -0
- package/packages/plugin-cloud/agents/aws-cloud-architect.md +521 -0
- package/packages/plugin-cloud/agents/azure-cloud-architect.md +436 -0
- package/packages/plugin-cloud/agents/gcp-cloud-architect.md +385 -0
- package/packages/plugin-cloud/agents/gcp-cloud-functions-engineer.md +306 -0
- package/packages/plugin-cloud/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-cloud/agents/kubernetes-orchestrator.md +566 -0
- package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-cloud/agents/terraform-infrastructure-expert.md +454 -0
- package/packages/plugin-cloud/commands/cloud-cost-optimize.md +243 -0
- package/packages/plugin-cloud/commands/cloud-validate.md +196 -0
- package/packages/plugin-cloud/commands/infra-deploy.md +38 -0
- package/packages/plugin-cloud/commands/k8s-deploy.md +37 -0
- package/packages/plugin-cloud/commands/ssh-security.md +65 -0
- package/packages/plugin-cloud/commands/traefik-setup.md +65 -0
- package/packages/plugin-cloud/hooks/pre-cloud-deploy.js +456 -0
- package/packages/plugin-cloud/package.json +64 -0
- package/packages/plugin-cloud/plugin.json +338 -0
- package/packages/plugin-cloud/rules/cloud-security-compliance.md +313 -0
- package/packages/plugin-cloud/rules/infrastructure-pipeline.md +128 -0
- package/packages/plugin-cloud/scripts/examples/aws-validate.sh +30 -0
- package/packages/plugin-cloud/scripts/examples/azure-setup.sh +33 -0
- package/packages/plugin-cloud/scripts/examples/gcp-setup.sh +39 -0
- package/packages/plugin-cloud/scripts/examples/k8s-validate.sh +40 -0
- package/packages/plugin-cloud/scripts/examples/terraform-init.sh +26 -0
- package/packages/plugin-core/README.md +274 -0
- package/packages/plugin-core/agents/core/agent-manager.md +296 -0
- package/packages/plugin-core/agents/core/code-analyzer.md +131 -0
- package/packages/plugin-core/agents/core/file-analyzer.md +162 -0
- package/packages/plugin-core/agents/core/test-runner.md +200 -0
- package/packages/plugin-core/commands/code-rabbit.md +128 -0
- package/packages/plugin-core/commands/prompt.md +9 -0
- package/packages/plugin-core/commands/re-init.md +9 -0
- package/packages/plugin-core/hooks/context7-reminder.md +29 -0
- package/packages/plugin-core/hooks/enforce-agents.js +125 -0
- package/packages/plugin-core/hooks/enforce-agents.sh +35 -0
- package/packages/plugin-core/hooks/pre-agent-context7.js +224 -0
- package/packages/plugin-core/hooks/pre-command-context7.js +229 -0
- package/packages/plugin-core/hooks/strict-enforce-agents.sh +39 -0
- package/packages/plugin-core/hooks/test-hook.sh +21 -0
- package/packages/plugin-core/hooks/unified-context7-enforcement.sh +38 -0
- package/packages/plugin-core/package.json +45 -0
- package/packages/plugin-core/plugin.json +387 -0
- package/packages/plugin-core/rules/agent-coordination.md +549 -0
- package/packages/plugin-core/rules/agent-mandatory.md +170 -0
- package/packages/plugin-core/rules/ai-integration-patterns.md +219 -0
- package/packages/plugin-core/rules/command-pipelines.md +208 -0
- package/packages/plugin-core/rules/context-optimization.md +176 -0
- package/packages/plugin-core/rules/context7-enforcement.md +327 -0
- package/packages/plugin-core/rules/datetime.md +122 -0
- package/packages/plugin-core/rules/definition-of-done.md +272 -0
- package/packages/plugin-core/rules/development-environments.md +19 -0
- package/packages/plugin-core/rules/development-workflow.md +198 -0
- package/packages/plugin-core/rules/framework-path-rules.md +180 -0
- package/packages/plugin-core/rules/frontmatter-operations.md +64 -0
- package/packages/plugin-core/rules/git-strategy.md +237 -0
- package/packages/plugin-core/rules/golden-rules.md +181 -0
- package/packages/plugin-core/rules/naming-conventions.md +111 -0
- package/packages/plugin-core/rules/no-pr-workflow.md +183 -0
- package/packages/plugin-core/rules/performance-guidelines.md +403 -0
- package/packages/plugin-core/rules/pipeline-mandatory.md +109 -0
- package/packages/plugin-core/rules/security-checklist.md +318 -0
- package/packages/plugin-core/rules/standard-patterns.md +197 -0
- package/packages/plugin-core/rules/strip-frontmatter.md +85 -0
- package/packages/plugin-core/rules/tdd.enforcement.md +103 -0
- package/packages/plugin-core/rules/use-ast-grep.md +113 -0
- package/packages/plugin-core/scripts/lib/datetime-utils.sh +254 -0
- package/packages/plugin-core/scripts/lib/frontmatter-utils.sh +294 -0
- package/packages/plugin-core/scripts/lib/github-utils.sh +221 -0
- package/packages/plugin-core/scripts/lib/logging-utils.sh +199 -0
- package/packages/plugin-core/scripts/lib/validation-utils.sh +339 -0
- package/packages/plugin-core/scripts/mcp/add.sh +7 -0
- package/packages/plugin-core/scripts/mcp/disable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/enable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/list.sh +7 -0
- package/packages/plugin-core/scripts/mcp/sync.sh +8 -0
- package/packages/plugin-data/README.md +315 -0
- package/packages/plugin-data/agents/airflow-orchestration-expert.md +158 -0
- package/packages/plugin-data/agents/kedro-pipeline-expert.md +304 -0
- package/packages/plugin-data/agents/langgraph-workflow-expert.md +530 -0
- package/packages/plugin-data/commands/airflow-dag-scaffold.md +413 -0
- package/packages/plugin-data/commands/kafka-pipeline-scaffold.md +503 -0
- package/packages/plugin-data/package.json +66 -0
- package/packages/plugin-data/plugin.json +294 -0
- package/packages/plugin-data/rules/data-quality-standards.md +373 -0
- package/packages/plugin-data/rules/etl-pipeline-standards.md +255 -0
- package/packages/plugin-data/scripts/examples/airflow-dag-example.py +245 -0
- package/packages/plugin-data/scripts/examples/dbt-transform-example.sql +238 -0
- package/packages/plugin-data/scripts/examples/kafka-streaming-example.py +257 -0
- package/packages/plugin-data/scripts/examples/pandas-etl-example.py +332 -0
- package/packages/plugin-databases/README.md +330 -0
- package/packages/plugin-databases/agents/README.md +50 -0
- package/packages/plugin-databases/agents/bigquery-expert.md +401 -0
- package/packages/plugin-databases/agents/cosmosdb-expert.md +375 -0
- package/packages/plugin-databases/agents/mongodb-expert.md +407 -0
- package/packages/plugin-databases/agents/postgresql-expert.md +329 -0
- package/packages/plugin-databases/agents/redis-expert.md +74 -0
- package/packages/plugin-databases/commands/db-optimize.md +612 -0
- package/packages/plugin-databases/package.json +60 -0
- package/packages/plugin-databases/plugin.json +237 -0
- package/packages/plugin-databases/rules/database-management-strategy.md +146 -0
- package/packages/plugin-databases/rules/database-pipeline.md +316 -0
- package/packages/plugin-databases/scripts/examples/bigquery-cost-analyze.sh +160 -0
- package/packages/plugin-databases/scripts/examples/cosmosdb-ru-optimize.sh +163 -0
- package/packages/plugin-databases/scripts/examples/mongodb-shard-check.sh +120 -0
- package/packages/plugin-databases/scripts/examples/postgres-index-analyze.sh +95 -0
- package/packages/plugin-databases/scripts/examples/redis-cache-stats.sh +121 -0
- package/packages/plugin-devops/README.md +367 -0
- package/packages/plugin-devops/agents/README.md +52 -0
- package/packages/plugin-devops/agents/azure-devops-specialist.md +308 -0
- package/packages/plugin-devops/agents/docker-containerization-expert.md +298 -0
- package/packages/plugin-devops/agents/github-operations-specialist.md +335 -0
- package/packages/plugin-devops/agents/mcp-context-manager.md +319 -0
- package/packages/plugin-devops/agents/observability-engineer.md +574 -0
- package/packages/plugin-devops/agents/ssh-operations-expert.md +1093 -0
- package/packages/plugin-devops/agents/traefik-proxy-expert.md +444 -0
- package/packages/plugin-devops/commands/ci-pipeline-create.md +581 -0
- package/packages/plugin-devops/commands/docker-optimize.md +493 -0
- package/packages/plugin-devops/commands/workflow-create.md +42 -0
- package/packages/plugin-devops/hooks/pre-docker-build.js +472 -0
- package/packages/plugin-devops/package.json +61 -0
- package/packages/plugin-devops/plugin.json +302 -0
- package/packages/plugin-devops/rules/ci-cd-kubernetes-strategy.md +25 -0
- package/packages/plugin-devops/rules/devops-troubleshooting-playbook.md +450 -0
- package/packages/plugin-devops/rules/docker-first-development.md +404 -0
- package/packages/plugin-devops/rules/github-operations.md +92 -0
- package/packages/plugin-devops/scripts/examples/docker-build-multistage.sh +43 -0
- package/packages/plugin-devops/scripts/examples/docker-compose-validate.sh +74 -0
- package/packages/plugin-devops/scripts/examples/github-workflow-validate.sh +48 -0
- package/packages/plugin-devops/scripts/examples/prometheus-health-check.sh +58 -0
- package/packages/plugin-devops/scripts/examples/ssh-key-setup.sh +74 -0
- package/packages/plugin-frameworks/README.md +309 -0
- package/packages/plugin-frameworks/agents/README.md +64 -0
- package/packages/plugin-frameworks/agents/e2e-test-engineer.md +579 -0
- package/packages/plugin-frameworks/agents/nats-messaging-expert.md +254 -0
- package/packages/plugin-frameworks/agents/react-frontend-engineer.md +393 -0
- package/packages/plugin-frameworks/agents/react-ui-expert.md +226 -0
- package/packages/plugin-frameworks/agents/tailwindcss-expert.md +1021 -0
- package/packages/plugin-frameworks/agents/ux-design-expert.md +244 -0
- package/packages/plugin-frameworks/commands/app-scaffold.md +50 -0
- package/packages/plugin-frameworks/commands/nextjs-optimize.md +692 -0
- package/packages/plugin-frameworks/commands/react-optimize.md +583 -0
- package/packages/plugin-frameworks/commands/tailwind-system.md +64 -0
- package/packages/plugin-frameworks/package.json +59 -0
- package/packages/plugin-frameworks/plugin.json +224 -0
- package/packages/plugin-frameworks/rules/performance-guidelines.md +403 -0
- package/packages/plugin-frameworks/rules/ui-development-standards.md +281 -0
- package/packages/plugin-frameworks/rules/ui-framework-rules.md +151 -0
- package/packages/plugin-frameworks/scripts/examples/react-component-perf.sh +34 -0
- package/packages/plugin-frameworks/scripts/examples/tailwind-optimize.sh +44 -0
- package/packages/plugin-frameworks/scripts/examples/vue-composition-check.sh +41 -0
- package/packages/plugin-languages/README.md +333 -0
- package/packages/plugin-languages/agents/README.md +50 -0
- package/packages/plugin-languages/agents/bash-scripting-expert.md +541 -0
- package/packages/plugin-languages/agents/javascript-frontend-engineer.md +197 -0
- package/packages/plugin-languages/agents/nodejs-backend-engineer.md +226 -0
- package/packages/plugin-languages/agents/python-backend-engineer.md +214 -0
- package/packages/plugin-languages/agents/python-backend-expert.md +289 -0
- package/packages/plugin-languages/commands/javascript-optimize.md +636 -0
- package/packages/plugin-languages/commands/nodejs-api-scaffold.md +341 -0
- package/packages/plugin-languages/commands/nodejs-optimize.md +689 -0
- package/packages/plugin-languages/commands/python-api-scaffold.md +261 -0
- package/packages/plugin-languages/commands/python-optimize.md +593 -0
- package/packages/plugin-languages/package.json +65 -0
- package/packages/plugin-languages/plugin.json +265 -0
- package/packages/plugin-languages/rules/code-quality-standards.md +496 -0
- package/packages/plugin-languages/rules/testing-standards.md +768 -0
- package/packages/plugin-languages/scripts/examples/bash-production-script.sh +520 -0
- package/packages/plugin-languages/scripts/examples/javascript-es6-patterns.js +291 -0
- package/packages/plugin-languages/scripts/examples/nodejs-async-iteration.js +360 -0
- package/packages/plugin-languages/scripts/examples/python-async-patterns.py +289 -0
- package/packages/plugin-languages/scripts/examples/typescript-patterns.ts +432 -0
- package/packages/plugin-ml/README.md +430 -0
- package/packages/plugin-ml/agents/automl-expert.md +326 -0
- package/packages/plugin-ml/agents/computer-vision-expert.md +550 -0
- package/packages/plugin-ml/agents/gradient-boosting-expert.md +455 -0
- package/packages/plugin-ml/agents/neural-network-architect.md +1228 -0
- package/packages/plugin-ml/agents/nlp-transformer-expert.md +584 -0
- package/packages/plugin-ml/agents/pytorch-expert.md +412 -0
- package/packages/plugin-ml/agents/reinforcement-learning-expert.md +2088 -0
- package/packages/plugin-ml/agents/scikit-learn-expert.md +228 -0
- package/packages/plugin-ml/agents/tensorflow-keras-expert.md +509 -0
- package/packages/plugin-ml/agents/time-series-expert.md +303 -0
- package/packages/plugin-ml/commands/ml-automl.md +572 -0
- package/packages/plugin-ml/commands/ml-train-optimize.md +657 -0
- package/packages/plugin-ml/package.json +52 -0
- package/packages/plugin-ml/plugin.json +338 -0
- package/packages/plugin-pm/README.md +368 -0
- package/packages/plugin-pm/claudeautopm-plugin-pm-2.0.0.tgz +0 -0
- package/packages/plugin-pm/commands/azure/COMMANDS.md +107 -0
- package/packages/plugin-pm/commands/azure/COMMAND_MAPPING.md +252 -0
- package/packages/plugin-pm/commands/azure/INTEGRATION_FIX.md +103 -0
- package/packages/plugin-pm/commands/azure/README.md +246 -0
- package/packages/plugin-pm/commands/azure/active-work.md +198 -0
- package/packages/plugin-pm/commands/azure/aliases.md +143 -0
- package/packages/plugin-pm/commands/azure/blocked-items.md +287 -0
- package/packages/plugin-pm/commands/azure/clean.md +93 -0
- package/packages/plugin-pm/commands/azure/docs-query.md +48 -0
- package/packages/plugin-pm/commands/azure/feature-decompose.md +380 -0
- package/packages/plugin-pm/commands/azure/feature-list.md +61 -0
- package/packages/plugin-pm/commands/azure/feature-new.md +115 -0
- package/packages/plugin-pm/commands/azure/feature-show.md +205 -0
- package/packages/plugin-pm/commands/azure/feature-start.md +130 -0
- package/packages/plugin-pm/commands/azure/fix-integration-example.md +93 -0
- package/packages/plugin-pm/commands/azure/help.md +150 -0
- package/packages/plugin-pm/commands/azure/import-us.md +269 -0
- package/packages/plugin-pm/commands/azure/init.md +211 -0
- package/packages/plugin-pm/commands/azure/next-task.md +262 -0
- package/packages/plugin-pm/commands/azure/search.md +160 -0
- package/packages/plugin-pm/commands/azure/sprint-status.md +235 -0
- package/packages/plugin-pm/commands/azure/standup.md +260 -0
- package/packages/plugin-pm/commands/azure/sync-all.md +99 -0
- package/packages/plugin-pm/commands/azure/task-analyze.md +186 -0
- package/packages/plugin-pm/commands/azure/task-close.md +329 -0
- package/packages/plugin-pm/commands/azure/task-edit.md +145 -0
- package/packages/plugin-pm/commands/azure/task-list.md +263 -0
- package/packages/plugin-pm/commands/azure/task-new.md +84 -0
- package/packages/plugin-pm/commands/azure/task-reopen.md +79 -0
- package/packages/plugin-pm/commands/azure/task-show.md +126 -0
- package/packages/plugin-pm/commands/azure/task-start.md +301 -0
- package/packages/plugin-pm/commands/azure/task-status.md +65 -0
- package/packages/plugin-pm/commands/azure/task-sync.md +67 -0
- package/packages/plugin-pm/commands/azure/us-edit.md +164 -0
- package/packages/plugin-pm/commands/azure/us-list.md +202 -0
- package/packages/plugin-pm/commands/azure/us-new.md +265 -0
- package/packages/plugin-pm/commands/azure/us-parse.md +253 -0
- package/packages/plugin-pm/commands/azure/us-show.md +188 -0
- package/packages/plugin-pm/commands/azure/us-status.md +320 -0
- package/packages/plugin-pm/commands/azure/validate.md +86 -0
- package/packages/plugin-pm/commands/azure/work-item-sync.md +47 -0
- package/packages/plugin-pm/commands/blocked.md +28 -0
- package/packages/plugin-pm/commands/clean.md +119 -0
- package/packages/plugin-pm/commands/context-create.md +136 -0
- package/packages/plugin-pm/commands/context-prime.md +170 -0
- package/packages/plugin-pm/commands/context-update.md +292 -0
- package/packages/plugin-pm/commands/context.md +28 -0
- package/packages/plugin-pm/commands/epic-close.md +86 -0
- package/packages/plugin-pm/commands/epic-decompose.md +370 -0
- package/packages/plugin-pm/commands/epic-edit.md +83 -0
- package/packages/plugin-pm/commands/epic-list.md +30 -0
- package/packages/plugin-pm/commands/epic-merge.md +222 -0
- package/packages/plugin-pm/commands/epic-oneshot.md +119 -0
- package/packages/plugin-pm/commands/epic-refresh.md +119 -0
- package/packages/plugin-pm/commands/epic-show.md +28 -0
- package/packages/plugin-pm/commands/epic-split.md +120 -0
- package/packages/plugin-pm/commands/epic-start.md +195 -0
- package/packages/plugin-pm/commands/epic-status.md +28 -0
- package/packages/plugin-pm/commands/epic-sync-modular.md +338 -0
- package/packages/plugin-pm/commands/epic-sync-original.md +473 -0
- package/packages/plugin-pm/commands/epic-sync.md +486 -0
- package/packages/plugin-pm/commands/github/workflow-create.md +42 -0
- package/packages/plugin-pm/commands/help.md +28 -0
- package/packages/plugin-pm/commands/import.md +115 -0
- package/packages/plugin-pm/commands/in-progress.md +28 -0
- package/packages/plugin-pm/commands/init.md +28 -0
- package/packages/plugin-pm/commands/issue-analyze.md +202 -0
- package/packages/plugin-pm/commands/issue-close.md +119 -0
- package/packages/plugin-pm/commands/issue-edit.md +93 -0
- package/packages/plugin-pm/commands/issue-reopen.md +87 -0
- package/packages/plugin-pm/commands/issue-show.md +41 -0
- package/packages/plugin-pm/commands/issue-start.md +234 -0
- package/packages/plugin-pm/commands/issue-status.md +95 -0
- package/packages/plugin-pm/commands/issue-sync.md +411 -0
- package/packages/plugin-pm/commands/next.md +28 -0
- package/packages/plugin-pm/commands/prd-edit.md +82 -0
- package/packages/plugin-pm/commands/prd-list.md +28 -0
- package/packages/plugin-pm/commands/prd-new.md +55 -0
- package/packages/plugin-pm/commands/prd-parse.md +42 -0
- package/packages/plugin-pm/commands/prd-status.md +28 -0
- package/packages/plugin-pm/commands/search.md +28 -0
- package/packages/plugin-pm/commands/standup.md +28 -0
- package/packages/plugin-pm/commands/status.md +28 -0
- package/packages/plugin-pm/commands/sync.md +99 -0
- package/packages/plugin-pm/commands/test-reference-update.md +151 -0
- package/packages/plugin-pm/commands/validate.md +28 -0
- package/packages/plugin-pm/commands/what-next.md +28 -0
- package/packages/plugin-pm/package.json +57 -0
- package/packages/plugin-pm/plugin.json +503 -0
- package/packages/plugin-pm/scripts/pm/analytics.js +425 -0
- package/packages/plugin-pm/scripts/pm/blocked.js +164 -0
- package/packages/plugin-pm/scripts/pm/blocked.sh +78 -0
- package/packages/plugin-pm/scripts/pm/clean.js +464 -0
- package/packages/plugin-pm/scripts/pm/context-create.js +216 -0
- package/packages/plugin-pm/scripts/pm/context-prime.js +335 -0
- package/packages/plugin-pm/scripts/pm/context-update.js +344 -0
- package/packages/plugin-pm/scripts/pm/context.js +338 -0
- package/packages/plugin-pm/scripts/pm/epic-close.js +347 -0
- package/packages/plugin-pm/scripts/pm/epic-edit.js +382 -0
- package/packages/plugin-pm/scripts/pm/epic-list.js +273 -0
- package/packages/plugin-pm/scripts/pm/epic-list.sh +109 -0
- package/packages/plugin-pm/scripts/pm/epic-show.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-show.sh +105 -0
- package/packages/plugin-pm/scripts/pm/epic-split.js +522 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.js +183 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.sh +94 -0
- package/packages/plugin-pm/scripts/pm/epic-status.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-status.sh +104 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/README.md +208 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-epic-issue.sh +77 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-task-issues.sh +86 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-epic-file.sh +79 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-references.sh +89 -0
- package/packages/plugin-pm/scripts/pm/epic-sync.sh +137 -0
- package/packages/plugin-pm/scripts/pm/help.js +92 -0
- package/packages/plugin-pm/scripts/pm/help.sh +90 -0
- package/packages/plugin-pm/scripts/pm/in-progress.js +178 -0
- package/packages/plugin-pm/scripts/pm/in-progress.sh +93 -0
- package/packages/plugin-pm/scripts/pm/init.js +321 -0
- package/packages/plugin-pm/scripts/pm/init.sh +178 -0
- package/packages/plugin-pm/scripts/pm/issue-close.js +232 -0
- package/packages/plugin-pm/scripts/pm/issue-edit.js +310 -0
- package/packages/plugin-pm/scripts/pm/issue-show.js +272 -0
- package/packages/plugin-pm/scripts/pm/issue-start.js +181 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/format-comment.sh +468 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/gather-updates.sh +460 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/post-comment.sh +330 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/preflight-validation.sh +348 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/update-frontmatter.sh +387 -0
- package/packages/plugin-pm/scripts/pm/lib/README.md +85 -0
- package/packages/plugin-pm/scripts/pm/lib/epic-discovery.js +119 -0
- package/packages/plugin-pm/scripts/pm/lib/logger.js +78 -0
- package/packages/plugin-pm/scripts/pm/next.js +189 -0
- package/packages/plugin-pm/scripts/pm/next.sh +72 -0
- package/packages/plugin-pm/scripts/pm/optimize.js +407 -0
- package/packages/plugin-pm/scripts/pm/pr-create.js +337 -0
- package/packages/plugin-pm/scripts/pm/pr-list.js +257 -0
- package/packages/plugin-pm/scripts/pm/prd-list.js +242 -0
- package/packages/plugin-pm/scripts/pm/prd-list.sh +103 -0
- package/packages/plugin-pm/scripts/pm/prd-new.js +684 -0
- package/packages/plugin-pm/scripts/pm/prd-parse.js +547 -0
- package/packages/plugin-pm/scripts/pm/prd-status.js +152 -0
- package/packages/plugin-pm/scripts/pm/prd-status.sh +63 -0
- package/packages/plugin-pm/scripts/pm/release.js +460 -0
- package/packages/plugin-pm/scripts/pm/search.js +192 -0
- package/packages/plugin-pm/scripts/pm/search.sh +89 -0
- package/packages/plugin-pm/scripts/pm/standup.js +362 -0
- package/packages/plugin-pm/scripts/pm/standup.sh +95 -0
- package/packages/plugin-pm/scripts/pm/status.js +148 -0
- package/packages/plugin-pm/scripts/pm/status.sh +59 -0
- package/packages/plugin-pm/scripts/pm/sync-batch.js +337 -0
- package/packages/plugin-pm/scripts/pm/sync.js +343 -0
- package/packages/plugin-pm/scripts/pm/template-list.js +141 -0
- package/packages/plugin-pm/scripts/pm/template-new.js +366 -0
- package/packages/plugin-pm/scripts/pm/validate.js +274 -0
- package/packages/plugin-pm/scripts/pm/validate.sh +106 -0
- package/packages/plugin-pm/scripts/pm/what-next.js +660 -0
- package/packages/plugin-testing/README.md +401 -0
- package/packages/plugin-testing/agents/frontend-testing-engineer.md +768 -0
- package/packages/plugin-testing/commands/jest-optimize.md +800 -0
- package/packages/plugin-testing/commands/playwright-optimize.md +887 -0
- package/packages/plugin-testing/commands/test-coverage.md +512 -0
- package/packages/plugin-testing/commands/test-performance.md +1041 -0
- package/packages/plugin-testing/commands/test-setup.md +414 -0
- package/packages/plugin-testing/package.json +40 -0
- package/packages/plugin-testing/plugin.json +197 -0
- package/packages/plugin-testing/rules/test-coverage-requirements.md +581 -0
- package/packages/plugin-testing/rules/testing-standards.md +529 -0
- package/packages/plugin-testing/scripts/examples/react-testing-example.test.jsx +460 -0
- package/packages/plugin-testing/scripts/examples/vitest-config-example.js +352 -0
- package/packages/plugin-testing/scripts/examples/vue-testing-example.test.js +586 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pre-Docker-Build Hook
|
|
5
|
+
*
|
|
6
|
+
* Validates Dockerfile and docker-compose.yml before building images.
|
|
7
|
+
* Enforces best practices from Context7 /docker/docs documentation.
|
|
8
|
+
*
|
|
9
|
+
* @blocking true
|
|
10
|
+
* @type pre-command
|
|
11
|
+
* @triggers docker:build, docker:optimize, docker-compose:up
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const { execSync } = require('child_process');
|
|
17
|
+
|
|
18
|
+
// ANSI color codes
|
|
19
|
+
const colors = {
|
|
20
|
+
reset: '\x1b[0m',
|
|
21
|
+
red: '\x1b[31m',
|
|
22
|
+
yellow: '\x1b[33m',
|
|
23
|
+
green: '\x1b[32m',
|
|
24
|
+
blue: '\x1b[34m',
|
|
25
|
+
cyan: '\x1b[36m',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function log(message, color = 'reset') {
|
|
29
|
+
console.log(`${colors[color]}${message}${colors.reset}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function header(message) {
|
|
33
|
+
console.log('');
|
|
34
|
+
log('━'.repeat(60), 'cyan');
|
|
35
|
+
log(`🐳 ${message}`, 'cyan');
|
|
36
|
+
log('━'.repeat(60), 'cyan');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function checkmark(message) {
|
|
40
|
+
log(`✅ ${message}`, 'green');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function warning(message) {
|
|
44
|
+
log(`⚠️ ${message}`, 'yellow');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function error(message) {
|
|
48
|
+
log(`❌ ${message}`, 'red');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function info(message) {
|
|
52
|
+
log(`ℹ️ ${message}`, 'blue');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Parse command to detect Docker operations
|
|
57
|
+
*/
|
|
58
|
+
function parseCommand(args) {
|
|
59
|
+
const command = args.join(' ');
|
|
60
|
+
return {
|
|
61
|
+
isDockerBuild: command.includes('docker:build') ||
|
|
62
|
+
command.includes('docker build') ||
|
|
63
|
+
command.includes('docker:optimize'),
|
|
64
|
+
isCompose: command.includes('docker-compose') || command.includes('compose'),
|
|
65
|
+
dockerfile: extractDockerfile(args),
|
|
66
|
+
force: command.includes('--force') || command.includes('-f'),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function extractDockerfile(args) {
|
|
71
|
+
const fileIndex = args.findIndex(arg => arg === '--file' || arg === '-f');
|
|
72
|
+
if (fileIndex !== -1 && args[fileIndex + 1]) {
|
|
73
|
+
return args[fileIndex + 1];
|
|
74
|
+
}
|
|
75
|
+
return 'Dockerfile';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Check if Dockerfile exists
|
|
80
|
+
*/
|
|
81
|
+
function checkDockerfileExists(dockerfile) {
|
|
82
|
+
if (!fs.existsSync(dockerfile)) {
|
|
83
|
+
error(`Dockerfile not found: ${dockerfile}`);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
checkmark(`Dockerfile found: ${dockerfile}`);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Analyze Dockerfile for best practices
|
|
92
|
+
* Based on Context7 /docker/docs patterns
|
|
93
|
+
*/
|
|
94
|
+
function analyzeDockerfile(dockerfile) {
|
|
95
|
+
const issues = {
|
|
96
|
+
critical: [],
|
|
97
|
+
warnings: [],
|
|
98
|
+
improvements: [],
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const content = fs.readFileSync(dockerfile, 'utf8');
|
|
102
|
+
const lines = content.split('\n');
|
|
103
|
+
|
|
104
|
+
header('Dockerfile Best Practices Analysis');
|
|
105
|
+
|
|
106
|
+
// Check 1: FROM base image
|
|
107
|
+
const fromLines = lines.filter(l => l.trim().startsWith('FROM '));
|
|
108
|
+
if (fromLines.length === 0) {
|
|
109
|
+
issues.critical.push('No FROM instruction found');
|
|
110
|
+
} else {
|
|
111
|
+
// Check for latest tag
|
|
112
|
+
const hasLatest = fromLines.some(l => l.includes(':latest') || !l.includes(':'));
|
|
113
|
+
if (hasLatest) {
|
|
114
|
+
issues.warnings.push('Using :latest tag or no tag - pin specific version for reproducibility');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Check for multi-stage
|
|
118
|
+
if (fromLines.length > 1) {
|
|
119
|
+
checkmark(`Multi-stage build detected (${fromLines.length} stages)`);
|
|
120
|
+
} else {
|
|
121
|
+
issues.improvements.push('Consider multi-stage build for smaller final image');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Check for Alpine/slim variants
|
|
125
|
+
const hasOptimized = fromLines.some(l => l.includes('alpine') || l.includes('slim') || l.includes('distroless'));
|
|
126
|
+
if (!hasOptimized) {
|
|
127
|
+
issues.improvements.push('Consider using Alpine or slim base images for smaller size');
|
|
128
|
+
} else {
|
|
129
|
+
checkmark('Using optimized base image (alpine/slim/distroless)');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Check 2: COPY vs ADD
|
|
134
|
+
const addInstructions = lines.filter(l => l.trim().startsWith('ADD '));
|
|
135
|
+
if (addInstructions.length > 0) {
|
|
136
|
+
issues.warnings.push(`Found ${addInstructions.length} ADD instruction(s) - prefer COPY unless extracting archives`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Check 3: Layer optimization - COPY before dependency install
|
|
140
|
+
let foundCopyAll = false;
|
|
141
|
+
let foundInstall = false;
|
|
142
|
+
|
|
143
|
+
for (const line of lines) {
|
|
144
|
+
const trimmed = line.trim();
|
|
145
|
+
|
|
146
|
+
if (trimmed.startsWith('COPY . ') || trimmed.startsWith('COPY ./ ')) {
|
|
147
|
+
foundCopyAll = true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!foundCopyAll && (
|
|
151
|
+
trimmed.includes('npm install') ||
|
|
152
|
+
trimmed.includes('pip install') ||
|
|
153
|
+
trimmed.includes('yarn install') ||
|
|
154
|
+
trimmed.includes('go mod download')
|
|
155
|
+
)) {
|
|
156
|
+
foundInstall = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (foundCopyAll && !foundInstall) {
|
|
161
|
+
issues.warnings.push('COPY . before dependency installation - poor layer caching');
|
|
162
|
+
issues.improvements.push('Copy package/requirements files first, install deps, then copy source');
|
|
163
|
+
} else if (foundInstall) {
|
|
164
|
+
checkmark('Dependencies installed before copying all source files');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Check 4: Running as root
|
|
168
|
+
const hasUser = lines.some(l => l.trim().startsWith('USER ') && !l.includes('USER root'));
|
|
169
|
+
if (!hasUser) {
|
|
170
|
+
issues.critical.push('No non-root USER specified - security risk');
|
|
171
|
+
} else {
|
|
172
|
+
checkmark('Non-root user configured');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Check 5: WORKDIR usage
|
|
176
|
+
const hasWorkdir = lines.some(l => l.trim().startsWith('WORKDIR '));
|
|
177
|
+
if (!hasWorkdir) {
|
|
178
|
+
issues.warnings.push('No WORKDIR specified - use WORKDIR instead of cd commands');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Check 6: apt-get without cleanup
|
|
182
|
+
const aptGetLines = lines.filter(l => l.includes('apt-get install'));
|
|
183
|
+
for (const line of aptGetLines) {
|
|
184
|
+
if (!line.includes('rm -rf /var/lib/apt/lists')) {
|
|
185
|
+
issues.warnings.push('apt-get install without cleanup - image size not optimized');
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Check 7: Multiple RUN commands that could be chained
|
|
191
|
+
const runCommands = lines.filter(l => l.trim().startsWith('RUN '));
|
|
192
|
+
if (runCommands.length > 5) {
|
|
193
|
+
issues.improvements.push(`${runCommands.length} RUN commands - consider chaining with && for fewer layers`);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Check 8: HEALTHCHECK
|
|
197
|
+
const hasHealthcheck = lines.some(l => l.trim().startsWith('HEALTHCHECK '));
|
|
198
|
+
if (!hasHealthcheck) {
|
|
199
|
+
issues.improvements.push('No HEALTHCHECK defined - add for better container monitoring');
|
|
200
|
+
} else {
|
|
201
|
+
checkmark('HEALTHCHECK configured');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Check 9: LABEL for metadata
|
|
205
|
+
const hasLabels = lines.some(l => l.trim().startsWith('LABEL '));
|
|
206
|
+
if (!hasLabels) {
|
|
207
|
+
issues.improvements.push('No LABELs defined - add metadata for better organization');
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Check 10: Hardcoded secrets
|
|
211
|
+
const secretPatterns = [
|
|
212
|
+
/password\s*=\s*["'][^"']+["']/i,
|
|
213
|
+
/secret\s*=\s*["'][^"']+["']/i,
|
|
214
|
+
/api[_-]?key\s*=\s*["'][^"']+["']/i,
|
|
215
|
+
/token\s*=\s*["'][^"']+["']/i,
|
|
216
|
+
];
|
|
217
|
+
|
|
218
|
+
for (const line of lines) {
|
|
219
|
+
for (const pattern of secretPatterns) {
|
|
220
|
+
if (pattern.test(line)) {
|
|
221
|
+
issues.critical.push('Potential hardcoded secret detected in Dockerfile');
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Check 11: BuildKit syntax
|
|
228
|
+
const hasBuildKitSyntax = lines.some(l => l.includes('# syntax=docker/dockerfile:'));
|
|
229
|
+
if (!hasBuildKitSyntax) {
|
|
230
|
+
issues.improvements.push('Add # syntax=docker/dockerfile:1 for BuildKit features');
|
|
231
|
+
} else {
|
|
232
|
+
checkmark('BuildKit syntax enabled');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return issues;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Check for .dockerignore
|
|
240
|
+
*/
|
|
241
|
+
function checkDockerignore() {
|
|
242
|
+
header('.dockerignore Validation');
|
|
243
|
+
|
|
244
|
+
if (!fs.existsSync('.dockerignore')) {
|
|
245
|
+
warning('.dockerignore file not found');
|
|
246
|
+
info('Creating .dockerignore can reduce build context and improve security');
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
checkmark('.dockerignore file exists');
|
|
251
|
+
|
|
252
|
+
const content = fs.readFileSync('.dockerignore', 'utf8');
|
|
253
|
+
const lines = content.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
|
|
254
|
+
|
|
255
|
+
const recommended = [
|
|
256
|
+
{ pattern: '.git', description: 'Version control' },
|
|
257
|
+
{ pattern: 'node_modules', description: 'Dependencies' },
|
|
258
|
+
{ pattern: '.env', description: 'Environment files' },
|
|
259
|
+
{ pattern: '*.log', description: 'Log files' },
|
|
260
|
+
{ pattern: 'README.md', description: 'Documentation' },
|
|
261
|
+
];
|
|
262
|
+
|
|
263
|
+
let missing = [];
|
|
264
|
+
for (const rec of recommended) {
|
|
265
|
+
if (!lines.some(l => l.includes(rec.pattern))) {
|
|
266
|
+
missing.push(rec);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (missing.length > 0) {
|
|
271
|
+
warning('Recommended patterns missing from .dockerignore:');
|
|
272
|
+
missing.forEach(m => {
|
|
273
|
+
log(` - ${m.pattern} (${m.description})`, 'yellow');
|
|
274
|
+
});
|
|
275
|
+
} else {
|
|
276
|
+
checkmark('All recommended patterns present');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Check for docker-compose.yml
|
|
284
|
+
*/
|
|
285
|
+
function checkDockerCompose() {
|
|
286
|
+
const composeFiles = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];
|
|
287
|
+
const found = composeFiles.find(f => fs.existsSync(f));
|
|
288
|
+
|
|
289
|
+
if (!found) {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
header('Docker Compose Validation');
|
|
294
|
+
checkmark(`Docker Compose file found: ${found}`);
|
|
295
|
+
|
|
296
|
+
try {
|
|
297
|
+
execSync('docker-compose config', { stdio: 'ignore' });
|
|
298
|
+
checkmark('Docker Compose configuration is valid');
|
|
299
|
+
return { valid: true, issues: [] };
|
|
300
|
+
} catch (e) {
|
|
301
|
+
error('Docker Compose configuration is invalid');
|
|
302
|
+
return { valid: false, issues: ['Invalid docker-compose configuration'] };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Remind about Context7 queries
|
|
308
|
+
*/
|
|
309
|
+
function remindContext7() {
|
|
310
|
+
header('Context7 Documentation Queries');
|
|
311
|
+
|
|
312
|
+
info('Before building, ensure you have queried Context7 for:');
|
|
313
|
+
console.log('');
|
|
314
|
+
|
|
315
|
+
const queries = [
|
|
316
|
+
'mcp://context7/docker/best-practices - Docker image best practices',
|
|
317
|
+
'mcp://context7/docker/multi-stage-builds - Multi-stage build patterns',
|
|
318
|
+
'mcp://context7/docker/security - Docker security hardening',
|
|
319
|
+
'mcp://context7/docker/buildkit - BuildKit optimization features',
|
|
320
|
+
];
|
|
321
|
+
|
|
322
|
+
queries.forEach(query => {
|
|
323
|
+
log(` → ${query}`, 'cyan');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
console.log('');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Main execution
|
|
331
|
+
*/
|
|
332
|
+
function main() {
|
|
333
|
+
const args = process.argv.slice(2);
|
|
334
|
+
|
|
335
|
+
if (args.length === 0) {
|
|
336
|
+
error('No command arguments provided');
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const command = parseCommand(args);
|
|
341
|
+
|
|
342
|
+
if (!command.isDockerBuild && !command.isCompose) {
|
|
343
|
+
// Not a Docker command, exit silently
|
|
344
|
+
process.exit(0);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
console.log('');
|
|
348
|
+
log('╔════════════════════════════════════════════════════════════╗', 'cyan');
|
|
349
|
+
log('║ DOCKER BUILD VALIDATION PRE-BUILD HOOK ║', 'cyan');
|
|
350
|
+
log('╚════════════════════════════════════════════════════════════╝', 'cyan');
|
|
351
|
+
console.log('');
|
|
352
|
+
|
|
353
|
+
// Remind about Context7
|
|
354
|
+
remindContext7();
|
|
355
|
+
|
|
356
|
+
let allIssues = {
|
|
357
|
+
critical: [],
|
|
358
|
+
warnings: [],
|
|
359
|
+
improvements: [],
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
// Check Dockerfile
|
|
363
|
+
if (command.isDockerBuild) {
|
|
364
|
+
if (!checkDockerfileExists(command.dockerfile)) {
|
|
365
|
+
process.exit(1);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const dockerfileIssues = analyzeDockerfile(command.dockerfile);
|
|
369
|
+
allIssues.critical.push(...dockerfileIssues.critical);
|
|
370
|
+
allIssues.warnings.push(...dockerfileIssues.warnings);
|
|
371
|
+
allIssues.improvements.push(...dockerfileIssues.improvements);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Check .dockerignore
|
|
375
|
+
checkDockerignore();
|
|
376
|
+
|
|
377
|
+
// Check docker-compose if present
|
|
378
|
+
if (command.isCompose) {
|
|
379
|
+
const composeResult = checkDockerCompose();
|
|
380
|
+
if (composeResult && !composeResult.valid) {
|
|
381
|
+
allIssues.critical.push(...composeResult.issues);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Display results
|
|
386
|
+
header('Validation Summary');
|
|
387
|
+
|
|
388
|
+
if (allIssues.critical.length === 0 &&
|
|
389
|
+
allIssues.warnings.length === 0 &&
|
|
390
|
+
allIssues.improvements.length === 0) {
|
|
391
|
+
checkmark('All checks passed! Ready to build.');
|
|
392
|
+
console.log('');
|
|
393
|
+
log('✨ Docker build can proceed safely', 'green');
|
|
394
|
+
console.log('');
|
|
395
|
+
process.exit(0);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Display critical issues
|
|
399
|
+
if (allIssues.critical.length > 0) {
|
|
400
|
+
console.log('');
|
|
401
|
+
error(`Found ${allIssues.critical.length} CRITICAL issue(s):`);
|
|
402
|
+
allIssues.critical.forEach((issue, index) => {
|
|
403
|
+
log(` ${index + 1}. ${issue}`, 'red');
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Display warnings
|
|
408
|
+
if (allIssues.warnings.length > 0) {
|
|
409
|
+
console.log('');
|
|
410
|
+
warning(`Found ${allIssues.warnings.length} warning(s):`);
|
|
411
|
+
allIssues.warnings.forEach((issue, index) => {
|
|
412
|
+
log(` ${index + 1}. ${issue}`, 'yellow');
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Display improvements
|
|
417
|
+
if (allIssues.improvements.length > 0) {
|
|
418
|
+
console.log('');
|
|
419
|
+
info(`${allIssues.improvements.length} improvement suggestion(s):`);
|
|
420
|
+
allIssues.improvements.forEach((issue, index) => {
|
|
421
|
+
log(` ${index + 1}. ${issue}`, 'blue');
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
console.log('');
|
|
426
|
+
|
|
427
|
+
// Decision logic
|
|
428
|
+
if (allIssues.critical.length > 0) {
|
|
429
|
+
if (command.force) {
|
|
430
|
+
warning('CRITICAL issues found, but --force flag provided');
|
|
431
|
+
warning('Proceeding with build (NOT RECOMMENDED)');
|
|
432
|
+
console.log('');
|
|
433
|
+
process.exit(0);
|
|
434
|
+
} else {
|
|
435
|
+
error('🚫 BUILD BLOCKED due to critical issues');
|
|
436
|
+
console.log('');
|
|
437
|
+
info('To proceed anyway (NOT RECOMMENDED), use --force flag');
|
|
438
|
+
info('To fix issues, review the findings above and update your Dockerfile');
|
|
439
|
+
console.log('');
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// Only warnings or improvements
|
|
445
|
+
if (allIssues.warnings.length > 0) {
|
|
446
|
+
warning('Warnings detected - recommended to address before building');
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (allIssues.improvements.length > 0) {
|
|
450
|
+
info('Consider improvements for better optimization and security');
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
console.log('');
|
|
454
|
+
checkmark('Build can proceed (with warnings/improvements)');
|
|
455
|
+
console.log('');
|
|
456
|
+
|
|
457
|
+
process.exit(0);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Run main function
|
|
461
|
+
try {
|
|
462
|
+
main();
|
|
463
|
+
} catch (error) {
|
|
464
|
+
console.error('');
|
|
465
|
+
log('❌ Hook execution failed:', 'red');
|
|
466
|
+
console.error(error.message);
|
|
467
|
+
console.error('');
|
|
468
|
+
|
|
469
|
+
// Don't block build on hook errors (fail open)
|
|
470
|
+
log('⚠️ Allowing build to proceed despite hook error', 'yellow');
|
|
471
|
+
process.exit(0);
|
|
472
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@claudeautopm/plugin-devops",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Complete DevOps plugin with agents, commands, rules, and scripts for CI/CD, Docker, GitHub, observability, and infrastructure automation for ClaudeAutoPM",
|
|
5
|
+
"main": "plugin.json",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"agents/",
|
|
9
|
+
"commands/",
|
|
10
|
+
"rules/",
|
|
11
|
+
"scripts/",
|
|
12
|
+
"plugin.json",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
18
|
+
"validate": "node -e \"require('./plugin.json')\" && echo 'plugin.json is valid'"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"claudeautopm",
|
|
22
|
+
"plugin",
|
|
23
|
+
"devops",
|
|
24
|
+
"docker",
|
|
25
|
+
"github",
|
|
26
|
+
"ci-cd",
|
|
27
|
+
"azure-devops",
|
|
28
|
+
"observability",
|
|
29
|
+
"prometheus",
|
|
30
|
+
"grafana",
|
|
31
|
+
"ssh",
|
|
32
|
+
"traefik",
|
|
33
|
+
"containers",
|
|
34
|
+
"automation"
|
|
35
|
+
],
|
|
36
|
+
"author": {
|
|
37
|
+
"name": "ClaudeAutoPM Team",
|
|
38
|
+
"email": "autopm@example.com"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/rafeekpro/ClaudeAutoPM.git",
|
|
44
|
+
"directory": "packages/plugin-devops"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/rafeekpro/ClaudeAutoPM/tree/main/packages/plugin-devops#readme",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/rafeekpro/ClaudeAutoPM/issues"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=16.0.0",
|
|
52
|
+
"npm": ">=8.0.0"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"@claudeautopm/plugin-core": "^2.0.0"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public",
|
|
59
|
+
"registry": "https://registry.npmjs.org/"
|
|
60
|
+
}
|
|
61
|
+
}
|