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,330 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Post Comment Script for Issue Sync
|
|
3
|
+
# Posts formatted comments to GitHub issues
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Load libraries
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
source "${SCRIPT_DIR}/../../lib/logging-utils.sh"
|
|
10
|
+
source "${SCRIPT_DIR}/../../lib/github-utils.sh"
|
|
11
|
+
source "${SCRIPT_DIR}/../../lib/validation-utils.sh"
|
|
12
|
+
source "${SCRIPT_DIR}/../../lib/datetime-utils.sh"
|
|
13
|
+
|
|
14
|
+
# Script configuration
|
|
15
|
+
readonly ISSUE_NUMBER="${1:-}"
|
|
16
|
+
readonly COMMENT_FILE="${2:-}"
|
|
17
|
+
readonly IS_COMPLETION="${3:-false}"
|
|
18
|
+
|
|
19
|
+
# Global variables
|
|
20
|
+
declare -g comment_id=""
|
|
21
|
+
declare -g comment_url=""
|
|
22
|
+
|
|
23
|
+
# Main function
|
|
24
|
+
main() {
|
|
25
|
+
print_banner "GitHub Comment Poster" "1.0.0"
|
|
26
|
+
|
|
27
|
+
# Validate inputs
|
|
28
|
+
log_info "Posting comment to issue #$ISSUE_NUMBER"
|
|
29
|
+
validate_inputs || exit 1
|
|
30
|
+
|
|
31
|
+
# Check GitHub authentication
|
|
32
|
+
with_error_handling "GitHub authentication check" \
|
|
33
|
+
check_github_authentication
|
|
34
|
+
|
|
35
|
+
# Check if issue exists
|
|
36
|
+
with_error_handling "Issue validation" \
|
|
37
|
+
validate_issue_exists
|
|
38
|
+
|
|
39
|
+
# Post comment to GitHub
|
|
40
|
+
with_error_handling "Post comment to GitHub" \
|
|
41
|
+
post_github_comment
|
|
42
|
+
|
|
43
|
+
# Verify comment was posted
|
|
44
|
+
with_error_handling "Verify comment posted" \
|
|
45
|
+
verify_comment_posted
|
|
46
|
+
|
|
47
|
+
# Display results
|
|
48
|
+
display_results
|
|
49
|
+
|
|
50
|
+
# Return comment URL
|
|
51
|
+
echo "$comment_url"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# Validate script inputs
|
|
55
|
+
validate_inputs() {
|
|
56
|
+
log_function_entry "validate_inputs"
|
|
57
|
+
|
|
58
|
+
if [[ -z "$ISSUE_NUMBER" ]]; then
|
|
59
|
+
log_error "Issue number is required"
|
|
60
|
+
return 1
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
if [[ ! -f "$COMMENT_FILE" ]]; then
|
|
64
|
+
log_error "Comment file not found: $COMMENT_FILE"
|
|
65
|
+
return 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Validate issue number format
|
|
69
|
+
if ! [[ "$ISSUE_NUMBER" =~ ^[0-9]+$ ]]; then
|
|
70
|
+
log_error "Invalid issue number format: $ISSUE_NUMBER"
|
|
71
|
+
return 1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
log_function_exit "validate_inputs"
|
|
75
|
+
return 0
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# Check GitHub authentication
|
|
79
|
+
check_github_authentication() {
|
|
80
|
+
log_function_entry "check_github_authentication"
|
|
81
|
+
|
|
82
|
+
log_info "Verifying GitHub CLI authentication"
|
|
83
|
+
|
|
84
|
+
if ! validate_github_auth; then
|
|
85
|
+
log_error "GitHub CLI authentication failed"
|
|
86
|
+
echo "❌ GitHub CLI is not authenticated"
|
|
87
|
+
echo "Please run: gh auth login"
|
|
88
|
+
return 1
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
log_success "GitHub CLI authenticated"
|
|
92
|
+
log_function_exit "check_github_authentication"
|
|
93
|
+
return 0
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# Validate that the issue exists
|
|
97
|
+
validate_issue_exists() {
|
|
98
|
+
log_function_entry "validate_issue_exists"
|
|
99
|
+
|
|
100
|
+
log_info "Validating issue #$ISSUE_NUMBER exists"
|
|
101
|
+
|
|
102
|
+
local issue_state
|
|
103
|
+
issue_state=$(check_issue_exists "$ISSUE_NUMBER")
|
|
104
|
+
|
|
105
|
+
if [[ $? -ne 0 ]]; then
|
|
106
|
+
log_error "Issue #$ISSUE_NUMBER not found"
|
|
107
|
+
echo "❌ Issue #$ISSUE_NUMBER not found"
|
|
108
|
+
return 1
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
log_info "Issue #$ISSUE_NUMBER exists with state: $issue_state"
|
|
112
|
+
|
|
113
|
+
# Warn if issue is closed
|
|
114
|
+
if [[ "$issue_state" == "closed" ]]; then
|
|
115
|
+
log_warning "Issue #$ISSUE_NUMBER is closed"
|
|
116
|
+
echo "⚠️ Issue #$ISSUE_NUMBER is closed"
|
|
117
|
+
|
|
118
|
+
# Interactive confirmation for closed issues
|
|
119
|
+
if [[ -t 0 ]] && [[ "${AUTOPM_FORCE_SYNC:-}" != "true" ]]; then
|
|
120
|
+
if ! confirm "Post comment to closed issue?"; then
|
|
121
|
+
echo "Comment posting cancelled"
|
|
122
|
+
exit 0
|
|
123
|
+
fi
|
|
124
|
+
fi
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
log_function_exit "validate_issue_exists"
|
|
128
|
+
return 0
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
# Post comment to GitHub issue
|
|
132
|
+
post_github_comment() {
|
|
133
|
+
log_function_entry "post_github_comment"
|
|
134
|
+
|
|
135
|
+
log_info "Posting comment to issue #$ISSUE_NUMBER"
|
|
136
|
+
|
|
137
|
+
# Check for dry run mode
|
|
138
|
+
if [[ "${AUTOPM_DRY_RUN:-false}" == "true" ]]; then
|
|
139
|
+
log_warning "DRY RUN mode - not posting comment"
|
|
140
|
+
echo "🔸 DRY RUN: Would post comment to issue #$ISSUE_NUMBER"
|
|
141
|
+
echo "Comment preview:"
|
|
142
|
+
head -20 "$COMMENT_FILE" | sed 's/^/ /'
|
|
143
|
+
echo " ..."
|
|
144
|
+
comment_id="DRY-RUN"
|
|
145
|
+
comment_url="https://github.com/DRYRUN/issues/$ISSUE_NUMBER#issuecomment-DRYRUN"
|
|
146
|
+
log_function_exit "post_github_comment"
|
|
147
|
+
return 0
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Post the comment using GitHub CLI
|
|
151
|
+
local response
|
|
152
|
+
response=$(gh issue comment "$ISSUE_NUMBER" \
|
|
153
|
+
--body-file "$COMMENT_FILE" \
|
|
154
|
+
--json id,url 2>&1) || {
|
|
155
|
+
log_error "Failed to post comment: $response"
|
|
156
|
+
echo "❌ Failed to post comment to issue #$ISSUE_NUMBER"
|
|
157
|
+
echo "Error: $response"
|
|
158
|
+
return 1
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Extract comment ID and URL from response
|
|
162
|
+
comment_id=$(echo "$response" | jq -r '.id' 2>/dev/null || echo "")
|
|
163
|
+
comment_url=$(echo "$response" | jq -r '.url' 2>/dev/null || echo "")
|
|
164
|
+
|
|
165
|
+
if [[ -z "$comment_id" ]] || [[ "$comment_id" == "null" ]]; then
|
|
166
|
+
# Try alternative parsing for non-JSON response
|
|
167
|
+
log_debug "Attempting alternative response parsing"
|
|
168
|
+
|
|
169
|
+
# GitHub CLI sometimes returns just the URL
|
|
170
|
+
if [[ "$response" =~ https://github.com/.*/issues/.*#issuecomment-.* ]]; then
|
|
171
|
+
comment_url="$response"
|
|
172
|
+
comment_id=$(echo "$response" | sed 's/.*#issuecomment-//')
|
|
173
|
+
else
|
|
174
|
+
log_error "Could not parse comment response: $response"
|
|
175
|
+
echo "⚠️ Comment may have been posted but could not parse response"
|
|
176
|
+
# Continue anyway as the comment might have been posted
|
|
177
|
+
fi
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
log_success "Comment posted successfully"
|
|
181
|
+
log_debug "Comment ID: $comment_id"
|
|
182
|
+
log_debug "Comment URL: $comment_url"
|
|
183
|
+
|
|
184
|
+
log_function_exit "post_github_comment"
|
|
185
|
+
return 0
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# Verify comment was posted
|
|
189
|
+
verify_comment_posted() {
|
|
190
|
+
log_function_entry "verify_comment_posted"
|
|
191
|
+
|
|
192
|
+
# Skip verification in dry run mode
|
|
193
|
+
if [[ "${AUTOPM_DRY_RUN:-false}" == "true" ]]; then
|
|
194
|
+
log_debug "Skipping verification in dry run mode"
|
|
195
|
+
log_function_exit "verify_comment_posted"
|
|
196
|
+
return 0
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
log_info "Verifying comment was posted"
|
|
200
|
+
|
|
201
|
+
# If we don't have a comment URL, try to get the latest comment
|
|
202
|
+
if [[ -z "$comment_url" ]] || [[ "$comment_url" == "null" ]]; then
|
|
203
|
+
log_debug "No comment URL, checking latest comments"
|
|
204
|
+
|
|
205
|
+
# Get the last comment on the issue
|
|
206
|
+
local latest_comment
|
|
207
|
+
latest_comment=$(gh issue view "$ISSUE_NUMBER" \
|
|
208
|
+
--json comments \
|
|
209
|
+
--jq '.comments[-1].url' 2>/dev/null || echo "")
|
|
210
|
+
|
|
211
|
+
if [[ -n "$latest_comment" ]]; then
|
|
212
|
+
comment_url="$latest_comment"
|
|
213
|
+
log_info "Found latest comment: $comment_url"
|
|
214
|
+
else
|
|
215
|
+
log_warning "Could not verify comment was posted"
|
|
216
|
+
# Not a fatal error - comment might still have been posted
|
|
217
|
+
fi
|
|
218
|
+
else
|
|
219
|
+
# Verify the comment exists by trying to view it
|
|
220
|
+
local verify_response
|
|
221
|
+
verify_response=$(gh api "${comment_url#https://github.com}" \
|
|
222
|
+
--jq '.id' 2>/dev/null || echo "")
|
|
223
|
+
|
|
224
|
+
if [[ -n "$verify_response" ]]; then
|
|
225
|
+
log_success "Comment verified: exists at $comment_url"
|
|
226
|
+
else
|
|
227
|
+
log_warning "Could not verify comment at URL: $comment_url"
|
|
228
|
+
fi
|
|
229
|
+
fi
|
|
230
|
+
|
|
231
|
+
log_function_exit "verify_comment_posted"
|
|
232
|
+
return 0
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
# Display posting results
|
|
236
|
+
display_results() {
|
|
237
|
+
print_section "✅ Comment Posting Results"
|
|
238
|
+
|
|
239
|
+
echo "Issue: #$ISSUE_NUMBER"
|
|
240
|
+
|
|
241
|
+
if [[ "$IS_COMPLETION" == "true" ]]; then
|
|
242
|
+
echo "Comment Type: Completion Comment"
|
|
243
|
+
else
|
|
244
|
+
echo "Comment Type: Progress Update"
|
|
245
|
+
fi
|
|
246
|
+
|
|
247
|
+
# Show comment size
|
|
248
|
+
local comment_size
|
|
249
|
+
comment_size=$(wc -c < "$COMMENT_FILE" 2>/dev/null || echo "0")
|
|
250
|
+
echo "Comment Size: $comment_size characters"
|
|
251
|
+
|
|
252
|
+
# Show posting status
|
|
253
|
+
if [[ "${AUTOPM_DRY_RUN:-false}" == "true" ]]; then
|
|
254
|
+
echo ""
|
|
255
|
+
echo "🔸 DRY RUN - No actual comment posted"
|
|
256
|
+
echo "Review the formatted comment at: $COMMENT_FILE"
|
|
257
|
+
else
|
|
258
|
+
if [[ -n "$comment_url" ]] && [[ "$comment_url" != "null" ]]; then
|
|
259
|
+
echo ""
|
|
260
|
+
echo "✅ Comment posted successfully"
|
|
261
|
+
echo "🔗 View comment: $comment_url"
|
|
262
|
+
else
|
|
263
|
+
echo ""
|
|
264
|
+
echo "⚠️ Comment posting status uncertain"
|
|
265
|
+
echo "Please check issue #$ISSUE_NUMBER manually"
|
|
266
|
+
fi
|
|
267
|
+
fi
|
|
268
|
+
|
|
269
|
+
# Show timestamp
|
|
270
|
+
local current_time
|
|
271
|
+
current_time=$(get_current_datetime)
|
|
272
|
+
echo ""
|
|
273
|
+
echo "Posted at: $current_time"
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
# Error handling
|
|
277
|
+
handle_error() {
|
|
278
|
+
local exit_code=$?
|
|
279
|
+
log_error "Comment posting failed with exit code: $exit_code"
|
|
280
|
+
log_error "Failed to post comment to issue: #$ISSUE_NUMBER"
|
|
281
|
+
|
|
282
|
+
# Provide recovery suggestions
|
|
283
|
+
echo ""
|
|
284
|
+
echo "Recovery options:"
|
|
285
|
+
echo "1. Check GitHub authentication: gh auth status"
|
|
286
|
+
echo "2. Verify issue exists: gh issue view $ISSUE_NUMBER"
|
|
287
|
+
echo "3. Try manual posting: gh issue comment $ISSUE_NUMBER --body-file $COMMENT_FILE"
|
|
288
|
+
echo "4. Check network connectivity"
|
|
289
|
+
|
|
290
|
+
exit "$exit_code"
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
# Set up error handling
|
|
294
|
+
trap handle_error ERR
|
|
295
|
+
|
|
296
|
+
# Validate arguments
|
|
297
|
+
if [[ $# -lt 2 ]]; then
|
|
298
|
+
echo "Usage: $0 <issue_number> <comment_file> [is_completion]"
|
|
299
|
+
echo ""
|
|
300
|
+
echo "Posts a formatted comment to a GitHub issue."
|
|
301
|
+
echo ""
|
|
302
|
+
echo "Arguments:"
|
|
303
|
+
echo " issue_number GitHub issue number to post comment to"
|
|
304
|
+
echo " comment_file Path to formatted comment file"
|
|
305
|
+
echo " is_completion Optional: 'true' if completion comment (default: false)"
|
|
306
|
+
echo ""
|
|
307
|
+
echo "Environment Variables:"
|
|
308
|
+
echo " AUTOPM_DRY_RUN=true Perform dry run without posting"
|
|
309
|
+
echo " AUTOPM_FORCE_SYNC=true Skip confirmations for closed issues"
|
|
310
|
+
echo " AUTOPM_LOG_LEVEL=0 Enable debug logging"
|
|
311
|
+
echo ""
|
|
312
|
+
echo "Examples:"
|
|
313
|
+
echo " $0 123 /tmp/formatted-comment.md"
|
|
314
|
+
echo " $0 456 /tmp/completion-comment.md true"
|
|
315
|
+
echo " AUTOPM_DRY_RUN=true $0 789 /tmp/test-comment.md"
|
|
316
|
+
echo ""
|
|
317
|
+
echo "Output:"
|
|
318
|
+
echo " Prints comment URL on success"
|
|
319
|
+
echo " Returns 0 on success, non-zero on failure"
|
|
320
|
+
echo ""
|
|
321
|
+
echo "Error Recovery:"
|
|
322
|
+
echo " - If posting fails, the formatted comment is preserved"
|
|
323
|
+
echo " - You can manually post using: gh issue comment <number> --body-file <file>"
|
|
324
|
+
echo " - Check GitHub status: gh auth status"
|
|
325
|
+
echo ""
|
|
326
|
+
exit 1
|
|
327
|
+
fi
|
|
328
|
+
|
|
329
|
+
# Run main function
|
|
330
|
+
main "$@"
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Preflight Validation Script for Issue Sync
|
|
3
|
+
# Performs all necessary checks before syncing issue updates
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Load libraries
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
source "${SCRIPT_DIR}/../../lib/logging-utils.sh"
|
|
10
|
+
source "${SCRIPT_DIR}/../../lib/github-utils.sh"
|
|
11
|
+
source "${SCRIPT_DIR}/../../lib/frontmatter-utils.sh"
|
|
12
|
+
source "${SCRIPT_DIR}/../../lib/validation-utils.sh"
|
|
13
|
+
source "${SCRIPT_DIR}/../../lib/datetime-utils.sh"
|
|
14
|
+
|
|
15
|
+
# Script configuration
|
|
16
|
+
readonly ISSUE_NUMBER="${1:-}"
|
|
17
|
+
|
|
18
|
+
# Global variables
|
|
19
|
+
declare -g epic_name=""
|
|
20
|
+
declare -g updates_dir=""
|
|
21
|
+
declare -g progress_file=""
|
|
22
|
+
|
|
23
|
+
# Main function
|
|
24
|
+
main() {
|
|
25
|
+
print_banner "Issue Sync Preflight Validation" "1.0.0"
|
|
26
|
+
|
|
27
|
+
# Validate inputs
|
|
28
|
+
log_info "Validating issue: #$ISSUE_NUMBER"
|
|
29
|
+
validate_inputs || exit 1
|
|
30
|
+
|
|
31
|
+
# Run all preflight checks
|
|
32
|
+
with_error_handling "Repository protection check" \
|
|
33
|
+
check_repository_protection
|
|
34
|
+
|
|
35
|
+
with_error_handling "GitHub authentication check" \
|
|
36
|
+
check_github_authentication
|
|
37
|
+
|
|
38
|
+
with_error_handling "Issue validation" \
|
|
39
|
+
validate_issue_exists
|
|
40
|
+
|
|
41
|
+
with_error_handling "Local updates check" \
|
|
42
|
+
check_local_updates
|
|
43
|
+
|
|
44
|
+
with_error_handling "Sync timing check" \
|
|
45
|
+
check_sync_timing
|
|
46
|
+
|
|
47
|
+
with_error_handling "Changes verification" \
|
|
48
|
+
verify_changes_exist
|
|
49
|
+
|
|
50
|
+
# Output validation results
|
|
51
|
+
display_validation_results
|
|
52
|
+
|
|
53
|
+
log_success "All preflight checks passed successfully"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Validate script inputs
|
|
57
|
+
validate_inputs() {
|
|
58
|
+
log_function_entry "validate_inputs"
|
|
59
|
+
|
|
60
|
+
validate_issue_number "$ISSUE_NUMBER" || return 1
|
|
61
|
+
|
|
62
|
+
log_function_exit "validate_inputs"
|
|
63
|
+
return 0
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# Check repository protection
|
|
67
|
+
check_repository_protection() {
|
|
68
|
+
log_function_entry "check_repository_protection"
|
|
69
|
+
|
|
70
|
+
log_info "Checking repository protection against template repos"
|
|
71
|
+
check_repo_protection
|
|
72
|
+
|
|
73
|
+
log_function_exit "check_repository_protection"
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Check GitHub authentication
|
|
77
|
+
check_github_authentication() {
|
|
78
|
+
log_function_entry "check_github_authentication"
|
|
79
|
+
|
|
80
|
+
log_info "Verifying GitHub CLI authentication"
|
|
81
|
+
validate_github_auth
|
|
82
|
+
|
|
83
|
+
log_function_exit "check_github_authentication"
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# Validate that the issue exists and get its state
|
|
87
|
+
validate_issue_exists() {
|
|
88
|
+
log_function_entry "validate_issue_exists"
|
|
89
|
+
|
|
90
|
+
log_info "Validating issue #$ISSUE_NUMBER exists"
|
|
91
|
+
|
|
92
|
+
local issue_state
|
|
93
|
+
issue_state=$(check_issue_exists "$ISSUE_NUMBER")
|
|
94
|
+
|
|
95
|
+
if [[ $? -ne 0 ]]; then
|
|
96
|
+
log_error "Issue #$ISSUE_NUMBER not found"
|
|
97
|
+
echo "❌ Issue #$ISSUE_NUMBER not found"
|
|
98
|
+
echo "Please verify the issue number and try again."
|
|
99
|
+
return 1
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
log_info "Issue #$ISSUE_NUMBER exists with state: $issue_state"
|
|
103
|
+
|
|
104
|
+
# Warn if issue is closed but we're still syncing
|
|
105
|
+
if [[ "$issue_state" == "closed" ]]; then
|
|
106
|
+
log_warning "Issue #$ISSUE_NUMBER is closed"
|
|
107
|
+
echo "⚠️ Issue #$ISSUE_NUMBER is closed but you're syncing updates."
|
|
108
|
+
echo "This is unusual but allowed - the sync will proceed."
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
log_function_exit "validate_issue_exists"
|
|
112
|
+
return 0
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# Check for local updates directory and files
|
|
116
|
+
check_local_updates() {
|
|
117
|
+
log_function_entry "check_local_updates"
|
|
118
|
+
|
|
119
|
+
log_info "Checking for local updates directory"
|
|
120
|
+
|
|
121
|
+
# Find the epic that contains this issue
|
|
122
|
+
local found_epic=""
|
|
123
|
+
for epic_dir in .claude/epics/*/; do
|
|
124
|
+
[[ -d "$epic_dir" ]] || continue
|
|
125
|
+
|
|
126
|
+
local epic_updates_dir="$epic_dir/updates/$ISSUE_NUMBER"
|
|
127
|
+
if [[ -d "$epic_updates_dir" ]]; then
|
|
128
|
+
found_epic=$(basename "$epic_dir")
|
|
129
|
+
updates_dir="$epic_updates_dir"
|
|
130
|
+
progress_file="$epic_updates_dir/progress.md"
|
|
131
|
+
break
|
|
132
|
+
fi
|
|
133
|
+
done
|
|
134
|
+
|
|
135
|
+
if [[ -z "$found_epic" ]]; then
|
|
136
|
+
log_error "No local updates found for issue #$ISSUE_NUMBER"
|
|
137
|
+
echo "❌ No local updates found for issue #$ISSUE_NUMBER"
|
|
138
|
+
echo "Initialize issue tracking with: /pm:issue-start $ISSUE_NUMBER"
|
|
139
|
+
return 1
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
epic_name="$found_epic"
|
|
143
|
+
log_info "Found updates in epic: $epic_name"
|
|
144
|
+
log_debug "Updates directory: $updates_dir"
|
|
145
|
+
|
|
146
|
+
# Check if progress.md exists
|
|
147
|
+
if [[ ! -f "$progress_file" ]]; then
|
|
148
|
+
log_error "No progress tracking found"
|
|
149
|
+
echo "❌ No progress tracking found for issue #$ISSUE_NUMBER"
|
|
150
|
+
echo "Initialize with: /pm:issue-start $ISSUE_NUMBER"
|
|
151
|
+
return 1
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
log_success "Local updates directory found: $updates_dir"
|
|
155
|
+
log_function_exit "check_local_updates"
|
|
156
|
+
return 0
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Check timing of last sync to avoid too frequent syncs
|
|
160
|
+
check_sync_timing() {
|
|
161
|
+
log_function_entry "check_sync_timing"
|
|
162
|
+
|
|
163
|
+
log_info "Checking last sync timing"
|
|
164
|
+
|
|
165
|
+
local last_sync
|
|
166
|
+
last_sync=$(get_frontmatter_field "$progress_file" "last_sync" 2>/dev/null || echo "")
|
|
167
|
+
|
|
168
|
+
if [[ -n "$last_sync" ]]; then
|
|
169
|
+
local current_time
|
|
170
|
+
current_time=$(get_current_datetime)
|
|
171
|
+
|
|
172
|
+
local time_diff
|
|
173
|
+
time_diff=$(datetime_diff_minutes "$last_sync" "$current_time" 2>/dev/null || echo "999")
|
|
174
|
+
|
|
175
|
+
log_debug "Last sync: $last_sync, Current: $current_time, Diff: ${time_diff}m"
|
|
176
|
+
|
|
177
|
+
if [[ "$time_diff" -lt 5 ]]; then
|
|
178
|
+
log_warning "Recent sync detected (${time_diff} minutes ago)"
|
|
179
|
+
echo "⚠️ Issue was synced recently (${time_diff} minutes ago at $last_sync)"
|
|
180
|
+
|
|
181
|
+
# Interactive confirmation in non-automated environments
|
|
182
|
+
if [[ -t 0 ]] && [[ "${AUTOPM_FORCE_SYNC:-}" != "true" ]]; then
|
|
183
|
+
echo "Force sync anyway? Set AUTOPM_FORCE_SYNC=true to skip this check."
|
|
184
|
+
if ! confirm "Continue with sync?"; then
|
|
185
|
+
echo "Sync cancelled by user"
|
|
186
|
+
exit 0
|
|
187
|
+
fi
|
|
188
|
+
fi
|
|
189
|
+
fi
|
|
190
|
+
else
|
|
191
|
+
log_info "No previous sync timestamp found - this appears to be the first sync"
|
|
192
|
+
fi
|
|
193
|
+
|
|
194
|
+
log_function_exit "check_sync_timing"
|
|
195
|
+
return 0
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
# Verify that there are actually changes to sync
|
|
199
|
+
verify_changes_exist() {
|
|
200
|
+
log_function_entry "verify_changes_exist"
|
|
201
|
+
|
|
202
|
+
log_info "Verifying that changes exist to sync"
|
|
203
|
+
|
|
204
|
+
# Get last sync timestamp
|
|
205
|
+
local last_sync
|
|
206
|
+
last_sync=$(get_frontmatter_field "$progress_file" "last_sync" 2>/dev/null || echo "")
|
|
207
|
+
|
|
208
|
+
local has_changes=false
|
|
209
|
+
|
|
210
|
+
# Check if progress.md has been modified since last sync
|
|
211
|
+
if [[ -f "$progress_file" ]]; then
|
|
212
|
+
if [[ -z "$last_sync" ]]; then
|
|
213
|
+
# No previous sync, so there are changes
|
|
214
|
+
has_changes=true
|
|
215
|
+
log_debug "No previous sync - treating as changes exist"
|
|
216
|
+
else
|
|
217
|
+
# Check file modification time vs last sync
|
|
218
|
+
local file_mtime_iso
|
|
219
|
+
if command -v gstat >/dev/null 2>&1; then
|
|
220
|
+
# GNU stat (macOS with coreutils)
|
|
221
|
+
file_mtime_iso=$(gstat -c %Y "$progress_file" | xargs -I {} date -u -d "@{}" +"%Y-%m-%dT%H:%M:%SZ")
|
|
222
|
+
else
|
|
223
|
+
# BSD stat (macOS default) or Linux stat
|
|
224
|
+
file_mtime_iso=$(stat -f %m "$progress_file" 2>/dev/null | xargs -I {} date -u -r {} +"%Y-%m-%dT%H:%M:%SZ" ||
|
|
225
|
+
stat -c %Y "$progress_file" | xargs -I {} date -u -d "@{}" +"%Y-%m-%dT%H:%M:%SZ")
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
if datetime_is_after "$file_mtime_iso" "$last_sync" 2>/dev/null; then
|
|
229
|
+
has_changes=true
|
|
230
|
+
log_debug "Progress file modified after last sync"
|
|
231
|
+
fi
|
|
232
|
+
fi
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
# Check for other update files
|
|
236
|
+
if [[ -d "$updates_dir" ]]; then
|
|
237
|
+
local update_files
|
|
238
|
+
update_files=$(find "$updates_dir" -name "*.md" -type f | wc -l)
|
|
239
|
+
if [[ "$update_files" -gt 1 ]]; then # More than just progress.md
|
|
240
|
+
has_changes=true
|
|
241
|
+
log_debug "Found $update_files update files"
|
|
242
|
+
fi
|
|
243
|
+
fi
|
|
244
|
+
|
|
245
|
+
if [[ "$has_changes" != "true" ]]; then
|
|
246
|
+
local last_sync_formatted
|
|
247
|
+
last_sync_formatted=$(echo "$last_sync" | sed 's/T/ /' | sed 's/Z//')
|
|
248
|
+
|
|
249
|
+
log_info "No new updates found since last sync"
|
|
250
|
+
echo "ℹ️ No new updates to sync since $last_sync_formatted"
|
|
251
|
+
echo "All changes have already been synchronized to GitHub."
|
|
252
|
+
exit 0
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
log_success "Changes detected - sync can proceed"
|
|
256
|
+
log_function_exit "verify_changes_exist"
|
|
257
|
+
return 0
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
# Display validation results summary
|
|
261
|
+
display_validation_results() {
|
|
262
|
+
print_section "✅ Preflight Validation Results"
|
|
263
|
+
|
|
264
|
+
echo "Issue: #$ISSUE_NUMBER"
|
|
265
|
+
echo "Epic: $epic_name"
|
|
266
|
+
echo "Updates Directory: $updates_dir"
|
|
267
|
+
echo "Progress File: $progress_file"
|
|
268
|
+
|
|
269
|
+
# Show basic issue info if possible
|
|
270
|
+
if command -v gh >/dev/null 2>&1; then
|
|
271
|
+
local issue_title
|
|
272
|
+
issue_title=$(gh issue view "$ISSUE_NUMBER" --json title -q .title 2>/dev/null || echo "Unknown")
|
|
273
|
+
echo "Issue Title: $issue_title"
|
|
274
|
+
fi
|
|
275
|
+
|
|
276
|
+
# Show completion status
|
|
277
|
+
local completion
|
|
278
|
+
completion=$(get_frontmatter_field "$progress_file" "completion" 2>/dev/null || echo "Unknown")
|
|
279
|
+
echo "Current Completion: $completion"
|
|
280
|
+
|
|
281
|
+
# Show last sync info
|
|
282
|
+
local last_sync
|
|
283
|
+
last_sync=$(get_frontmatter_field "$progress_file" "last_sync" 2>/dev/null || echo "Never")
|
|
284
|
+
echo "Last Sync: $last_sync"
|
|
285
|
+
|
|
286
|
+
echo ""
|
|
287
|
+
echo "✅ All preflight checks passed"
|
|
288
|
+
echo "✅ Ready to sync updates to GitHub"
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
# Get epic name for the issue
|
|
292
|
+
get_epic_name() {
|
|
293
|
+
echo "$epic_name"
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
# Get updates directory path
|
|
297
|
+
get_updates_directory() {
|
|
298
|
+
echo "$updates_dir"
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
# Get progress file path
|
|
302
|
+
get_progress_file() {
|
|
303
|
+
echo "$progress_file"
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
# Error handling
|
|
307
|
+
handle_error() {
|
|
308
|
+
local exit_code=$?
|
|
309
|
+
log_error "Preflight validation failed with exit code: $exit_code"
|
|
310
|
+
log_error "Issue sync preflight failed for: #$ISSUE_NUMBER"
|
|
311
|
+
exit "$exit_code"
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
# Set up error handling
|
|
315
|
+
trap handle_error ERR
|
|
316
|
+
|
|
317
|
+
# Validate arguments
|
|
318
|
+
if [[ $# -ne 1 ]]; then
|
|
319
|
+
echo "Usage: $0 <issue_number>"
|
|
320
|
+
echo ""
|
|
321
|
+
echo "Performs preflight validation for issue sync operation."
|
|
322
|
+
echo ""
|
|
323
|
+
echo "Checks performed:"
|
|
324
|
+
echo " 1. Repository protection (prevents syncing to template repos)"
|
|
325
|
+
echo " 2. GitHub CLI authentication"
|
|
326
|
+
echo " 3. Issue existence and state validation"
|
|
327
|
+
echo " 4. Local updates directory and files"
|
|
328
|
+
echo " 5. Sync timing (prevents too frequent syncs)"
|
|
329
|
+
echo " 6. Changes verification (ensures there's something to sync)"
|
|
330
|
+
echo ""
|
|
331
|
+
echo "Environment Variables:"
|
|
332
|
+
echo " AUTOPM_FORCE_SYNC=true Skip timing checks and force sync"
|
|
333
|
+
echo " AUTOPM_LOG_LEVEL=0 Enable debug logging"
|
|
334
|
+
echo ""
|
|
335
|
+
echo "Examples:"
|
|
336
|
+
echo " $0 123"
|
|
337
|
+
echo " AUTOPM_FORCE_SYNC=true $0 456"
|
|
338
|
+
echo ""
|
|
339
|
+
echo "Output Functions (for use by other scripts):"
|
|
340
|
+
echo " get_epic_name Returns the epic name containing the issue"
|
|
341
|
+
echo " get_updates_directory Returns the path to updates directory"
|
|
342
|
+
echo " get_progress_file Returns the path to progress.md file"
|
|
343
|
+
echo ""
|
|
344
|
+
exit 1
|
|
345
|
+
fi
|
|
346
|
+
|
|
347
|
+
# Run main function
|
|
348
|
+
main "$@"
|