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,94 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Epic Start - Launch parallel agent execution for an epic
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
# Get the directory where this script is located
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
SCRIPTS_DIR="$(dirname "$SCRIPT_DIR")"
|
|
9
|
+
BASE_DIR="$(dirname "$(dirname "$SCRIPTS_DIR")")"
|
|
10
|
+
|
|
11
|
+
# Source common functions
|
|
12
|
+
source "$SCRIPTS_DIR/lib/common-functions.sh" 2>/dev/null || true
|
|
13
|
+
|
|
14
|
+
# Epic name from argument
|
|
15
|
+
EPIC_NAME="${1:-}"
|
|
16
|
+
|
|
17
|
+
if [ -z "$EPIC_NAME" ]; then
|
|
18
|
+
echo "❌ Error: Epic name required"
|
|
19
|
+
echo "Usage: /pm:epic-start <epic-name>"
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# Find epic file
|
|
24
|
+
EPIC_FILE=".claude/epics/${EPIC_NAME}.md"
|
|
25
|
+
if [ ! -f "$EPIC_FILE" ]; then
|
|
26
|
+
EPIC_FILE=".claude/prds/${EPIC_NAME}.md"
|
|
27
|
+
if [ ! -f "$EPIC_FILE" ]; then
|
|
28
|
+
echo "❌ Error: Epic not found: ${EPIC_NAME}"
|
|
29
|
+
echo "Available epics:"
|
|
30
|
+
ls .claude/epics/*.md .claude/prds/*.md 2>/dev/null | xargs -n1 basename | sed 's/\.md$//' | sed 's/^/ - /'
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
echo "🚀 Starting parallel execution for epic: ${EPIC_NAME}"
|
|
36
|
+
echo "📄 Epic file: ${EPIC_FILE}"
|
|
37
|
+
echo ""
|
|
38
|
+
|
|
39
|
+
# Extract tasks from epic file
|
|
40
|
+
echo "📋 Extracting tasks from epic..."
|
|
41
|
+
TASKS=$(grep -E "^- \[ \]|^- \[x\]" "$EPIC_FILE" 2>/dev/null || true)
|
|
42
|
+
|
|
43
|
+
if [ -z "$TASKS" ]; then
|
|
44
|
+
echo "⚠️ No tasks found in epic file"
|
|
45
|
+
echo "Tip: Add tasks in format: - [ ] Task description"
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Count tasks
|
|
50
|
+
TOTAL_TASKS=$(echo "$TASKS" | wc -l | tr -d ' ')
|
|
51
|
+
INCOMPLETE_TASKS=$(echo "$TASKS" | grep "^- \[ \]" | wc -l | tr -d ' ')
|
|
52
|
+
COMPLETE_TASKS=$(echo "$TASKS" | grep "^- \[x\]" | wc -l | tr -d ' ')
|
|
53
|
+
|
|
54
|
+
echo "📊 Task Status:"
|
|
55
|
+
echo " • Total: $TOTAL_TASKS"
|
|
56
|
+
echo " • Complete: $COMPLETE_TASKS"
|
|
57
|
+
echo " • Remaining: $INCOMPLETE_TASKS"
|
|
58
|
+
echo ""
|
|
59
|
+
|
|
60
|
+
if [ "$INCOMPLETE_TASKS" -eq 0 ]; then
|
|
61
|
+
echo "✅ All tasks are already complete!"
|
|
62
|
+
exit 0
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Start parallel execution
|
|
66
|
+
echo "🔄 Starting parallel execution for $INCOMPLETE_TASKS tasks..."
|
|
67
|
+
echo ""
|
|
68
|
+
|
|
69
|
+
# Check if parallel streams script exists
|
|
70
|
+
PARALLEL_SCRIPT="$SCRIPTS_DIR/start-parallel-streams.js"
|
|
71
|
+
if [ -f "$PARALLEL_SCRIPT" ]; then
|
|
72
|
+
echo "Using Node.js parallel executor..."
|
|
73
|
+
node "$PARALLEL_SCRIPT" --epic "$EPIC_NAME"
|
|
74
|
+
else
|
|
75
|
+
# Fallback to basic parallel execution
|
|
76
|
+
echo "Starting tasks in parallel..."
|
|
77
|
+
|
|
78
|
+
# Process each incomplete task
|
|
79
|
+
echo "$TASKS" | grep "^- \[ \]" | while IFS= read -r task; do
|
|
80
|
+
# Extract task description
|
|
81
|
+
TASK_DESC=$(echo "$task" | sed 's/^- \[ \] //')
|
|
82
|
+
echo " ▶ Starting: $TASK_DESC"
|
|
83
|
+
|
|
84
|
+
# You can add actual task execution logic here
|
|
85
|
+
# For example, launching agents or running specific scripts
|
|
86
|
+
done
|
|
87
|
+
|
|
88
|
+
echo ""
|
|
89
|
+
echo "✅ Parallel execution initiated"
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
echo ""
|
|
93
|
+
echo "💡 Monitor progress with: /pm:epic-status $EPIC_NAME"
|
|
94
|
+
echo "📝 View details with: /pm:epic-show $EPIC_NAME"
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PM Epic Status Script - Node.js Implementation
|
|
5
|
+
*
|
|
6
|
+
* Migrated from epic-status.sh to provide epic status with progress visualization
|
|
7
|
+
* Maintains full compatibility with the original bash implementation
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Shows epic status with progress bar visualization
|
|
11
|
+
* - Calculates task breakdown (total, open, closed, blocked)
|
|
12
|
+
* - Identifies blocked tasks based on dependencies
|
|
13
|
+
* - Provides visual progress indication
|
|
14
|
+
* - Handles various dependency formats
|
|
15
|
+
* - Includes GitHub link if available
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
|
|
21
|
+
function parseMetadata(content) {
|
|
22
|
+
const metadata = {
|
|
23
|
+
name: '',
|
|
24
|
+
status: '',
|
|
25
|
+
progress: '',
|
|
26
|
+
github: '',
|
|
27
|
+
created: '',
|
|
28
|
+
parallel: '',
|
|
29
|
+
depends_on: ''
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Handle YAML frontmatter (between --- lines)
|
|
33
|
+
const yamlMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
34
|
+
if (yamlMatch) {
|
|
35
|
+
const yamlContent = yamlMatch[1];
|
|
36
|
+
const lines = yamlContent.split('\n');
|
|
37
|
+
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
const trimmedLine = line.trim();
|
|
40
|
+
if (trimmedLine.includes(':')) {
|
|
41
|
+
const [key, ...valueParts] = trimmedLine.split(':');
|
|
42
|
+
const value = valueParts.join(':').trim();
|
|
43
|
+
const cleanKey = key.trim().toLowerCase();
|
|
44
|
+
|
|
45
|
+
if (Object.prototype.hasOwnProperty.call(metadata, cleanKey)) {
|
|
46
|
+
metadata[cleanKey] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} else {
|
|
51
|
+
// Handle simple key-value format (key: value lines at start of file)
|
|
52
|
+
const lines = content.split('\n');
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
const trimmedLine = line.trim();
|
|
55
|
+
if (trimmedLine.includes(':') && !trimmedLine.startsWith('#')) {
|
|
56
|
+
const [key, ...valueParts] = trimmedLine.split(':');
|
|
57
|
+
const value = valueParts.join(':').trim();
|
|
58
|
+
const cleanKey = key.trim().toLowerCase();
|
|
59
|
+
|
|
60
|
+
if (Object.prototype.hasOwnProperty.call(metadata, cleanKey)) {
|
|
61
|
+
metadata[cleanKey] = value;
|
|
62
|
+
}
|
|
63
|
+
} else if (trimmedLine.startsWith('#') || trimmedLine === '') {
|
|
64
|
+
// Stop parsing when we hit content
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return metadata;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function getAvailableEpics() {
|
|
74
|
+
if (!fs.existsSync('.claude/epics')) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
return fs.readdirSync('.claude/epics', { withFileTypes: true })
|
|
80
|
+
.filter(dirent => dirent.isDirectory())
|
|
81
|
+
.map(dirent => dirent.name);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function isTaskClosed(status) {
|
|
88
|
+
const lowerStatus = (status || '').toLowerCase();
|
|
89
|
+
return ['closed', 'completed'].includes(lowerStatus);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function hasValidDependencies(depsString) {
|
|
93
|
+
if (!depsString || depsString.trim() === '') {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Handle malformed dependency strings
|
|
98
|
+
if (depsString === 'depends_on:') {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Clean up the dependency string
|
|
103
|
+
let cleanDeps = depsString.trim();
|
|
104
|
+
|
|
105
|
+
// Remove array brackets if present
|
|
106
|
+
cleanDeps = cleanDeps.replace(/^\[|\]$/g, '');
|
|
107
|
+
|
|
108
|
+
// Check if there's actual content after cleaning
|
|
109
|
+
cleanDeps = cleanDeps.trim();
|
|
110
|
+
|
|
111
|
+
return cleanDeps.length > 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function generateProgressBar(percent) {
|
|
115
|
+
const totalChars = 20;
|
|
116
|
+
const filled = Math.round((percent * totalChars) / 100);
|
|
117
|
+
const empty = totalChars - filled;
|
|
118
|
+
|
|
119
|
+
let bar = '[';
|
|
120
|
+
bar += '█'.repeat(filled);
|
|
121
|
+
bar += '░'.repeat(empty);
|
|
122
|
+
bar += ']';
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
bar,
|
|
126
|
+
percent,
|
|
127
|
+
filled,
|
|
128
|
+
empty
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function epicStatus(epicName) {
|
|
133
|
+
if (!epicName || epicName.trim() === '') {
|
|
134
|
+
throw new Error('❌ Please specify an epic name\nUsage: /pm:epic-status <epic-name>');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const epicDir = `.claude/epics/${epicName}`;
|
|
138
|
+
const epicFilePath = `${epicDir}/epic.md`;
|
|
139
|
+
|
|
140
|
+
// Check if epic exists
|
|
141
|
+
if (!fs.existsSync(epicFilePath)) {
|
|
142
|
+
const availableEpics = getAvailableEpics();
|
|
143
|
+
let errorMessage = `❌ Epic not found: ${epicName}\n\nAvailable epics:`;
|
|
144
|
+
|
|
145
|
+
if (availableEpics.length > 0) {
|
|
146
|
+
for (const epic of availableEpics) {
|
|
147
|
+
errorMessage += `\n • ${epic}`;
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
errorMessage += '\n (none)';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
throw new Error(errorMessage);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Parse epic metadata
|
|
157
|
+
let epicMetadata;
|
|
158
|
+
try {
|
|
159
|
+
const epicContent = fs.readFileSync(epicFilePath, 'utf8');
|
|
160
|
+
epicMetadata = parseMetadata(epicContent);
|
|
161
|
+
} catch (error) {
|
|
162
|
+
// Use defaults if file can't be read
|
|
163
|
+
epicMetadata = {
|
|
164
|
+
name: epicName,
|
|
165
|
+
status: 'planning',
|
|
166
|
+
progress: '0%',
|
|
167
|
+
github: '',
|
|
168
|
+
created: 'unknown'
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Apply defaults
|
|
173
|
+
const epic = {
|
|
174
|
+
name: epicMetadata.name || epicName,
|
|
175
|
+
status: epicMetadata.status || 'planning',
|
|
176
|
+
progress: epicMetadata.progress || '0%',
|
|
177
|
+
github: epicMetadata.github || ''
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// Analyze tasks
|
|
181
|
+
let totalTasks = 0;
|
|
182
|
+
let openTasks = 0;
|
|
183
|
+
let closedTasks = 0;
|
|
184
|
+
let blockedTasks = 0;
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const files = fs.readdirSync(epicDir);
|
|
188
|
+
const taskFiles = files.filter(file => /^\d+\.md$/.test(file));
|
|
189
|
+
|
|
190
|
+
for (const file of taskFiles) {
|
|
191
|
+
const taskFilePath = path.join(epicDir, file);
|
|
192
|
+
|
|
193
|
+
let taskMetadata;
|
|
194
|
+
try {
|
|
195
|
+
const taskContent = fs.readFileSync(taskFilePath, 'utf8');
|
|
196
|
+
taskMetadata = parseMetadata(taskContent);
|
|
197
|
+
} catch (error) {
|
|
198
|
+
// Use defaults if file can't be read
|
|
199
|
+
taskMetadata = {
|
|
200
|
+
status: 'open',
|
|
201
|
+
depends_on: ''
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const status = taskMetadata.status || 'open';
|
|
206
|
+
const depsString = taskMetadata.depends_on || '';
|
|
207
|
+
|
|
208
|
+
totalTasks++;
|
|
209
|
+
|
|
210
|
+
if (isTaskClosed(status)) {
|
|
211
|
+
closedTasks++;
|
|
212
|
+
} else if (hasValidDependencies(depsString)) {
|
|
213
|
+
// Task is open but has dependencies - consider it blocked
|
|
214
|
+
blockedTasks++;
|
|
215
|
+
} else {
|
|
216
|
+
// Task is open and has no dependencies
|
|
217
|
+
openTasks++;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
} catch (error) {
|
|
221
|
+
// Directory can't be read, continue with zero tasks
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Calculate progress
|
|
225
|
+
let progressData;
|
|
226
|
+
if (totalTasks > 0) {
|
|
227
|
+
const percent = Math.round((closedTasks * 100) / totalTasks);
|
|
228
|
+
progressData = generateProgressBar(percent);
|
|
229
|
+
progressData.message = `Progress: ${progressData.bar} ${percent}%`;
|
|
230
|
+
} else {
|
|
231
|
+
progressData = {
|
|
232
|
+
bar: '',
|
|
233
|
+
percent: 0,
|
|
234
|
+
filled: 0,
|
|
235
|
+
empty: 0,
|
|
236
|
+
message: 'Progress: No tasks created'
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return {
|
|
241
|
+
epic,
|
|
242
|
+
taskBreakdown: {
|
|
243
|
+
totalTasks,
|
|
244
|
+
openTasks,
|
|
245
|
+
closedTasks,
|
|
246
|
+
blockedTasks
|
|
247
|
+
},
|
|
248
|
+
progressBar: progressData
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function formatEpicStatus(epicName, data) {
|
|
253
|
+
let output = 'Getting status...\n\n\n';
|
|
254
|
+
|
|
255
|
+
output += `📚 Epic Status: ${epicName}\n`;
|
|
256
|
+
output += '================================\n\n';
|
|
257
|
+
|
|
258
|
+
// Progress bar
|
|
259
|
+
output += `${data.progressBar.message}\n\n`;
|
|
260
|
+
|
|
261
|
+
// Task breakdown
|
|
262
|
+
output += '📊 Breakdown:\n';
|
|
263
|
+
output += ` Total tasks: ${data.taskBreakdown.totalTasks}\n`;
|
|
264
|
+
output += ` ✅ Completed: ${data.taskBreakdown.closedTasks}\n`;
|
|
265
|
+
output += ` 🔄 Available: ${data.taskBreakdown.openTasks}\n`;
|
|
266
|
+
output += ` ⏸️ Blocked: ${data.taskBreakdown.blockedTasks}\n`;
|
|
267
|
+
|
|
268
|
+
// GitHub link if available
|
|
269
|
+
if (data.epic.github) {
|
|
270
|
+
output += `\n🔗 GitHub: ${data.epic.github}\n`;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return output;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// CommonJS export for testing
|
|
277
|
+
module.exports = epicStatus;
|
|
278
|
+
|
|
279
|
+
// CLI execution
|
|
280
|
+
if (require.main === module) {
|
|
281
|
+
const epicName = process.argv[2];
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
const data = epicStatus(epicName);
|
|
285
|
+
console.log(formatEpicStatus(epicName, data));
|
|
286
|
+
process.exit(0);
|
|
287
|
+
} catch (error) {
|
|
288
|
+
console.error(error.message);
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Backward compatibility wrapper for epic-status.js
|
|
4
|
+
# This script maintains compatibility while delegating to the Node.js implementation
|
|
5
|
+
|
|
6
|
+
# Get script directory to locate the Node.js implementation
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
NODE_SCRIPT="$SCRIPT_DIR/epic-status.js"
|
|
9
|
+
|
|
10
|
+
# Check if Node.js version exists and node is available
|
|
11
|
+
if [ -f "$NODE_SCRIPT" ] && command -v node >/dev/null 2>&1; then
|
|
12
|
+
# Use Node.js implementation
|
|
13
|
+
node "$NODE_SCRIPT" "$@"
|
|
14
|
+
else
|
|
15
|
+
# Fallback to original bash implementation
|
|
16
|
+
echo "Getting status..."
|
|
17
|
+
echo ""
|
|
18
|
+
echo ""
|
|
19
|
+
|
|
20
|
+
epic_name="$1"
|
|
21
|
+
|
|
22
|
+
if [ -z "$epic_name" ]; then
|
|
23
|
+
echo "❌ Please specify an epic name"
|
|
24
|
+
echo "Usage: /pm:epic-status <epic-name>"
|
|
25
|
+
echo ""
|
|
26
|
+
echo "Available epics:"
|
|
27
|
+
for dir in .claude/epics/*/; do
|
|
28
|
+
[ -d "$dir" ] && echo " • $(basename "$dir")"
|
|
29
|
+
done
|
|
30
|
+
exit 1
|
|
31
|
+
else
|
|
32
|
+
# Show status for specific epic
|
|
33
|
+
epic_dir=".claude/epics/$epic_name"
|
|
34
|
+
epic_file="$epic_dir/epic.md"
|
|
35
|
+
|
|
36
|
+
if [ ! -f "$epic_file" ]; then
|
|
37
|
+
echo "❌ Epic not found: $epic_name"
|
|
38
|
+
echo ""
|
|
39
|
+
echo "Available epics:"
|
|
40
|
+
for dir in .claude/epics/*/; do
|
|
41
|
+
[ -d "$dir" ] && echo " • $(basename "$dir")"
|
|
42
|
+
done
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
echo "📚 Epic Status: $epic_name"
|
|
47
|
+
echo "================================"
|
|
48
|
+
echo ""
|
|
49
|
+
|
|
50
|
+
# Extract metadata
|
|
51
|
+
status=$(grep "^status:" "$epic_file" | head -1 | sed 's/^status: *//')
|
|
52
|
+
progress=$(grep "^progress:" "$epic_file" | head -1 | sed 's/^progress: *//')
|
|
53
|
+
github=$(grep "^github:" "$epic_file" | head -1 | sed 's/^github: *//')
|
|
54
|
+
|
|
55
|
+
# Count tasks
|
|
56
|
+
total=0
|
|
57
|
+
open=0
|
|
58
|
+
closed=0
|
|
59
|
+
blocked=0
|
|
60
|
+
|
|
61
|
+
# Use find to safely iterate over task files
|
|
62
|
+
for task_file in "$epic_dir"/[0-9]*.md; do
|
|
63
|
+
[ -f "$task_file" ] || continue
|
|
64
|
+
((total++))
|
|
65
|
+
|
|
66
|
+
task_status=$(grep "^status:" "$task_file" | head -1 | sed 's/^status: *//')
|
|
67
|
+
deps=$(grep "^depends_on:" "$task_file" | head -1 | sed 's/^depends_on: *\[//' | sed 's/\]//')
|
|
68
|
+
|
|
69
|
+
if [ "$task_status" = "closed" ] || [ "$task_status" = "completed" ]; then
|
|
70
|
+
((closed++))
|
|
71
|
+
elif [ -n "$deps" ] && [ "$deps" != "depends_on:" ]; then
|
|
72
|
+
((blocked++))
|
|
73
|
+
else
|
|
74
|
+
((open++))
|
|
75
|
+
fi
|
|
76
|
+
done
|
|
77
|
+
|
|
78
|
+
# Display progress bar
|
|
79
|
+
if [ $total -gt 0 ]; then
|
|
80
|
+
percent=$((closed * 100 / total))
|
|
81
|
+
filled=$((percent * 20 / 100))
|
|
82
|
+
empty=$((20 - filled))
|
|
83
|
+
|
|
84
|
+
echo -n "Progress: ["
|
|
85
|
+
[ $filled -gt 0 ] && printf '%0.s█' $(seq 1 $filled)
|
|
86
|
+
[ $empty -gt 0 ] && printf '%0.s░' $(seq 1 $empty)
|
|
87
|
+
echo "] $percent%"
|
|
88
|
+
else
|
|
89
|
+
echo "Progress: No tasks created"
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
echo ""
|
|
93
|
+
echo "📊 Breakdown:"
|
|
94
|
+
echo " Total tasks: $total"
|
|
95
|
+
echo " ✅ Completed: $closed"
|
|
96
|
+
echo " 🔄 Available: $open"
|
|
97
|
+
echo " ⏸️ Blocked: $blocked"
|
|
98
|
+
|
|
99
|
+
[ -n "$github" ] && echo ""
|
|
100
|
+
[ -n "$github" ] && echo "🔗 GitHub: $github"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
exit 0
|
|
104
|
+
fi
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Epic Sync Modular Scripts
|
|
2
|
+
|
|
3
|
+
This directory contains the modular implementation of the epic-sync workflow that pushes epics and tasks to GitHub as issues.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
The epic-sync process is split into 4 specialized scripts:
|
|
8
|
+
|
|
9
|
+
1. **create-epic-issue.sh** - Creates the main epic GitHub issue
|
|
10
|
+
2. **create-task-issues.sh** - Creates GitHub issues for all tasks
|
|
11
|
+
3. **update-references.sh** - Renames task files to match GitHub issue numbers
|
|
12
|
+
4. **update-epic-file.sh** - Updates epic.md with real issue numbers
|
|
13
|
+
|
|
14
|
+
## Orchestration
|
|
15
|
+
|
|
16
|
+
The **recommended way** to use these scripts is via the orchestration script:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# From project root
|
|
20
|
+
bash .claude/scripts/pm/epic-sync.sh <epic_name>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This automatically runs all 4 steps in the correct order.
|
|
24
|
+
|
|
25
|
+
## Individual Scripts
|
|
26
|
+
|
|
27
|
+
### 1. create-epic-issue.sh
|
|
28
|
+
|
|
29
|
+
**Purpose:** Creates the main GitHub issue for the epic
|
|
30
|
+
|
|
31
|
+
**Input:**
|
|
32
|
+
- Epic name (e.g., `postgresql-connection-module`)
|
|
33
|
+
|
|
34
|
+
**Output:**
|
|
35
|
+
- GitHub issue number (stdout)
|
|
36
|
+
|
|
37
|
+
**What it does:**
|
|
38
|
+
- Strips frontmatter from epic.md
|
|
39
|
+
- Counts tasks in epic directory
|
|
40
|
+
- Detects epic type (bug vs feature)
|
|
41
|
+
- Creates GitHub issue with proper labels
|
|
42
|
+
- Returns epic issue number
|
|
43
|
+
|
|
44
|
+
**Usage:**
|
|
45
|
+
```bash
|
|
46
|
+
epic_number=$(bash .claude/scripts/pm/epic-sync/create-epic-issue.sh "my-feature")
|
|
47
|
+
echo "Epic created: #$epic_number"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. create-task-issues.sh
|
|
51
|
+
|
|
52
|
+
**Purpose:** Creates GitHub issues for all task files
|
|
53
|
+
|
|
54
|
+
**Input:**
|
|
55
|
+
- Epic name
|
|
56
|
+
- Epic issue number (from step 1)
|
|
57
|
+
|
|
58
|
+
**Output:**
|
|
59
|
+
- Path to task mapping file (stdout)
|
|
60
|
+
|
|
61
|
+
**What it does:**
|
|
62
|
+
- Finds all `[0-9]*.md` files in epic directory
|
|
63
|
+
- Strips frontmatter from each task
|
|
64
|
+
- Creates GitHub issue for each task
|
|
65
|
+
- Labels with `task,epic:<epic_name>`
|
|
66
|
+
- Saves mapping of old_name -> issue_number to `.task-mapping.txt`
|
|
67
|
+
- **Mapping file is saved in epic directory** (persistent, not in /tmp)
|
|
68
|
+
|
|
69
|
+
**Usage:**
|
|
70
|
+
```bash
|
|
71
|
+
mapping=$(bash .claude/scripts/pm/epic-sync/create-task-issues.sh "my-feature" "42")
|
|
72
|
+
echo "Mapping saved: $mapping"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Important:** The mapping file is saved as `.claude/epics/<epic>/.task-mapping.txt` for use in subsequent steps.
|
|
76
|
+
|
|
77
|
+
### 3. update-references.sh
|
|
78
|
+
|
|
79
|
+
**Purpose:** Renames task files to GitHub issue numbers and updates frontmatter
|
|
80
|
+
|
|
81
|
+
**Input:**
|
|
82
|
+
- Epic name
|
|
83
|
+
- Path to task mapping file (from step 2)
|
|
84
|
+
|
|
85
|
+
**Output:**
|
|
86
|
+
- None (modifies files in place)
|
|
87
|
+
|
|
88
|
+
**What it does:**
|
|
89
|
+
- Reads `.task-mapping.txt` file
|
|
90
|
+
- For each mapping (e.g., `001 -> 2`):
|
|
91
|
+
- Renames `001.md` to `2.md`
|
|
92
|
+
- Updates frontmatter with GitHub URL
|
|
93
|
+
- Updates frontmatter timestamp
|
|
94
|
+
- Creates backups during rename (removed on success)
|
|
95
|
+
|
|
96
|
+
**Usage:**
|
|
97
|
+
```bash
|
|
98
|
+
bash .claude/scripts/pm/epic-sync/update-references.sh "my-feature" ".claude/epics/my-feature/.task-mapping.txt"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Before:**
|
|
102
|
+
```
|
|
103
|
+
.claude/epics/my-feature/
|
|
104
|
+
├── 001.md (github: [Will be updated...])
|
|
105
|
+
├── 002.md (github: [Will be updated...])
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**After:**
|
|
109
|
+
```
|
|
110
|
+
.claude/epics/my-feature/
|
|
111
|
+
├── 2.md (github: https://github.com/user/repo/issues/2)
|
|
112
|
+
├── 3.md (github: https://github.com/user/repo/issues/3)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 4. update-epic-file.sh
|
|
116
|
+
|
|
117
|
+
**Purpose:** Updates epic.md with GitHub URL and real task references
|
|
118
|
+
|
|
119
|
+
**Input:**
|
|
120
|
+
- Epic name
|
|
121
|
+
- Epic issue number
|
|
122
|
+
|
|
123
|
+
**Output:**
|
|
124
|
+
- None (modifies epic.md in place)
|
|
125
|
+
|
|
126
|
+
**What it does:**
|
|
127
|
+
- Updates epic.md frontmatter with GitHub URL
|
|
128
|
+
- Updates timestamp
|
|
129
|
+
- Reads `.task-mapping.txt`
|
|
130
|
+
- Replaces task references (e.g., `- [ ] 001` → `- [ ] #2`)
|
|
131
|
+
- Creates backup during update (removed on success)
|
|
132
|
+
|
|
133
|
+
**Usage:**
|
|
134
|
+
```bash
|
|
135
|
+
bash .claude/scripts/pm/epic-sync/update-epic-file.sh "my-feature" "42"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## File Persistence Fix
|
|
139
|
+
|
|
140
|
+
**IMPORTANT:** The task mapping file is saved to a **persistent location**:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
.claude/epics/<epic_name>/.task-mapping.txt
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
This fixes the bug where the mapping file was being saved to `/tmp` and deleted before subsequent scripts could use it.
|
|
147
|
+
|
|
148
|
+
## Error Handling
|
|
149
|
+
|
|
150
|
+
All scripts use `set -euo pipefail` for robust error handling:
|
|
151
|
+
- `-e`: Exit on error
|
|
152
|
+
- `-u`: Error on undefined variables
|
|
153
|
+
- `-o pipefail`: Fail if any command in pipeline fails
|
|
154
|
+
|
|
155
|
+
## Testing
|
|
156
|
+
|
|
157
|
+
Test individual scripts:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# Create a test epic first
|
|
161
|
+
mkdir -p .claude/epics/test-epic
|
|
162
|
+
echo "---\ntitle: Test\n---\n# Test Epic" > .claude/epics/test-epic/epic.md
|
|
163
|
+
echo "---\ntitle: Task 1\n---\n# Task 1" > .claude/epics/test-epic/001.md
|
|
164
|
+
echo "---\ntitle: Task 2\n---\n# Task 2" > .claude/epics/test-epic/002.md
|
|
165
|
+
|
|
166
|
+
# Run orchestration script
|
|
167
|
+
bash .claude/scripts/pm/epic-sync.sh test-epic
|
|
168
|
+
|
|
169
|
+
# Verify files were renamed
|
|
170
|
+
ls .claude/epics/test-epic/
|
|
171
|
+
# Should show: epic.md, <issue_number>.md files
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Dependencies
|
|
175
|
+
|
|
176
|
+
- **bash** >= 4.0
|
|
177
|
+
- **gh** (GitHub CLI) - authenticated
|
|
178
|
+
- **awk** - for frontmatter processing
|
|
179
|
+
- **find** - for file discovery
|
|
180
|
+
- **grep** - for pattern matching
|
|
181
|
+
|
|
182
|
+
## Common Issues
|
|
183
|
+
|
|
184
|
+
### "Template repository detected"
|
|
185
|
+
```bash
|
|
186
|
+
# Fix: Set correct remote
|
|
187
|
+
git remote set-url origin https://github.com/YOUR_USERNAME/YOUR_REPO.git
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### "GitHub CLI not authenticated"
|
|
191
|
+
```bash
|
|
192
|
+
gh auth login
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### "Mapping file not found"
|
|
196
|
+
- Ensure step 2 completed successfully
|
|
197
|
+
- Check `.claude/epics/<epic>/.task-mapping.txt` exists
|
|
198
|
+
|
|
199
|
+
### "Task files still numbered 001, 002..."
|
|
200
|
+
- Step 3 (update-references.sh) may not have run
|
|
201
|
+
- Check for errors in step 2 output
|
|
202
|
+
- Run orchestration script instead of individual scripts
|
|
203
|
+
|
|
204
|
+
## Related Files
|
|
205
|
+
|
|
206
|
+
- **/.claude/commands/pm/epic-sync.md** - Command documentation
|
|
207
|
+
- **/.claude/commands/pm/issue-start.md** - Works with renamed files
|
|
208
|
+
- **/.claude/commands/pm/issue-analyze.md** - Expects GitHub issue numbers
|