claude-autopm 2.8.2 → 2.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +399 -637
- package/install/install.js +15 -5
- package/package.json +2 -1
- package/packages/plugin-ai/LICENSE +21 -0
- package/packages/plugin-ai/README.md +316 -0
- package/packages/plugin-ai/agents/anthropic-claude-expert.md +579 -0
- package/packages/plugin-ai/agents/azure-openai-expert.md +1411 -0
- package/packages/plugin-ai/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-ai/agents/google-a2a-expert.md +1445 -0
- package/packages/plugin-ai/agents/huggingface-expert.md +2131 -0
- package/packages/plugin-ai/agents/langchain-expert.md +1427 -0
- package/packages/plugin-ai/agents/langgraph-workflow-expert.md +520 -0
- package/packages/plugin-ai/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-ai/commands/a2a-setup.md +886 -0
- package/packages/plugin-ai/commands/ai-model-deployment.md +481 -0
- package/packages/plugin-ai/commands/anthropic-optimize.md +793 -0
- package/packages/plugin-ai/commands/huggingface-deploy.md +789 -0
- package/packages/plugin-ai/commands/langchain-optimize.md +807 -0
- package/packages/plugin-ai/commands/llm-optimize.md +348 -0
- package/packages/plugin-ai/commands/openai-optimize.md +863 -0
- package/packages/plugin-ai/commands/rag-optimize.md +841 -0
- package/packages/plugin-ai/commands/rag-setup-scaffold.md +382 -0
- package/packages/plugin-ai/package.json +66 -0
- package/packages/plugin-ai/plugin.json +519 -0
- package/packages/plugin-ai/rules/ai-model-standards.md +449 -0
- package/packages/plugin-ai/rules/prompt-engineering-standards.md +509 -0
- package/packages/plugin-ai/scripts/examples/huggingface-inference-example.py +145 -0
- package/packages/plugin-ai/scripts/examples/langchain-rag-example.py +366 -0
- package/packages/plugin-ai/scripts/examples/mlflow-tracking-example.py +224 -0
- package/packages/plugin-ai/scripts/examples/openai-chat-example.py +425 -0
- package/packages/plugin-cloud/README.md +268 -0
- package/packages/plugin-cloud/agents/README.md +55 -0
- package/packages/plugin-cloud/agents/aws-cloud-architect.md +521 -0
- package/packages/plugin-cloud/agents/azure-cloud-architect.md +436 -0
- package/packages/plugin-cloud/agents/gcp-cloud-architect.md +385 -0
- package/packages/plugin-cloud/agents/gcp-cloud-functions-engineer.md +306 -0
- package/packages/plugin-cloud/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-cloud/agents/kubernetes-orchestrator.md +566 -0
- package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-cloud/agents/terraform-infrastructure-expert.md +454 -0
- package/packages/plugin-cloud/commands/cloud-cost-optimize.md +243 -0
- package/packages/plugin-cloud/commands/cloud-validate.md +196 -0
- package/packages/plugin-cloud/commands/infra-deploy.md +38 -0
- package/packages/plugin-cloud/commands/k8s-deploy.md +37 -0
- package/packages/plugin-cloud/commands/ssh-security.md +65 -0
- package/packages/plugin-cloud/commands/traefik-setup.md +65 -0
- package/packages/plugin-cloud/hooks/pre-cloud-deploy.js +456 -0
- package/packages/plugin-cloud/package.json +64 -0
- package/packages/plugin-cloud/plugin.json +338 -0
- package/packages/plugin-cloud/rules/cloud-security-compliance.md +313 -0
- package/packages/plugin-cloud/rules/infrastructure-pipeline.md +128 -0
- package/packages/plugin-cloud/scripts/examples/aws-validate.sh +30 -0
- package/packages/plugin-cloud/scripts/examples/azure-setup.sh +33 -0
- package/packages/plugin-cloud/scripts/examples/gcp-setup.sh +39 -0
- package/packages/plugin-cloud/scripts/examples/k8s-validate.sh +40 -0
- package/packages/plugin-cloud/scripts/examples/terraform-init.sh +26 -0
- package/packages/plugin-core/README.md +274 -0
- package/packages/plugin-core/agents/core/agent-manager.md +296 -0
- package/packages/plugin-core/agents/core/code-analyzer.md +131 -0
- package/packages/plugin-core/agents/core/file-analyzer.md +162 -0
- package/packages/plugin-core/agents/core/test-runner.md +200 -0
- package/packages/plugin-core/commands/code-rabbit.md +128 -0
- package/packages/plugin-core/commands/prompt.md +9 -0
- package/packages/plugin-core/commands/re-init.md +9 -0
- package/packages/plugin-core/hooks/context7-reminder.md +29 -0
- package/packages/plugin-core/hooks/enforce-agents.js +125 -0
- package/packages/plugin-core/hooks/enforce-agents.sh +35 -0
- package/packages/plugin-core/hooks/pre-agent-context7.js +224 -0
- package/packages/plugin-core/hooks/pre-command-context7.js +229 -0
- package/packages/plugin-core/hooks/strict-enforce-agents.sh +39 -0
- package/packages/plugin-core/hooks/test-hook.sh +21 -0
- package/packages/plugin-core/hooks/unified-context7-enforcement.sh +38 -0
- package/packages/plugin-core/package.json +45 -0
- package/packages/plugin-core/plugin.json +387 -0
- package/packages/plugin-core/rules/agent-coordination.md +549 -0
- package/packages/plugin-core/rules/agent-mandatory.md +170 -0
- package/packages/plugin-core/rules/ai-integration-patterns.md +219 -0
- package/packages/plugin-core/rules/command-pipelines.md +208 -0
- package/packages/plugin-core/rules/context-optimization.md +176 -0
- package/packages/plugin-core/rules/context7-enforcement.md +327 -0
- package/packages/plugin-core/rules/datetime.md +122 -0
- package/packages/plugin-core/rules/definition-of-done.md +272 -0
- package/packages/plugin-core/rules/development-environments.md +19 -0
- package/packages/plugin-core/rules/development-workflow.md +198 -0
- package/packages/plugin-core/rules/framework-path-rules.md +180 -0
- package/packages/plugin-core/rules/frontmatter-operations.md +64 -0
- package/packages/plugin-core/rules/git-strategy.md +237 -0
- package/packages/plugin-core/rules/golden-rules.md +181 -0
- package/packages/plugin-core/rules/naming-conventions.md +111 -0
- package/packages/plugin-core/rules/no-pr-workflow.md +183 -0
- package/packages/plugin-core/rules/performance-guidelines.md +403 -0
- package/packages/plugin-core/rules/pipeline-mandatory.md +109 -0
- package/packages/plugin-core/rules/security-checklist.md +318 -0
- package/packages/plugin-core/rules/standard-patterns.md +197 -0
- package/packages/plugin-core/rules/strip-frontmatter.md +85 -0
- package/packages/plugin-core/rules/tdd.enforcement.md +103 -0
- package/packages/plugin-core/rules/use-ast-grep.md +113 -0
- package/packages/plugin-core/scripts/lib/datetime-utils.sh +254 -0
- package/packages/plugin-core/scripts/lib/frontmatter-utils.sh +294 -0
- package/packages/plugin-core/scripts/lib/github-utils.sh +221 -0
- package/packages/plugin-core/scripts/lib/logging-utils.sh +199 -0
- package/packages/plugin-core/scripts/lib/validation-utils.sh +339 -0
- package/packages/plugin-core/scripts/mcp/add.sh +7 -0
- package/packages/plugin-core/scripts/mcp/disable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/enable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/list.sh +7 -0
- package/packages/plugin-core/scripts/mcp/sync.sh +8 -0
- package/packages/plugin-data/README.md +315 -0
- package/packages/plugin-data/agents/airflow-orchestration-expert.md +158 -0
- package/packages/plugin-data/agents/kedro-pipeline-expert.md +304 -0
- package/packages/plugin-data/agents/langgraph-workflow-expert.md +530 -0
- package/packages/plugin-data/commands/airflow-dag-scaffold.md +413 -0
- package/packages/plugin-data/commands/kafka-pipeline-scaffold.md +503 -0
- package/packages/plugin-data/package.json +66 -0
- package/packages/plugin-data/plugin.json +294 -0
- package/packages/plugin-data/rules/data-quality-standards.md +373 -0
- package/packages/plugin-data/rules/etl-pipeline-standards.md +255 -0
- package/packages/plugin-data/scripts/examples/airflow-dag-example.py +245 -0
- package/packages/plugin-data/scripts/examples/dbt-transform-example.sql +238 -0
- package/packages/plugin-data/scripts/examples/kafka-streaming-example.py +257 -0
- package/packages/plugin-data/scripts/examples/pandas-etl-example.py +332 -0
- package/packages/plugin-databases/README.md +330 -0
- package/packages/plugin-databases/agents/README.md +50 -0
- package/packages/plugin-databases/agents/bigquery-expert.md +401 -0
- package/packages/plugin-databases/agents/cosmosdb-expert.md +375 -0
- package/packages/plugin-databases/agents/mongodb-expert.md +407 -0
- package/packages/plugin-databases/agents/postgresql-expert.md +329 -0
- package/packages/plugin-databases/agents/redis-expert.md +74 -0
- package/packages/plugin-databases/commands/db-optimize.md +612 -0
- package/packages/plugin-databases/package.json +60 -0
- package/packages/plugin-databases/plugin.json +237 -0
- package/packages/plugin-databases/rules/database-management-strategy.md +146 -0
- package/packages/plugin-databases/rules/database-pipeline.md +316 -0
- package/packages/plugin-databases/scripts/examples/bigquery-cost-analyze.sh +160 -0
- package/packages/plugin-databases/scripts/examples/cosmosdb-ru-optimize.sh +163 -0
- package/packages/plugin-databases/scripts/examples/mongodb-shard-check.sh +120 -0
- package/packages/plugin-databases/scripts/examples/postgres-index-analyze.sh +95 -0
- package/packages/plugin-databases/scripts/examples/redis-cache-stats.sh +121 -0
- package/packages/plugin-devops/README.md +367 -0
- package/packages/plugin-devops/agents/README.md +52 -0
- package/packages/plugin-devops/agents/azure-devops-specialist.md +308 -0
- package/packages/plugin-devops/agents/docker-containerization-expert.md +298 -0
- package/packages/plugin-devops/agents/github-operations-specialist.md +335 -0
- package/packages/plugin-devops/agents/mcp-context-manager.md +319 -0
- package/packages/plugin-devops/agents/observability-engineer.md +574 -0
- package/packages/plugin-devops/agents/ssh-operations-expert.md +1093 -0
- package/packages/plugin-devops/agents/traefik-proxy-expert.md +444 -0
- package/packages/plugin-devops/commands/ci-pipeline-create.md +581 -0
- package/packages/plugin-devops/commands/docker-optimize.md +493 -0
- package/packages/plugin-devops/commands/workflow-create.md +42 -0
- package/packages/plugin-devops/hooks/pre-docker-build.js +472 -0
- package/packages/plugin-devops/package.json +61 -0
- package/packages/plugin-devops/plugin.json +302 -0
- package/packages/plugin-devops/rules/ci-cd-kubernetes-strategy.md +25 -0
- package/packages/plugin-devops/rules/devops-troubleshooting-playbook.md +450 -0
- package/packages/plugin-devops/rules/docker-first-development.md +404 -0
- package/packages/plugin-devops/rules/github-operations.md +92 -0
- package/packages/plugin-devops/scripts/examples/docker-build-multistage.sh +43 -0
- package/packages/plugin-devops/scripts/examples/docker-compose-validate.sh +74 -0
- package/packages/plugin-devops/scripts/examples/github-workflow-validate.sh +48 -0
- package/packages/plugin-devops/scripts/examples/prometheus-health-check.sh +58 -0
- package/packages/plugin-devops/scripts/examples/ssh-key-setup.sh +74 -0
- package/packages/plugin-frameworks/README.md +309 -0
- package/packages/plugin-frameworks/agents/README.md +64 -0
- package/packages/plugin-frameworks/agents/e2e-test-engineer.md +579 -0
- package/packages/plugin-frameworks/agents/nats-messaging-expert.md +254 -0
- package/packages/plugin-frameworks/agents/react-frontend-engineer.md +393 -0
- package/packages/plugin-frameworks/agents/react-ui-expert.md +226 -0
- package/packages/plugin-frameworks/agents/tailwindcss-expert.md +1021 -0
- package/packages/plugin-frameworks/agents/ux-design-expert.md +244 -0
- package/packages/plugin-frameworks/commands/app-scaffold.md +50 -0
- package/packages/plugin-frameworks/commands/nextjs-optimize.md +692 -0
- package/packages/plugin-frameworks/commands/react-optimize.md +583 -0
- package/packages/plugin-frameworks/commands/tailwind-system.md +64 -0
- package/packages/plugin-frameworks/package.json +59 -0
- package/packages/plugin-frameworks/plugin.json +224 -0
- package/packages/plugin-frameworks/rules/performance-guidelines.md +403 -0
- package/packages/plugin-frameworks/rules/ui-development-standards.md +281 -0
- package/packages/plugin-frameworks/rules/ui-framework-rules.md +151 -0
- package/packages/plugin-frameworks/scripts/examples/react-component-perf.sh +34 -0
- package/packages/plugin-frameworks/scripts/examples/tailwind-optimize.sh +44 -0
- package/packages/plugin-frameworks/scripts/examples/vue-composition-check.sh +41 -0
- package/packages/plugin-languages/README.md +333 -0
- package/packages/plugin-languages/agents/README.md +50 -0
- package/packages/plugin-languages/agents/bash-scripting-expert.md +541 -0
- package/packages/plugin-languages/agents/javascript-frontend-engineer.md +197 -0
- package/packages/plugin-languages/agents/nodejs-backend-engineer.md +226 -0
- package/packages/plugin-languages/agents/python-backend-engineer.md +214 -0
- package/packages/plugin-languages/agents/python-backend-expert.md +289 -0
- package/packages/plugin-languages/commands/javascript-optimize.md +636 -0
- package/packages/plugin-languages/commands/nodejs-api-scaffold.md +341 -0
- package/packages/plugin-languages/commands/nodejs-optimize.md +689 -0
- package/packages/plugin-languages/commands/python-api-scaffold.md +261 -0
- package/packages/plugin-languages/commands/python-optimize.md +593 -0
- package/packages/plugin-languages/package.json +65 -0
- package/packages/plugin-languages/plugin.json +265 -0
- package/packages/plugin-languages/rules/code-quality-standards.md +496 -0
- package/packages/plugin-languages/rules/testing-standards.md +768 -0
- package/packages/plugin-languages/scripts/examples/bash-production-script.sh +520 -0
- package/packages/plugin-languages/scripts/examples/javascript-es6-patterns.js +291 -0
- package/packages/plugin-languages/scripts/examples/nodejs-async-iteration.js +360 -0
- package/packages/plugin-languages/scripts/examples/python-async-patterns.py +289 -0
- package/packages/plugin-languages/scripts/examples/typescript-patterns.ts +432 -0
- package/packages/plugin-ml/README.md +430 -0
- package/packages/plugin-ml/agents/automl-expert.md +326 -0
- package/packages/plugin-ml/agents/computer-vision-expert.md +550 -0
- package/packages/plugin-ml/agents/gradient-boosting-expert.md +455 -0
- package/packages/plugin-ml/agents/neural-network-architect.md +1228 -0
- package/packages/plugin-ml/agents/nlp-transformer-expert.md +584 -0
- package/packages/plugin-ml/agents/pytorch-expert.md +412 -0
- package/packages/plugin-ml/agents/reinforcement-learning-expert.md +2088 -0
- package/packages/plugin-ml/agents/scikit-learn-expert.md +228 -0
- package/packages/plugin-ml/agents/tensorflow-keras-expert.md +509 -0
- package/packages/plugin-ml/agents/time-series-expert.md +303 -0
- package/packages/plugin-ml/commands/ml-automl.md +572 -0
- package/packages/plugin-ml/commands/ml-train-optimize.md +657 -0
- package/packages/plugin-ml/package.json +52 -0
- package/packages/plugin-ml/plugin.json +338 -0
- package/packages/plugin-pm/README.md +368 -0
- package/packages/plugin-pm/claudeautopm-plugin-pm-2.0.0.tgz +0 -0
- package/packages/plugin-pm/commands/azure/COMMANDS.md +107 -0
- package/packages/plugin-pm/commands/azure/COMMAND_MAPPING.md +252 -0
- package/packages/plugin-pm/commands/azure/INTEGRATION_FIX.md +103 -0
- package/packages/plugin-pm/commands/azure/README.md +246 -0
- package/packages/plugin-pm/commands/azure/active-work.md +198 -0
- package/packages/plugin-pm/commands/azure/aliases.md +143 -0
- package/packages/plugin-pm/commands/azure/blocked-items.md +287 -0
- package/packages/plugin-pm/commands/azure/clean.md +93 -0
- package/packages/plugin-pm/commands/azure/docs-query.md +48 -0
- package/packages/plugin-pm/commands/azure/feature-decompose.md +380 -0
- package/packages/plugin-pm/commands/azure/feature-list.md +61 -0
- package/packages/plugin-pm/commands/azure/feature-new.md +115 -0
- package/packages/plugin-pm/commands/azure/feature-show.md +205 -0
- package/packages/plugin-pm/commands/azure/feature-start.md +130 -0
- package/packages/plugin-pm/commands/azure/fix-integration-example.md +93 -0
- package/packages/plugin-pm/commands/azure/help.md +150 -0
- package/packages/plugin-pm/commands/azure/import-us.md +269 -0
- package/packages/plugin-pm/commands/azure/init.md +211 -0
- package/packages/plugin-pm/commands/azure/next-task.md +262 -0
- package/packages/plugin-pm/commands/azure/search.md +160 -0
- package/packages/plugin-pm/commands/azure/sprint-status.md +235 -0
- package/packages/plugin-pm/commands/azure/standup.md +260 -0
- package/packages/plugin-pm/commands/azure/sync-all.md +99 -0
- package/packages/plugin-pm/commands/azure/task-analyze.md +186 -0
- package/packages/plugin-pm/commands/azure/task-close.md +329 -0
- package/packages/plugin-pm/commands/azure/task-edit.md +145 -0
- package/packages/plugin-pm/commands/azure/task-list.md +263 -0
- package/packages/plugin-pm/commands/azure/task-new.md +84 -0
- package/packages/plugin-pm/commands/azure/task-reopen.md +79 -0
- package/packages/plugin-pm/commands/azure/task-show.md +126 -0
- package/packages/plugin-pm/commands/azure/task-start.md +301 -0
- package/packages/plugin-pm/commands/azure/task-status.md +65 -0
- package/packages/plugin-pm/commands/azure/task-sync.md +67 -0
- package/packages/plugin-pm/commands/azure/us-edit.md +164 -0
- package/packages/plugin-pm/commands/azure/us-list.md +202 -0
- package/packages/plugin-pm/commands/azure/us-new.md +265 -0
- package/packages/plugin-pm/commands/azure/us-parse.md +253 -0
- package/packages/plugin-pm/commands/azure/us-show.md +188 -0
- package/packages/plugin-pm/commands/azure/us-status.md +320 -0
- package/packages/plugin-pm/commands/azure/validate.md +86 -0
- package/packages/plugin-pm/commands/azure/work-item-sync.md +47 -0
- package/packages/plugin-pm/commands/blocked.md +28 -0
- package/packages/plugin-pm/commands/clean.md +119 -0
- package/packages/plugin-pm/commands/context-create.md +136 -0
- package/packages/plugin-pm/commands/context-prime.md +170 -0
- package/packages/plugin-pm/commands/context-update.md +292 -0
- package/packages/plugin-pm/commands/context.md +28 -0
- package/packages/plugin-pm/commands/epic-close.md +86 -0
- package/packages/plugin-pm/commands/epic-decompose.md +370 -0
- package/packages/plugin-pm/commands/epic-edit.md +83 -0
- package/packages/plugin-pm/commands/epic-list.md +30 -0
- package/packages/plugin-pm/commands/epic-merge.md +222 -0
- package/packages/plugin-pm/commands/epic-oneshot.md +119 -0
- package/packages/plugin-pm/commands/epic-refresh.md +119 -0
- package/packages/plugin-pm/commands/epic-show.md +28 -0
- package/packages/plugin-pm/commands/epic-split.md +120 -0
- package/packages/plugin-pm/commands/epic-start.md +195 -0
- package/packages/plugin-pm/commands/epic-status.md +28 -0
- package/packages/plugin-pm/commands/epic-sync-modular.md +338 -0
- package/packages/plugin-pm/commands/epic-sync-original.md +473 -0
- package/packages/plugin-pm/commands/epic-sync.md +486 -0
- package/packages/plugin-pm/commands/github/workflow-create.md +42 -0
- package/packages/plugin-pm/commands/help.md +28 -0
- package/packages/plugin-pm/commands/import.md +115 -0
- package/packages/plugin-pm/commands/in-progress.md +28 -0
- package/packages/plugin-pm/commands/init.md +28 -0
- package/packages/plugin-pm/commands/issue-analyze.md +202 -0
- package/packages/plugin-pm/commands/issue-close.md +119 -0
- package/packages/plugin-pm/commands/issue-edit.md +93 -0
- package/packages/plugin-pm/commands/issue-reopen.md +87 -0
- package/packages/plugin-pm/commands/issue-show.md +41 -0
- package/packages/plugin-pm/commands/issue-start.md +234 -0
- package/packages/plugin-pm/commands/issue-status.md +95 -0
- package/packages/plugin-pm/commands/issue-sync.md +411 -0
- package/packages/plugin-pm/commands/next.md +28 -0
- package/packages/plugin-pm/commands/prd-edit.md +82 -0
- package/packages/plugin-pm/commands/prd-list.md +28 -0
- package/packages/plugin-pm/commands/prd-new.md +55 -0
- package/packages/plugin-pm/commands/prd-parse.md +42 -0
- package/packages/plugin-pm/commands/prd-status.md +28 -0
- package/packages/plugin-pm/commands/search.md +28 -0
- package/packages/plugin-pm/commands/standup.md +28 -0
- package/packages/plugin-pm/commands/status.md +28 -0
- package/packages/plugin-pm/commands/sync.md +99 -0
- package/packages/plugin-pm/commands/test-reference-update.md +151 -0
- package/packages/plugin-pm/commands/validate.md +28 -0
- package/packages/plugin-pm/commands/what-next.md +28 -0
- package/packages/plugin-pm/package.json +57 -0
- package/packages/plugin-pm/plugin.json +503 -0
- package/packages/plugin-pm/scripts/pm/analytics.js +425 -0
- package/packages/plugin-pm/scripts/pm/blocked.js +164 -0
- package/packages/plugin-pm/scripts/pm/blocked.sh +78 -0
- package/packages/plugin-pm/scripts/pm/clean.js +464 -0
- package/packages/plugin-pm/scripts/pm/context-create.js +216 -0
- package/packages/plugin-pm/scripts/pm/context-prime.js +335 -0
- package/packages/plugin-pm/scripts/pm/context-update.js +344 -0
- package/packages/plugin-pm/scripts/pm/context.js +338 -0
- package/packages/plugin-pm/scripts/pm/epic-close.js +347 -0
- package/packages/plugin-pm/scripts/pm/epic-edit.js +382 -0
- package/packages/plugin-pm/scripts/pm/epic-list.js +273 -0
- package/packages/plugin-pm/scripts/pm/epic-list.sh +109 -0
- package/packages/plugin-pm/scripts/pm/epic-show.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-show.sh +105 -0
- package/packages/plugin-pm/scripts/pm/epic-split.js +522 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.js +183 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.sh +94 -0
- package/packages/plugin-pm/scripts/pm/epic-status.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-status.sh +104 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/README.md +208 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-epic-issue.sh +77 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-task-issues.sh +86 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-epic-file.sh +79 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-references.sh +89 -0
- package/packages/plugin-pm/scripts/pm/epic-sync.sh +137 -0
- package/packages/plugin-pm/scripts/pm/help.js +92 -0
- package/packages/plugin-pm/scripts/pm/help.sh +90 -0
- package/packages/plugin-pm/scripts/pm/in-progress.js +178 -0
- package/packages/plugin-pm/scripts/pm/in-progress.sh +93 -0
- package/packages/plugin-pm/scripts/pm/init.js +321 -0
- package/packages/plugin-pm/scripts/pm/init.sh +178 -0
- package/packages/plugin-pm/scripts/pm/issue-close.js +232 -0
- package/packages/plugin-pm/scripts/pm/issue-edit.js +310 -0
- package/packages/plugin-pm/scripts/pm/issue-show.js +272 -0
- package/packages/plugin-pm/scripts/pm/issue-start.js +181 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/format-comment.sh +468 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/gather-updates.sh +460 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/post-comment.sh +330 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/preflight-validation.sh +348 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/update-frontmatter.sh +387 -0
- package/packages/plugin-pm/scripts/pm/lib/README.md +85 -0
- package/packages/plugin-pm/scripts/pm/lib/epic-discovery.js +119 -0
- package/packages/plugin-pm/scripts/pm/lib/logger.js +78 -0
- package/packages/plugin-pm/scripts/pm/next.js +189 -0
- package/packages/plugin-pm/scripts/pm/next.sh +72 -0
- package/packages/plugin-pm/scripts/pm/optimize.js +407 -0
- package/packages/plugin-pm/scripts/pm/pr-create.js +337 -0
- package/packages/plugin-pm/scripts/pm/pr-list.js +257 -0
- package/packages/plugin-pm/scripts/pm/prd-list.js +242 -0
- package/packages/plugin-pm/scripts/pm/prd-list.sh +103 -0
- package/packages/plugin-pm/scripts/pm/prd-new.js +684 -0
- package/packages/plugin-pm/scripts/pm/prd-parse.js +547 -0
- package/packages/plugin-pm/scripts/pm/prd-status.js +152 -0
- package/packages/plugin-pm/scripts/pm/prd-status.sh +63 -0
- package/packages/plugin-pm/scripts/pm/release.js +460 -0
- package/packages/plugin-pm/scripts/pm/search.js +192 -0
- package/packages/plugin-pm/scripts/pm/search.sh +89 -0
- package/packages/plugin-pm/scripts/pm/standup.js +362 -0
- package/packages/plugin-pm/scripts/pm/standup.sh +95 -0
- package/packages/plugin-pm/scripts/pm/status.js +148 -0
- package/packages/plugin-pm/scripts/pm/status.sh +59 -0
- package/packages/plugin-pm/scripts/pm/sync-batch.js +337 -0
- package/packages/plugin-pm/scripts/pm/sync.js +343 -0
- package/packages/plugin-pm/scripts/pm/template-list.js +141 -0
- package/packages/plugin-pm/scripts/pm/template-new.js +366 -0
- package/packages/plugin-pm/scripts/pm/validate.js +274 -0
- package/packages/plugin-pm/scripts/pm/validate.sh +106 -0
- package/packages/plugin-pm/scripts/pm/what-next.js +660 -0
- package/packages/plugin-testing/README.md +401 -0
- package/packages/plugin-testing/agents/frontend-testing-engineer.md +768 -0
- package/packages/plugin-testing/commands/jest-optimize.md +800 -0
- package/packages/plugin-testing/commands/playwright-optimize.md +887 -0
- package/packages/plugin-testing/commands/test-coverage.md +512 -0
- package/packages/plugin-testing/commands/test-performance.md +1041 -0
- package/packages/plugin-testing/commands/test-setup.md +414 -0
- package/packages/plugin-testing/package.json +40 -0
- package/packages/plugin-testing/plugin.json +197 -0
- package/packages/plugin-testing/rules/test-coverage-requirements.md +581 -0
- package/packages/plugin-testing/rules/testing-standards.md +529 -0
- package/packages/plugin-testing/scripts/examples/react-testing-example.test.jsx +460 -0
- package/packages/plugin-testing/scripts/examples/vitest-config-example.js +352 -0
- package/packages/plugin-testing/scripts/examples/vue-testing-example.test.js +586 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Update Frontmatter Script for Issue Sync
|
|
3
|
+
# Updates progress.md frontmatter after successful sync
|
|
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/frontmatter-utils.sh"
|
|
11
|
+
source "${SCRIPT_DIR}/../../lib/datetime-utils.sh"
|
|
12
|
+
source "${SCRIPT_DIR}/../../lib/validation-utils.sh"
|
|
13
|
+
|
|
14
|
+
# Script configuration
|
|
15
|
+
readonly ISSUE_NUMBER="${1:-}"
|
|
16
|
+
readonly PROGRESS_FILE="${2:-}"
|
|
17
|
+
readonly COMMENT_URL="${3:-}"
|
|
18
|
+
readonly IS_COMPLETION="${4:-false}"
|
|
19
|
+
|
|
20
|
+
# Global variables
|
|
21
|
+
declare -g backup_file=""
|
|
22
|
+
declare -g updated_fields=0
|
|
23
|
+
|
|
24
|
+
# Main function
|
|
25
|
+
main() {
|
|
26
|
+
print_banner "Frontmatter Updater" "1.0.0"
|
|
27
|
+
|
|
28
|
+
# Validate inputs
|
|
29
|
+
log_info "Updating frontmatter for issue #$ISSUE_NUMBER"
|
|
30
|
+
validate_inputs || exit 1
|
|
31
|
+
|
|
32
|
+
# Create backup
|
|
33
|
+
with_error_handling "Create backup" \
|
|
34
|
+
create_backup
|
|
35
|
+
|
|
36
|
+
# Update sync timestamp
|
|
37
|
+
with_error_handling "Update sync timestamp" \
|
|
38
|
+
update_sync_timestamp
|
|
39
|
+
|
|
40
|
+
# Update comment URL
|
|
41
|
+
with_error_handling "Update comment URL" \
|
|
42
|
+
update_comment_url
|
|
43
|
+
|
|
44
|
+
# Update completion status if needed
|
|
45
|
+
if [[ "$IS_COMPLETION" == "true" ]]; then
|
|
46
|
+
with_error_handling "Update completion status" \
|
|
47
|
+
update_completion_status
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# Update issue state if changed
|
|
51
|
+
with_error_handling "Update issue state" \
|
|
52
|
+
update_issue_state
|
|
53
|
+
|
|
54
|
+
# Verify updates
|
|
55
|
+
with_error_handling "Verify frontmatter updates" \
|
|
56
|
+
verify_updates
|
|
57
|
+
|
|
58
|
+
# Display results
|
|
59
|
+
display_results
|
|
60
|
+
|
|
61
|
+
log_success "Frontmatter updated successfully"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Validate script inputs
|
|
65
|
+
validate_inputs() {
|
|
66
|
+
log_function_entry "validate_inputs"
|
|
67
|
+
|
|
68
|
+
if [[ -z "$ISSUE_NUMBER" ]]; then
|
|
69
|
+
log_error "Issue number is required"
|
|
70
|
+
return 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
if [[ ! -f "$PROGRESS_FILE" ]]; then
|
|
74
|
+
log_error "Progress file not found: $PROGRESS_FILE"
|
|
75
|
+
return 1
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Validate progress file has frontmatter
|
|
79
|
+
if ! has_frontmatter "$PROGRESS_FILE"; then
|
|
80
|
+
log_error "Progress file does not have valid frontmatter"
|
|
81
|
+
return 1
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
log_function_exit "validate_inputs"
|
|
85
|
+
return 0
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Create backup of progress file
|
|
89
|
+
create_backup() {
|
|
90
|
+
log_function_entry "create_backup"
|
|
91
|
+
|
|
92
|
+
backup_file="${PROGRESS_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
|
|
93
|
+
|
|
94
|
+
log_info "Creating backup: $backup_file"
|
|
95
|
+
cp "$PROGRESS_FILE" "$backup_file"
|
|
96
|
+
|
|
97
|
+
if [[ ! -f "$backup_file" ]]; then
|
|
98
|
+
log_error "Failed to create backup"
|
|
99
|
+
return 1
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
log_success "Backup created"
|
|
103
|
+
log_function_exit "create_backup"
|
|
104
|
+
return 0
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# Update last sync timestamp
|
|
108
|
+
update_sync_timestamp() {
|
|
109
|
+
log_function_entry "update_sync_timestamp"
|
|
110
|
+
|
|
111
|
+
local current_time
|
|
112
|
+
current_time=$(get_current_datetime)
|
|
113
|
+
|
|
114
|
+
log_info "Updating last_sync to: $current_time"
|
|
115
|
+
|
|
116
|
+
if update_frontmatter_field "$PROGRESS_FILE" "last_sync" "$current_time"; then
|
|
117
|
+
((updated_fields++))
|
|
118
|
+
log_success "Sync timestamp updated"
|
|
119
|
+
else
|
|
120
|
+
log_warning "Failed to update sync timestamp"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
log_function_exit "update_sync_timestamp"
|
|
124
|
+
return 0
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# Update last comment URL
|
|
128
|
+
update_comment_url() {
|
|
129
|
+
log_function_entry "update_comment_url"
|
|
130
|
+
|
|
131
|
+
if [[ -z "$COMMENT_URL" ]] || [[ "$COMMENT_URL" == "null" ]]; then
|
|
132
|
+
log_debug "No comment URL to update"
|
|
133
|
+
log_function_exit "update_comment_url"
|
|
134
|
+
return 0
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
log_info "Updating last_comment_url to: $COMMENT_URL"
|
|
138
|
+
|
|
139
|
+
if update_frontmatter_field "$PROGRESS_FILE" "last_comment_url" "$COMMENT_URL"; then
|
|
140
|
+
((updated_fields++))
|
|
141
|
+
log_success "Comment URL updated"
|
|
142
|
+
else
|
|
143
|
+
log_warning "Failed to update comment URL"
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
log_function_exit "update_comment_url"
|
|
147
|
+
return 0
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# Update completion status
|
|
151
|
+
update_completion_status() {
|
|
152
|
+
log_function_entry "update_completion_status"
|
|
153
|
+
|
|
154
|
+
log_info "Updating completion status to 100%"
|
|
155
|
+
|
|
156
|
+
# Update completion percentage
|
|
157
|
+
if update_frontmatter_field "$PROGRESS_FILE" "completion" "100"; then
|
|
158
|
+
((updated_fields++))
|
|
159
|
+
log_success "Completion percentage updated"
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
# Update status field
|
|
163
|
+
if update_frontmatter_field "$PROGRESS_FILE" "status" "completed"; then
|
|
164
|
+
((updated_fields++))
|
|
165
|
+
log_success "Status updated to completed"
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# Add completion timestamp
|
|
169
|
+
local completion_time
|
|
170
|
+
completion_time=$(get_current_datetime)
|
|
171
|
+
|
|
172
|
+
if update_frontmatter_field "$PROGRESS_FILE" "completed_at" "$completion_time"; then
|
|
173
|
+
((updated_fields++))
|
|
174
|
+
log_success "Completion timestamp added"
|
|
175
|
+
fi
|
|
176
|
+
|
|
177
|
+
log_function_exit "update_completion_status"
|
|
178
|
+
return 0
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# Update issue state from GitHub
|
|
182
|
+
update_issue_state() {
|
|
183
|
+
log_function_entry "update_issue_state"
|
|
184
|
+
|
|
185
|
+
# Check if GitHub CLI is available
|
|
186
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
187
|
+
log_debug "GitHub CLI not available, skipping state update"
|
|
188
|
+
log_function_exit "update_issue_state"
|
|
189
|
+
return 0
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
log_info "Checking current issue state"
|
|
193
|
+
|
|
194
|
+
# Get current issue state from GitHub
|
|
195
|
+
local issue_state
|
|
196
|
+
issue_state=$(gh issue view "$ISSUE_NUMBER" \
|
|
197
|
+
--json state -q .state 2>/dev/null || echo "")
|
|
198
|
+
|
|
199
|
+
if [[ -z "$issue_state" ]]; then
|
|
200
|
+
log_warning "Could not retrieve issue state"
|
|
201
|
+
log_function_exit "update_issue_state"
|
|
202
|
+
return 0
|
|
203
|
+
fi
|
|
204
|
+
|
|
205
|
+
# Get current state from frontmatter
|
|
206
|
+
local current_state
|
|
207
|
+
current_state=$(get_frontmatter_field "$PROGRESS_FILE" "issue_state" 2>/dev/null || echo "")
|
|
208
|
+
|
|
209
|
+
if [[ "$issue_state" != "$current_state" ]]; then
|
|
210
|
+
log_info "Updating issue_state from '$current_state' to '$issue_state'"
|
|
211
|
+
|
|
212
|
+
if update_frontmatter_field "$PROGRESS_FILE" "issue_state" "$issue_state"; then
|
|
213
|
+
((updated_fields++))
|
|
214
|
+
log_success "Issue state updated"
|
|
215
|
+
fi
|
|
216
|
+
else
|
|
217
|
+
log_debug "Issue state unchanged: $issue_state"
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
log_function_exit "update_issue_state"
|
|
221
|
+
return 0
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
# Verify frontmatter updates
|
|
225
|
+
verify_updates() {
|
|
226
|
+
log_function_entry "verify_updates"
|
|
227
|
+
|
|
228
|
+
log_info "Verifying frontmatter updates"
|
|
229
|
+
|
|
230
|
+
# Check that last_sync was updated
|
|
231
|
+
local last_sync
|
|
232
|
+
last_sync=$(get_frontmatter_field "$PROGRESS_FILE" "last_sync" 2>/dev/null || echo "")
|
|
233
|
+
|
|
234
|
+
if [[ -z "$last_sync" ]]; then
|
|
235
|
+
log_warning "last_sync field not found after update"
|
|
236
|
+
else
|
|
237
|
+
log_success "last_sync verified: $last_sync"
|
|
238
|
+
fi
|
|
239
|
+
|
|
240
|
+
# Check completion if it was a completion sync
|
|
241
|
+
if [[ "$IS_COMPLETION" == "true" ]]; then
|
|
242
|
+
local completion
|
|
243
|
+
completion=$(get_frontmatter_field "$PROGRESS_FILE" "completion" 2>/dev/null || echo "0")
|
|
244
|
+
|
|
245
|
+
if [[ "$completion" == "100" ]]; then
|
|
246
|
+
log_success "Completion verified: 100%"
|
|
247
|
+
else
|
|
248
|
+
log_warning "Completion not set to 100%: $completion"
|
|
249
|
+
fi
|
|
250
|
+
fi
|
|
251
|
+
|
|
252
|
+
# Verify file integrity
|
|
253
|
+
if ! has_frontmatter "$PROGRESS_FILE"; then
|
|
254
|
+
log_error "Frontmatter corrupted after update"
|
|
255
|
+
|
|
256
|
+
# Restore from backup
|
|
257
|
+
log_warning "Restoring from backup"
|
|
258
|
+
cp "$backup_file" "$PROGRESS_FILE"
|
|
259
|
+
return 1
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
log_success "All updates verified"
|
|
263
|
+
log_function_exit "verify_updates"
|
|
264
|
+
return 0
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
# Display update results
|
|
268
|
+
display_results() {
|
|
269
|
+
print_section "✅ Frontmatter Update Results"
|
|
270
|
+
|
|
271
|
+
echo "Issue: #$ISSUE_NUMBER"
|
|
272
|
+
echo "Progress File: $PROGRESS_FILE"
|
|
273
|
+
echo "Fields Updated: $updated_fields"
|
|
274
|
+
|
|
275
|
+
echo ""
|
|
276
|
+
echo "Updated Fields:"
|
|
277
|
+
|
|
278
|
+
# Show current values of key fields
|
|
279
|
+
local last_sync
|
|
280
|
+
last_sync=$(get_frontmatter_field "$PROGRESS_FILE" "last_sync" 2>/dev/null || echo "Not set")
|
|
281
|
+
echo " - last_sync: $last_sync"
|
|
282
|
+
|
|
283
|
+
if [[ -n "$COMMENT_URL" ]] && [[ "$COMMENT_URL" != "null" ]]; then
|
|
284
|
+
echo " - last_comment_url: $COMMENT_URL"
|
|
285
|
+
fi
|
|
286
|
+
|
|
287
|
+
if [[ "$IS_COMPLETION" == "true" ]]; then
|
|
288
|
+
local completion
|
|
289
|
+
completion=$(get_frontmatter_field "$PROGRESS_FILE" "completion" 2>/dev/null || echo "Unknown")
|
|
290
|
+
echo " - completion: ${completion}%"
|
|
291
|
+
|
|
292
|
+
local status
|
|
293
|
+
status=$(get_frontmatter_field "$PROGRESS_FILE" "status" 2>/dev/null || echo "Unknown")
|
|
294
|
+
echo " - status: $status"
|
|
295
|
+
fi
|
|
296
|
+
|
|
297
|
+
local issue_state
|
|
298
|
+
issue_state=$(get_frontmatter_field "$PROGRESS_FILE" "issue_state" 2>/dev/null || echo "Unknown")
|
|
299
|
+
echo " - issue_state: $issue_state"
|
|
300
|
+
|
|
301
|
+
echo ""
|
|
302
|
+
echo "✅ Frontmatter updated successfully"
|
|
303
|
+
|
|
304
|
+
if [[ -n "$backup_file" ]]; then
|
|
305
|
+
echo "📄 Backup saved: $backup_file"
|
|
306
|
+
fi
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
# Cleanup function
|
|
310
|
+
cleanup() {
|
|
311
|
+
# Remove old backup files (keep last 5)
|
|
312
|
+
if [[ -n "$PROGRESS_FILE" ]]; then
|
|
313
|
+
local backup_dir
|
|
314
|
+
backup_dir=$(dirname "$PROGRESS_FILE")
|
|
315
|
+
|
|
316
|
+
log_debug "Cleaning old backups in: $backup_dir"
|
|
317
|
+
|
|
318
|
+
# Find and remove old backups, keeping the 5 most recent
|
|
319
|
+
find "$backup_dir" -name "$(basename "$PROGRESS_FILE").backup.*" -type f 2>/dev/null | \
|
|
320
|
+
sort -r | \
|
|
321
|
+
tail -n +6 | \
|
|
322
|
+
while read -r old_backup; do
|
|
323
|
+
log_debug "Removing old backup: $old_backup"
|
|
324
|
+
rm -f "$old_backup"
|
|
325
|
+
done
|
|
326
|
+
fi
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# Error handling
|
|
330
|
+
handle_error() {
|
|
331
|
+
local exit_code=$?
|
|
332
|
+
log_error "Frontmatter update failed with exit code: $exit_code"
|
|
333
|
+
log_error "Failed to update frontmatter for issue: #$ISSUE_NUMBER"
|
|
334
|
+
|
|
335
|
+
# Restore from backup if available
|
|
336
|
+
if [[ -n "$backup_file" ]] && [[ -f "$backup_file" ]]; then
|
|
337
|
+
echo "⚠️ Restoring from backup: $backup_file"
|
|
338
|
+
cp "$backup_file" "$PROGRESS_FILE"
|
|
339
|
+
echo "✅ Backup restored"
|
|
340
|
+
fi
|
|
341
|
+
|
|
342
|
+
exit "$exit_code"
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
# Set up error handling and cleanup
|
|
346
|
+
trap handle_error ERR
|
|
347
|
+
trap cleanup EXIT
|
|
348
|
+
|
|
349
|
+
# Validate arguments
|
|
350
|
+
if [[ $# -lt 2 ]]; then
|
|
351
|
+
echo "Usage: $0 <issue_number> <progress_file> [comment_url] [is_completion]"
|
|
352
|
+
echo ""
|
|
353
|
+
echo "Updates progress.md frontmatter after successful issue sync."
|
|
354
|
+
echo ""
|
|
355
|
+
echo "Arguments:"
|
|
356
|
+
echo " issue_number GitHub issue number"
|
|
357
|
+
echo " progress_file Path to progress.md file"
|
|
358
|
+
echo " comment_url Optional: URL of posted comment"
|
|
359
|
+
echo " is_completion Optional: 'true' if task is complete (default: false)"
|
|
360
|
+
echo ""
|
|
361
|
+
echo "Updates the following frontmatter fields:"
|
|
362
|
+
echo " - last_sync: Current timestamp"
|
|
363
|
+
echo " - last_comment_url: URL of the posted comment"
|
|
364
|
+
echo " - issue_state: Current state from GitHub (open/closed)"
|
|
365
|
+
echo " - completion: Set to 100 if is_completion=true"
|
|
366
|
+
echo " - status: Set to 'completed' if is_completion=true"
|
|
367
|
+
echo " - completed_at: Timestamp if is_completion=true"
|
|
368
|
+
echo ""
|
|
369
|
+
echo "Environment Variables:"
|
|
370
|
+
echo " AUTOPM_LOG_LEVEL=0 Enable debug logging"
|
|
371
|
+
echo ""
|
|
372
|
+
echo "Features:"
|
|
373
|
+
echo " - Automatic backup before modification"
|
|
374
|
+
echo " - Verification of updates"
|
|
375
|
+
echo " - Rollback on failure"
|
|
376
|
+
echo " - Old backup cleanup (keeps last 5)"
|
|
377
|
+
echo ""
|
|
378
|
+
echo "Examples:"
|
|
379
|
+
echo " $0 123 .claude/epics/auth/updates/123/progress.md"
|
|
380
|
+
echo " $0 456 ./progress.md https://github.com/owner/repo/issues/456#issuecomment-123"
|
|
381
|
+
echo " $0 789 ./progress.md \"\" true"
|
|
382
|
+
echo ""
|
|
383
|
+
exit 1
|
|
384
|
+
fi
|
|
385
|
+
|
|
386
|
+
# Run main function
|
|
387
|
+
main "$@"
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# PM Scripts Library
|
|
2
|
+
|
|
3
|
+
This directory contains shared utilities for PM command scripts.
|
|
4
|
+
|
|
5
|
+
## Logger
|
|
6
|
+
|
|
7
|
+
The `logger.js` module provides consistent, colored logging across all PM commands.
|
|
8
|
+
|
|
9
|
+
### Usage
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
const { logInfo, logSuccess, logWarning, logError, logDebug } = require('./lib/logger');
|
|
13
|
+
|
|
14
|
+
// Info message (blue ℹ icon)
|
|
15
|
+
logInfo('Processing task...');
|
|
16
|
+
|
|
17
|
+
// Success message (green ✓ icon)
|
|
18
|
+
logSuccess('Task completed successfully');
|
|
19
|
+
|
|
20
|
+
// Warning message (yellow ⚠ icon)
|
|
21
|
+
logWarning('Task may require attention');
|
|
22
|
+
|
|
23
|
+
// Error message (red ❌ icon)
|
|
24
|
+
logError('Failed to process task', error);
|
|
25
|
+
// The error parameter is optional and will display error.message and stack (if DEBUG=1)
|
|
26
|
+
|
|
27
|
+
// Debug message (only shown if DEBUG=1)
|
|
28
|
+
logDebug('Detailed debug information');
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Environment Variables
|
|
32
|
+
|
|
33
|
+
- `DEBUG=1` - Enable debug logging and full error stack traces
|
|
34
|
+
|
|
35
|
+
### Color Constants
|
|
36
|
+
|
|
37
|
+
If you need custom formatting, you can import the colors:
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
const { colors } = require('./lib/logger');
|
|
41
|
+
|
|
42
|
+
console.log(`${colors.blue}Custom message${colors.reset}`);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Available colors:
|
|
46
|
+
- `colors.red`
|
|
47
|
+
- `colors.green`
|
|
48
|
+
- `colors.yellow`
|
|
49
|
+
- `colors.blue`
|
|
50
|
+
- `colors.cyan`
|
|
51
|
+
- `colors.gray`
|
|
52
|
+
- `colors.reset`
|
|
53
|
+
|
|
54
|
+
## Migration Guide
|
|
55
|
+
|
|
56
|
+
To migrate existing PM scripts to use the logger:
|
|
57
|
+
|
|
58
|
+
1. Import the logger at the top of your file:
|
|
59
|
+
```javascript
|
|
60
|
+
const { logError, logWarning, logInfo, logSuccess } = require('./lib/logger');
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
2. Replace `console.error()` calls:
|
|
64
|
+
```javascript
|
|
65
|
+
// Before
|
|
66
|
+
console.error('Error:', err.message);
|
|
67
|
+
|
|
68
|
+
// After
|
|
69
|
+
logError('Error description', err);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
3. Add error handling to promise chains:
|
|
73
|
+
```javascript
|
|
74
|
+
// Before
|
|
75
|
+
const results = await Promise.all(promises);
|
|
76
|
+
|
|
77
|
+
// After
|
|
78
|
+
const promises = items.map(item =>
|
|
79
|
+
processItem(item).catch(err => {
|
|
80
|
+
logWarning(`Failed to process ${item.name}`, err);
|
|
81
|
+
return defaultValue;
|
|
82
|
+
})
|
|
83
|
+
);
|
|
84
|
+
const results = await Promise.all(promises);
|
|
85
|
+
```
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Epic Discovery Utilities
|
|
6
|
+
* Shared utilities for discovering epic directories in both flat and nested structures
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Helper function to check if directory contains epic.md
|
|
11
|
+
* @param {string} dirPath - Path to check
|
|
12
|
+
* @returns {boolean} - True if directory contains epic.md
|
|
13
|
+
*/
|
|
14
|
+
function isEpicDir(dirPath) {
|
|
15
|
+
return fs.existsSync(path.join(dirPath, 'epic.md'));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Recursive function to find all epic directories
|
|
20
|
+
* Supports both flat and nested multi-epic structures
|
|
21
|
+
* @param {string} basePath - Base path to search from
|
|
22
|
+
* @param {number} depth - Current recursion depth (max 3 levels)
|
|
23
|
+
* @returns {Array<{name: string, path: string}>} - Array of epic directories
|
|
24
|
+
*/
|
|
25
|
+
function findEpicDirs(basePath, depth = 0) {
|
|
26
|
+
if (depth >= 3) {
|
|
27
|
+
if (process.env.DEBUG) {
|
|
28
|
+
console.error(`Maximum recursion depth reached at ${basePath}`);
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const epicDirs = [];
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const entries = fs.readdirSync(basePath, { withFileTypes: true });
|
|
37
|
+
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
if (!entry.isDirectory()) continue;
|
|
40
|
+
|
|
41
|
+
const fullPath = path.join(basePath, entry.name);
|
|
42
|
+
|
|
43
|
+
if (isEpicDir(fullPath)) {
|
|
44
|
+
// This is an epic directory
|
|
45
|
+
const relativePath = path.relative('.claude/epics', fullPath);
|
|
46
|
+
epicDirs.push({ name: relativePath, path: fullPath });
|
|
47
|
+
} else {
|
|
48
|
+
// Check subdirectories (multi-epic structure)
|
|
49
|
+
epicDirs.push(...findEpicDirs(fullPath, depth + 1));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} catch (err) {
|
|
53
|
+
// Log but don't fail
|
|
54
|
+
if (process.env.DEBUG) {
|
|
55
|
+
console.error(`Error reading directory ${basePath}:`, err.message);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return epicDirs;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Find all epic directories supporting both flat and nested structures
|
|
64
|
+
* @returns {Array<{name: string, path: string}>} - Array of epic directories
|
|
65
|
+
*/
|
|
66
|
+
function findAllEpicDirs() {
|
|
67
|
+
const epicsPath = '.claude/epics';
|
|
68
|
+
|
|
69
|
+
if (!fs.existsSync(epicsPath)) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const epicDirs = [];
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
// First check if top-level directories are epic dirs (flat structure)
|
|
77
|
+
// or if we need to search recursively (nested structure)
|
|
78
|
+
const topLevelEntries = fs.readdirSync(epicsPath, { withFileTypes: true })
|
|
79
|
+
.filter(dirent => dirent.isDirectory());
|
|
80
|
+
|
|
81
|
+
for (const entry of topLevelEntries) {
|
|
82
|
+
const fullPath = path.join(epicsPath, entry.name);
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// Check if this directory has task files (flat epic) or subdirectories (nested structure)
|
|
86
|
+
const hasTaskFiles = fs.readdirSync(fullPath)
|
|
87
|
+
.some(file => /^\d+.*\.md$/.test(file));
|
|
88
|
+
|
|
89
|
+
const hasEpicMd = isEpicDir(fullPath);
|
|
90
|
+
|
|
91
|
+
if (hasTaskFiles || hasEpicMd) {
|
|
92
|
+
// This is a flat epic directory (backward compatible with epics without epic.md)
|
|
93
|
+
epicDirs.push({ name: entry.name, path: fullPath });
|
|
94
|
+
} else {
|
|
95
|
+
// This might be a parent directory for nested epics
|
|
96
|
+
epicDirs.push(...findEpicDirs(fullPath, 0));
|
|
97
|
+
}
|
|
98
|
+
} catch (err) {
|
|
99
|
+
// Log but don't fail for unreadable directories
|
|
100
|
+
if (process.env.DEBUG) {
|
|
101
|
+
console.error(`Error checking directory ${fullPath}:`, err.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
// Log top-level errors in DEBUG mode
|
|
107
|
+
if (process.env.DEBUG) {
|
|
108
|
+
console.error(`Error in findAllEpicDirs:`, err.message);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return epicDirs;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = {
|
|
116
|
+
isEpicDir,
|
|
117
|
+
findEpicDirs,
|
|
118
|
+
findAllEpicDirs
|
|
119
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility for PM scripts
|
|
3
|
+
* Provides consistent colored output across all PM commands
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// ANSI color codes
|
|
7
|
+
const colors = {
|
|
8
|
+
reset: '\x1b[0m',
|
|
9
|
+
red: '\x1b[31m',
|
|
10
|
+
green: '\x1b[32m',
|
|
11
|
+
yellow: '\x1b[33m',
|
|
12
|
+
blue: '\x1b[34m',
|
|
13
|
+
gray: '\x1b[90m',
|
|
14
|
+
cyan: '\x1b[36m'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Log an info message
|
|
19
|
+
* @param {string} message - The message to log
|
|
20
|
+
*/
|
|
21
|
+
function logInfo(message) {
|
|
22
|
+
console.log(`${colors.blue}ℹ${colors.reset} ${message}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Log a success message
|
|
27
|
+
* @param {string} message - The message to log
|
|
28
|
+
*/
|
|
29
|
+
function logSuccess(message) {
|
|
30
|
+
console.log(`${colors.green}✓${colors.reset} ${message}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Log a warning message
|
|
35
|
+
* @param {string} message - The message to log
|
|
36
|
+
*/
|
|
37
|
+
function logWarning(message) {
|
|
38
|
+
console.warn(`${colors.yellow}⚠${colors.reset} ${message}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Log an error message
|
|
43
|
+
* @param {string} message - The message to log
|
|
44
|
+
* @param {Error} [error] - Optional error object for details
|
|
45
|
+
*/
|
|
46
|
+
function logError(message, error) {
|
|
47
|
+
console.error(`${colors.red}❌${colors.reset} ${message}`);
|
|
48
|
+
if (error && error.message) {
|
|
49
|
+
console.error(`${colors.gray} ${error.message}${colors.reset}`);
|
|
50
|
+
}
|
|
51
|
+
if (error && error.stack && process.env.DEBUG) {
|
|
52
|
+
console.error(`${colors.gray}${error.stack}${colors.reset}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Log a debug message (only shown if DEBUG env var is set)
|
|
58
|
+
* @param {string} message - The message to log
|
|
59
|
+
*/
|
|
60
|
+
function logDebug(message) {
|
|
61
|
+
if (process.env.DEBUG) {
|
|
62
|
+
console.log(`${colors.gray}[DEBUG]${colors.reset} ${message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Export colors for custom formatting
|
|
68
|
+
*/
|
|
69
|
+
const logColors = colors;
|
|
70
|
+
|
|
71
|
+
module.exports = {
|
|
72
|
+
logInfo,
|
|
73
|
+
logSuccess,
|
|
74
|
+
logWarning,
|
|
75
|
+
logError,
|
|
76
|
+
logDebug,
|
|
77
|
+
colors: logColors
|
|
78
|
+
};
|