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,181 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Issue Start - Start work on an issue
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { execSync } = require('child_process');
|
|
9
|
+
|
|
10
|
+
class IssueStarter {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.providersDir = path.join(__dirname, '..', '..', 'providers');
|
|
13
|
+
this.issueDir = path.join('.claude', 'issues');
|
|
14
|
+
this.activeWorkFile = path.join('.claude', 'active-work.json');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
detectProvider() {
|
|
18
|
+
// Check for Azure DevOps
|
|
19
|
+
if (fs.existsSync('.azure') || process.env.AZURE_DEVOPS_ORG) {
|
|
20
|
+
return 'azure';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Check for GitHub
|
|
24
|
+
if (fs.existsSync('.github') || fs.existsSync('.git')) {
|
|
25
|
+
try {
|
|
26
|
+
const remoteUrl = execSync('git remote get-url origin 2>/dev/null', { encoding: 'utf8' });
|
|
27
|
+
if (remoteUrl.includes('github.com')) {
|
|
28
|
+
return 'github';
|
|
29
|
+
}
|
|
30
|
+
} catch {}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return 'local';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
loadActiveWork() {
|
|
37
|
+
if (!fs.existsSync(this.activeWorkFile)) {
|
|
38
|
+
return { issues: [], epics: [] };
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(fs.readFileSync(this.activeWorkFile, 'utf8'));
|
|
42
|
+
} catch {
|
|
43
|
+
return { issues: [], epics: [] };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
saveActiveWork(activeWork) {
|
|
48
|
+
const dir = path.dirname(this.activeWorkFile);
|
|
49
|
+
if (!fs.existsSync(dir)) {
|
|
50
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
fs.writeFileSync(this.activeWorkFile, JSON.stringify(activeWork, null, 2));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async startIssue(issueId, options = {}) {
|
|
56
|
+
const provider = options.provider || this.detectProvider();
|
|
57
|
+
console.log(`🚀 Starting work on issue: ${issueId}`);
|
|
58
|
+
console.log(`📦 Provider: ${provider}\n`);
|
|
59
|
+
|
|
60
|
+
// Update active work tracking
|
|
61
|
+
const activeWork = this.loadActiveWork();
|
|
62
|
+
const issueEntry = {
|
|
63
|
+
id: issueId,
|
|
64
|
+
provider: provider,
|
|
65
|
+
startedAt: new Date().toISOString(),
|
|
66
|
+
status: 'in-progress'
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Remove if already exists and add to beginning
|
|
70
|
+
activeWork.issues = activeWork.issues.filter(i => i.id !== issueId);
|
|
71
|
+
activeWork.issues.unshift(issueEntry);
|
|
72
|
+
|
|
73
|
+
// Keep only last 10 active issues
|
|
74
|
+
if (activeWork.issues.length > 10) {
|
|
75
|
+
activeWork.issues = activeWork.issues.slice(0, 10);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
this.saveActiveWork(activeWork);
|
|
79
|
+
|
|
80
|
+
// Try to use provider-specific start command
|
|
81
|
+
const providerScript = path.join(this.providersDir, provider, 'issue-start.js');
|
|
82
|
+
if (fs.existsSync(providerScript)) {
|
|
83
|
+
console.log(`Using ${provider} provider to start issue...`);
|
|
84
|
+
try {
|
|
85
|
+
require(providerScript);
|
|
86
|
+
return;
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.log(`⚠️ Provider script failed, using local tracking`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Local tracking fallback
|
|
93
|
+
console.log('📝 Creating local issue tracking...');
|
|
94
|
+
|
|
95
|
+
// Create issue file if it doesn't exist
|
|
96
|
+
if (!fs.existsSync(this.issueDir)) {
|
|
97
|
+
fs.mkdirSync(this.issueDir, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const issueFile = path.join(this.issueDir, `${issueId}.md`);
|
|
101
|
+
if (!fs.existsSync(issueFile)) {
|
|
102
|
+
const template = `# Issue ${issueId}
|
|
103
|
+
|
|
104
|
+
## Status
|
|
105
|
+
- **State**: In Progress
|
|
106
|
+
- **Started**: ${new Date().toISOString()}
|
|
107
|
+
- **Assigned**: ${process.env.USER || 'current-user'}
|
|
108
|
+
|
|
109
|
+
## Description
|
|
110
|
+
[Add issue description here]
|
|
111
|
+
|
|
112
|
+
## Tasks
|
|
113
|
+
- [ ] Task 1
|
|
114
|
+
- [ ] Task 2
|
|
115
|
+
- [ ] Task 3
|
|
116
|
+
|
|
117
|
+
## Notes
|
|
118
|
+
- Started work on ${new Date().toLocaleDateString()}
|
|
119
|
+
|
|
120
|
+
## Updates
|
|
121
|
+
- ${new Date().toISOString()}: Issue started
|
|
122
|
+
`;
|
|
123
|
+
fs.writeFileSync(issueFile, template);
|
|
124
|
+
console.log(`✅ Created issue file: ${issueFile}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Display status
|
|
128
|
+
console.log('\n📊 Issue Status:');
|
|
129
|
+
console.log(` • ID: ${issueId}`);
|
|
130
|
+
console.log(` • Status: In Progress`);
|
|
131
|
+
console.log(` • Started: ${new Date().toLocaleString()}`);
|
|
132
|
+
|
|
133
|
+
// Show next steps
|
|
134
|
+
console.log('\n💡 Next steps:');
|
|
135
|
+
console.log(` • View issue: pm issue-show ${issueId}`);
|
|
136
|
+
console.log(` • Update status: pm issue-edit ${issueId}`);
|
|
137
|
+
console.log(` • Close issue: pm issue-close ${issueId}`);
|
|
138
|
+
console.log(` • View all active: pm in-progress`);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async run(args) {
|
|
142
|
+
const issueId = args[0];
|
|
143
|
+
|
|
144
|
+
if (!issueId) {
|
|
145
|
+
console.error('❌ Error: Issue ID required');
|
|
146
|
+
console.error('Usage: pm issue-start <issue-id> [--provider=azure|github]');
|
|
147
|
+
|
|
148
|
+
// Show active work if any
|
|
149
|
+
const activeWork = this.loadActiveWork();
|
|
150
|
+
if (activeWork.issues.length > 0) {
|
|
151
|
+
console.log('\n📋 Currently active issues:');
|
|
152
|
+
activeWork.issues.slice(0, 5).forEach(issue => {
|
|
153
|
+
const date = new Date(issue.startedAt).toLocaleDateString();
|
|
154
|
+
console.log(` • ${issue.id} (${issue.provider}) - started ${date}`);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const options = {};
|
|
162
|
+
args.slice(1).forEach(arg => {
|
|
163
|
+
if (arg.startsWith('--provider=')) {
|
|
164
|
+
options.provider = arg.split('=')[1];
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
await this.startIssue(issueId, options);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Main execution
|
|
173
|
+
if (require.main === module) {
|
|
174
|
+
const starter = new IssueStarter();
|
|
175
|
+
starter.run(process.argv.slice(2)).catch(error => {
|
|
176
|
+
console.error('❌ Error:', error.message);
|
|
177
|
+
process.exit(1);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
module.exports = IssueStarter;
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Format Comment Script for Issue Sync
|
|
3
|
+
# Formats consolidated updates into a GitHub issue comment
|
|
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
|
+
|
|
13
|
+
# Script configuration
|
|
14
|
+
readonly ISSUE_NUMBER="${1:-}"
|
|
15
|
+
readonly UPDATES_FILE="${2:-}"
|
|
16
|
+
readonly PROGRESS_FILE="${3:-}"
|
|
17
|
+
readonly IS_COMPLETION="${4:-false}"
|
|
18
|
+
|
|
19
|
+
# Global variables
|
|
20
|
+
declare -g formatted_comment=""
|
|
21
|
+
declare -g temp_dir=""
|
|
22
|
+
|
|
23
|
+
# Main function
|
|
24
|
+
main() {
|
|
25
|
+
print_banner "GitHub Comment Formatter" "1.0.0"
|
|
26
|
+
|
|
27
|
+
# Validate inputs
|
|
28
|
+
log_info "Formatting comment for issue #$ISSUE_NUMBER"
|
|
29
|
+
validate_inputs || exit 1
|
|
30
|
+
|
|
31
|
+
# Setup workspace
|
|
32
|
+
setup_workspace
|
|
33
|
+
|
|
34
|
+
# Format appropriate comment type
|
|
35
|
+
if [[ "$IS_COMPLETION" == "true" ]]; then
|
|
36
|
+
with_error_handling "Format completion comment" \
|
|
37
|
+
format_completion_comment
|
|
38
|
+
else
|
|
39
|
+
with_error_handling "Format progress update comment" \
|
|
40
|
+
format_progress_update_comment
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Validate comment size
|
|
44
|
+
with_error_handling "Validate comment size" \
|
|
45
|
+
validate_comment_size
|
|
46
|
+
|
|
47
|
+
# Output results
|
|
48
|
+
display_results
|
|
49
|
+
|
|
50
|
+
# Return path to formatted comment
|
|
51
|
+
echo "$formatted_comment"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# Validate script inputs
|
|
55
|
+
validate_inputs() {
|
|
56
|
+
log_function_entry "validate_inputs"
|
|
57
|
+
|
|
58
|
+
if [[ -z "$ISSUE_NUMBER" ]]; then
|
|
59
|
+
log_error "Issue number is required"
|
|
60
|
+
return 1
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
if [[ ! -f "$UPDATES_FILE" ]]; then
|
|
64
|
+
log_error "Updates file not found: $UPDATES_FILE"
|
|
65
|
+
return 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if [[ ! -f "$PROGRESS_FILE" ]]; then
|
|
69
|
+
log_error "Progress file not found: $PROGRESS_FILE"
|
|
70
|
+
return 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
log_function_exit "validate_inputs"
|
|
74
|
+
return 0
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# Setup temporary workspace
|
|
78
|
+
setup_workspace() {
|
|
79
|
+
log_function_entry "setup_workspace"
|
|
80
|
+
|
|
81
|
+
temp_dir="/tmp/format-comment-$$"
|
|
82
|
+
formatted_comment="$temp_dir/formatted-comment.md"
|
|
83
|
+
|
|
84
|
+
log_info "Creating workspace: $temp_dir"
|
|
85
|
+
mkdir -p "$temp_dir"
|
|
86
|
+
|
|
87
|
+
# Cleanup on exit
|
|
88
|
+
trap "cleanup_workspace" EXIT
|
|
89
|
+
|
|
90
|
+
log_function_exit "setup_workspace"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# Cleanup workspace
|
|
94
|
+
cleanup_workspace() {
|
|
95
|
+
if [[ -n "$temp_dir" ]] && [[ -d "$temp_dir" ]]; then
|
|
96
|
+
log_debug "Cleaning up workspace: $temp_dir"
|
|
97
|
+
# Don't remove - calling script needs the results
|
|
98
|
+
# rm -rf "$temp_dir"
|
|
99
|
+
fi
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Format progress update comment
|
|
103
|
+
format_progress_update_comment() {
|
|
104
|
+
log_function_entry "format_progress_update_comment"
|
|
105
|
+
|
|
106
|
+
local current_date
|
|
107
|
+
current_date=$(get_current_date)
|
|
108
|
+
|
|
109
|
+
local current_datetime
|
|
110
|
+
current_datetime=$(get_current_datetime)
|
|
111
|
+
|
|
112
|
+
# Get completion percentage
|
|
113
|
+
local completion
|
|
114
|
+
completion=$(get_frontmatter_field "$PROGRESS_FILE" "completion" 2>/dev/null || echo "0")
|
|
115
|
+
|
|
116
|
+
# Parse updates file to extract sections
|
|
117
|
+
parse_updates_file
|
|
118
|
+
|
|
119
|
+
log_info "Creating progress update comment"
|
|
120
|
+
|
|
121
|
+
# Create formatted comment
|
|
122
|
+
cat > "$formatted_comment" << EOF
|
|
123
|
+
## 🔄 Progress Update - ${current_date}
|
|
124
|
+
|
|
125
|
+
### ✅ Completed Work
|
|
126
|
+
$(get_section "completed" "- No completed items in this update")
|
|
127
|
+
|
|
128
|
+
### 🔄 In Progress
|
|
129
|
+
$(get_section "in_progress" "- Continuing work on implementation")
|
|
130
|
+
|
|
131
|
+
### 📝 Technical Notes
|
|
132
|
+
$(get_section "technical_notes" "- No new technical notes")
|
|
133
|
+
|
|
134
|
+
### 📊 Acceptance Criteria Status
|
|
135
|
+
$(format_acceptance_criteria)
|
|
136
|
+
|
|
137
|
+
### 🚀 Next Steps
|
|
138
|
+
$(get_section "next_steps" "- Continue with planned implementation")
|
|
139
|
+
|
|
140
|
+
### ⚠️ Blockers
|
|
141
|
+
$(get_section "blockers" "- No current blockers")
|
|
142
|
+
|
|
143
|
+
### 💻 Recent Commits
|
|
144
|
+
$(format_recent_commits)
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
*Progress: ${completion}% | Synced from local updates at ${current_datetime}*
|
|
148
|
+
EOF
|
|
149
|
+
|
|
150
|
+
log_success "Progress update comment formatted"
|
|
151
|
+
log_function_exit "format_progress_update_comment"
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
# Format completion comment
|
|
155
|
+
format_completion_comment() {
|
|
156
|
+
log_function_entry "format_completion_comment"
|
|
157
|
+
|
|
158
|
+
local current_date
|
|
159
|
+
current_date=$(get_current_date)
|
|
160
|
+
|
|
161
|
+
local current_datetime
|
|
162
|
+
current_datetime=$(get_current_datetime)
|
|
163
|
+
|
|
164
|
+
# Parse updates file
|
|
165
|
+
parse_updates_file
|
|
166
|
+
|
|
167
|
+
log_info "Creating completion comment"
|
|
168
|
+
|
|
169
|
+
# Create formatted completion comment
|
|
170
|
+
cat > "$formatted_comment" << EOF
|
|
171
|
+
## ✅ Task Completed - ${current_date}
|
|
172
|
+
|
|
173
|
+
### 🎯 All Acceptance Criteria Met
|
|
174
|
+
$(format_acceptance_criteria_completion)
|
|
175
|
+
|
|
176
|
+
### 📦 Deliverables
|
|
177
|
+
$(get_section "deliverables" "- Implementation complete\n- Code reviewed and tested")
|
|
178
|
+
|
|
179
|
+
### 🧪 Testing
|
|
180
|
+
$(format_testing_status)
|
|
181
|
+
|
|
182
|
+
### 📚 Documentation
|
|
183
|
+
$(format_documentation_status)
|
|
184
|
+
|
|
185
|
+
This task is ready for review and can be closed.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
*Task completed: 100% | Synced at ${current_datetime}*
|
|
189
|
+
EOF
|
|
190
|
+
|
|
191
|
+
log_success "Completion comment formatted"
|
|
192
|
+
log_function_exit "format_completion_comment"
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
# Parse updates file and extract sections
|
|
196
|
+
parse_updates_file() {
|
|
197
|
+
log_function_entry "parse_updates_file"
|
|
198
|
+
|
|
199
|
+
# Extract different sections from updates file
|
|
200
|
+
extract_section "Progress Updates" "progress"
|
|
201
|
+
extract_section "Technical Notes" "technical_notes"
|
|
202
|
+
extract_section "Recent Commits" "commits"
|
|
203
|
+
extract_section "Acceptance Criteria" "acceptance_criteria"
|
|
204
|
+
extract_section "Next Steps" "next_steps"
|
|
205
|
+
extract_section "Blockers" "blockers"
|
|
206
|
+
extract_section "Completed Work" "completed"
|
|
207
|
+
extract_section "In Progress" "in_progress"
|
|
208
|
+
extract_section "Deliverables" "deliverables"
|
|
209
|
+
extract_section "Testing" "testing"
|
|
210
|
+
extract_section "Documentation" "documentation"
|
|
211
|
+
|
|
212
|
+
log_debug "Updates file parsed into sections"
|
|
213
|
+
log_function_exit "parse_updates_file"
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
# Extract a section from updates file
|
|
217
|
+
extract_section() {
|
|
218
|
+
local section_title="$1"
|
|
219
|
+
local section_key="$2"
|
|
220
|
+
local section_file="$temp_dir/section_${section_key}.md"
|
|
221
|
+
|
|
222
|
+
log_debug "Extracting section: $section_title"
|
|
223
|
+
|
|
224
|
+
# Use awk to extract section content
|
|
225
|
+
awk -v section="## $section_title" '
|
|
226
|
+
$0 == section { capture=1; next }
|
|
227
|
+
/^## / && capture { capture=0 }
|
|
228
|
+
capture && NF { print }
|
|
229
|
+
' "$UPDATES_FILE" > "$section_file"
|
|
230
|
+
|
|
231
|
+
if [[ ! -s "$section_file" ]]; then
|
|
232
|
+
log_debug "Section not found or empty: $section_title"
|
|
233
|
+
fi
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
# Get formatted section content
|
|
237
|
+
get_section() {
|
|
238
|
+
local section_key="$1"
|
|
239
|
+
local default_content="$2"
|
|
240
|
+
local section_file="$temp_dir/section_${section_key}.md"
|
|
241
|
+
|
|
242
|
+
if [[ -f "$section_file" ]] && [[ -s "$section_file" ]]; then
|
|
243
|
+
cat "$section_file"
|
|
244
|
+
else
|
|
245
|
+
echo -e "$default_content"
|
|
246
|
+
fi
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# Format acceptance criteria
|
|
250
|
+
format_acceptance_criteria() {
|
|
251
|
+
local criteria_file="$temp_dir/section_acceptance_criteria.md"
|
|
252
|
+
|
|
253
|
+
if [[ -f "$criteria_file" ]] && [[ -s "$criteria_file" ]]; then
|
|
254
|
+
# Process existing criteria
|
|
255
|
+
cat "$criteria_file" | while read -r line; do
|
|
256
|
+
if [[ "$line" =~ ^-[[:space:]].*$ ]]; then
|
|
257
|
+
# Determine status based on keywords
|
|
258
|
+
if [[ "$line" =~ (✅|[Cc]omplete|[Dd]one|[Ff]inished) ]]; then
|
|
259
|
+
echo "$line"
|
|
260
|
+
elif [[ "$line" =~ (🔄|[Ii]n[[:space:]]progress|[Ww]orking|[Oo]ngoing) ]]; then
|
|
261
|
+
echo "$line"
|
|
262
|
+
elif [[ "$line" =~ (⚠️|⏸️|[Bb]locked|[Pp]ending|[Ww]aiting) ]]; then
|
|
263
|
+
echo "$line"
|
|
264
|
+
else
|
|
265
|
+
# Default to unchecked
|
|
266
|
+
echo "- □ ${line#- }"
|
|
267
|
+
fi
|
|
268
|
+
else
|
|
269
|
+
echo "$line"
|
|
270
|
+
fi
|
|
271
|
+
done
|
|
272
|
+
else
|
|
273
|
+
# Default criteria status
|
|
274
|
+
echo "- ✅ Initial implementation complete"
|
|
275
|
+
echo "- 🔄 Testing in progress"
|
|
276
|
+
echo "- □ Documentation pending"
|
|
277
|
+
fi
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
# Format acceptance criteria for completion
|
|
281
|
+
format_acceptance_criteria_completion() {
|
|
282
|
+
local criteria_file="$temp_dir/section_acceptance_criteria.md"
|
|
283
|
+
|
|
284
|
+
if [[ -f "$criteria_file" ]] && [[ -s "$criteria_file" ]]; then
|
|
285
|
+
# Mark all as complete
|
|
286
|
+
cat "$criteria_file" | while read -r line; do
|
|
287
|
+
if [[ "$line" =~ ^-[[:space:]].*$ ]]; then
|
|
288
|
+
# Remove any existing status markers and add checkmark
|
|
289
|
+
cleaned_line=$(echo "$line" | sed 's/^-[[:space:]]*\(✅\|🔄\|⚠️\|⏸️\|□\)[[:space:]]*/- /')
|
|
290
|
+
echo "- ✅ ${cleaned_line#- }"
|
|
291
|
+
else
|
|
292
|
+
echo "$line"
|
|
293
|
+
fi
|
|
294
|
+
done
|
|
295
|
+
else
|
|
296
|
+
echo "- ✅ All requirements implemented"
|
|
297
|
+
echo "- ✅ Code quality standards met"
|
|
298
|
+
echo "- ✅ Performance requirements satisfied"
|
|
299
|
+
fi
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
# Format recent commits
|
|
303
|
+
format_recent_commits() {
|
|
304
|
+
local commits_file="$temp_dir/section_commits.md"
|
|
305
|
+
|
|
306
|
+
if [[ -f "$commits_file" ]] && [[ -s "$commits_file" ]]; then
|
|
307
|
+
# Limit to 10 most recent commits
|
|
308
|
+
head -10 "$commits_file"
|
|
309
|
+
else
|
|
310
|
+
# Try to get recent commits from git
|
|
311
|
+
if command -v git >/dev/null 2>&1; then
|
|
312
|
+
local recent_commits
|
|
313
|
+
recent_commits=$(git log --oneline -5 --no-merges 2>/dev/null || echo "")
|
|
314
|
+
|
|
315
|
+
if [[ -n "$recent_commits" ]]; then
|
|
316
|
+
echo "$recent_commits" | while read -r commit; do
|
|
317
|
+
echo "- $commit"
|
|
318
|
+
done
|
|
319
|
+
else
|
|
320
|
+
echo "- No recent commits found"
|
|
321
|
+
fi
|
|
322
|
+
else
|
|
323
|
+
echo "- Commit history not available"
|
|
324
|
+
fi
|
|
325
|
+
fi
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
# Format testing status
|
|
329
|
+
format_testing_status() {
|
|
330
|
+
local testing_file="$temp_dir/section_testing.md"
|
|
331
|
+
|
|
332
|
+
if [[ -f "$testing_file" ]] && [[ -s "$testing_file" ]]; then
|
|
333
|
+
cat "$testing_file"
|
|
334
|
+
else
|
|
335
|
+
# Default testing status
|
|
336
|
+
cat << EOF
|
|
337
|
+
- Unit tests: ✅ Passing
|
|
338
|
+
- Integration tests: ✅ Passing
|
|
339
|
+
- Manual testing: ✅ Complete
|
|
340
|
+
EOF
|
|
341
|
+
fi
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
# Format documentation status
|
|
345
|
+
format_documentation_status() {
|
|
346
|
+
local docs_file="$temp_dir/section_documentation.md"
|
|
347
|
+
|
|
348
|
+
if [[ -f "$docs_file" ]] && [[ -s "$docs_file" ]]; then
|
|
349
|
+
cat "$docs_file"
|
|
350
|
+
else
|
|
351
|
+
# Default documentation status
|
|
352
|
+
cat << EOF
|
|
353
|
+
- Code documentation: ✅ Updated
|
|
354
|
+
- README updates: ✅ Complete
|
|
355
|
+
- API documentation: ✅ Current
|
|
356
|
+
EOF
|
|
357
|
+
fi
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
# Validate comment size against GitHub limits
|
|
361
|
+
validate_comment_size() {
|
|
362
|
+
log_function_entry "validate_comment_size"
|
|
363
|
+
|
|
364
|
+
local max_size=65536 # GitHub comment size limit
|
|
365
|
+
local comment_size
|
|
366
|
+
comment_size=$(wc -c < "$formatted_comment")
|
|
367
|
+
|
|
368
|
+
log_info "Comment size: $comment_size characters (max: $max_size)"
|
|
369
|
+
|
|
370
|
+
if [[ "$comment_size" -gt "$max_size" ]]; then
|
|
371
|
+
log_warning "Comment exceeds GitHub size limit ($comment_size > $max_size)"
|
|
372
|
+
|
|
373
|
+
# Truncate comment
|
|
374
|
+
local truncated_file="$temp_dir/truncated-comment.md"
|
|
375
|
+
head -c 65000 "$formatted_comment" > "$truncated_file"
|
|
376
|
+
|
|
377
|
+
# Add truncation notice
|
|
378
|
+
cat >> "$truncated_file" << EOF
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
⚠️ **Comment truncated due to size limit**
|
|
382
|
+
|
|
383
|
+
The full update is available in your local files at:
|
|
384
|
+
\`.claude/epics/*/updates/$ISSUE_NUMBER/\`
|
|
385
|
+
EOF
|
|
386
|
+
|
|
387
|
+
# Replace with truncated version
|
|
388
|
+
mv "$truncated_file" "$formatted_comment"
|
|
389
|
+
|
|
390
|
+
log_info "Comment truncated to fit GitHub limits"
|
|
391
|
+
else
|
|
392
|
+
log_debug "Comment size is within limits"
|
|
393
|
+
fi
|
|
394
|
+
|
|
395
|
+
log_function_exit "validate_comment_size"
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
# Display formatting results
|
|
399
|
+
display_results() {
|
|
400
|
+
print_section "✅ Comment Formatting Results"
|
|
401
|
+
|
|
402
|
+
echo "Issue: #$ISSUE_NUMBER"
|
|
403
|
+
echo "Comment Type: $([[ "$IS_COMPLETION" == "true" ]] && echo "Completion" || echo "Progress Update")"
|
|
404
|
+
|
|
405
|
+
# Show comment preview (first 5 lines)
|
|
406
|
+
echo ""
|
|
407
|
+
echo "Comment Preview:"
|
|
408
|
+
head -5 "$formatted_comment" | sed 's/^/ /'
|
|
409
|
+
echo " ..."
|
|
410
|
+
|
|
411
|
+
# Show size info
|
|
412
|
+
local comment_size
|
|
413
|
+
comment_size=$(wc -c < "$formatted_comment")
|
|
414
|
+
echo ""
|
|
415
|
+
echo "Comment Size: $comment_size characters"
|
|
416
|
+
|
|
417
|
+
if [[ "$comment_size" -gt 65536 ]]; then
|
|
418
|
+
echo "⚠️ Comment was truncated to fit GitHub limits"
|
|
419
|
+
fi
|
|
420
|
+
|
|
421
|
+
echo ""
|
|
422
|
+
echo "✅ Comment formatted successfully"
|
|
423
|
+
echo "📄 Formatted comment: $formatted_comment"
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
# Error handling
|
|
427
|
+
handle_error() {
|
|
428
|
+
local exit_code=$?
|
|
429
|
+
log_error "Comment formatting failed with exit code: $exit_code"
|
|
430
|
+
log_error "Failed to format comment for issue: #$ISSUE_NUMBER"
|
|
431
|
+
exit "$exit_code"
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
# Set up error handling
|
|
435
|
+
trap handle_error ERR
|
|
436
|
+
|
|
437
|
+
# Validate arguments
|
|
438
|
+
if [[ $# -lt 3 ]]; then
|
|
439
|
+
echo "Usage: $0 <issue_number> <updates_file> <progress_file> [is_completion]"
|
|
440
|
+
echo ""
|
|
441
|
+
echo "Formats consolidated updates into a GitHub issue comment."
|
|
442
|
+
echo ""
|
|
443
|
+
echo "Arguments:"
|
|
444
|
+
echo " issue_number GitHub issue number"
|
|
445
|
+
echo " updates_file Path to consolidated updates file"
|
|
446
|
+
echo " progress_file Path to progress.md file"
|
|
447
|
+
echo " is_completion Optional: 'true' if task is complete (default: false)"
|
|
448
|
+
echo ""
|
|
449
|
+
echo "The script will format either:"
|
|
450
|
+
echo " - Progress update comment (default)"
|
|
451
|
+
echo " - Completion comment (if is_completion=true)"
|
|
452
|
+
echo ""
|
|
453
|
+
echo "GitHub comment size limits:"
|
|
454
|
+
echo " - Maximum: 65,536 characters"
|
|
455
|
+
echo " - Comments will be truncated if necessary"
|
|
456
|
+
echo ""
|
|
457
|
+
echo "Examples:"
|
|
458
|
+
echo " $0 123 /tmp/updates.md .claude/epics/auth/updates/123/progress.md"
|
|
459
|
+
echo " $0 456 /tmp/updates.md ./progress.md true"
|
|
460
|
+
echo ""
|
|
461
|
+
echo "Output:"
|
|
462
|
+
echo " Prints path to formatted comment file on stdout"
|
|
463
|
+
echo ""
|
|
464
|
+
exit 1
|
|
465
|
+
fi
|
|
466
|
+
|
|
467
|
+
# Run main function
|
|
468
|
+
main "$@"
|